ctf/tmf: allow multiple traces to be open with name clashing events
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.core / src / org / eclipse / linuxtools / tmf / core / ctfadaptor / CtfTmfEventField.java
index a38cf78e4b3dfb3c0bef62307104c1f6744f1fd4..6e77376bdd5085ce2112c123c189d9a4792025d1 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2011, 2013 Ericsson, École Polytechnique de Montréal
+ * Copyright (c) 2011, 2014 Ericsson, École Polytechnique de Montréal
  *
  * All rights reserved. This program and the accompanying materials are made
  * available under the terms of the Eclipse Public License v1.0 which
@@ -12,6 +12,7 @@
  *  Bernd Hufmann - Add Enum field handling
  *  Geneviève Bastien - Add Struct and Variant field handling
  *  Jean-Christian Kouame - Correct handling of unsigned integer fields
+ *  François Doray - Add generic array field type
  *******************************************************************************/
 
 package org.eclipse.linuxtools.tmf.core.ctfadaptor;
@@ -21,7 +22,6 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.Map.Entry;
 
-import org.eclipse.linuxtools.ctf.core.event.types.ArrayDeclaration;
 import org.eclipse.linuxtools.ctf.core.event.types.ArrayDefinition;
 import org.eclipse.linuxtools.ctf.core.event.types.Definition;
 import org.eclipse.linuxtools.ctf.core.event.types.EnumDefinition;
