Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/text/TextTraceEventContent.java')
-rw-r--r--tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/text/TextTraceEventContent.java348
1 files changed, 348 insertions, 0 deletions
diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/text/TextTraceEventContent.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/text/TextTraceEventContent.java
new file mode 100644
index 0000000000..aab941d4fe
--- /dev/null
+++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/text/TextTraceEventContent.java
@@ -0,0 +1,348 @@
+/*******************************************************************************
+ * Copyright (c) 2012, 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
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Patrick Tasse - Initial API and implementation
+ * Bernd Hufmann - Updated equals, clone and hashCode to consider StringBuffer values
+ *******************************************************************************/
+
+package org.eclipse.tracecompass.tmf.core.trace.text;
+
+import static org.eclipse.tracecompass.common.core.NonNullUtils.checkNotNull;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.tracecompass.tmf.core.event.ITmfEventField;
+
+/**
+ * Implementation of ITmfEventField for Text Traces.
+ */
+public class TextTraceEventContent implements ITmfEventField {
+
+ private final @NonNull String fName;
+ private final @NonNull List<TextTraceEventContent> fFields;
+
+ private @Nullable Object fValue;
+
+ // ------------------------------------------------------------------------
+ // Constructors
+ // ------------------------------------------------------------------------
+
+ /**
+ * Constructor for a root event content. Subfields with the specified field
+ * names are created and initialized with a null value.
+ *
+ * @param fieldNames
+ * the array of non-null field names
+ * @throws IllegalArgumentException
+ * if any one of the field names is null
+ */
+ public TextTraceEventContent(@NonNull String[] fieldNames) {
+ fName = ITmfEventField.ROOT_FIELD_ID;
+ fValue = null;
+ fFields = new ArrayList<>(fieldNames.length);
+ for (String fieldName : fieldNames) {
+ if (fieldName == null) {
+ throw new IllegalArgumentException("Null field name not allowed"); //$NON-NLS-1$
+ }
+ fFields.add(new TextTraceEventContent(fieldName));
+ }
+ }
+
+ /**
+ * Constructor for an initial capacity. This should be the expected number
+ * of fields.
+ *
+ * @param initialCapacity
+ * the initial capacity of the field list
+ * @since 1.0
+ */
+ public TextTraceEventContent(int initialCapacity) {
+ fName = ITmfEventField.ROOT_FIELD_ID;
+ fValue = null;
+ fFields = new ArrayList<>(initialCapacity);
+ }
+
+ /**
+ * Constructor for a subfield
+ *
+ * @param fieldName
+ * the subfield name
+ */
+ private TextTraceEventContent(@NonNull String fieldName) {
+ fName = fieldName;
+ fValue = null;
+ fFields = checkNotNull(Collections.EMPTY_LIST);
+ }
+
+ // ------------------------------------------------------------------------
+ // ITmfEventField
+ // ------------------------------------------------------------------------
+
+ @Override
+ public String getName() {
+ return fName;
+ }
+
+ @Override
+ public Object getValue() {
+ return fValue;
+ }
+
+ @Override
+ public List<String> getFieldNames() {
+ List<String> fieldNames = new ArrayList<>(fFields.size());
+ for (TextTraceEventContent field : fFields) {
+ fieldNames.add(field.getName());
+ }
+ return fieldNames;
+ }
+
+ @Override
+ public List<TextTraceEventContent> getFields() {
+ return new ArrayList<>(fFields);
+ }
+
+ @Override
+ public ITmfEventField getField(String... path) {
+ if (path.length == 0) {
+ return this;
+ }
+ // There are no sub fields
+ if (path.length == 1) {
+ for (TextTraceEventContent field : fFields) {
+ if (field.getName().equals(path[0])) {
+ return field;
+ }
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public String getFormattedValue() {
+ Object value = fValue;
+ if (value == null) {
+ return null;
+ }
+ return value.toString();
+ }
+
+ // ------------------------------------------------------------------------
+ // Convenience getters and setters
+ // ------------------------------------------------------------------------
+
+ /**
+ * Get a field name by index.
+ *
+ * @param index
+ * The index of the field
+ * @return The name of the field at that index
+ */
+ public String getFieldName(int index) {
+ if (index >= 0 && index < fFields.size()) {
+ return fFields.get(index).getName();
+ }
+ return null;
+ }
+
+ /**
+ * Get a field by index.
+ *
+ * @param index
+ * The index of the field
+ * @return The field object at the requested index
+ */
+ public ITmfEventField getField(int index) {
+ if (index >= 0 && index < fFields.size()) {
+ return fFields.get(index);
+ }
+ return null;
+ }
+
+ /**
+ * Get a subfield value by name.
+ *
+ * @param name
+ * a subfield name
+ * @return field value object
+ */
+ public Object getFieldValue(@NonNull String name) {
+ for (int i = 0; i < fFields.size(); i++) {
+ if (fFields.get(i).getName().equals(name)) {
+ return fFields.get(i).getValue();
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Get a subfield value by index.
+ *
+ * @param index
+ * a subfield index
+ * @return field value object
+ */
+ public Object getFieldValue(int index) {
+ if (index >= 0 && index < fFields.size()) {
+ return fFields.get(index).getValue();
+ }
+ return null;
+ }
+
+ /**
+ * Set the content value.
+ *
+ * @param value
+ * the content value
+ */
+ public void setValue(Object value) {
+ fValue = value;
+ }
+
+ /**
+ * Set a subfield value by name. Adds the subfield if it is new.
+ *
+ * @param name
+ * a subfield name
+ * @param value
+ * the subfield value
+ */
+ public void setFieldValue(@NonNull String name, Object value) {
+ TextTraceEventContent field = null;
+ for (int i = 0; i < fFields.size(); i++) {
+ if (fFields.get(i).getName().equals(name)) {
+ field = fFields.get(i);
+ field.setValue(value);
+ }
+ }
+ if (field == null) {
+ field = new TextTraceEventContent(name);
+ field.setValue(value);
+ fFields.add(field);
+ }
+ }
+
+ /**
+ * Set a subfield value by index.
+ *
+ * @param index
+ * a subfield index
+ * @param value
+ * the subfield value
+ */
+ public void setFieldValue(int index, Object value) {
+ if (index >= 0 && index < fFields.size()) {
+ fFields.get(index).fValue = value;
+ }
+ }
+
+ /**
+ * Add a new subfield unconditionally and set its value. Note: This can
+ * create a duplicate subfield. If the subfield already exists, use
+ * {@link #setFieldValue(String, Object)} instead.
+ *
+ * @param name
+ * a subfield name
+ * @param value
+ * the subfield value
+ * @since 1.0
+ */
+ public void addField(@NonNull String name, Object value) {
+ TextTraceEventContent field = new TextTraceEventContent(name);
+ field.setValue(value);
+ fFields.add(field);
+ }
+
+ // ------------------------------------------------------------------------
+ // Object
+ // ------------------------------------------------------------------------
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + fFields.hashCode();
+ result = prime * result + fName.hashCode();
+ int tmpHash = 0; // initialize for fValue equals null;
+ Object value = fValue;
+ if (value != null) {
+ if (value instanceof StringBuffer) {
+ tmpHash = value.toString().hashCode();
+ } else {
+ tmpHash = value.hashCode();
+ }
+ }
+ result = prime * result + tmpHash;
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ TextTraceEventContent other = (TextTraceEventContent) obj;
+ if (!fFields.equals(other.fFields)) {
+ return false;
+ }
+ if (!fName.equals(other.fName)) {
+ return false;
+ }
+
+ Object value = fValue;
+ if (value == null) {
+ if (other.fValue != null) {
+ return false;
+ }
+ } else {
+ if ((value instanceof StringBuffer) && (other.fValue instanceof StringBuffer)) {
+ Object otherValue = other.getValue();
+ if (otherValue == null) {
+ return false;
+ }
+ if (!value.toString().equals(otherValue.toString())) {
+ return false;
+ }
+ } else if (!value.equals(other.fValue)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ if (fName == ITmfEventField.ROOT_FIELD_ID) {
+ for (int i = 0; i < getFields().size(); i++) {
+ ITmfEventField field = getFields().get(i);
+ if (i != 0) {
+ sb.append(", "); //$NON-NLS-1$
+ }
+ sb.append(field.toString());
+ }
+ } else {
+ sb.append(fName);
+ sb.append('=');
+ sb.append(fValue);
+ }
+ return sb.toString();
+ }
+
+}

Back to the top