Fix clone of CtfTmfTimestamp in CtfTmfEvent.
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.core / src / org / eclipse / linuxtools / tmf / core / ctfadaptor / CtfTmfEvent.java
index acb3a658c2f69a8c55af3fcda98f7f3fb5b6c145..4fc75aa137c11f4849f17e2866877ccea38cb03f 100644 (file)
@@ -13,6 +13,7 @@ package org.eclipse.linuxtools.tmf.core.ctfadaptor;
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map.Entry;
 
@@ -25,12 +26,13 @@ import org.eclipse.linuxtools.tmf.core.event.ITmfEventType;
 import org.eclipse.linuxtools.tmf.core.event.ITmfTimestamp;
 
 /**
- * <b><u>CTFEvent</u></b>
- * <p>
- * This is a wrapper class around CTF's Event Definition/Declaration so that we
- * can map all types of Declaration to native Java types.
+ * A wrapper class around CTF's Event Definition/Declaration that maps all
+ * types of Declaration to native Java types.
+ *
+ * @version 1.0
+ * @author Alexandre Montplaisir
  */
-public final class CtfTmfEvent implements ITmfEvent {
+public final class CtfTmfEvent implements ITmfEvent, Cloneable {
 
     // ------------------------------------------------------------------------
     // Constants
@@ -38,7 +40,7 @@ public final class CtfTmfEvent implements ITmfEvent {
 
     private static final String NO_STREAM = "No stream"; //$NON-NLS-1$
     private static final String EMPTY_CTF_EVENT_NAME = "Empty CTF event"; //$NON-NLS-1$
-    private static final String CONTEXT_ID = "Ctf Event"; //$NON-NLS-1$
+
 
     // ------------------------------------------------------------------------
     // Attributes
@@ -62,9 +64,11 @@ public final class CtfTmfEvent implements ITmfEvent {
      * the StreamInputReader).
      *
      * @param eventDef
-
-     * @param fileName String
-     * @param originTrace CtfTmfTrace
+     *            CTF EventDefinition object corresponding to this trace event
+     * @param fileName
+     *            The path to the trace file
+     * @param originTrace
+     *            The trace from which this event originates
      */
     public CtfTmfEvent(EventDefinition eventDef, String fileName,
             CtfTmfTrace originTrace) {
@@ -81,8 +85,7 @@ public final class CtfTmfEvent implements ITmfEvent {
         }
 
         /* Read the base event info */
-        Long offset = originTrace.getCTFTrace().getOffset();
-        this.timestamp = eventDef.timestamp + offset;
+        this.timestamp = this.getTrace().getCTFTrace().timestampCyclesToNanos(eventDef.getTimestamp());
         this.sourceCPU = eventDef.getCPU();
         this.typeId = eventDef.getDeclaration().getId();
         this.eventName = eventDef.getDeclaration().getName();
@@ -98,10 +101,10 @@ public final class CtfTmfEvent implements ITmfEvent {
      * mess, and put them into something ITmfEventField can cope with.
      *
      * @param eventDef
-
-     * @return CtfTmfEventField[]
+     *            CTF EventDefinition to read
+     * @return CtfTmfEventField[] The array of fields that were read
      */
-    private static CtfTmfEventField[] parseFields(EventDefinition eventDef) {
+    public static CtfTmfEventField[] parseFields(EventDefinition eventDef) {
         List<CtfTmfEventField> fields = new ArrayList<CtfTmfEventField>();
 
         StructDefinition structFields = eventDef.getFields();
@@ -109,16 +112,12 @@ public final class CtfTmfEvent implements ITmfEvent {
         String curFieldName;
         Definition curFieldDef;
         CtfTmfEventField curField;
-
-        for (Entry<String, Definition> entry : definitions.entrySet()) {
+        Iterator<Entry<String, Definition>> it = definitions.entrySet().iterator();
+        while(it.hasNext()) {
+            Entry<String, Definition> entry = it.next();
             curFieldName = entry.getKey();
             curFieldDef = entry.getValue();
             curField = CtfTmfEventField.parseField(curFieldDef, curFieldName);
-            if (curField == null) {
-//                TmfCorePlugin.getDefault().log(
-//                        "We've parsed an unimplemented field type for event \"" + this.eventName //$NON-NLS-1$
-//                                + "\", field \"" + curFieldName + "\" of type " + curFieldDef.getClass().toString()); //$NON-NLS-1$ //$NON-NLS-2$
-            }
             fields.add(curField);
         }
 
@@ -129,6 +128,7 @@ public final class CtfTmfEvent implements ITmfEvent {
      * Copy constructor
      *
      * @param other
+     *            CtfTmfEvent to copy
      */
     public CtfTmfEvent(CtfTmfEvent other) {
         this.fTrace = other.getTrace();
@@ -143,11 +143,16 @@ public final class CtfTmfEvent implements ITmfEvent {
 
         /* Copy the fields over */
         this.fContent = (CtfTmfContent) other.fContent.clone();
+        this.fTimestamp = other.fTimestamp.clone();
     }
 
     /**
-     * Inner constructor to create "null" events. Don't use this directly, use
-     * CTFEvent.getNullEvent();
+     * Inner constructor to create "null" events. Don't use this directly in
+     * normal usage, use CtfTmfEvent.getNullEvent() to get an instance of an
+     * empty event.
+     *
+     * This needs to be public however because it's used in extension points,
+     * and the framework will use this constructor to get the class type.
      */
     public CtfTmfEvent() {
         this.fTrace = null;
@@ -156,8 +161,7 @@ public final class CtfTmfEvent implements ITmfEvent {
         this.typeId = -1;
         this.fileName = NO_STREAM;
         this.eventName = EMPTY_CTF_EVENT_NAME;
-        this.fContent = new CtfTmfContent("", new CtfTmfEventField[0]);
-
+        this.fContent = new CtfTmfContent("", new CtfTmfEventField[0]); //$NON-NLS-1$
     }
 
     // ------------------------------------------------------------------------
@@ -273,7 +277,6 @@ public final class CtfTmfEvent implements ITmfEvent {
         return fSource;
     }
 
-    private CtfTmfEventType type = null;
     /**
      * Method getType.
      * @return ITmfEventType
@@ -281,10 +284,11 @@ public final class CtfTmfEvent implements ITmfEvent {
      */
     @Override
     public ITmfEventType getType() {
-        if(type == null){
-            type = new CtfTmfEventType(CONTEXT_ID, eventName, fContent);
+        CtfTmfEventType ctfTmfEventType = CtfTmfEventType.get(eventName);
+        if( ctfTmfEventType == null ){
+            ctfTmfEventType = new CtfTmfEventType( this.getEventName(), this.getContent());
         }
-        return type;
+        return ctfTmfEventType;
     }
 
     /**
This page took 0.042053 seconds and 5 git commands to generate.