@@ -105,25 +105,25 @@ public abstract class CtfTmfEventField extends TmfEventField {
 
         } else if (fieldDef instanceof ArrayDefinition) {
             ArrayDefinition arrayDef = (ArrayDefinition) fieldDef;
-            ArrayDeclaration arrayDecl = arrayDef.getDeclaration();
 
-            if (arrayDef.isString()) {
+            if (arrayDef.getDeclaration().isString()) {
                 /* This is an array of UTF-8 bytes, a.k.a. a String! */
                 field = new CTFStringField(fieldName, fieldDef.toString());
 
-            } else if (arrayDecl.getElementType() instanceof IntegerDeclaration) {
-                /* This is a an array of CTF Integers */
-                List<Long> values = new ArrayList<Long>(arrayDecl.getLength());
-                for (int i = 0; i < arrayDecl.getLength(); i++) {
-                    values.add(((IntegerDefinition) arrayDef.getElem(i)).getValue());
+            } else {
+                /* Arrays of elements of any other type */
+                Definition[] definitions = arrayDef.getDefinitions();
+                CtfTmfEventField[] elements = new CtfTmfEventField[definitions.length];
+
+                /* Parse the elements of the array. */
+                for (int i = 0; i < definitions.length; i++) {
+                    CtfTmfEventField curField = CtfTmfEventField.parseField(
+                            definitions[i], fieldName + '[' + i + ']');
+                    elements[i] = curField;
                 }
-                long[] valuesArray = convertListToArray(values);
-                field = new CTFIntegerArrayField(fieldName, valuesArray,
-                        ((IntegerDeclaration) arrayDecl.getElementType()).getBase(),
-                        ((IntegerDeclaration) arrayDecl.getElementType()).isSigned());
-            }
-            /* Add other types of arrays here */
 
+                field = new CTFArrayField(fieldName, elements);
+            }
         } else if (fieldDef instanceof SequenceDefinition) {
             SequenceDefinition seqDef = (SequenceDefinition) fieldDef;
             SequenceDeclaration seqDecl = seqDef.getDeclaration();
@@ -136,14 +136,14 @@ public abstract class CtfTmfEventField extends TmfEventField {
                 field = new CTFStringField(fieldName, seqDef.toString());
             } else if (seqDecl.getElementType() instanceof IntegerDeclaration) {
                 /* Sequence of integers => CTFIntegerArrayField */
-                List<Long> values = new ArrayList<Long>(seqDef.getLength());
+                long[] values = new long[seqDef.getLength()];
                 for (int i = 0; i < seqDef.getLength(); i++) {
-                    values.add(((IntegerDefinition) seqDef.getElem(i)).getValue());
+                    values[i] = ((IntegerDefinition) seqDef.getElem(i)).getValue();
                 }
-                long[] valuesArray = convertListToArray(values);
-                field = new CTFIntegerArrayField(fieldName, valuesArray,
+                field = new CTFIntegerArrayField(fieldName, values,
                         ((IntegerDeclaration) seqDecl.getElementType()).getBase(),
                         ((IntegerDeclaration) seqDecl.getElementType()).isSigned());
+
             }
             /* Add other Sequence types here */
 
@@ -153,7 +153,7 @@ public abstract class CtfTmfEventField extends TmfEventField {
             String curFieldName = null;
             Definition curFieldDef;
             CtfTmfEventField curField;
-            List<ITmfEventField> list = new ArrayList<ITmfEventField>();
+            List<ITmfEventField> list = new ArrayList<>();
             /* Recursively parse the fields */
             for (Entry<String, Definition> entry : strDef.getDefinitions().entrySet()) {
                 curFieldName = entry.getKey();
@@ -191,17 +191,6 @@ public abstract class CtfTmfEventField extends TmfEventField {
         return getName() + '=' + getFormattedValue();
     }
 
-    /**
-     * We cannot use List.toArray(T[]) for primitives types, so do it manually.
-     */
-    private static long[] convertListToArray(List<Long> list) {
-        long[] array = new long[list.size()];
-        for (int i = 0; i < list.size(); i++) {
-            array[i] = list.get(i);
-        }
-        return array;
-    }
-
 }
 
 /**
@@ -211,8 +200,8 @@ public abstract class CtfTmfEventField extends TmfEventField {
  */
 final class CTFIntegerField extends CtfTmfEventField {
 
-    private final int base;
-    private final boolean signed;
+    private final int fBase;
+    private final boolean fSigned;
 
     /**
      * A CTF "IntegerDefinition" can be an integer of any byte size, so in the
@@ -227,8 +216,8 @@ final class CTFIntegerField extends CtfTmfEventField {
      */
     CTFIntegerField(String name, long longValue, int base, boolean signed) {
         super(name, longValue, null);
-        this.signed = signed;
-        this.base = base;
+        fSigned = signed;
+        fBase = base;
     }
 
     @Override
@@ -238,7 +227,7 @@ final class CTFIntegerField extends CtfTmfEventField {
 
     @Override
     public String getFormattedValue() {
-        return IntegerDefinition.formatNumber(getValue(), base, signed);
+        return IntegerDefinition.formatNumber(getValue(), fBase, fSigned);
     }
 
 }
@@ -275,9 +264,9 @@ final class CTFStringField extends CtfTmfEventField {
  */
 final class CTFIntegerArrayField extends CtfTmfEventField {
 
-    private final int base;
-    private final boolean signed;
-    private String formattedValue = null;
+    private final int fBase;
+    private final boolean fSigned;
+    private String fFormattedValue = null;
 
     /**
      * Constructor for CTFIntegerArrayField.
@@ -292,8 +281,8 @@ final class CTFIntegerArrayField extends CtfTmfEventField {
      */
     CTFIntegerArrayField(String name, long[] longValues, int base, boolean signed) {
         super(name, longValues, null);
-        this.base = base;
-        this.signed = signed;
+        fBase = base;
+        fSigned = signed;
     }
 
     @Override
@@ -302,19 +291,58 @@ final class CTFIntegerArrayField extends CtfTmfEventField {
     }
 
     @Override
-    public String getFormattedValue() {
-        if (formattedValue == null) {
-            List<String> strings = new ArrayList<String>();
+    public synchronized String getFormattedValue() {
+        if (fFormattedValue == null) {
+            List<String> strings = new ArrayList<>();
             for (long value : getValue()) {
-                strings.add(IntegerDefinition.formatNumber(value, base, signed));
+                strings.add(IntegerDefinition.formatNumber(value, fBase, fSigned));
             }
-            formattedValue = strings.toString();
+            fFormattedValue = strings.toString();
         }
-        return formattedValue;
+        return fFormattedValue;
     }
 
 }
 
+/**
+ * CTF field implementation for arrays of arbitrary types.
+ *
+ * @author fdoray
+ */
+final class CTFArrayField extends CtfTmfEventField {
+
+    private String fFormattedValue = null;
+
+    /**
+     * Constructor for CTFArrayField.
+     *
+     * @param name
+     *            The name of this field
+     * @param elements
+     *            The array elements of this field
+     */
+    CTFArrayField(String name, CtfTmfEventField[] elements) {
+        super(name, elements, elements);
+    }
+
+    @Override
+    public CtfTmfEventField[] getValue() {
+        return (CtfTmfEventField[]) super.getValue();
+    }
+
+    @Override
+    public synchronized String getFormattedValue() {
+        if (fFormattedValue == null) {
+            List<String> strings = new ArrayList<>();
+            for (CtfTmfEventField element : getValue()) {
+                strings.add(element.getFormattedValue());
+            }
+            fFormattedValue = strings.toString();
+        }
+        return fFormattedValue;
+    }
+}
+
 /**
  * CTF field implementation for floats.
  *
@@ -358,7 +386,7 @@ final class CTFEnumField extends CtfTmfEventField {
      */
     CTFEnumField(String name, CtfEnumPair enumValue) {
         super(name, new CtfEnumPair(enumValue.getFirst(),
-                enumValue.getSecond().longValue()), null);
+                enumValue.getSecond()), null);
     }
 
     @Override
This page took 0.028691 seconds and 5 git commands to generate.