/*******************************************************************************
- * Copyright (c) 2010, 2013 Ericsson
+ * Copyright (c) 2010, 2015 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v1.0 which
import java.util.Stack;
+import org.eclipse.tracecompass.tmf.core.event.aspect.ITmfEventAspect;
+import org.eclipse.tracecompass.tmf.core.event.aspect.TmfEventFieldAspect;
import org.eclipse.tracecompass.tmf.core.filter.model.ITmfFilterTreeNode;
import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterAndNode;
+import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterAspectNode;
import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterCompareNode;
+import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterCompareNode.Type;
import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterContainsNode;
import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterEqualsNode;
-import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterEventTypeNode;
import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterMatchesNode;
import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterNode;
import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterOrNode;
import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterRootNode;
+import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterTraceTypeNode;
import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterTreeNode;
-import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterCompareNode.Type;
+import org.eclipse.tracecompass.tmf.core.project.model.TmfTraceType;
+import org.eclipse.tracecompass.tmf.core.project.model.TraceTypeHelper;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
*/
public class TmfFilterContentHandler extends DefaultHandler {
+ // Backward compatibility strings
+ private static final String EVENTTYPE_NODE_NAME = "EVENTTYPE"; //$NON-NLS-1$
+ private static final String NAME_ATTR = "name"; //$NON-NLS-1$
+ private static final String LTTNG_KERNEL_TRACE = "Common Trace Format : LTTng Kernel Trace"; //$NON-NLS-1$
+ private static final String LINUX_KERNEL_TRACE = "Common Trace Format : Linux Kernel Trace"; //$NON-NLS-1$
+ private static final String FIELD_ATTR = "field"; //$NON-NLS-1$
+ private static final String EVENT_FIELD_TIMESTAMP = ":timestamp:"; //$NON-NLS-1$
+ private static final String EVENT_FIELD_TYPE = ":type:"; //$NON-NLS-1$
+ private static final String EVENT_FIELD_CONTENT = ":content:"; //$NON-NLS-1$
+
private ITmfFilterTreeNode fRoot = null;
private Stack<ITmfFilterTreeNode> fFilterTreeStack = null;
node = new TmfFilterNode(atts.getValue(TmfFilterNode.NAME_ATTR));
- } else if (localName.equals(TmfFilterEventTypeNode.NODE_NAME)) {
+ } else if (localName.equals(TmfFilterTraceTypeNode.NODE_NAME)) {
- node = new TmfFilterEventTypeNode(null);
- ((TmfFilterEventTypeNode) node).setEventType(atts.getValue(TmfFilterEventTypeNode.TYPE_ATTR));
- ((TmfFilterEventTypeNode) node).setName(atts.getValue(TmfFilterEventTypeNode.NAME_ATTR));
+ node = new TmfFilterTraceTypeNode(null);
+ String traceTypeId = atts.getValue(TmfFilterTraceTypeNode.TYPE_ATTR);
+ traceTypeId = TmfTraceType.buildCompatibilityTraceTypeId(traceTypeId);
+ ((TmfFilterTraceTypeNode) node).setTraceTypeId(traceTypeId);
+ TraceTypeHelper helper = TmfTraceType.getTraceType(traceTypeId);
+ if (helper != null) {
+ ((TmfFilterTraceTypeNode) node).setTraceClass(helper.getTraceClass());
+ }
+ ((TmfFilterTraceTypeNode) node).setName(atts.getValue(TmfFilterTraceTypeNode.NAME_ATTR));
} else if (localName.equals(TmfFilterAndNode.NODE_NAME)) {
if (value != null && value.equalsIgnoreCase(Boolean.TRUE.toString())) {
((TmfFilterContainsNode) node).setNot(true);
}
- ((TmfFilterContainsNode) node).setField(atts.getValue(TmfFilterContainsNode.FIELD_ATTR));
+ createEventAspect((TmfFilterAspectNode) node, atts);
((TmfFilterContainsNode) node).setValue(atts.getValue(TmfFilterContainsNode.VALUE_ATTR));
value = atts.getValue(TmfFilterContainsNode.IGNORECASE_ATTR);
if (value != null && value.equalsIgnoreCase(Boolean.TRUE.toString())) {
if (value != null && value.equalsIgnoreCase(Boolean.TRUE.toString())) {
((TmfFilterEqualsNode) node).setNot(true);
}
- ((TmfFilterEqualsNode) node).setField(atts.getValue(TmfFilterEqualsNode.FIELD_ATTR));
+ createEventAspect((TmfFilterAspectNode) node, atts);
((TmfFilterEqualsNode) node).setValue(atts.getValue(TmfFilterEqualsNode.VALUE_ATTR));
value = atts.getValue(TmfFilterEqualsNode.IGNORECASE_ATTR);
if (value != null && value.equalsIgnoreCase(Boolean.TRUE.toString())) {
if (value != null && value.equalsIgnoreCase(Boolean.TRUE.toString())) {
((TmfFilterMatchesNode) node).setNot(true);
}
- ((TmfFilterMatchesNode) node).setField(atts.getValue(TmfFilterMatchesNode.FIELD_ATTR));
+ createEventAspect((TmfFilterAspectNode) node, atts);
((TmfFilterMatchesNode) node).setRegex(atts.getValue(TmfFilterMatchesNode.REGEX_ATTR));
} else if (localName.equals(TmfFilterCompareNode.NODE_NAME)) {
if (value != null && value.equalsIgnoreCase(Boolean.TRUE.toString())) {
((TmfFilterCompareNode) node).setNot(true);
}
- ((TmfFilterCompareNode) node).setField(atts.getValue(TmfFilterCompareNode.FIELD_ATTR));
+ createEventAspect((TmfFilterAspectNode) node, atts);
value = atts.getValue(TmfFilterCompareNode.TYPE_ATTR);
if (value != null) {
((TmfFilterCompareNode) node).setType(Type.valueOf(value));
}
((TmfFilterCompareNode) node).setValue(atts.getValue(TmfFilterCompareNode.VALUE_ATTR));
+ // Backward compatibility with event type filter node
+ } else if (localName.equals(EVENTTYPE_NODE_NAME)) {
+
+ node = new TmfFilterTraceTypeNode(null);
+ String label = atts.getValue(NAME_ATTR);
+ if (label != null) {
+ // Backward compatibility with renamed LTTng Kernel Trace
+ if (label.equals(LTTNG_KERNEL_TRACE)) {
+ label = LINUX_KERNEL_TRACE;
+ }
+
+ String traceTypeId = TmfTraceType.getTraceTypeId(label);
+ TraceTypeHelper helper = TmfTraceType.getTraceType(traceTypeId);
+ if (helper == null) {
+ // Backward compatibility with category-less custom trace types
+ for (TraceTypeHelper h : TmfTraceType.getTraceTypeHelpers()) {
+ if (h.getName().equals(label)) {
+ label = h.getLabel();
+ helper = h;
+ break;
+ }
+ }
+ }
+ if (helper != null) {
+ ((TmfFilterTraceTypeNode) node).setTraceTypeId(helper.getTraceTypeId());
+ ((TmfFilterTraceTypeNode) node).setTraceClass(helper.getTraceClass());
+ }
+ ((TmfFilterTraceTypeNode) node).setName(label);
+ }
+
}
fFilterTreeStack.push(node);
}
+ private static void createEventAspect(TmfFilterAspectNode node, Attributes atts) {
+ String traceTypeId = atts.getValue(TmfFilterAspectNode.TRACE_TYPE_ID_ATTR);
+ traceTypeId = TmfTraceType.buildCompatibilityTraceTypeId(traceTypeId);
+ String name = atts.getValue(TmfFilterAspectNode.EVENT_ASPECT_ATTR);
+ if (TmfFilterAspectNode.BASE_ASPECT_ID.equals(traceTypeId)) {
+ for (ITmfEventAspect eventAspect : ITmfEventAspect.BASE_ASPECTS) {
+ if (eventAspect.getName().equals(name)) {
+ node.setEventAspect(eventAspect);
+ node.setTraceTypeId(traceTypeId);
+ if (eventAspect instanceof TmfEventFieldAspect) {
+ String field = atts.getValue(TmfFilterAspectNode.FIELD_ATTR);
+ if (field != null && !field.isEmpty()) {
+ node.setEventAspect(((TmfEventFieldAspect) eventAspect).forField(field));
+ }
+ }
+ break;
+ }
+ }
+ } else if (traceTypeId != null && name != null) {
+ TraceTypeHelper helper = TmfTraceType.getTraceType(traceTypeId);
+ if (helper != null) {
+ for (ITmfEventAspect eventAspect : helper.getTrace().getEventAspects()) {
+ if (eventAspect.getName().equals(name)) {
+ node.setEventAspect(eventAspect);
+ node.setTraceTypeId(traceTypeId);
+ if (eventAspect instanceof TmfEventFieldAspect) {
+ String field = atts.getValue(TmfFilterAspectNode.FIELD_ATTR);
+ if (field != null && !field.isEmpty()) {
+ node.setEventAspect(((TmfEventFieldAspect) eventAspect).forField(field));
+ }
+ }
+ break;
+ }
+ }
+ }
+ } else {
+ // Backward compatibility with field-based filters
+ String field = atts.getValue(FIELD_ATTR);
+ if (field != null) {
+ if (field.equals(EVENT_FIELD_TIMESTAMP)) {
+ node.setEventAspect(ITmfEventAspect.BaseAspects.TIMESTAMP);
+ node.setTraceTypeId(TmfFilterAspectNode.BASE_ASPECT_ID);
+ } else if (field.equals(EVENT_FIELD_TYPE)) {
+ node.setEventAspect(ITmfEventAspect.BaseAspects.EVENT_TYPE);
+ node.setTraceTypeId(TmfFilterAspectNode.BASE_ASPECT_ID);
+ } else if (field.equals(EVENT_FIELD_CONTENT)) {
+ node.setEventAspect(ITmfEventAspect.BaseAspects.CONTENTS);
+ node.setTraceTypeId(TmfFilterAspectNode.BASE_ASPECT_ID);
+ } else {
+ node.setEventAspect(ITmfEventAspect.BaseAspects.CONTENTS.forField(field));
+ node.setTraceTypeId(TmfFilterAspectNode.BASE_ASPECT_ID);
+ }
+ }
+ }
+ }
}