-/*******************************************************************************\r
- * Copyright (c) 2010 Ericsson\r
- *\r
- * All rights reserved. This program and the accompanying materials are\r
- * made available under the terms of the Eclipse Public License v1.0 which\r
- * accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * Patrick Tasse - Initial API and implementation\r
- *******************************************************************************/\r
-\r
-package org.eclipse.linuxtools.internal.tmf.ui.parsers.custom;\r
-\r
-import java.io.FileNotFoundException;\r
-import java.io.IOException;\r
-import java.util.HashMap;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-import java.util.Map.Entry;\r
-import java.util.regex.Matcher;\r
-\r
-import org.eclipse.core.resources.IProject;\r
-import org.eclipse.core.resources.IResource;\r
-import org.eclipse.linuxtools.internal.tmf.ui.Activator;\r
-import org.eclipse.linuxtools.internal.tmf.ui.parsers.custom.CustomTxtTraceDefinition.InputLine;\r
-import org.eclipse.linuxtools.tmf.core.event.ITmfEvent;\r
-import org.eclipse.linuxtools.tmf.core.event.TmfTimestamp;\r
-import org.eclipse.linuxtools.tmf.core.exceptions.TmfTraceException;\r
-import org.eclipse.linuxtools.tmf.core.io.BufferedRandomAccessFile;\r
-import org.eclipse.linuxtools.tmf.core.trace.ITmfContext;\r
-import org.eclipse.linuxtools.tmf.core.trace.ITmfEventParser;\r
-import org.eclipse.linuxtools.tmf.core.trace.ITmfLocation;\r
-import org.eclipse.linuxtools.tmf.core.trace.TmfContext;\r
-import org.eclipse.linuxtools.tmf.core.trace.TmfLongLocation;\r
-import org.eclipse.linuxtools.tmf.core.trace.TmfTrace;\r
-\r
-public class CustomTxtTrace extends TmfTrace implements ITmfEventParser {\r
-\r
- private static final TmfLongLocation NULL_LOCATION = new TmfLongLocation((Long) null);\r
- private static final int DEFAULT_CACHE_SIZE = 100;\r
-\r
- private final CustomTxtTraceDefinition fDefinition;\r
- private final CustomTxtEventType fEventType;\r
- private BufferedRandomAccessFile fFile;\r
-\r
- public CustomTxtTrace(final CustomTxtTraceDefinition definition) {\r
- fDefinition = definition;\r
- fEventType = new CustomTxtEventType(fDefinition);\r
- setCacheSize(DEFAULT_CACHE_SIZE);\r
- }\r
-\r
- public CustomTxtTrace(final IResource resource, final CustomTxtTraceDefinition definition, final String path, final int cacheSize) throws TmfTraceException {\r
- this(definition);\r
- setCacheSize((cacheSize > 0) ? cacheSize : DEFAULT_CACHE_SIZE);\r
- initTrace(resource, path, CustomTxtEvent.class);\r
- }\r
-\r
- @Override\r
- public void initTrace(final IResource resource, final String path, final Class<? extends ITmfEvent> eventType) throws TmfTraceException {\r
- super.initTrace(resource, path, eventType);\r
- try {\r
- fFile = new BufferedRandomAccessFile(getPath(), "r"); //$NON-NLS-1$\r
- } catch (IOException e) {\r
- throw new TmfTraceException(e.getMessage(), e);\r
- }\r
- indexTrace(false);\r
- }\r
-\r
- @Override\r
- public synchronized void dispose() {\r
- super.dispose();\r
- if (fFile != null) {\r
- try {\r
- fFile.close();\r
- } catch (IOException e) {\r
- } finally {\r
- fFile = null;\r
- }\r
- }\r
- }\r
-\r
- @Override\r
- public synchronized TmfContext seekEvent(final ITmfLocation location) {\r
- final CustomTxtTraceContext context = new CustomTxtTraceContext(NULL_LOCATION, ITmfContext.UNKNOWN_RANK);\r
- if (NULL_LOCATION.equals(location) || fFile == null) {\r
- return context;\r
- }\r
- try {\r
- if (location == null) {\r
- fFile.seek(0);\r
- } else if (location.getLocationInfo() instanceof Long) {\r
- fFile.seek((Long) location.getLocationInfo());\r
- }\r
- String line;\r
- long rawPos = fFile.getFilePointer();\r
- while ((line = fFile.getNextLine()) != null) {\r
- for (final InputLine input : getFirstLines()) {\r
- final Matcher matcher = input.getPattern().matcher(line);\r
- if (matcher.find()) {\r
- context.setLocation(new TmfLongLocation(rawPos));\r
- context.firstLineMatcher = matcher;\r
- context.firstLine = line;\r
- context.nextLineLocation = fFile.getFilePointer();\r
- context.inputLine = input;\r
- return context;\r
- }\r
- }\r
- rawPos = fFile.getFilePointer();\r
- }\r
- return context;\r
- } catch (final FileNotFoundException e) {\r
- Activator.getDefault().logError("Error seeking event. File not found: " + getPath(), e); //$NON-NLS-1$\r
- return context;\r
- } catch (final IOException e) {\r
- Activator.getDefault().logError("Error seeking event. File: " + getPath(), e); //$NON-NLS-1$\r
- return context;\r
- }\r
-\r
- }\r
-\r
- @Override\r
- public synchronized TmfContext seekEvent(final double ratio) {\r
- if (fFile == null) {\r
- return new CustomTxtTraceContext(NULL_LOCATION, ITmfContext.UNKNOWN_RANK);\r
- }\r
- try {\r
- long pos = (long) (ratio * fFile.length());\r
- while (pos > 0) {\r
- fFile.seek(pos - 1);\r
- if (fFile.read() == '\n') {\r
- break;\r
- }\r
- pos--;\r
- }\r
- final ITmfLocation location = new TmfLongLocation(pos);\r
- final TmfContext context = seekEvent(location);\r
- context.setRank(ITmfContext.UNKNOWN_RANK);\r
- return context;\r
- } catch (final IOException e) {\r
- Activator.getDefault().logError("Error seeking event. File: " + getPath(), e); //$NON-NLS-1$\r
- return new CustomTxtTraceContext(NULL_LOCATION, ITmfContext.UNKNOWN_RANK);\r
- }\r
- }\r
-\r
- @Override\r
- public synchronized double getLocationRatio(final ITmfLocation location) {\r
- if (fFile == null) {\r
- return 0;\r
- }\r
- try {\r
- if (location.getLocationInfo() instanceof Long) {\r
- return (double) ((Long) location.getLocationInfo()) / fFile.length();\r
- }\r
- } catch (final IOException e) {\r
- Activator.getDefault().logError("Error seeking event. File: " + getPath(), e); //$NON-NLS-1$\r
- }\r
- return 0;\r
- }\r
-\r
- @Override\r
- public ITmfLocation getCurrentLocation() {\r
- // TODO Auto-generated method stub\r
- return null;\r
- }\r
-\r
- @Override\r
- public synchronized CustomTxtEvent parseEvent(final ITmfContext tmfContext) {\r
- ITmfContext context = seekEvent(tmfContext.getLocation());\r
- return parse(context);\r
- }\r
-\r
- @Override\r
- public synchronized CustomTxtEvent getNext(final ITmfContext context) {\r
- final ITmfContext savedContext = context.clone();\r
- final CustomTxtEvent event = parse(context);\r
- if (event != null) {\r
- updateAttributes(savedContext, event.getTimestamp());\r
- context.increaseRank();\r
- }\r
- return event;\r
- }\r
-\r
- private synchronized CustomTxtEvent parse(final ITmfContext tmfContext) {\r
- if (fFile == null) {\r
- return null;\r
- }\r
- if (!(tmfContext instanceof CustomTxtTraceContext)) {\r
- return null;\r
- }\r
-\r
- final CustomTxtTraceContext context = (CustomTxtTraceContext) tmfContext;\r
- if (!(context.getLocation().getLocationInfo() instanceof Long) || NULL_LOCATION.equals(context.getLocation())) {\r
- return null;\r
- }\r
-\r
- CustomTxtEvent event = parseFirstLine(context);\r
-\r
- final HashMap<InputLine, Integer> countMap = new HashMap<InputLine, Integer>();\r
- InputLine currentInput = null;\r
- if (context.inputLine.childrenInputs != null && context.inputLine.childrenInputs.size() > 0) {\r
- currentInput = context.inputLine.childrenInputs.get(0);\r
- countMap.put(currentInput, 0);\r
- }\r
-\r
- try {\r
- if (fFile.getFilePointer() != context.nextLineLocation) {\r
- fFile.seek(context.nextLineLocation);\r
- }\r
- String line;\r
- long rawPos = fFile.getFilePointer();\r
- while ((line = fFile.getNextLine()) != null) {\r
- boolean processed = false;\r
- if (currentInput == null) {\r
- for (final InputLine input : getFirstLines()) {\r
- final Matcher matcher = input.getPattern().matcher(line);\r
- if (matcher.find()) {\r
- context.setLocation(new TmfLongLocation(rawPos));\r
- context.firstLineMatcher = matcher;\r
- context.firstLine = line;\r
- context.nextLineLocation = fFile.getFilePointer();\r
- context.inputLine = input;\r
- return event;\r
- }\r
- }\r
- } else {\r
- if (countMap.get(currentInput) >= currentInput.getMinCount()) {\r
- final List<InputLine> nextInputs = currentInput.getNextInputs(countMap);\r
- if (nextInputs.size() == 0 || nextInputs.get(nextInputs.size() - 1).getMinCount() == 0) {\r
- for (final InputLine input : getFirstLines()) {\r
- final Matcher matcher = input.getPattern().matcher(line);\r
- if (matcher.find()) {\r
- context.setLocation(new TmfLongLocation(rawPos));\r
- context.firstLineMatcher = matcher;\r
- context.firstLine = line;\r
- context.nextLineLocation = fFile.getFilePointer();\r
- context.inputLine = input;\r
- return event;\r
- }\r
- }\r
- }\r
- for (final InputLine input : nextInputs) {\r
- final Matcher matcher = input.getPattern().matcher(line);\r
- if (matcher.find()) {\r
- event.processGroups(input, matcher);\r
- currentInput = input;\r
- if (countMap.get(currentInput) == null) {\r
- countMap.put(currentInput, 1);\r
- } else {\r
- countMap.put(currentInput, countMap.get(currentInput) + 1);\r
- }\r
- Iterator<InputLine> iter = countMap.keySet().iterator();\r
- while (iter.hasNext()) {\r
- final InputLine inputLine = iter.next();\r
- if (inputLine.level > currentInput.level) {\r
- iter.remove();\r
- }\r
- }\r
- if (currentInput.childrenInputs != null && currentInput.childrenInputs.size() > 0) {\r
- currentInput = currentInput.childrenInputs.get(0);\r
- countMap.put(currentInput, 0);\r
- } else if (countMap.get(currentInput) >= currentInput.getMaxCount()) {\r
- if (currentInput.getNextInputs(countMap).size() > 0) {\r
- currentInput = currentInput.getNextInputs(countMap).get(0);\r
- if (countMap.get(currentInput) == null) {\r
- countMap.put(currentInput, 0);\r
- }\r
- iter = countMap.keySet().iterator();\r
- while (iter.hasNext()) {\r
- final InputLine inputLine = iter.next();\r
- if (inputLine.level > currentInput.level) {\r
- iter.remove();\r
- }\r
- }\r
- } else {\r
- currentInput = null;\r
- }\r
- }\r
- processed = true;\r
- break;\r
- }\r
- }\r
- }\r
- if (! processed) {\r
- final Matcher matcher = currentInput.getPattern().matcher(line);\r
- if (matcher.find()) {\r
- event.processGroups(currentInput, matcher);\r
- countMap.put(currentInput, countMap.get(currentInput) + 1);\r
- if (currentInput.childrenInputs != null && currentInput.childrenInputs.size() > 0) {\r
- currentInput = currentInput.childrenInputs.get(0);\r
- countMap.put(currentInput, 0);\r
- } else if (countMap.get(currentInput) >= currentInput.getMaxCount()) {\r
- if (currentInput.getNextInputs(countMap).size() > 0) {\r
- currentInput = currentInput.getNextInputs(countMap).get(0);\r
- if (countMap.get(currentInput) == null) {\r
- countMap.put(currentInput, 0);\r
- }\r
- final Iterator<InputLine> iter = countMap.keySet().iterator();\r
- while (iter.hasNext()) {\r
- final InputLine inputLine = iter.next();\r
- if (inputLine.level > currentInput.level) {\r
- iter.remove();\r
- }\r
- }\r
- } else {\r
- currentInput = null;\r
- }\r
- }\r
- }\r
- ((StringBuffer) event.getContent().getValue()).append("\n").append(line); //$NON-NLS-1$\r
- }\r
- }\r
- rawPos = fFile.getFilePointer();\r
- }\r
- } catch (final IOException e) {\r
- Activator.getDefault().logError("Error seeking event. File: " + getPath(), e); //$NON-NLS-1$\r
- }\r
- for (final Entry<InputLine, Integer> entry : countMap.entrySet()) {\r
- if (entry.getValue() < entry.getKey().getMinCount()) {\r
- event = null;\r
- }\r
- }\r
- context.setLocation(NULL_LOCATION);\r
- return event;\r
- }\r
-\r
- public List<InputLine> getFirstLines() {\r
- return fDefinition.inputs;\r
- }\r
-\r
- public CustomTxtEvent parseFirstLine(final CustomTxtTraceContext context) {\r
- final CustomTxtEvent event = new CustomTxtEvent(fDefinition, this, TmfTimestamp.ZERO, "", fEventType, ""); //$NON-NLS-1$ //$NON-NLS-2$\r
- event.processGroups(context.inputLine, context.firstLineMatcher);\r
- event.setContent(new CustomEventContent(event, new StringBuffer(context.firstLine)));\r
- return event;\r
- }\r
-\r
- public CustomTraceDefinition getDefinition() {\r
- return fDefinition;\r
- }\r
-\r
- /* (non-Javadoc)\r
- * @see org.eclipse.linuxtools.tmf.core.trace.ITmfTrace#validate(org.eclipse.core.resources.IProject, java.lang.String)\r
- */\r
- @Override\r
- public boolean validate(IProject project, String path) {\r
- return fileExists(path);\r
- }\r
-}\r
+/*******************************************************************************
+ * Copyright (c) 2010 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Patrick Tasse - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.tmf.ui.parsers.custom;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map.Entry;
+import java.util.regex.Matcher;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.linuxtools.internal.tmf.ui.Activator;
+import org.eclipse.linuxtools.internal.tmf.ui.parsers.custom.CustomTxtTraceDefinition.InputLine;
+import org.eclipse.linuxtools.tmf.core.event.ITmfEvent;
+import org.eclipse.linuxtools.tmf.core.event.TmfTimestamp;
+import org.eclipse.linuxtools.tmf.core.exceptions.TmfTraceException;
+import org.eclipse.linuxtools.tmf.core.io.BufferedRandomAccessFile;
+import org.eclipse.linuxtools.tmf.core.trace.ITmfContext;
+import org.eclipse.linuxtools.tmf.core.trace.ITmfEventParser;
+import org.eclipse.linuxtools.tmf.core.trace.ITmfLocation;
+import org.eclipse.linuxtools.tmf.core.trace.TmfContext;
+import org.eclipse.linuxtools.tmf.core.trace.TmfLongLocation;
+import org.eclipse.linuxtools.tmf.core.trace.TmfTrace;
+
+public class CustomTxtTrace extends TmfTrace implements ITmfEventParser {
+
+ private static final TmfLongLocation NULL_LOCATION = new TmfLongLocation((Long) null);
+ private static final int DEFAULT_CACHE_SIZE = 100;
+
+ private final CustomTxtTraceDefinition fDefinition;
+ private final CustomTxtEventType fEventType;
+ private BufferedRandomAccessFile fFile;
+
+ public CustomTxtTrace(final CustomTxtTraceDefinition definition) {
+ fDefinition = definition;
+ fEventType = new CustomTxtEventType(fDefinition);
+ setCacheSize(DEFAULT_CACHE_SIZE);
+ }
+
+ public CustomTxtTrace(final IResource resource, final CustomTxtTraceDefinition definition, final String path, final int cacheSize) throws TmfTraceException {
+ this(definition);
+ setCacheSize((cacheSize > 0) ? cacheSize : DEFAULT_CACHE_SIZE);
+ initTrace(resource, path, CustomTxtEvent.class);
+ }
+
+ @Override
+ public void initTrace(final IResource resource, final String path, final Class<? extends ITmfEvent> eventType) throws TmfTraceException {
+ super.initTrace(resource, path, eventType);
+ try {
+ fFile = new BufferedRandomAccessFile(getPath(), "r"); //$NON-NLS-1$
+ } catch (IOException e) {
+ throw new TmfTraceException(e.getMessage(), e);
+ }
+ indexTrace(false);
+ }
+
+ @Override
+ public synchronized void dispose() {
+ super.dispose();
+ if (fFile != null) {
+ try {
+ fFile.close();
+ } catch (IOException e) {
+ } finally {
+ fFile = null;
+ }
+ }
+ }
+
+ @Override
+ public synchronized TmfContext seekEvent(final ITmfLocation location) {
+ final CustomTxtTraceContext context = new CustomTxtTraceContext(NULL_LOCATION, ITmfContext.UNKNOWN_RANK);
+ if (NULL_LOCATION.equals(location) || fFile == null) {
+ return context;
+ }
+ try {
+ if (location == null) {
+ fFile.seek(0);
+ } else if (location.getLocationInfo() instanceof Long) {
+ fFile.seek((Long) location.getLocationInfo());
+ }
+ String line;
+ long rawPos = fFile.getFilePointer();
+ while ((line = fFile.getNextLine()) != null) {
+ for (final InputLine input : getFirstLines()) {
+ final Matcher matcher = input.getPattern().matcher(line);
+ if (matcher.find()) {
+ context.setLocation(new TmfLongLocation(rawPos));
+ context.firstLineMatcher = matcher;
+ context.firstLine = line;
+ context.nextLineLocation = fFile.getFilePointer();
+ context.inputLine = input;
+ return context;
+ }
+ }
+ rawPos = fFile.getFilePointer();
+ }
+ return context;
+ } catch (final FileNotFoundException e) {
+ Activator.getDefault().logError("Error seeking event. File not found: " + getPath(), e); //$NON-NLS-1$
+ return context;
+ } catch (final IOException e) {
+ Activator.getDefault().logError("Error seeking event. File: " + getPath(), e); //$NON-NLS-1$
+ return context;
+ }
+
+ }
+
+ @Override
+ public synchronized TmfContext seekEvent(final double ratio) {
+ if (fFile == null) {
+ return new CustomTxtTraceContext(NULL_LOCATION, ITmfContext.UNKNOWN_RANK);
+ }
+ try {
+ long pos = (long) (ratio * fFile.length());
+ while (pos > 0) {
+ fFile.seek(pos - 1);
+ if (fFile.read() == '\n') {
+ break;
+ }
+ pos--;
+ }
+ final ITmfLocation location = new TmfLongLocation(pos);
+ final TmfContext context = seekEvent(location);
+ context.setRank(ITmfContext.UNKNOWN_RANK);
+ return context;
+ } catch (final IOException e) {
+ Activator.getDefault().logError("Error seeking event. File: " + getPath(), e); //$NON-NLS-1$
+ return new CustomTxtTraceContext(NULL_LOCATION, ITmfContext.UNKNOWN_RANK);
+ }
+ }
+
+ @Override
+ public synchronized double getLocationRatio(final ITmfLocation location) {
+ if (fFile == null) {
+ return 0;
+ }
+ try {
+ if (location.getLocationInfo() instanceof Long) {
+ return (double) ((Long) location.getLocationInfo()) / fFile.length();
+ }
+ } catch (final IOException e) {
+ Activator.getDefault().logError("Error seeking event. File: " + getPath(), e); //$NON-NLS-1$
+ }
+ return 0;
+ }
+
+ @Override
+ public ITmfLocation getCurrentLocation() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public synchronized CustomTxtEvent parseEvent(final ITmfContext tmfContext) {
+ ITmfContext context = seekEvent(tmfContext.getLocation());
+ return parse(context);
+ }
+
+ @Override
+ public synchronized CustomTxtEvent getNext(final ITmfContext context) {
+ final ITmfContext savedContext = context.clone();
+ final CustomTxtEvent event = parse(context);
+ if (event != null) {
+ updateAttributes(savedContext, event.getTimestamp());
+ context.increaseRank();
+ }
+ return event;
+ }
+
+ private synchronized CustomTxtEvent parse(final ITmfContext tmfContext) {
+ if (fFile == null) {
+ return null;
+ }
+ if (!(tmfContext instanceof CustomTxtTraceContext)) {
+ return null;
+ }
+
+ final CustomTxtTraceContext context = (CustomTxtTraceContext) tmfContext;
+ if (!(context.getLocation().getLocationInfo() instanceof Long) || NULL_LOCATION.equals(context.getLocation())) {
+ return null;
+ }
+
+ CustomTxtEvent event = parseFirstLine(context);
+
+ final HashMap<InputLine, Integer> countMap = new HashMap<InputLine, Integer>();
+ InputLine currentInput = null;
+ if (context.inputLine.childrenInputs != null && context.inputLine.childrenInputs.size() > 0) {
+ currentInput = context.inputLine.childrenInputs.get(0);
+ countMap.put(currentInput, 0);
+ }
+
+ try {
+ if (fFile.getFilePointer() != context.nextLineLocation) {
+ fFile.seek(context.nextLineLocation);
+ }
+ String line;
+ long rawPos = fFile.getFilePointer();
+ while ((line = fFile.getNextLine()) != null) {
+ boolean processed = false;
+ if (currentInput == null) {
+ for (final InputLine input : getFirstLines()) {
+ final Matcher matcher = input.getPattern().matcher(line);
+ if (matcher.find()) {
+ context.setLocation(new TmfLongLocation(rawPos));
+ context.firstLineMatcher = matcher;
+ context.firstLine = line;
+ context.nextLineLocation = fFile.getFilePointer();
+ context.inputLine = input;
+ return event;
+ }
+ }
+ } else {
+ if (countMap.get(currentInput) >= currentInput.getMinCount()) {
+ final List<InputLine> nextInputs = currentInput.getNextInputs(countMap);
+ if (nextInputs.size() == 0 || nextInputs.get(nextInputs.size() - 1).getMinCount() == 0) {
+ for (final InputLine input : getFirstLines()) {
+ final Matcher matcher = input.getPattern().matcher(line);
+ if (matcher.find()) {
+ context.setLocation(new TmfLongLocation(rawPos));
+ context.firstLineMatcher = matcher;
+ context.firstLine = line;
+ context.nextLineLocation = fFile.getFilePointer();
+ context.inputLine = input;
+ return event;
+ }
+ }
+ }
+ for (final InputLine input : nextInputs) {
+ final Matcher matcher = input.getPattern().matcher(line);
+ if (matcher.find()) {
+ event.processGroups(input, matcher);
+ currentInput = input;
+ if (countMap.get(currentInput) == null) {
+ countMap.put(currentInput, 1);
+ } else {
+ countMap.put(currentInput, countMap.get(currentInput) + 1);
+ }
+ Iterator<InputLine> iter = countMap.keySet().iterator();
+ while (iter.hasNext()) {
+ final InputLine inputLine = iter.next();
+ if (inputLine.level > currentInput.level) {
+ iter.remove();
+ }
+ }
+ if (currentInput.childrenInputs != null && currentInput.childrenInputs.size() > 0) {
+ currentInput = currentInput.childrenInputs.get(0);
+ countMap.put(currentInput, 0);
+ } else if (countMap.get(currentInput) >= currentInput.getMaxCount()) {
+ if (currentInput.getNextInputs(countMap).size() > 0) {
+ currentInput = currentInput.getNextInputs(countMap).get(0);
+ if (countMap.get(currentInput) == null) {
+ countMap.put(currentInput, 0);
+ }
+ iter = countMap.keySet().iterator();
+ while (iter.hasNext()) {
+ final InputLine inputLine = iter.next();
+ if (inputLine.level > currentInput.level) {
+ iter.remove();
+ }
+ }
+ } else {
+ currentInput = null;
+ }
+ }
+ processed = true;
+ break;
+ }
+ }
+ }
+ if (! processed) {
+ final Matcher matcher = currentInput.getPattern().matcher(line);
+ if (matcher.find()) {
+ event.processGroups(currentInput, matcher);
+ countMap.put(currentInput, countMap.get(currentInput) + 1);
+ if (currentInput.childrenInputs != null && currentInput.childrenInputs.size() > 0) {
+ currentInput = currentInput.childrenInputs.get(0);
+ countMap.put(currentInput, 0);
+ } else if (countMap.get(currentInput) >= currentInput.getMaxCount()) {
+ if (currentInput.getNextInputs(countMap).size() > 0) {
+ currentInput = currentInput.getNextInputs(countMap).get(0);
+ if (countMap.get(currentInput) == null) {
+ countMap.put(currentInput, 0);
+ }
+ final Iterator<InputLine> iter = countMap.keySet().iterator();
+ while (iter.hasNext()) {
+ final InputLine inputLine = iter.next();
+ if (inputLine.level > currentInput.level) {
+ iter.remove();
+ }
+ }
+ } else {
+ currentInput = null;
+ }
+ }
+ }
+ ((StringBuffer) event.getContent().getValue()).append("\n").append(line); //$NON-NLS-1$
+ }
+ }
+ rawPos = fFile.getFilePointer();
+ }
+ } catch (final IOException e) {
+ Activator.getDefault().logError("Error seeking event. File: " + getPath(), e); //$NON-NLS-1$
+ }
+ for (final Entry<InputLine, Integer> entry : countMap.entrySet()) {
+ if (entry.getValue() < entry.getKey().getMinCount()) {
+ event = null;
+ }
+ }
+ context.setLocation(NULL_LOCATION);
+ return event;
+ }
+
+ public List<InputLine> getFirstLines() {
+ return fDefinition.inputs;
+ }
+
+ public CustomTxtEvent parseFirstLine(final CustomTxtTraceContext context) {
+ final CustomTxtEvent event = new CustomTxtEvent(fDefinition, this, TmfTimestamp.ZERO, "", fEventType, ""); //$NON-NLS-1$ //$NON-NLS-2$
+ event.processGroups(context.inputLine, context.firstLineMatcher);
+ event.setContent(new CustomEventContent(event, new StringBuffer(context.firstLine)));
+ return event;
+ }
+
+ public CustomTraceDefinition getDefinition() {
+ return fDefinition;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.linuxtools.tmf.core.trace.ITmfTrace#validate(org.eclipse.core.resources.IProject, java.lang.String)
+ */
+ @Override
+ public boolean validate(IProject project, String path) {
+ return fileExists(path);
+ }
+}