Minor API improvements
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.core / src / org / eclipse / linuxtools / tmf / core / event / TmfEventField.java
CommitLineData
8c8bf09f 1/*******************************************************************************
bbc1c411 2 * Copyright (c) 2009, 2012 Ericsson
8c8bf09f 3 *
cbbcc354 4 * All rights reserved. This program and the accompanying materials are made
5 * available under the terms of the Eclipse Public License v1.0 which
8c8bf09f
ASL
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
8 *
9 * Contributors:
1f506a43 10 * Francois Chouinard - Initial API and implementation
bbc1c411 11 * Francois Chouinard - Updated as per TMF Event Model 1.0
8c8bf09f
ASL
12 *******************************************************************************/
13
6c13869b 14package org.eclipse.linuxtools.tmf.core.event;
8c8bf09f 15
ea2b103b 16import java.util.Arrays;
4c564a2d
FC
17import java.util.HashMap;
18import java.util.Map;
19
8c8bf09f 20/**
b9e37ffd 21 * A basic implementation of ITmfEventField.
8c8bf09f 22 * <p>
b9e37ffd
FC
23 * Non-value fields are structural (i.e. used to represent the event structure
24 * including optional fields) while the valued fields are actual event fields.
25 *
26 * @since 1.0
27 * @version 1.0
28 * @author Francois Chouinard
29 * @see ITmfEventField
30 * @see ITmfEventType
31 * @see ITmfEvent
8c8bf09f 32 */
cbbcc354 33public class TmfEventField implements ITmfEventField {
8c8bf09f 34
cbd4ad82 35 // ------------------------------------------------------------------------
8c8bf09f 36 // Attributes
cbd4ad82 37 // ------------------------------------------------------------------------
8c8bf09f 38
4c564a2d
FC
39 private String fName;
40 private Object fValue;
41 private ITmfEventField[] fFields;
8c8bf09f 42
4c564a2d
FC
43 private String[] fFieldNames;
44 private Map<String, ITmfEventField> fNameMapping;
085d898f 45
cbd4ad82 46 // ------------------------------------------------------------------------
8c8bf09f 47 // Constructors
cbd4ad82
FC
48 // ------------------------------------------------------------------------
49
cbbcc354 50 /**
51 * Default constructor
52 */
cbd4ad82 53 @SuppressWarnings("unused")
cbbcc354 54 private TmfEventField() {
cbd4ad82 55 }
8c8bf09f 56
4c564a2d 57 /**
75d42a16 58 * Constructor for a structural field
4c564a2d
FC
59 *
60 * @param name the event field id
0d9a6d76 61 * @param fields the list of subfields
4c564a2d 62 */
085d898f 63 public TmfEventField(final String name, final ITmfEventField[] fields) {
75d42a16 64 this(name, null, fields);
4c564a2d
FC
65 }
66
67 /**
75d42a16 68 * Constructor for a terminal field (i.e. no subfields)
4c564a2d
FC
69 *
70 * @param name the event field id
75d42a16 71 * @param value the event field value
4c564a2d 72 */
085d898f 73 public TmfEventField(final String name, final Object value) {
75d42a16 74 this(name, value, null);
4c564a2d
FC
75 }
76
8c8bf09f 77 /**
cbbcc354 78 * Full constructor
79 *
4c564a2d 80 * @param name the event field id
cbbcc354 81 * @param value the event field value
0d9a6d76 82 * @param fields the list of subfields
8c8bf09f 83 */
085d898f 84 public TmfEventField(final String name, final Object value, final ITmfEventField[] fields) {
b9e37ffd 85 if (name == null) {
cbbcc354 86 throw new IllegalArgumentException();
b9e37ffd 87 }
4c564a2d 88 fName = name;
cbbcc354 89 fValue = value;
ea2b103b 90 fFields = (fields != null) ? Arrays.copyOf(fields, fields.length) : null;
4c564a2d 91 populateStructs();
28b94d61
FC
92 }
93
94 /**
cbbcc354 95 * Copy constructor
96 *
97 * @param field the other event field
28b94d61 98 */
085d898f 99 public TmfEventField(final TmfEventField field) {
b9e37ffd 100 if (field == null) {
085d898f 101 throw new IllegalArgumentException();
b9e37ffd 102 }
085d898f
FC
103 fName = field.fName;
104 fValue = field.fValue;
105 fFields = field.fFields;
106 fFieldNames = field.fFieldNames;
75d42a16 107 populateStructs();
28b94d61
FC
108 }
109
cbd4ad82 110 // ------------------------------------------------------------------------
cbbcc354 111 // ITmfEventField
cbd4ad82 112 // ------------------------------------------------------------------------
8c8bf09f 113
d7dbf09a
FC
114 /* (non-Javadoc)
115 * @see org.eclipse.linuxtools.tmf.core.event.ITmfEventField#getName()
116 */
117 @Override
4c564a2d
FC
118 public String getName() {
119 return fName;
28b94d61
FC
120 }
121
d7dbf09a
FC
122 /* (non-Javadoc)
123 * @see org.eclipse.linuxtools.tmf.core.event.ITmfEventField#getValue()
124 */
125 @Override
8c8bf09f
ASL
126 public Object getValue() {
127 return fValue;
128 }
129
d7dbf09a
FC
130 /* (non-Javadoc)
131 * @see org.eclipse.linuxtools.tmf.core.event.ITmfEventField#getFieldNames()
132 */
133 @Override
4c564a2d 134 public String[] getFieldNames() {
ea2b103b 135 return Arrays.copyOf(fFieldNames, fFieldNames.length);
4c564a2d
FC
136 }
137
d7dbf09a
FC
138 /* (non-Javadoc)
139 * @see org.eclipse.linuxtools.tmf.core.event.ITmfEventField#getFieldName(int)
140 */
141 @Override
085d898f
FC
142 public String getFieldName(final int index) {
143 final ITmfEventField field = getField(index);
b9e37ffd 144 if (field != null) {
4c564a2d 145 return field.getName();
b9e37ffd 146 }
4c564a2d
FC
147 return null;
148 }
149
d7dbf09a
FC
150 /* (non-Javadoc)
151 * @see org.eclipse.linuxtools.tmf.core.event.ITmfEventField#getFields()
152 */
153 @Override
4c564a2d 154 public ITmfEventField[] getFields() {
b9e37ffd 155 return (fFields != null) ? Arrays.copyOf(fFields, fFields.length) : null;
4c564a2d
FC
156 }
157
d7dbf09a
FC
158 /* (non-Javadoc)
159 * @see org.eclipse.linuxtools.tmf.core.event.ITmfEventField#getField(java.lang.String)
160 */
161 @Override
085d898f 162 public ITmfEventField getField(final String name) {
4c564a2d
FC
163 return fNameMapping.get(name);
164 }
165
d7dbf09a
FC
166 /* (non-Javadoc)
167 * @see org.eclipse.linuxtools.tmf.core.event.ITmfEventField#getField(int)
168 */
169 @Override
085d898f 170 public ITmfEventField getField(final int index) {
b9e37ffd 171 if (fFields != null && index >= 0 && index < fFields.length) {
4c564a2d 172 return fFields[index];
b9e37ffd 173 }
4c564a2d 174 return null;
cbbcc354 175 }
176
177 // ------------------------------------------------------------------------
178 // Convenience setters
179 // ------------------------------------------------------------------------
180
28b94d61 181 /**
4c564a2d
FC
182 * @param value new field raw value
183 * @param fields the corresponding fields
28b94d61 184 */
085d898f 185 protected void setValue(final Object value, final ITmfEventField[] fields) {
28b94d61 186 fValue = value;
beae214a 187 fFields = (fields != null) ? Arrays.copyOf(fields, fields.length) : null;
4c564a2d
FC
188 populateStructs();
189 }
190
191 // ------------------------------------------------------------------------
192 // Operations
193 // ------------------------------------------------------------------------
194
195 /**
196 * Create a root field from a list of labels.
197 *
198 * @param labels the list of labels
199 * @return the (flat) root list
200 */
085d898f
FC
201 public final static ITmfEventField makeRoot(final String[] labels) {
202 final ITmfEventField[] fields = new ITmfEventField[labels.length];
b9e37ffd 203 for (int i = 0; i < labels.length; i++) {
4c564a2d 204 fields[i] = new TmfEventField(labels[i], null);
b9e37ffd
FC
205 }
206 // Return a new root field;
207 return new TmfEventField(ITmfEventField.ROOT_FIELD_ID, fields);
4c564a2d
FC
208 }
209
210 /*
211 * Populate the subfield names and the name map
212 */
213 private void populateStructs() {
085d898f 214 final int nbFields = (fFields != null) ? fFields.length : 0;
4c564a2d
FC
215 fFieldNames = new String[nbFields];
216 fNameMapping = new HashMap<String, ITmfEventField>();
217 for (int i = 0; i < nbFields; i++) {
085d898f 218 final String name = fFields[i].getName();
4c564a2d
FC
219 fFieldNames[i] = name;
220 fNameMapping.put(name, fFields[i]);
221 }
28b94d61
FC
222 }
223
cbbcc354 224 // ------------------------------------------------------------------------
225 // Cloneable
226 // ------------------------------------------------------------------------
227
d7dbf09a
FC
228 /* (non-Javadoc)
229 * @see java.lang.Object#clone()
230 */
cbbcc354 231 @Override
8c149234 232 public TmfEventField clone() {
cbbcc354 233 TmfEventField clone = null;
234 try {
235 clone = (TmfEventField) super.clone();
4c564a2d 236 clone.fName = fName;
cbbcc354 237 clone.fValue = fValue;
4c564a2d
FC
238 clone.fFields = (fFields != null) ? fFields.clone() : null;
239 clone.populateStructs();
085d898f 240 } catch (final CloneNotSupportedException e) {
cbbcc354 241 }
242 return clone;
243 }
244
cbd4ad82
FC
245 // ------------------------------------------------------------------------
246 // Object
247 // ------------------------------------------------------------------------
8c8bf09f 248
d7dbf09a
FC
249 /* (non-Javadoc)
250 * @see java.lang.Object#hashCode()
251 */
28b94d61 252 @Override
cbd4ad82 253 public int hashCode() {
cbbcc354 254 final int prime = 31;
255 int result = 1;
75d42a16 256 result = prime * result + fName.hashCode();
cbbcc354 257 result = prime * result + ((fValue == null) ? 0 : fValue.hashCode());
2fb2eb37 258 return result;
cbd4ad82
FC
259 }
260
d7dbf09a
FC
261 /* (non-Javadoc)
262 * @see java.lang.Object#equals(java.lang.Object)
263 */
cbbcc354 264 @Override
085d898f 265 public boolean equals(final Object obj) {
b9e37ffd 266 if (this == obj) {
cbbcc354 267 return true;
b9e37ffd
FC
268 }
269 if (obj == null) {
cbbcc354 270 return false;
b9e37ffd
FC
271 }
272 if (!(obj instanceof TmfEventField)) {
cbbcc354 273 return false;
b9e37ffd 274 }
085d898f 275 final TmfEventField other = (TmfEventField) obj;
b9e37ffd 276 if (!fName.equals(other.fName)) {
cbbcc354 277 return false;
b9e37ffd 278 }
cbbcc354 279 if (fValue == null) {
b9e37ffd 280 if (other.fValue != null) {
cbbcc354 281 return false;
b9e37ffd
FC
282 }
283 } else if (!fValue.equals(other.fValue)) {
cbbcc354 284 return false;
b9e37ffd 285 }
cbbcc354 286 return true;
28b94d61
FC
287 }
288
d7dbf09a
FC
289 /* (non-Javadoc)
290 * @see java.lang.Object#toString()
291 */
82b08e62 292 @Override
3b38ea61 293 @SuppressWarnings("nls")
cbbcc354 294 public String toString() {
4c564a2d 295 return "TmfEventField [fFieldId=" + fName + ", fValue=" + fValue + "]";
8c8bf09f 296 }
1f506a43 297
cbbcc354 298}
This page took 0.048236 seconds and 5 git commands to generate.