tmf.core: null type safety (added type annotation)
[deliverable/tracecompass.git] / tmf / org.eclipse.tracecompass.tmf.analysis.xml.core / src / org / eclipse / tracecompass / tmf / analysis / xml / core / model / TmfXmlPatternSegmentBuilder.java
index 6c445cadf66511fbfcc2d5df3ddeaab0d1efb6dd..7b6c1771078672aa08b52ed026c90f664d43f2ad 100644 (file)
@@ -14,6 +14,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 
 import org.eclipse.jdt.annotation.Nullable;
 import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.Activator;
@@ -94,15 +95,18 @@ public class TmfXmlPatternSegmentBuilder {
      *            Start time of the pattern segment to generate
      * @param end
      *            End time of the pattern segment to generate
+     * @param scenarioInfo
+     *            The active scenario details. Or <code>null</code> if there is
+     *            no scenario.
      * @return The pattern segment generated
      */
-    public TmfXmlPatternSegment generatePatternSegment(ITmfEvent event, ITmfTimestamp start, ITmfTimestamp end) {
+    public TmfXmlPatternSegment generatePatternSegment(ITmfEvent event, ITmfTimestamp start, ITmfTimestamp end, @Nullable TmfXmlScenarioInfo scenarioInfo) {
         int scale = event.getTimestamp().getScale();
         long startValue = start.toNanos();
         long endValue = end.toNanos();
-        String segmentName = getPatternSegmentName(event);
+        String segmentName = getPatternSegmentName(event, scenarioInfo);
         Map<String, ITmfStateValue> fields = new HashMap<>();
-        setPatternSegmentContent(event, start, end, fields);
+        setPatternSegmentContent(event, start, end, fields, scenarioInfo);
         TmfXmlPatternSegment segment = new TmfXmlPatternSegment(startValue, endValue, scale, segmentName, fields);
         if (fContainer instanceof XmlPatternStateProvider) {
             ((XmlPatternStateProvider) fContainer).getListener().onNewSegment(segment);
@@ -115,10 +119,13 @@ public class TmfXmlPatternSegmentBuilder {
      *
      * @param event
      *            The active event
+     * @param scenarioInfo
+     *            The active scenario details. Or <code>null</code> if there is
+     *            no scenario.
      * @return The name of the segment
      */
-    private String getPatternSegmentName(ITmfEvent event) {
-        return fSegmentType.getName(event);
+    private String getPatternSegmentName(ITmfEvent event, @Nullable TmfXmlScenarioInfo scenarioInfo) {
+        return fSegmentType.getName(event, scenarioInfo);
     }
 
     /**
@@ -133,10 +140,38 @@ public class TmfXmlPatternSegmentBuilder {
      *            The end timestamp of this segment
      * @param fields
      *            The map that will contained all the fields
+     * @param scenarioInfo
+     *            The active scenario details. Or <code>null</code> if there is
+     *            no scenario.
      */
-    private void setPatternSegmentContent(ITmfEvent event, ITmfTimestamp start, ITmfTimestamp end, Map<String, ITmfStateValue> fields) {
+    private void setPatternSegmentContent(ITmfEvent event, ITmfTimestamp start, ITmfTimestamp end, Map<String, ITmfStateValue> fields, @Nullable TmfXmlScenarioInfo scenarioInfo) {
         for (TmfXmlPatternSegmentField field : fFields) {
-            fields.put(field.getName(), field.getValue(event));
+            fields.put(field.getName(), field.getValue(event, scenarioInfo));
+        }
+        if (scenarioInfo != null) {
+            addStoredFieldsContent(event, fields, scenarioInfo);
+        }
+    }
+
+    /**
+     * Query the stored fields path and add them to the content of the pattern
+     * segment. This is specific to pattern analysis.
+     *
+     * @param event
+     *            The active event
+     * @param fields
+     *            The segment fields
+     * @param info
+     *            The active scenario details
+     */
+    protected void addStoredFieldsContent(ITmfEvent event, Map<String, ITmfStateValue> fields, final TmfXmlScenarioInfo info) {
+        if (fContainer instanceof XmlPatternStateProvider) {
+            for (Entry<String, String> entry : ((XmlPatternStateProvider) fContainer).getStoredFields().entrySet()) {
+                ITmfStateValue value = ((XmlPatternStateProvider) fContainer).getHistoryBuilder().getStoredFieldValue(fContainer, entry.getValue(), info, event);
+                if (!value.isNull()) {
+                    fields.put(entry.getValue(), value);
+                }
+            }
         }
     }
 
@@ -155,9 +190,9 @@ public class TmfXmlPatternSegmentBuilder {
         }
     }
 
-    private static void getNameFromXmlStateValue(ITmfEvent event, StringBuilder builder, ITmfXmlStateValue xmlStateValue) {
+    private static void getNameFromXmlStateValue(ITmfEvent event, StringBuilder builder, ITmfXmlStateValue xmlStateValue, @Nullable TmfXmlScenarioInfo scenarioInfo) {
         try {
-            ITmfStateValue value = xmlStateValue.getValue(event);
+            ITmfStateValue value = xmlStateValue.getValue(event, scenarioInfo);
             switch (value.getType()) {
             case DOUBLE:
                 builder.append(value.unboxDouble());
@@ -229,13 +264,16 @@ public class TmfXmlPatternSegmentBuilder {
          *            The active event
          * @return The state value representing the value of the XML pattern
          *         segment field
+         * @param scenarioInfo
+         *            The active scenario details. Or <code>null</code> if there
+         *            is no scenario.
          */
-        public ITmfStateValue getValue(ITmfEvent event) {
+        public ITmfStateValue getValue(ITmfEvent event, @Nullable TmfXmlScenarioInfo scenarioInfo) {
             if (fStateValue != null) {
                 return fStateValue;
             }
             try {
-                return checkNotNull(fXmlStateValue).getValue(event);
+                return checkNotNull(fXmlStateValue).getValue(event, scenarioInfo);
             } catch (AttributeNotFoundException e) {
                 Activator.logError("Failed to get the state value", e); //$NON-NLS-1$
             }
@@ -288,12 +326,15 @@ public class TmfXmlPatternSegmentBuilder {
          *
          * @param event
          *            The active event
+         * @param scenarioInfo
+         *            The active scenario details. Or <code>null</code> if there
+         *            is no scenario.
          * @return The segment name
          */
-        public String getName(ITmfEvent event) {
+        public String getName(ITmfEvent event, @Nullable TmfXmlScenarioInfo scenarioInfo) {
             StringBuilder name = new StringBuilder(PATTERN_SEGMENT_NAME_PREFIX);
             if (fNameStateValue != null) {
-                getNameFromXmlStateValue(event, name, fNameStateValue);
+                getNameFromXmlStateValue(event, name, fNameStateValue, scenarioInfo);
             } else {
                 name.append(fSegmentNameAttribute);
             }
This page took 0.030114 seconds and 5 git commands to generate.