/*******************************************************************************
- * Copyright (c) 2010, 2015 Ericsson
+ * Copyright (c) 2010, 2016 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v1.0 which
package org.eclipse.tracecompass.tmf.core.parsers.custom;
+import static org.eclipse.tracecompass.common.core.NonNullUtils.checkNotNull;
+
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import org.eclipse.tracecompass.internal.tmf.core.Activator;
import org.eclipse.tracecompass.internal.tmf.core.parsers.custom.CustomEventAspects;
import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
+import org.eclipse.tracecompass.tmf.core.event.ITmfEventField;
import org.eclipse.tracecompass.tmf.core.event.aspect.ITmfEventAspect;
import org.eclipse.tracecompass.tmf.core.exceptions.TmfTraceException;
import org.eclipse.tracecompass.tmf.core.io.BufferedRandomAccessFile;
+import org.eclipse.tracecompass.tmf.core.parsers.custom.CustomTraceDefinition.Tag;
+import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler;
+import org.eclipse.tracecompass.tmf.core.signal.TmfTraceRangeUpdatedSignal;
import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp;
import org.eclipse.tracecompass.tmf.core.trace.ITmfContext;
import org.eclipse.tracecompass.tmf.core.trace.TmfContext;
import org.eclipse.tracecompass.tmf.core.trace.TmfTrace;
+import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils;
import org.eclipse.tracecompass.tmf.core.trace.TraceValidationStatus;
import org.eclipse.tracecompass.tmf.core.trace.indexer.ITmfPersistentlyIndexable;
import org.eclipse.tracecompass.tmf.core.trace.indexer.ITmfTraceIndexer;
private static final int CONFIDENCE = 100;
private final CustomXmlTraceDefinition fDefinition;
- private final CustomXmlEventType fEventType;
+ private final ITmfEventField fRootField;
private final CustomXmlInputElement fRecordInputElement;
private BufferedRandomAccessFile fFile;
- private final String fTraceTypeId;
+ private final @NonNull String fTraceTypeId;
private static final char SEPARATOR = ':';
private static final String CUSTOM_XML_TRACE_TYPE_PREFIX = "custom.xml.trace" + SEPARATOR; //$NON-NLS-1$
*/
public CustomXmlTrace(final CustomXmlTraceDefinition definition) {
fDefinition = definition;
- fEventType = new CustomXmlEventType(fDefinition);
+ fRootField = CustomEventType.getRootField(definition);
fRecordInputElement = getRecordInputElement(fDefinition.rootInputElement);
fTraceTypeId = buildTraceTypeId(definition.categoryName, definition.definitionName);
setCacheSize(DEFAULT_CACHE_SIZE);
@Override
public void initTrace(final IResource resource, final String path, final Class<? extends ITmfEvent> eventType) throws TmfTraceException {
super.initTrace(resource, path, eventType);
+ initFile();
+ }
+
+ private void initFile() throws TmfTraceException {
+ closeFile();
try {
fFile = new BufferedRandomAccessFile(getPath(), "r"); //$NON-NLS-1$
} catch (IOException e) {
@Override
public synchronized void dispose() {
super.dispose();
+ closeFile();
+ }
+
+ private void closeFile() {
if (fFile != null) {
try {
fFile.close();
}
@Override
- public Iterable<ITmfEventAspect> getEventAspects() {
+ public Iterable<ITmfEventAspect<?>> getEventAspects() {
return CustomEventAspects.generateAspects(fDefinition);
}
final Element element = parseElementBuffer(elementBuffer);
event = extractEvent(element, fRecordInputElement);
- ((StringBuffer) event.getContent().getValue()).append(elementBuffer);
+ ((StringBuffer) event.getContentValue()).append(elementBuffer);
long rawPos = fFile.getFilePointer();
String line = fFile.getNextLine();
if (!element.hasChildNodes()) {
buffer.append(element.getNodeName());
} else if (element.getChildNodes().getLength() == 1 && element.getFirstChild().getNodeType() == Node.TEXT_NODE) {
- buffer.append(element.getNodeName() + ":" + element.getFirstChild().getNodeValue().trim()); //$NON-NLS-1$
+ buffer.append(element.getNodeName());
+ buffer.append(':');
+ buffer.append(element.getFirstChild().getNodeValue().trim());
} else {
buffer.append(element.getNodeName());
buffer.append(" [ "); //$NON-NLS-1$
* @return The extracted event
*/
public CustomXmlEvent extractEvent(final Element element, final CustomXmlInputElement inputElement) {
- final CustomXmlEvent event = new CustomXmlEvent(fDefinition, this, TmfTimestamp.ZERO, fEventType);
+ CustomXmlEventType eventType = new CustomXmlEventType(checkNotNull(fDefinition.definitionName), fRootField);
+ final CustomXmlEvent event = new CustomXmlEvent(fDefinition, this, TmfTimestamp.ZERO, eventType);
event.setContent(new CustomEventContent(event, new StringBuffer()));
parseElement(element, event, inputElement);
return event;
}
private void parseElement(final Element element, final CustomXmlEvent event, final CustomXmlInputElement inputElement) {
- if (inputElement.getInputName() != null && !inputElement.getInputName().equals(CustomXmlTraceDefinition.TAG_IGNORE)) {
- event.parseInput(parseElement(element, new StringBuffer()).toString(), inputElement.getInputName(), inputElement.getInputAction(), inputElement.getInputFormat());
+ String eventType = inputElement.getEventType();
+ if (eventType != null && event.getType() instanceof CustomEventType) {
+ ((CustomEventType) event.getType()).setName(eventType);
+ }
+ if (!inputElement.getInputTag().equals(Tag.IGNORE)) {
+ event.parseInput(parseElement(element, new StringBuffer()).toString(), inputElement.getInputTag(), inputElement.getInputName(), inputElement.getInputAction(), inputElement.getInputFormat());
}
if (inputElement.getAttributes() != null) {
for (final CustomXmlInputAttribute attribute : inputElement.getAttributes()) {
- event.parseInput(element.getAttribute(attribute.getAttributeName()), attribute.getInputName(), attribute.getInputAction(), attribute.getInputFormat());
+ event.parseInput(element.getAttribute(attribute.getAttributeName()), attribute.getInputTag(), attribute.getInputName(), attribute.getInputAction(), attribute.getInputFormat());
}
}
final NodeList childNodes = element.getChildNodes();
if (!file.exists() || !file.isFile() || !file.canRead()) {
return new Status(IStatus.ERROR, Activator.PLUGIN_ID, Messages.CustomTrace_FileNotFound + ": " + path); //$NON-NLS-1$
}
+ try {
+ if (!TmfTraceUtils.isText(file)) {
+ return new TraceValidationStatus(0, Activator.PLUGIN_ID);
+ }
+ } catch (IOException e) {
+ Activator.logError("Error validating file: " + path, e); //$NON-NLS-1$
+ return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "IOException validating file: " + path, e); //$NON-NLS-1$
+ }
try (BufferedRandomAccessFile rafile = new BufferedRandomAccessFile(path, "r")) { //$NON-NLS-1$
int lineCount = 0;
long rawPos = 0;
}
return traceTypeId;
}
+
+ @TmfSignalHandler
+ @Override
+ public void traceRangeUpdated(TmfTraceRangeUpdatedSignal signal) {
+ if (signal.getTrace() == this) {
+ try {
+ synchronized (this) {
+ // Reset the file handle in case it has reached the end of the
+ // file already. Otherwise, it will not be able to read new data
+ // pass the previous end.
+ initFile();
+ }
+ } catch (TmfTraceException e) {
+ Activator.logError(e.getLocalizedMessage(), e);
+ }
+ }
+ super.traceRangeUpdated(signal);
+ }
}