Merge branch 'master' into lttng-kepler
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.ui / src / org / eclipse / linuxtools / internal / tmf / ui / parsers / custom / CustomTxtTrace.java
index c6e731fe1fb5adc7b65135204cd259a61f990e02..9e06206c094687aec92de470adbd4d19e4cb6103 100644 (file)
-/*******************************************************************************\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.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.TmfLocation;\r
-import org.eclipse.linuxtools.tmf.core.trace.TmfTrace;\r
-\r
-public class CustomTxtTrace extends TmfTrace<CustomTxtEvent> implements ITmfEventParser<CustomTxtEvent> {\r
-\r
-    private static final TmfLocation<Long> NULL_LOCATION = new TmfLocation<Long>((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<CustomTxtEvent> 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.getLocation() instanceof Long) {\r
-                fFile.seek((Long) location.getLocation());\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 TmfLocation<Long>(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 TmfLocation<Long>(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.getLocation() instanceof Long) {\r
-                return (double) ((Long) location.getLocation()) / 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().getLocation() 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 TmfLocation<Long>(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 TmfLocation<Long>(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);
+    }
+}
This page took 0.035443 seconds and 5 git commands to generate.