1 /*******************************************************************************
2 + * Copyright (c) 2009, 2010 Ericsson
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
10 * Alvaro Sanchez-Leon (alvsan09@gmail.com) - Initial API and implementation
11 *******************************************************************************/
12 package org
.eclipse
.linuxtools
.lttng
.state
.experiment
;
14 import java
.util
.HashMap
;
17 import org
.eclipse
.linuxtools
.lttng
.TraceDebug
;
18 import org
.eclipse
.linuxtools
.lttng
.control
.LttngCoreProviderFactory
;
19 import org
.eclipse
.linuxtools
.lttng
.control
.LttngSyntheticEventProvider
;
20 import org
.eclipse
.linuxtools
.lttng
.event
.LttngEvent
;
21 import org
.eclipse
.linuxtools
.lttng
.event
.LttngSyntheticEvent
;
22 import org
.eclipse
.linuxtools
.lttng
.event
.LttngSyntheticEvent
.SequenceInd
;
23 import org
.eclipse
.linuxtools
.lttng
.model
.LTTngTreeNode
;
24 import org
.eclipse
.linuxtools
.lttng
.signal
.ILttExperimentSelectedListener
;
25 import org
.eclipse
.linuxtools
.lttng
.signal
.StateExperimentListener
;
26 import org
.eclipse
.linuxtools
.lttng
.state
.trace
.IStateTraceManager
;
27 import org
.eclipse
.linuxtools
.tmf
.event
.TmfTimeRange
;
28 import org
.eclipse
.linuxtools
.tmf
.experiment
.TmfExperiment
;
29 import org
.eclipse
.linuxtools
.tmf
.request
.ITmfDataRequest
;
30 import org
.eclipse
.linuxtools
.tmf
.request
.ITmfEventRequest
;
31 import org
.eclipse
.linuxtools
.tmf
.request
.TmfDataRequest
;
32 import org
.eclipse
.linuxtools
.tmf
.request
.TmfEventRequest
;
33 import org
.eclipse
.linuxtools
.tmf
.signal
.TmfExperimentUpdatedSignal
;
34 import org
.eclipse
.linuxtools
.tmf
.trace
.ITmfTrace
;
40 public class StateExperimentManager
extends LTTngTreeNode
implements
41 ILttExperimentSelectedListener
, IStateExperimentManager
{
43 // ========================================================================
45 // =======================================================================
46 private LTTngTreeNode fSelectedExperiment
= null; // one selected experiment
48 private final StateExperimentListener fexperimentListener
;
49 private boolean fwaitForCompletion
= false;
51 * Used to route incoming events to proper trace manager, during check point
54 private final Map
<String
, IStateTraceManager
> ftraceToManagerMap
= new HashMap
<String
, IStateTraceManager
>();
55 private LttngSyntheticEvent syntheticEvent
= null;
56 private ITmfEventRequest
<LttngEvent
> fStateCheckPointRequest
= null;
59 // ========================================================================
61 // =======================================================================
62 public StateExperimentManager(Long id
, String name
) {
63 super(id
, null, name
, null);
64 fexperimentListener
= new StateExperimentListener("Experiment Manager",
69 // ========================================================================
71 // =======================================================================
74 // * @see org.eclipse.linuxtools.lttng.state.experiment.IStateExperimentManager#readExperimentTimeWindow(org.eclipse.linuxtools.tmf.event.TmfTimeRange, java.lang.String, org.eclipse.linuxtools.lttng.state.IStateDataRequestListener)
76 // public ILttngSyntEventRequest readExperimentTimeWindow(TmfTimeRange trange,
77 // Object source, IRequestStatusListener listener,
78 // ITransEventProcessor processor) {
80 // ILttngSyntEventRequest request = null;
83 // if (fSelectedExperiment != null) {
84 // // Get all trace manager nodes
85 // LTTngTreeNode[] traceMgrs = fSelectedExperiment.getChildren();
87 // if (traceMgrs != null && traceMgrs.length > 0) {
88 // IStateTraceManager traceManager;
89 // // Trigger one request per trace
90 // for (LTTngTreeNode traceNode : traceMgrs) {
91 // traceManager = (IStateTraceManager) traceNode;
92 // request = traceManager.executeDataRequest(trange, source,
98 // if (fSelectedExperiment == null) {
99 // TraceDebug.debug("No experiment selected");
107 // * @see org.eclipse.linuxtools.lttng.state.experiment.IStateExperimentManager#readExperiment(java.lang.String, org.eclipse.linuxtools.lttng.state.IStateDataRequestListener)
109 // @SuppressWarnings("unchecked")
110 // public void readExperiment(Object source, IRequestStatusListener listener,
111 // ITransEventProcessor processor) {
113 // if (fSelectedExperiment != null) {
114 // TmfExperiment<LttngEvent> experiment = (TmfExperiment<LttngEvent>) fSelectedExperiment
116 // TmfTimeRange trange = experiment.getTimeRange();
117 // readExperimentTimeWindow(trange, source, listener, processor);
119 // TraceDebug.debug("No selected experiment available");
129 * org.eclipse.linuxtools.lttng.state.experiment.IStateExperimentManager
130 * #experimentSelected_prep
131 * (org.eclipse.linuxtools.tmf.experiment.TmfExperiment)
133 public void experimentSelected_prep(TmfExperiment
<LttngEvent
> experiment
) {
134 LTTngTreeNode experimentNode
= null;
135 if (experiment
!= null) {
136 experimentNode
= getChildByName(experiment
.getName());
137 // keep experiment if already loaded with the same value
138 if (experimentNode
!= null
139 && experimentNode
.getValue() != experiment
) {
140 // rebuild the experiment nodes from scratch
141 removeChild(experimentNode
);
142 experimentNode
= null;
145 // Make sure all traces involved have a corresponding state manager
147 // state system to request its initial data
148 if (experimentNode
== null) {
149 // Create the new experiment tree node
150 experimentNode
= new LTTngTreeNode(getNextUniqueId(), this,
151 experiment
.getName(), experiment
);
152 // add the new experiment to this children list
153 addChild(experimentNode
);
156 // Make sure the traces exists in the tree
157 ITmfTrace
[] rtraces
= experiment
.getTraces();
159 LTTngTreeNode traceStateManagerNode
;
160 // StateStacksHandler
161 for (ITmfTrace rtrace
: rtraces
) {
162 traceName
= rtrace
.getName();
163 traceStateManagerNode
= experimentNode
.getChildByName(traceName
);
164 // Node does not exist for this experiment, so needs to be
166 if (traceStateManagerNode
== null) {
167 traceStateManagerNode
= StateManagerFactory
.getManager(
168 rtrace
, experimentNode
);
169 experimentNode
.addChild(traceStateManagerNode
);
173 // Reset event provider to handle requests for the new experiment
174 LttngSyntheticEventProvider synEventProvider
= LttngCoreProviderFactory
176 synEventProvider
.reset(experimentNode
);
178 // preserve the selected experiment
179 fSelectedExperiment
= experimentNode
;
186 * @see org.eclipse.linuxtools.lttng.signal.ILttExperimentSelectedListener#
187 * experimentSelected(java.lang.Object,
188 * org.eclipse.linuxtools.tmf.experiment.TmfExperiment)
190 public void experimentSelected(Object source
,
191 TmfExperiment
<LttngEvent
> experiment
) {
193 if (experiment
== null) {
194 TraceDebug
.debug("Received expriment is null");
198 // If previous request is ongoing, cancel it before requesting a new
200 if (fStateCheckPointRequest
!= null && !fStateCheckPointRequest
.isCompleted()) {
201 fStateCheckPointRequest
.cancel();
204 // trigger data request to build the state system check points
205 fStateCheckPointRequest
= buildCheckPoints(experiment
);
207 // LTTngTreeNode experimentNode = getChildByName(experiment.getName());
208 // if (experimentNode != null) {
209 // // get the trace manager nodes
210 // LTTngTreeNode[] traceNodes = experimentNode.getChildren();
211 // for (LTTngTreeNode traceStateManagerNode : traceNodes) {
212 // // The trace node needs to perform its first data request
213 // // for this experiment with the main goal of building its
215 // if (traceStateManagerNode instanceof ILttExperimentSelectedListener) {
216 // // no need to provide the trace to the trace manager
217 // ((ILttExperimentSelectedListener) traceStateManagerNode).experimentUpdated(
218 // new TmfExperimentUpdatedSignal(source, experiment, null), fwaitForCompletion);
227 * @see org.eclipse.linuxtools.lttng.signal.ILttExperimentSelectedListener#
229 * (org.eclipse.linuxtools.tmf.signal.TmfExperimentUpdatedSignal, boolean)
231 public void experimentUpdated(TmfExperimentUpdatedSignal signal
, boolean wait
) {
232 // NOTE: This represents the end of TMF indexing for a trace, however
233 // the node was already existing and the state system check points are
234 // already requested and built upon selection.
235 // No action for the time being
240 * @return the SelectedExperiment tree node
242 public LTTngTreeNode
getSelectedExperiment() {
243 return fSelectedExperiment
;
247 * @see org.eclipse.linuxtools.lttng.state.experiment.IStateExperimentManager#getExperimentTimeRange()
249 @SuppressWarnings("unchecked")
250 public TmfTimeRange
getExperimentTimeRange() {
251 TmfTimeRange timeRangeResult
= null;
252 if (fSelectedExperiment
!= null) {
253 timeRangeResult
= ((TmfExperiment
<LttngEvent
>) fSelectedExperiment
254 .getValue()).getTimeRange();
256 return timeRangeResult
;
262 * @see java.lang.Object#finalize()
265 protected void finalize() {
266 fexperimentListener
.dispose();
274 * org.eclipse.linuxtools.lttng.state.experiment.IStateExperimentManager
275 * #waitForComplete(boolean)
277 public void waitForCompletion(boolean wait
) {
278 fwaitForCompletion
= wait
;
281 private ITmfEventRequest
<LttngEvent
> buildCheckPoints(TmfExperiment
<LttngEvent
> experiment
) {
283 if (experiment
== null) {
284 TraceDebug
.debug("Received expriment is null");
288 LTTngTreeNode experimentNode
= getChildByName(experiment
.getName());
289 if (experimentNode
== null) {
290 TraceDebug
.debug("Expriment Node " + experiment
.getName() + " does not exist");
294 // get the trace manager nodes associated to the experiment
295 LTTngTreeNode
[] traceNodes
= experimentNode
.getChildren();
296 synchronized (this) {
297 ftraceToManagerMap
.clear();
301 for (LTTngTreeNode traceStateManagerNode
: traceNodes
) {
302 IStateTraceManager traceManager
;
304 traceManager
= (IStateTraceManager
) traceStateManagerNode
;
305 } catch (ClassCastException e
) {
306 System
.out
.println(e
.getStackTrace().toString());
310 // Clear all previously created check points as preparation to
312 traceManager
.clearCheckPoints();
314 // build the trace to manager mapping for event dispatching
315 trace
= traceManager
.getTrace();
316 synchronized (this) {
317 ftraceToManagerMap
.put(getTraceKey(trace
), traceManager
);
321 // if no trace mapping
322 if (ftraceToManagerMap
.size() < 1) {
323 TraceDebug
.debug("No traces associated to experiment " + experiment
.getName());
327 // Prepare event data request to build state model
328 ITmfEventRequest
<LttngEvent
> request
= new TmfEventRequest
<LttngEvent
>(
329 LttngEvent
.class, TmfTimeRange
.Eternity
,
330 TmfDataRequest
.ALL_DATA
, 1, ITmfDataRequest
.ExecutionType
.BACKGROUND
) {
338 * org.eclipse.linuxtools.tmf.request.TmfDataRequest#handleData()
341 public void handleData() {
342 LttngEvent
[] events
= getData();
343 if (events
.length
> 0) {
346 LttngEvent event
= (LttngEvent
) events
[0];
348 // Tracer.trace("Chk: " + event.getTimestamp());
350 ITmfTrace trace
= event
.getParentTrace();
351 IStateTraceManager traceManager
= ftraceToManagerMap
.get(getTraceKey(trace
));
352 if (traceManager
!= null) {
353 // obtain synthetic event
354 LttngSyntheticEvent synEvent
= updateSynEvent(event
,
356 // update state system, and save check points as needed
357 traceManager
.handleEvent(synEvent
, nbEvents
);
360 .debug("StateTraceManager not found for trace"
370 * org.eclipse.linuxtools.tmf.request.TmfDataRequest#handleFailure()
373 public void handleFailure() {
374 printCompletedMessage();
381 * org.eclipse.linuxtools.tmf.request.TmfDataRequest#handleCancel()
384 public void handleCancel() {
385 printCompletedMessage();
392 * org.eclipse.linuxtools.tmf.request.TmfDataRequest#handleSuccess()
395 public void handleSuccess() {
396 printCompletedMessage();
402 private void printCompletedMessage() {
403 // System.out.println(System.currentTimeMillis() + ": StateExperimentManager completed checkpoints");
405 // super.handleCompleted();
406 if (TraceDebug
.isDEBUG()) {
407 TraceDebug
.debug("Trace check point building completed, number of events handled: " + nbEvents
409 for (IStateTraceManager traceMgr
: ftraceToManagerMap
.values()) {
410 TraceDebug
.debug(traceMgr
.toString() + "\n\t\t");
416 // Execute event data request
417 experiment
.sendRequest(request
);
419 if (fwaitForCompletion
) {
421 request
.waitForCompletion();
422 } catch (InterruptedException e
) {
431 * Simplified trace key used to identify trace within experiment
436 private String
getTraceKey(ITmfTrace trace
) {
437 String traceKey
= trace
.getPath() + trace
.getName();
441 private LttngSyntheticEvent
updateSynEvent(LttngEvent e
, IStateTraceManager stateTraceManager
) {
442 if (syntheticEvent
== null || syntheticEvent
.getBaseEvent() != e
) {
443 syntheticEvent
= new LttngSyntheticEvent(e
);
446 // Trace model needed by application handlers
447 syntheticEvent
.setTraceModel(stateTraceManager
.getStateModel());
448 syntheticEvent
.setSequenceInd(SequenceInd
.UPDATE
);
450 return syntheticEvent
;