/*******************************************************************************\r
* Copyright (c) 2010 Ericsson\r
- * \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
+ *\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.File;\r
import java.io.FileNotFoundException;\r
import java.io.IOException;\r
import java.util.HashMap;\r
\r
import org.eclipse.core.resources.IProject;\r
import org.eclipse.core.resources.IResource;\r
-import org.eclipse.linuxtools.internal.tmf.ui.TmfUiPlugin;\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.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.TmfLongLocation;\r
import org.eclipse.linuxtools.tmf.core.trace.TmfTrace;\r
\r
-public class CustomTxtTrace extends TmfTrace<CustomTxtEvent> implements ITmfEventParser<CustomTxtEvent> {\r
+public class CustomTxtTrace extends TmfTrace implements ITmfEventParser {\r
\r
- private static final TmfLocation<Long> NULL_LOCATION = new TmfLocation<Long>((Long) null);\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 pageSize) throws TmfTraceException {\r
- super(resource, CustomTxtEvent.class, path, (pageSize > 0) ? pageSize : DEFAULT_CACHE_SIZE);\r
- fDefinition = definition;\r
- fEventType = new CustomTxtEventType(fDefinition);\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
+ 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 TmfContext seekEvent(final ITmfLocation<?> location) {\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) || !new File(getPath()).isFile())\r
+ if (NULL_LOCATION.equals(location) || fFile == null) {\r
return context;\r
- BufferedRandomAccessFile raFile = null;\r
+ }\r
try {\r
- raFile = new BufferedRandomAccessFile(getPath(), "r"); //$NON-NLS-1$\r
- if (location != null && location.getLocation() instanceof Long) {\r
- raFile.seek((Long)location.getLocation());\r
+ if (location == null) {\r
+ fFile.seek(0);\r
+ } else if (location.getLocationData() instanceof Long) {\r
+ fFile.seek((Long) location.getLocationData());\r
}\r
String line;\r
- long rawPos = raFile.getFilePointer();\r
- while ((line = raFile.getNextLine()) != null) {\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.raFile = raFile;\r
+ context.setLocation(new TmfLongLocation(rawPos));\r
context.firstLineMatcher = matcher;\r
context.firstLine = line;\r
- context.nextLineLocation = raFile.getFilePointer();\r
+ context.nextLineLocation = fFile.getFilePointer();\r
context.inputLine = input;\r
return context;\r
}\r
}\r
- rawPos = raFile.getFilePointer();\r
+ rawPos = fFile.getFilePointer();\r
}\r
return context;\r
} catch (final FileNotFoundException e) {\r
- TmfUiPlugin.getDefault().logError("Error seeking event. File not found: " + getPath(), e); //$NON-NLS-1$\r
+ Activator.getDefault().logError("Error seeking event. File not found: " + getPath(), e); //$NON-NLS-1$\r
return context;\r
} catch (final IOException e) {\r
- TmfUiPlugin.getDefault().logError("Error seeking event. File: " + getPath(), e); //$NON-NLS-1$\r
+ Activator.getDefault().logError("Error seeking event. File: " + getPath(), e); //$NON-NLS-1$\r
return context;\r
- } finally {\r
- if (raFile != null) {\r
- try {\r
- raFile.close();\r
- } catch (final IOException e) {\r
- }\r
- }\r
}\r
\r
}\r
\r
@Override\r
- public TmfContext seekEvent(final double ratio) {\r
- BufferedRandomAccessFile raFile = null;\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
- raFile = new BufferedRandomAccessFile(getPath(), "r"); //$NON-NLS-1$\r
- long pos = (long) (ratio * raFile.length());\r
+ long pos = (long) (ratio * fFile.length());\r
while (pos > 0) {\r
- raFile.seek(pos - 1);\r
- if (raFile.read() == '\n') {\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 ITmfLocation location = new TmfLongLocation(pos);\r
final TmfContext context = seekEvent(location);\r
context.setRank(ITmfContext.UNKNOWN_RANK);\r
return context;\r
- } catch (final FileNotFoundException e) {\r
- TmfUiPlugin.getDefault().logError("Error seeking event. File not found: " + getPath(), e); //$NON-NLS-1$\r
- return new CustomTxtTraceContext(NULL_LOCATION, ITmfContext.UNKNOWN_RANK);\r
} catch (final IOException e) {\r
- TmfUiPlugin.getDefault().logError("Error seeking event. File: " + getPath(), e); //$NON-NLS-1$\r
+ Activator.getDefault().logError("Error seeking event. File: " + getPath(), e); //$NON-NLS-1$\r
return new CustomTxtTraceContext(NULL_LOCATION, ITmfContext.UNKNOWN_RANK);\r
- } finally {\r
- if (raFile != null) {\r
- try {\r
- raFile.close();\r
- } catch (final IOException e) {\r
- }\r
- }\r
}\r
}\r
\r
@Override\r
- public double getLocationRatio(final ITmfLocation<?> location) {\r
- BufferedRandomAccessFile raFile = null;\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
- raFile = new BufferedRandomAccessFile(getPath(), "r"); //$NON-NLS-1$\r
- return (double) ((Long) location.getLocation()) / raFile.length();\r
+ if (location.getLocationData() instanceof Long) {\r
+ return (double) ((Long) location.getLocationData()) / fFile.length();\r
}\r
- } catch (final FileNotFoundException e) {\r
- TmfUiPlugin.getDefault().logError("Error seeking event. File not found: " + getPath(), e); //$NON-NLS-1$\r
} catch (final IOException e) {\r
- TmfUiPlugin.getDefault().logError("Error seeking event. File: " + getPath(), e); //$NON-NLS-1$\r
- } finally {\r
- if (raFile != null) {\r
- try {\r
- raFile.close();\r
- } catch (final IOException e) {\r
- }\r
- }\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
+ 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 = parseEvent(context);\r
+ final CustomTxtEvent event = parse(context);\r
if (event != null) {\r
updateAttributes(savedContext, event.getTimestamp());\r
context.increaseRank();\r
return event;\r
}\r
\r
- @Override\r
- public CustomTxtEvent parseEvent(final ITmfContext tmfContext) {\r
- if (!(tmfContext instanceof CustomTxtTraceContext))\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
+ if (!(context.getLocation().getLocationData() instanceof Long) || NULL_LOCATION.equals(context.getLocation())) {\r
return null;\r
+ }\r
\r
CustomTxtEvent event = parseFirstLine(context);\r
\r
countMap.put(currentInput, 0);\r
}\r
\r
- synchronized (context.raFile) {\r
- try {\r
- if (context.raFile.getFilePointer() != context.nextLineLocation) {\r
- context.raFile.seek(context.nextLineLocation);\r
- }\r
- String line;\r
- long rawPos = context.raFile.getFilePointer();\r
- while ((line = context.raFile.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 = context.raFile.getFilePointer();\r
- context.inputLine = input;\r
- return event;\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
- } 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 = context.raFile.getFilePointer();\r
- context.inputLine = input;\r
- return event;\r
- }\r
- }\r
- }\r
- for (final InputLine input : nextInputs) {\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
- 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
- processed = true;\r
- break;\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
- if (! processed) {\r
- final Matcher matcher = currentInput.getPattern().matcher(line);\r
+ for (final InputLine input : nextInputs) {\r
+ final Matcher matcher = input.getPattern().matcher(line);\r
if (matcher.find()) {\r
- event.processGroups(currentInput, matcher);\r
- countMap.put(currentInput, countMap.get(currentInput) + 1);\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
+ } 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
+ iter = countMap.keySet().iterator();\r
while (iter.hasNext()) {\r
final InputLine inputLine = iter.next();\r
if (inputLine.level > currentInput.level) {\r
} else {\r
currentInput = null;\r
}\r
+ }\r
+ processed = true;\r
+ break;\r
}\r
- ((StringBuffer) event.getContent().getValue()).append("\n").append(line); //$NON-NLS-1$\r
}\r
}\r
- rawPos = context.raFile.getFilePointer();\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
- } catch (final IOException e) {\r
- TmfUiPlugin.getDefault().logError("Error seeking event. File: " + getPath(), e); //$NON-NLS-1$\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
+ 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
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, context.firstLine));\r
+ event.setContent(new CustomEventContent(event, new StringBuffer(context.firstLine)));\r
return event;\r
}\r
\r