1 /*******************************************************************************
2 * Copyright (c) 2011 Ericsson
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
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
9 * Contributors: Alexandre Montplaisir - Initial API and implementation
10 *******************************************************************************/
12 package org
.eclipse
.linuxtools
.tmf
.core
.ctfadaptor
;
14 import java
.util
.ArrayList
;
15 import java
.util
.HashMap
;
16 import java
.util
.List
;
17 import java
.util
.Map
.Entry
;
19 import org
.eclipse
.linuxtools
.ctf
.core
.event
.EventDefinition
;
20 import org
.eclipse
.linuxtools
.ctf
.core
.event
.types
.Definition
;
21 import org
.eclipse
.linuxtools
.ctf
.core
.event
.types
.StructDefinition
;
22 import org
.eclipse
.linuxtools
.tmf
.core
.event
.ITmfEvent
;
23 import org
.eclipse
.linuxtools
.tmf
.core
.event
.ITmfEventField
;
24 import org
.eclipse
.linuxtools
.tmf
.core
.event
.ITmfEventType
;
25 import org
.eclipse
.linuxtools
.tmf
.core
.event
.ITmfTimestamp
;
28 * <b><u>CTFEvent</u></b>
30 * This is a wrapper class around CTF's Event Definition/Declaration so that we
31 * can map all types of Declaration to native Java types.
33 public final class CtfTmfEvent
implements ITmfEvent
{
35 // ------------------------------------------------------------------------
37 // ------------------------------------------------------------------------
39 private static final String NO_STREAM
= "No stream"; //$NON-NLS-1$
40 private static final String EMPTY_CTF_EVENT_NAME
= "Empty CTF event"; //$NON-NLS-1$
41 private static final String CONTEXT_ID
= "Ctf Event"; //$NON-NLS-1$
43 // ------------------------------------------------------------------------
45 // ------------------------------------------------------------------------
47 private final CtfTmfTrace fTrace
;
48 private final long timestamp
;
49 private final int sourceCPU
;
50 private final long typeId
;
51 private final String eventName
;
52 private final String fileName
;
54 private final CtfTmfContent fContent
;
56 // ------------------------------------------------------------------------
58 // ------------------------------------------------------------------------
61 * Usual CTFEvent constructor, where we read an event from the trace (via
62 * the StreamInputReader).
66 * @param fileName String
67 * @param originTrace CtfTmfTrace
69 public CtfTmfEvent(EventDefinition eventDef
, String fileName
,
70 CtfTmfTrace originTrace
) {
71 this.fTrace
= originTrace
;
73 if (eventDef
== null) {
77 this.fileName
= NO_STREAM
;
78 this.eventName
= EMPTY_CTF_EVENT_NAME
;
83 /* Read the base event info */
84 Long offset
= originTrace
.getCTFTrace().getOffset();
85 this.timestamp
= eventDef
.timestamp
+ offset
;
86 this.sourceCPU
= eventDef
.getCPU();
87 this.typeId
= eventDef
.getDeclaration().getId();
88 this.eventName
= eventDef
.getDeclaration().getName();
89 this.fileName
= fileName
;
92 this.fContent
= new CtfTmfContent(ITmfEventField
.ROOT_FIELD_ID
,
93 parseFields(eventDef
));
97 * Extract the field information from the structDefinition haze-inducing
98 * mess, and put them into something ITmfEventField can cope with.
102 * @return CtfTmfEventField[]
104 private static CtfTmfEventField
[] parseFields(EventDefinition eventDef
) {
105 List
<CtfTmfEventField
> fields
= new ArrayList
<CtfTmfEventField
>();
107 StructDefinition structFields
= eventDef
.getFields();
108 HashMap
<String
, Definition
> definitions
= structFields
.getDefinitions();
110 Definition curFieldDef
;
111 CtfTmfEventField curField
;
113 for (Entry
<String
, Definition
> entry
: definitions
.entrySet()) {
114 curFieldName
= entry
.getKey();
115 curFieldDef
= entry
.getValue();
116 curField
= CtfTmfEventField
.parseField(curFieldDef
, curFieldName
);
117 if (curField
== null) {
118 // TmfCorePlugin.getDefault().log(
119 // "We've parsed an unimplemented field type for event \"" + this.eventName //$NON-NLS-1$
120 // + "\", field \"" + curFieldName + "\" of type " + curFieldDef.getClass().toString()); //$NON-NLS-1$ //$NON-NLS-2$
122 fields
.add(curField
);
125 return fields
.toArray(new CtfTmfEventField
[fields
.size()]);
133 public CtfTmfEvent(CtfTmfEvent other
) {
134 this.fTrace
= other
.getTrace();
135 /* Primitives, those will be copied by value */
136 this.timestamp
= other
.timestamp
;
137 this.sourceCPU
= other
.sourceCPU
;
138 this.typeId
= other
.typeId
;
140 /* Strings are immutable, it's safe to shallow-copy them */
141 this.eventName
= other
.eventName
;
142 this.fileName
= other
.fileName
;
144 /* Copy the fields over */
145 this.fContent
= (CtfTmfContent
) other
.fContent
.clone();
149 * Inner constructor to create "null" events. Don't use this directly, use
150 * CTFEvent.getNullEvent();
152 public CtfTmfEvent() {
157 this.fileName
= NO_STREAM
;
158 this.eventName
= EMPTY_CTF_EVENT_NAME
;
159 this.fContent
= null;
162 // ------------------------------------------------------------------------
163 // Getters/Setters/Predicates
164 // ------------------------------------------------------------------------
166 private static CtfTmfEvent nullEvent
= null;
171 * @return an empty event. */
172 public static CtfTmfEvent
getNullEvent() {
173 if (nullEvent
== null) {
174 nullEvent
= new CtfTmfEvent();
180 * Gets the current timestamp of the event
182 * @return the current timestamp (long) */
183 public long getTimestampValue() {
184 return this.timestamp
;
188 * Gets the cpu core the event was recorded on.
190 * @return the cpu id for a given source. In lttng it's from CPUINFO */
191 public int getCPU() {
192 return this.sourceCPU
;
196 * Return this event's ID, according to the trace's metadata. Watch out,
197 * this ID is not constant from one trace to another for the same event
198 * types! Use "getEventName()" for a constant reference.
201 * @return the event ID */
202 public long getID() {
207 * Gets the name of a current event.
209 * @return the event name */
210 public String
getEventName() {
215 * Gets the channel name of a field.
217 * @return the channel name. */
218 public String
getChannelName() {
219 return this.fileName
;
224 * @return CtfTmfTrace
225 * @see org.eclipse.linuxtools.tmf.core.event.ITmfEvent#getTrace()
228 public CtfTmfTrace
getTrace() {
235 * @see org.eclipse.linuxtools.tmf.core.event.ITmfEvent#getRank()
238 public long getRank() {
239 // TODO Auto-generated method stub
243 private ITmfTimestamp fTimestamp
= null;
245 // TODO Benchmark if the singleton approach is faster than just
246 // instantiating a final fTimestramp right away at creation time
248 * Method getTimestamp.
249 * @return ITmfTimestamp
250 * @see org.eclipse.linuxtools.tmf.core.event.ITmfEvent#getTimestamp()
253 public ITmfTimestamp
getTimestamp() {
254 if (fTimestamp
== null) {
255 fTimestamp
= new CtfTmfTimestamp(timestamp
);
260 String fSource
= null;
264 * @see org.eclipse.linuxtools.tmf.core.event.ITmfEvent#getSource()
267 public String
getSource() {
268 // TODO Returns CPU for now
269 if(fSource
== null) {
270 fSource
= Integer
.toString(getCPU());
275 private CtfTmfEventType type
= null;
278 * @return ITmfEventType
279 * @see org.eclipse.linuxtools.tmf.core.event.ITmfEvent#getType()
282 public ITmfEventType
getType() {
284 type
= new CtfTmfEventType(CONTEXT_ID
, eventName
, fContent
);
291 * @return ITmfEventField
292 * @see org.eclipse.linuxtools.tmf.core.event.ITmfEvent#getContent()
295 public ITmfEventField
getContent() {
299 String fReference
= null;
301 * Method getReference.
303 * @see org.eclipse.linuxtools.tmf.core.event.ITmfEvent#getReference()
306 public String
getReference() {
307 if( fReference
== null){
308 fReference
= getChannelName();
315 * @return CtfTmfEvent
316 * @see org.eclipse.linuxtools.tmf.core.event.ITmfEvent#clone()
319 public CtfTmfEvent
clone() {
320 return new CtfTmfEvent(this);