ctf: Move CTF plugins to Java 7 and fix warnings
[deliverable/tracecompass.git] / org.eclipse.linuxtools.ctf.core / src / org / eclipse / linuxtools / ctf / core / event / EventDefinition.java
index afc14bff55fd274e3a8405b27ec224e19d413d13..6008a4891e7e17b69567c027d3f29b464704a366 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2011-2012 Ericsson, Ecole Polytechnique de Montreal and others
+ * Copyright (c) 2011-2013 Ericsson, Ecole Polytechnique de Montreal and others
  *
  * 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.linuxtools.ctf.core.event;
 
-import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
 
 import org.eclipse.linuxtools.ctf.core.event.types.Definition;
 import org.eclipse.linuxtools.ctf.core.event.types.IDefinitionScope;
+import org.eclipse.linuxtools.ctf.core.event.types.StructDeclaration;
 import org.eclipse.linuxtools.ctf.core.event.types.StructDefinition;
 import org.eclipse.linuxtools.ctf.core.trace.StreamInputReader;
 
 /**
- * <b><u>EventDefinition</u></b>
- * <p>
- * Represents an instance of an event.
+ * Representation of a particular instance of an event.
  */
 public class EventDefinition implements IDefinitionScope {
 
@@ -34,7 +34,7 @@ public class EventDefinition implements IDefinitionScope {
     /**
      * The corresponding event declaration.
      */
-    private final EventDeclaration declaration;
+    private final IEventDeclaration declaration;
 
     /**
      * The timestamp of the current event.
@@ -54,7 +54,7 @@ public class EventDefinition implements IDefinitionScope {
     /**
      * The StreamInputReader that reads this event definition.
      */
-    public final StreamInputReader streamInputReader;
+    private final StreamInputReader streamInputReader;
 
     // ------------------------------------------------------------------------
     // Constructors
@@ -64,9 +64,12 @@ public class EventDefinition implements IDefinitionScope {
      * Constructs an event definition.
      *
      * @param declaration
-     *            The corresponding event declaration.
+     *            The corresponding event declaration
+     * @param streamInputReader
+     *            The SIR from where this EventDef was read
+     * @since 2.0
      */
-    public EventDefinition(EventDeclaration declaration,
+    public EventDefinition(IEventDeclaration declaration,
             StreamInputReader streamInputReader) {
         this.declaration = declaration;
         this.streamInputReader = streamInputReader;
@@ -81,26 +84,109 @@ public class EventDefinition implements IDefinitionScope {
         return "event"; //$NON-NLS-1$
     }
 
-    public EventDeclaration getDeclaration() {
+    /**
+     * Gets the declaration (the form) of the data
+     *
+     * @return the event declaration
+     * @since 2.0
+     */
+    public IEventDeclaration getDeclaration() {
         return declaration;
     }
 
+    /**
+     * Gets the fields of a definition
+     *
+     * @return the fields of a definition in struct form. Can be null.
+     */
     public StructDefinition getFields() {
         return fields;
     }
 
-    public StructDefinition getContext() {
+    /**
+     * Gets the context of this event without the context of the stream
+     *
+     * @return the context in struct form
+     * @since 1.2
+     */
+    public StructDefinition getEventContext() {
         return context;
     }
 
+    /**
+     * Gets the context of this event within a stream
+     *
+     * @return the context in struct form
+     */
+    public StructDefinition getContext() {
+        final StructDefinition streamContext =
+                streamInputReader.getPacketReader().getStreamEventContextDef();
+
+        /* Most common case so far */
+        if (streamContext == null) {
+            return context;
+        }
+
+        /* streamContext is not null, but the context of the event is null */
+        if (context == null) {
+            return streamContext;
+        }
+
+        /* The stream context and event context are assigned. */
+        StructDeclaration mergedDeclaration = new StructDeclaration(1);
+
+        /* Add fields from the stream */
+        Map<String, Definition> defs = streamContext.getDefinitions();
+        for (Entry<String, Definition> entry : defs.entrySet()) {
+            mergedDeclaration.addField(entry.getKey(), entry.getValue().getDeclaration());
+        }
+
+        /* Add fields from the event context, overwrite the stream ones if needed. */
+        for (Entry<String, Definition> entry : context.getDefinitions().entrySet()) {
+            mergedDeclaration.addField(entry.getKey(), entry.getValue().getDeclaration());
+        }
+
+        StructDefinition mergedContext = mergedDeclaration.createDefinition(null, "context"); //$NON-NLS-1$
+        for (String key : mergedContext.getDefinitions().keySet()) {
+            final Definition lookupDefinition = context.lookupDefinition(key);
+            /*
+             * If the key is in the event context, add it from there, if it is
+             * not, then it's in the stream. There is a priority with scoping so
+             * if there is a field like "context" in both stream and context,
+             * you display the context.
+             */
+            if (lookupDefinition != null) {
+                mergedContext.getDefinitions().put(key, lookupDefinition);
+            } else {
+                mergedContext.getDefinitions().put(key, streamContext.lookupDefinition(key));
+            }
+        }
+        return mergedContext;
+    }
+
+    /**
+     * Gets the stream input reader that this event was made by
+     *
+     * @return the parent
+     */
     public StreamInputReader getStreamInputReader() {
         return streamInputReader;
     }
 
+    /**
+     * Gets the context of packet the event is in.
+     *
+     * @return the packet context
+     */
     public StructDefinition getPacketContext() {
         return streamInputReader.getCurrentPacketContext();
     }
 
+    /**
+     * gets the CPU the event was generated by. Slightly LTTng specific
+     *
+     * @return The CPU the event was generated by
+     */
     public int getCPU() {
         return streamInputReader.getCPU();
     }
@@ -113,21 +199,24 @@ public class EventDefinition implements IDefinitionScope {
     }
 
     /**
-     * @param timestamp the timestamp to set
+     * @param timestamp
+     *            the timestamp to set
      */
     public void setTimestamp(long timestamp) {
         this.timestamp = timestamp;
     }
 
     /**
-     * @param context the context to set
+     * @param context
+     *            the context to set
      */
     public void setContext(StructDefinition context) {
         this.context = context;
     }
 
     /**
-     * @param fields the fields to set
+     * @param fields
+     *            the fields to set
      */
     public void setFields(StructDefinition fields) {
         this.fields = fields;
@@ -150,32 +239,35 @@ public class EventDefinition implements IDefinitionScope {
 
     @Override
     public String toString() {
-        HashMap<String, Definition> f;
+        Map<String, Definition> definitions;
         List<String> list;
-        StringBuilder b = new StringBuilder();
+        StringBuilder retString = new StringBuilder();
+        final String cr = System.getProperty("line.separator");//$NON-NLS-1$
 
-        b.append("Event type: " + declaration.getName() + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
-        b.append("Timestamp: " + Long.toString(timestamp) + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
+        retString.append("Event type: " + declaration.getName() + cr); //$NON-NLS-1$
+        retString.append("Timestamp: " + Long.toString(timestamp) + cr); //$NON-NLS-1$
 
         if (context != null) {
-            f = context.getDefinitions();
+            definitions = context.getDefinitions();
             list = context.getDeclaration().getFieldsList();
 
             for (String field : list) {
-                b.append(field + " : " + f.get(field).toString() + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
+                retString.append(field
+                        + " : " + definitions.get(field).toString() + cr); //$NON-NLS-1$
             }
         }
 
         if (fields != null) {
-            f = fields.getDefinitions();
+            definitions = fields.getDefinitions();
             list = fields.getDeclaration().getFieldsList();
 
             for (String field : list) {
-                b.append(field + " : " + f.get(field).toString() + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
+                retString.append(field
+                        + " : " + definitions.get(field).toString() + cr); //$NON-NLS-1$
             }
         }
 
-        return b.toString();
+        return retString.toString();
     }
 
 }
This page took 0.026981 seconds and 5 git commands to generate.