Commit | Line | Data |
---|---|---|
5d10d135 ASL |
1 | /******************************************************************************* |
2 | * Copyright (c) 2009 Ericsson | |
3 | * | |
4 | * All rights reserved. This program and the accompanying materials are | |
5 | * made 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 | |
8 | * | |
9 | * Contributors: | |
10 | * William Bourque (wbourque@gmail.com) - Initial API and implementation | |
11 | *******************************************************************************/ | |
12 | ||
13 | package org.eclipse.linuxtools.lttng.event; | |
14 | ||
28b94d61 FC |
15 | import java.util.HashMap; |
16 | ||
0188b342 | 17 | import org.eclipse.linuxtools.lttng.jni.JniEvent; |
5d10d135 | 18 | import org.eclipse.linuxtools.tmf.event.TmfEventContent; |
cbd4ad82 | 19 | import org.eclipse.linuxtools.tmf.event.TmfNoSuchFieldException; |
5d10d135 ASL |
20 | |
21 | /** | |
07d9e2ee FC |
22 | * <b><u>LttngEventContent</u></b><p> |
23 | * | |
24 | * Lttng specific implementation of the TmfEventContent.<p> | |
5d10d135 ASL |
25 | */ |
26 | public class LttngEventContent extends TmfEventContent { | |
27 | ||
28b94d61 FC |
28 | // Hash map that contain the (parsed) fields. This is the actual payload of the event. |
29 | HashMap<String, LttngEventField> fFieldsMap = new HashMap<String, LttngEventField>(); | |
30 | ||
5d10d135 | 31 | /** |
28b94d61 | 32 | * Default constructor.<p> |
07d9e2ee | 33 | * |
5d10d135 | 34 | * |
5d10d135 | 35 | */ |
28b94d61 FC |
36 | public LttngEventContent() { |
37 | super(null, null); | |
5d10d135 | 38 | } |
28b94d61 | 39 | |
5d10d135 | 40 | /** |
07d9e2ee | 41 | * Constructor with parameters.<p> |
5d10d135 | 42 | * |
28b94d61 FC |
43 | * @param thisParent Parent event for this content. |
44 | * | |
45 | * @see org.eclipse.linuxtools.lttng.event.LttngEvent | |
46 | */ | |
47 | public LttngEventContent(LttngEvent thisParent) { | |
48 | super(thisParent, null); | |
49 | } | |
50 | ||
51 | /** | |
52 | * Constructor with parameters, with optional content.<p> | |
53 | * | |
54 | * @param thisParent Parent event for this content. | |
55 | * @param thisContent Already parsed content. | |
56 | * | |
57 | * @see org.eclipse.linuxtools.lttng.event.LttngEvent | |
5d10d135 | 58 | */ |
28b94d61 FC |
59 | public LttngEventContent(LttngEvent thisParent, HashMap<String, LttngEventField> thisContent) { |
60 | super(thisParent, null); | |
3fbd810a | 61 | |
28b94d61 | 62 | fFieldsMap = thisContent; |
5d10d135 ASL |
63 | } |
64 | ||
3fbd810a | 65 | /** |
07d9e2ee | 66 | * Copy Constructor.<p> |
3fbd810a | 67 | * |
07d9e2ee | 68 | * @param oldContent Content to copy from |
3fbd810a FC |
69 | */ |
70 | public LttngEventContent(LttngEventContent oldContent) { | |
28b94d61 FC |
71 | this((LttngEvent)oldContent.getEvent(), oldContent.getRawContent() ); |
72 | } | |
73 | ||
74 | ||
b5983975 FC |
75 | @Override |
76 | public LttngEvent getEvent() { | |
28b94d61 FC |
77 | return (LttngEvent)fParentEvent; |
78 | } | |
79 | ||
80 | public void setEvent(LttngEvent newParent) { | |
81 | fParentEvent = newParent; | |
82 | } | |
83 | ||
84 | ||
85 | // *** VERIFY *** | |
86 | // These are not very useful, are they? | |
b5983975 FC |
87 | @Override |
88 | public LttngEventType getType() { | |
28b94d61 | 89 | return (LttngEventType)fParentEvent.getType(); |
28b94d61 FC |
90 | } |
91 | public void setType(LttngEventType newType) { | |
92 | ((LttngEvent)fParentEvent).setType(newType); | |
3fbd810a FC |
93 | } |
94 | ||
28b94d61 FC |
95 | |
96 | // ***TODO*** | |
97 | // Find a better way to ensure content is sane!! | |
98 | public void emptyContent() { | |
99 | fFieldsMap.clear(); | |
100 | } | |
101 | ||
102 | // ***VERIFY*** | |
0188b342 | 103 | // A bit weird to return the _currently_parsed fields (unlike all fields like getFields() ) |
28b94d61 | 104 | // Should we keep this? |
07d9e2ee | 105 | /** |
28b94d61 | 106 | * Return currently parsed fields in an object array format.<p> |
07d9e2ee | 107 | * |
28b94d61 | 108 | * @return Currently parsed fields. |
5d10d135 ASL |
109 | */ |
110 | @Override | |
28b94d61 FC |
111 | public Object[] getContent() { |
112 | Object[] returnedContent = fFieldsMap.values().toArray( new Object[fFieldsMap.size()] ); | |
5d10d135 | 113 | |
28b94d61 | 114 | return returnedContent; |
5d10d135 | 115 | } |
28b94d61 | 116 | |
07d9e2ee | 117 | /** |
28b94d61 | 118 | * Return currently parsed fields in the internal hashmap format.<p> |
07d9e2ee | 119 | * |
28b94d61 FC |
120 | * @return Currently parsed fields. |
121 | */ | |
122 | public HashMap<String, LttngEventField> getRawContent() { | |
123 | return fFieldsMap; | |
124 | } | |
125 | ||
126 | // @SuppressWarnings("unchecked") | |
127 | // @Override | |
128 | // public LttngEventField[] getFields() { | |
129 | // LttngEventField tmpField = null; | |
130 | // | |
131 | // // *** TODO *** | |
132 | // // SLOW! SLOW! SLOW! We should prevent the user to use this!! | |
133 | // HashMap<String, Object> parsedContent = parseContent(); | |
134 | // | |
135 | // String contentKey = null; | |
136 | // Iterator<String> contentItr = parsedContent.keySet().iterator(); | |
137 | // while ( contentItr.hasNext() ) { | |
138 | // contentKey = contentItr.next(); | |
139 | // | |
140 | // tmpField = new LttngEventField(this, contentKey, parsedContent.get(contentKey)); | |
141 | // ((HashMap<String, LttngEventField>)fFields).put(contentKey, tmpField); | |
142 | // } | |
143 | // | |
144 | // return fFields.values().toArray(new LttngEventField[fFields.size()]); | |
145 | // } | |
146 | ||
147 | /** | |
148 | * Parse all fields and return them as an array of LttngFields.<p> | |
07d9e2ee | 149 | * |
28b94d61 | 150 | * Note : This function is heavy and should only be called if all fields are really needed. |
07d9e2ee | 151 | * |
28b94d61 | 152 | * @return All fields. |
07d9e2ee | 153 | * |
28b94d61 | 154 | * @see @see org.eclipse.linuxtools.lttng.event.LttngEventField |
5d10d135 ASL |
155 | */ |
156 | @Override | |
a55a769e | 157 | public synchronized LttngEventField[] getFields() { |
0188b342 WB |
158 | if ( fFieldsMap.size() < fParentEvent.getType().getNbFields() ) { |
159 | LttngEventField tmpField = null; | |
160 | LttngEventType tmpType = (LttngEventType)fParentEvent.getType(); | |
161 | ||
162 | for ( int pos=0; pos<tmpType.getNbFields(); pos++ ) { | |
cbd4ad82 | 163 | String name = null; |
64fe8e8a FC |
164 | LttngEvent lttngTmpEvent = (LttngEvent)getEvent(); //added for easier debugging |
165 | JniEvent tmpEvent = (lttngTmpEvent).convertEventTmfToJni(); | |
0a8bb596 WB |
166 | |
167 | // tmpEvent == null probably mean there is a discrepancy between Eclipse and C library | |
168 | // An error was probably printed in convertEventTmfToJni() already, but keep in mind this is SERIOUS | |
169 | if ( tmpEvent != null ) { | |
170 | try { | |
171 | name = tmpType.getLabel(pos); | |
172 | ||
173 | Object newValue = tmpEvent.parseFieldByName(name); | |
174 | tmpField = new LttngEventField(this, name, newValue ); | |
175 | fFieldsMap.put(name, tmpField); | |
176 | } | |
177 | catch (TmfNoSuchFieldException e) { | |
9c4eb5f7 | 178 | System.out.println("Invalid field position requested : " + pos + ", ignoring (getFields)."); //$NON-NLS-1$//$NON-NLS-2$ |
0a8bb596 | 179 | } |
0188b342 WB |
180 | } |
181 | } | |
5d10d135 | 182 | } |
28b94d61 | 183 | return fFieldsMap.values().toArray(new LttngEventField[fFieldsMap.size()]); |
5d10d135 ASL |
184 | } |
185 | ||
186 | /** | |
28b94d61 | 187 | * Parse a single field from its given position.<p> |
07d9e2ee | 188 | * |
28b94d61 | 189 | * @return The parsed field or null. |
07d9e2ee | 190 | * |
28b94d61 | 191 | * @see @see org.eclipse.linuxtools.lttng.event.LttngEventField |
5d10d135 | 192 | */ |
28b94d61 FC |
193 | @Override |
194 | public LttngEventField getField(int position) { | |
195 | LttngEventField returnedField = null; | |
cbd4ad82 FC |
196 | String label = null; |
197 | try { | |
198 | label = fParentEvent.getType().getLabel(position); | |
0a8bb596 WB |
199 | |
200 | returnedField = this.getField(label); | |
201 | } | |
202 | catch (TmfNoSuchFieldException e) { | |
9c4eb5f7 | 203 | System.out.println("Invalid field position requested : " + position + ", ignoring (getField)."); //$NON-NLS-1$//$NON-NLS-2$ |
cbd4ad82 | 204 | } |
88144d4a | 205 | |
28b94d61 | 206 | return returnedField; |
5d10d135 ASL |
207 | } |
208 | ||
209 | /** | |
28b94d61 | 210 | * Parse a single field from its given name.<p> |
07d9e2ee | 211 | * |
28b94d61 | 212 | * @return The parsed field or null. |
07d9e2ee | 213 | * |
28b94d61 | 214 | * @see @see org.eclipse.linuxtools.lttng.event.LttngEventField |
5d10d135 | 215 | */ |
28b94d61 | 216 | @Override |
a55a769e | 217 | public synchronized LttngEventField getField(String name) { |
e31e01e8 | 218 | // *** VERIFY *** |
28b94d61 FC |
219 | // Should we check if the field exists in LttngType before parsing? |
220 | // It could avoid calling parse for non-existent fields but would waste some cpu cycle on check? | |
221 | LttngEventField returnedField = fFieldsMap.get(name); | |
5d10d135 | 222 | |
28b94d61 FC |
223 | if ( returnedField == null ) { |
224 | // *** VERIFY *** | |
225 | // Should we really make sure we didn't get null before creating/inserting a field? | |
0188b342 WB |
226 | JniEvent tmpEvent = ((LttngEvent)getEvent()).convertEventTmfToJni(); |
227 | ||
228 | if ( tmpEvent != null) { | |
229 | Object newValue = tmpEvent.parseFieldByName(name); | |
230 | ||
231 | if ( newValue!= null ) { | |
232 | returnedField = new LttngEventField(this, name, newValue); | |
233 | fFieldsMap.put(name, returnedField ); | |
234 | } | |
235 | } | |
5d10d135 | 236 | } |
28b94d61 | 237 | |
5d10d135 ASL |
238 | return returnedField; |
239 | } | |
240 | ||
28b94d61 FC |
241 | // *** VERIFY *** |
242 | // *** Is this even useful? | |
243 | @Override | |
244 | protected void parseContent() { | |
245 | fFields = getFields(); | |
246 | } | |
247 | ||
5d10d135 | 248 | /** |
28b94d61 | 249 | * toString() method to print the content |
5d10d135 | 250 | * |
28b94d61 | 251 | * Note : this function parse all fields and so is very heavy to use. |
5d10d135 | 252 | */ |
6d848cce | 253 | @Override |
3b38ea61 | 254 | @SuppressWarnings("nls") |
28b94d61 | 255 | public String toString() { |
28b94d61 FC |
256 | LttngEventField[] allFields = getFields(); |
257 | ||
47e81b11 | 258 | StringBuffer strBuffer = new StringBuffer(); |
28b94d61 | 259 | for ( int pos=0; pos < allFields.length; pos++) { |
550d787e | 260 | if (pos != 0) strBuffer.append(","); |
47e81b11 | 261 | strBuffer.append(allFields[pos].toString()); |
28b94d61 FC |
262 | } |
263 | ||
47e81b11 | 264 | return strBuffer.toString(); |
5d10d135 | 265 | } |
1a971e96 FC |
266 | |
267 | @Override | |
268 | public LttngEventContent clone() { | |
269 | LttngEventContent clone = (LttngEventContent) super.clone(); | |
270 | LttngEventField[] fields = getFields(); | |
271 | clone.fFields = new LttngEventField[fields.length]; | |
272 | for (int i = 0; i < fields.length; i++) { | |
273 | clone.fFields[i] = fields[i].clone(); | |
274 | } | |
275 | clone.fFieldsMap = new HashMap<String, LttngEventField>(); | |
276 | for (String key : fFieldsMap.keySet()) { | |
277 | clone.fFieldsMap.put(new String(key), ((LttngEventField) fFieldsMap.get(key)).clone()); | |
278 | } | |
279 | return clone; | |
280 | } | |
281 | ||
5d10d135 | 282 | } |