tmf: Drop generics from ITmfTrace and TmfExperiment
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.core / src / org / eclipse / linuxtools / tmf / core / ctfadaptor / CtfTmfTrace.java
1 /*******************************************************************************
2 * Copyright (c) 2012 Ericsson
3 *
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
8 *
9 * Contributors: Matthew Khouzam - Initial API and implementation
10 *******************************************************************************/
11
12 package org.eclipse.linuxtools.tmf.core.ctfadaptor;
13
14 import org.eclipse.core.resources.IProject;
15 import org.eclipse.core.resources.IResource;
16 import org.eclipse.core.runtime.CoreException;
17 import org.eclipse.linuxtools.ctf.core.trace.CTFReaderException;
18 import org.eclipse.linuxtools.ctf.core.trace.CTFTrace;
19 import org.eclipse.linuxtools.tmf.core.ctfadaptor.CtfTmfTimestamp.TimestampType;
20 import org.eclipse.linuxtools.tmf.core.event.ITmfTimestamp;
21 import org.eclipse.linuxtools.tmf.core.event.ITmfEvent;
22 import org.eclipse.linuxtools.tmf.core.event.TmfTimestamp;
23 import org.eclipse.linuxtools.tmf.core.exceptions.TmfTraceException;
24 import org.eclipse.linuxtools.tmf.core.statesystem.IStateSystemQuerier;
25 import org.eclipse.linuxtools.tmf.core.trace.ITmfContext;
26 import org.eclipse.linuxtools.tmf.core.trace.ITmfEventParser;
27 import org.eclipse.linuxtools.tmf.core.trace.ITmfLocation;
28 import org.eclipse.linuxtools.tmf.core.trace.TmfTrace;
29
30 /**
31 * The CTf trace handler
32 *
33 * @version 1.0
34 * @author Matthew khouzam
35 */
36 public class CtfTmfTrace extends TmfTrace implements ITmfEventParser{
37
38
39 //-------------------------------------------
40 // Constants
41 //-------------------------------------------
42 /**
43 * Default cache size for CTF traces
44 */
45 protected static final int DEFAULT_CACHE_SIZE = 50000;
46
47 //-------------------------------------------
48 // Fields
49 //-------------------------------------------
50
51 /** Reference to the state system assigned to this trace */
52 protected IStateSystemQuerier ss = null;
53
54 /* Reference to the CTF Trace */
55 private CTFTrace fTrace;
56
57
58
59 //-------------------------------------------
60 // TmfTrace Overrides
61 //-------------------------------------------
62 /**
63 * Method initTrace.
64 *
65 * @param resource
66 * The resource associated with this trace
67 * @param path
68 * The path to the trace file
69 * @param eventType
70 * The type of events that will be read from this trace
71 * @throws TmfTraceException
72 * If something when wrong while reading the trace
73 */
74 @Override
75 public void initTrace(final IResource resource, final String path, final Class<? extends ITmfEvent> eventType)
76 throws TmfTraceException {
77 /*
78 * Set the cache size. This has to be done before the call to super()
79 * because the super needs to know the cache size.
80 */
81 setCacheSize();
82 super.initTrace(resource, path, eventType);
83
84 @SuppressWarnings("unused")
85 CtfTmfEventType type;
86
87 try {
88 this.fTrace = new CTFTrace(path);
89 CtfIteratorManager.addTrace(this);
90 CtfTmfLightweightContext ctx;
91 /* Set the start and (current) end times for this trace */
92 ctx = new CtfTmfLightweightContext(this);
93 ctx.setLocation(new CtfLocation(0L));
94 if(ctx.getLocation().equals(CtfIterator.NULL_LOCATION)) {
95 /* Handle the case where the trace is empty */
96 this.setStartTime(TmfTimestamp.BIG_BANG);
97 } else {
98 final ITmfTimestamp curTime = ctx.getCurrentEvent().getTimestamp();
99 this.setStartTime(curTime);
100 this.setEndTime(curTime);
101 }
102
103 } catch (final CTFReaderException e) {
104 /*
105 * If it failed at the init(), we can assume it's because the file
106 * was not found or was not recognized as a CTF trace. Throw into
107 * the new type of exception expected by the rest of TMF.
108 */
109 throw new TmfTraceException(e.getMessage(), e);
110 }
111
112 //FIXME This should be called via the ExperimentUpdated signal
113 buildStateSystem();
114
115 /* Refresh the project, so it can pick up new files that got created. */
116 if ( resource != null) {
117 try {
118 resource.getProject().refreshLocal(IResource.DEPTH_INFINITE, null);
119 } catch (CoreException e) {
120 throw new TmfTraceException(e.getMessage(), e);
121 }
122 }
123 }
124
125 /* (non-Javadoc)
126 * @see org.eclipse.linuxtools.tmf.core.trace.TmfTrace#dispose()
127 */
128 @Override
129 public synchronized void dispose() {
130 CtfIteratorManager.removeTrace(this);
131 super.dispose();
132 }
133
134 /**
135 * Method validate.
136 * @param project IProject
137 * @param path String
138 * @return boolean
139 * @see org.eclipse.linuxtools.tmf.core.trace.ITmfTrace#validate(IProject, String)
140 */
141 @Override
142 public boolean validate(final IProject project, final String path) {
143 try {
144 final CTFTrace temp = new CTFTrace(path);
145 return temp.majortIsSet(); // random test
146 } catch (final CTFReaderException e) {
147 /* Nope, not a CTF trace we can read */
148 return false;
149 }
150 }
151
152 /**
153 * Method getCurrentLocation. This is not applicable in CTF
154 * @return null, since the trace has no knowledge of the current location
155 * @see org.eclipse.linuxtools.tmf.core.trace.ITmfTrace#getCurrentLocation()
156 */
157 @Override
158 public ITmfLocation<?> getCurrentLocation() {
159 return null;
160 }
161
162
163
164 @Override
165 public double getLocationRatio(ITmfLocation<?> location) {
166 final CtfLocation curLocation = (CtfLocation) location;
167 final CtfTmfLightweightContext context = new CtfTmfLightweightContext(this);
168 context.setLocation(curLocation);
169 context.seek(curLocation.getLocation());
170 final long currentTime = ((Long)context.getLocation().getLocation());
171 final long startTime = getIterator(this, context).getStartTime();
172 final long endTime = getIterator(this, context).getEndTime();
173 return ((double) currentTime - startTime)
174 / (endTime - startTime);
175 }
176
177
178
179
180
181 /* (non-Javadoc)
182 * @see org.eclipse.linuxtools.tmf.core.trace.TmfTrace#seekEvent(org.eclipse.linuxtools.tmf.core.event.ITmfTimestamp)
183 */
184 @Override
185 public synchronized ITmfContext seekEvent(ITmfTimestamp timestamp) {
186 if( timestamp instanceof CtfTmfTimestamp){
187 CtfTmfLightweightContext iter = new CtfTmfLightweightContext(this);
188 iter.seek(timestamp.getValue());
189 return iter;
190 }
191 return super.seekEvent(timestamp);
192 }
193
194 /**
195 * Method seekEvent.
196 * @param location ITmfLocation<?>
197 * @return ITmfContext
198 */
199 @Override
200 public ITmfContext seekEvent(final ITmfLocation<?> location) {
201 CtfLocation currentLocation = (CtfLocation) location;
202 CtfTmfLightweightContext context = new CtfTmfLightweightContext(this);
203 /*
204 * The rank is set to 0 if the iterator seeks the beginning. If not, it
205 * will be set to UNKNOWN_RANK, since CTF traces don't support seeking
206 * by rank for now.
207 */
208 if (currentLocation == null) {
209 currentLocation = new CtfLocation(0L);
210 context.setRank(0);
211 }
212 if (currentLocation.getLocation() == CtfLocation.INVALID_LOCATION) {
213 ((CtfTmfTimestamp) getEndTime()).setType(TimestampType.NANOS);
214 currentLocation.setLocation(getEndTime().getValue() + 1);
215 }
216 context.setLocation(currentLocation);
217 if(context.getRank() != 0) {
218 context.setRank(ITmfContext.UNKNOWN_RANK);
219 }
220 return context;
221 }
222
223
224 @Override
225 public ITmfContext seekEvent(double ratio) {
226 CtfTmfLightweightContext context = new CtfTmfLightweightContext(this);
227 context.seek((long) (this.getNbEvents() * ratio));
228 context.setRank(ITmfContext.UNKNOWN_RANK);
229 return context;
230 }
231
232 /**
233 * Method readNextEvent.
234 * @param context ITmfContext
235 * @return CtfTmfEvent
236 * @see org.eclipse.linuxtools.tmf.core.trace.ITmfTrace#getNext(ITmfContext)
237 */
238 @Override
239 public synchronized CtfTmfEvent getNext(final ITmfContext context) {
240 CtfTmfEvent event = null;
241 if (context instanceof CtfTmfLightweightContext) {
242 if (CtfLocation.INVALID_LOCATION.equals(context.getLocation().getLocation())) {
243 return null;
244 }
245 CtfTmfLightweightContext ctfContext = (CtfTmfLightweightContext) context;
246 event = ctfContext.getCurrentEvent();
247
248 if (event != null) {
249 updateAttributes(context, event.getTimestamp());
250 ctfContext.advance();
251 ctfContext.increaseRank();
252 }
253 }
254
255 return event;
256 }
257
258 /**
259 * Suppressing the warning, because the 'throws' will usually happen in
260 * sub-classes.
261 *
262 * @throws TmfTraceException
263 */
264 @SuppressWarnings("unused")
265 protected void buildStateSystem() throws TmfTraceException {
266 /*
267 * Nothing is done in the basic implementation, please specify
268 * how/if to build a state system in derived classes.
269 */
270 return;
271 }
272
273 /**
274 * Method getStateSystem.
275 *
276 * @return IStateSystemQuerier
277 */
278 public IStateSystemQuerier getStateSystem() {
279 return this.ss;
280 }
281
282 /**
283 * gets the CTFtrace that this is wrapping
284 * @return the CTF trace
285 */
286 public CTFTrace getCTFTrace() {
287 return fTrace;
288 }
289
290
291 //-------------------------------------------
292 // Environment Parameters
293 //-------------------------------------------
294 /**
295 * Method getNbEnvVars.
296 *
297 * @return int
298 */
299 public int getNbEnvVars() {
300 return this.fTrace.getEnvironment().size();
301 }
302
303 /**
304 * Method getEnvNames.
305 *
306 * @return String[]
307 */
308 public String[] getEnvNames() {
309 final String[] s = new String[getNbEnvVars()];
310 return this.fTrace.getEnvironment().keySet().toArray(s);
311 }
312
313 /**
314 * Method getEnvValue.
315 *
316 * @param key
317 * String
318 * @return String
319 */
320 public String getEnvValue(final String key) {
321 return this.fTrace.getEnvironment().get(key);
322 }
323
324 //-------------------------------------------
325 // Clocks
326 //-------------------------------------------
327
328 /**
329 * gets the clock offset
330 * @return the clock offset in ns
331 */
332 public long getOffset(){
333 if( fTrace != null ) {
334 return fTrace.getOffset();
335 }
336 return 0;
337 }
338
339 //-------------------------------------------
340 // Parser
341 //-------------------------------------------
342
343 @Override
344 public CtfTmfEvent parseEvent(ITmfContext context) {
345 CtfTmfEvent event = null;
346 if( context instanceof CtfTmfLightweightContext ){
347 CtfTmfLightweightContext itt = (CtfTmfLightweightContext) context.clone();
348 event = itt.getCurrentEvent();
349 }
350 return event;
351 }
352
353 /**
354 * Sets the cache size for a CtfTmfTrace.
355 */
356 protected void setCacheSize() {
357 setCacheSize(DEFAULT_CACHE_SIZE);
358 }
359
360 //-------------------------------------------
361 // Helpers
362 //-------------------------------------------
363
364 private static CtfIterator getIterator(CtfTmfTrace trace, CtfTmfLightweightContext context) {
365 return CtfIteratorManager.getIterator(trace, context);
366 }
367 }
This page took 0.04333 seconds and 6 git commands to generate.