/*******************************************************************************
-+ * Copyright (c) 2009, 2010 Ericsson
+ * Copyright (c) 2009 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v1.0 which
import java.util.HashMap;
import java.util.Map;
-import org.eclipse.linuxtools.lttng.TraceDebug;
-import org.eclipse.linuxtools.lttng.control.LttngCoreProviderFactory;
-import org.eclipse.linuxtools.lttng.control.LttngSyntheticEventProvider;
-import org.eclipse.linuxtools.lttng.event.LttngEvent;
-import org.eclipse.linuxtools.lttng.event.LttngSyntheticEvent;
-import org.eclipse.linuxtools.lttng.event.LttngSyntheticEvent.SequenceInd;
-import org.eclipse.linuxtools.lttng.model.LTTngTreeNode;
-import org.eclipse.linuxtools.lttng.signal.ILttExperimentSelectedListener;
-import org.eclipse.linuxtools.lttng.signal.StateExperimentListener;
-import org.eclipse.linuxtools.lttng.state.trace.IStateTraceManager;
-import org.eclipse.linuxtools.tmf.event.TmfEvent;
+import org.eclipse.linuxtools.lttng.state.IStateDataRequestListener;
+import org.eclipse.linuxtools.lttng.state.StateManager;
+import org.eclipse.linuxtools.tmf.component.TmfComponent;
import org.eclipse.linuxtools.tmf.event.TmfTimeRange;
-import org.eclipse.linuxtools.tmf.experiment.TmfExperiment;
-import org.eclipse.linuxtools.tmf.request.ITmfEventRequest;
-import org.eclipse.linuxtools.tmf.request.TmfDataRequest;
-import org.eclipse.linuxtools.tmf.request.TmfEventRequest;
-import org.eclipse.linuxtools.tmf.signal.TmfExperimentUpdatedSignal;
-import org.eclipse.linuxtools.tmf.trace.ITmfTrace;
+import org.eclipse.linuxtools.tmf.signal.TmfSignalHandler;
+import org.eclipse.linuxtools.tmf.trace.TmfExperiment;
+import org.eclipse.linuxtools.tmf.trace.TmfExperimentSelectedSignal;
/**
* @author alvaro
*
*/
-public class StateExperimentManager extends LTTngTreeNode implements
- ILttExperimentSelectedListener, IStateExperimentManager {
+public class StateExperimentManager extends TmfComponent {
// ========================================================================
// Data
// =======================================================================
- private LTTngTreeNode fSelectedExperiment = null; // one selected experiment
- // supported
- private final StateExperimentListener fexperimentListener;
- private boolean fwaitForCompletion = false;
- /**
- * Used to route incoming events to proper trace manager, during check point
- * building
- */
- private final Map<ITmfTrace, IStateTraceManager> ftraceToManagerMap = new HashMap<ITmfTrace, IStateTraceManager>();
- private LttngSyntheticEvent syntheticEvent = null;
- private ITmfEventRequest<LttngEvent> fStateCheckPointRequest = null;
-
+
+ private final Map<String, StateManager> managersByID = new HashMap<String, StateManager>();
+ private TmfExperiment fExperiment = null; // one experiment supported
// ========================================================================
// Constructors
// =======================================================================
- public StateExperimentManager(Long id, String name) {
- super(id, null, name, null);
- fexperimentListener = new StateExperimentListener("Experiment Manager",
- this);
- }
+ /**
+ * package level constructor, creation from factory
+ */
+ StateExperimentManager() {
+ super();
+ }
// ========================================================================
// Methods
// =======================================================================
-// /* (non-Javadoc)
-// * @see org.eclipse.linuxtools.lttng.state.experiment.IStateExperimentManager#readExperimentTimeWindow(org.eclipse.linuxtools.tmf.event.TmfTimeRange, java.lang.String, org.eclipse.linuxtools.lttng.state.IStateDataRequestListener)
-// */
-// public ILttngSyntEventRequest readExperimentTimeWindow(TmfTimeRange trange,
-// Object source, IRequestStatusListener listener,
-// ITransEventProcessor processor) {
-//
-// ILttngSyntEventRequest request = null;
-//
-// // validate
-// if (fSelectedExperiment != null) {
-// // Get all trace manager nodes
-// LTTngTreeNode[] traceMgrs = fSelectedExperiment.getChildren();
-//
-// if (traceMgrs != null && traceMgrs.length > 0) {
-// IStateTraceManager traceManager;
-// // Trigger one request per trace
-// for (LTTngTreeNode traceNode : traceMgrs) {
-// traceManager = (IStateTraceManager) traceNode;
-// request = traceManager.executeDataRequest(trange, source,
-// listener,
-// processor);
-// }
-// }
-// } else {
-// if (fSelectedExperiment == null) {
-// TraceDebug.debug("No experiment selected");
-// }
-// }
-//
-// return request;
-// }
-
-// /* (non-Javadoc)
-// * @see org.eclipse.linuxtools.lttng.state.experiment.IStateExperimentManager#readExperiment(java.lang.String, org.eclipse.linuxtools.lttng.state.IStateDataRequestListener)
-// */
-// @SuppressWarnings("unchecked")
-// public void readExperiment(Object source, IRequestStatusListener listener,
-// ITransEventProcessor processor) {
-// // validate
-// if (fSelectedExperiment != null) {
-// TmfExperiment<LttngEvent> experiment = (TmfExperiment<LttngEvent>) fSelectedExperiment
-// .getValue();
-// TmfTimeRange trange = experiment.getTimeRange();
-// readExperimentTimeWindow(trange, source, listener, processor);
-// } else {
-// TraceDebug.debug("No selected experiment available");
-// }
-// }
-
-
-
- /*
- * (non-Javadoc)
+ /**
+ * Return the Map of unique id to Manager instance
*
- * @see
- * org.eclipse.linuxtools.lttng.state.experiment.IStateExperimentManager
- * #experimentSelected_prep
- * (org.eclipse.linuxtools.tmf.experiment.TmfExperiment)
+ * @return
*/
- public void experimentSelected_prep(TmfExperiment<LttngEvent> experiment) {
- LTTngTreeNode experimentNode = null;
- if (experiment != null) {
- experimentNode = getChildByName(experiment.getName());
- // keep experiment if already loaded with the same value
- if (experimentNode != null
- && experimentNode.getValue() != experiment) {
- // rebuild the experiment nodes from scratch
- removeChild(experimentNode);
- experimentNode = null;
- }
-
- // Make sure all traces involved have a corresponding state manager
- // and
- // state system to request its initial data
- if (experimentNode == null) {
- // Create the new experiment tree node
- experimentNode = new LTTngTreeNode(getNextUniqueId(), this,
- experiment.getName(), experiment);
- // add the new experiment to this children list
- addChild(experimentNode);
- }
-
- // Make sure the traces exists in the tree
- ITmfTrace[] rtraces = experiment.getTraces();
- String traceName;
- LTTngTreeNode traceStateManagerNode;
- // StateStacksHandler
- for (ITmfTrace rtrace : rtraces) {
- traceName = rtrace.getName();
- traceStateManagerNode = experimentNode.getChildByName(traceName);
- // Node does not exist for this experiment, so needs to be
- // created
- if (traceStateManagerNode == null) {
- traceStateManagerNode = StateManagerFactory.getManager(
- rtrace, experimentNode);
- experimentNode.addChild(traceStateManagerNode);
- }
- }
-
- // Reset event provider to handle requests for the new experiment
- LttngSyntheticEventProvider synEventProvider = LttngCoreProviderFactory
- .getEventProvider();
- synEventProvider.reset(experimentNode);
-
- // preserve the selected experiment
- fSelectedExperiment = experimentNode;
- }
+ public Map<String, StateManager> getManagersByID() {
+ return managersByID;
}
- /*
- * (non-Javadoc)
+ /**
+ * Read all available traces from the nearest checkpoint from start position
+ * to the end of a specified time range
*
- * @see org.eclipse.linuxtools.lttng.signal.ILttExperimentSelectedListener#
- * experimentSelected(java.lang.Object,
- * org.eclipse.linuxtools.tmf.experiment.TmfExperiment)
+ * @param trange
+ * @param obs
+ * @param transactionID
+ * @param display
*/
- public void experimentSelected(Object source,
- TmfExperiment<LttngEvent> experiment) {
- // validate
- if (experiment == null) {
- TraceDebug.debug("Received expriment is null");
- return;
+ public void readExperimentTimeWindow(TmfTimeRange trange,
+ String transactionID, IStateDataRequestListener listener) {
+ if (fExperiment != null) {
+ String id = fExperiment.getExperimentId();
+ StateManager manager = managersByID.get(id);
+ if (manager != null) {
+ // TODO: A loop to request data for each trace needs to be used
+ // here when multiple traces are supported.
+ manager.executeDataRequest(trange, transactionID, listener);
+ }
}
+ }
- // If previous request is ongoing, cancel it before requesting a new
- // one.
- if (fStateCheckPointRequest != null && !fStateCheckPointRequest.isCompleted()) {
- fStateCheckPointRequest.cancel();
+ public void readExperiment(String transactionID,
+ IStateDataRequestListener listener) {
+ // Need someone to listen to the updates as well as an fExperiment
+ // loaded.
+ if (listener != null && fExperiment != null) {
+ TmfTimeRange trange = fExperiment.getTimeRange();
+ String experimentId = fExperiment.getExperimentId();
+
+ // FIXME: there should be an id field available at the trace level
+ // to be fixed with the support of multiple files.
+ // We also need to iterate over the traces in the Experiment and
+ // execute a data Request on each of them
+ // This is also on hold till the request can be performed at a trace
+ // level.
+ // ITmfTrace[] fTraces = fExperiment.getTraces();
+ // for (int i=0; i < fTraces.length; i++) {
+ StateManager manager = StateManagerFactory.getManager(experimentId);
+ manager.executeDataRequest(trange, transactionID, listener);
+ // }
}
-
- // trigger data request to build the state system check points
- fStateCheckPointRequest = buildCheckPoints(experiment);
-
-// LTTngTreeNode experimentNode = getChildByName(experiment.getName());
-// if (experimentNode != null) {
-// // get the trace manager nodes
-// LTTngTreeNode[] traceNodes = experimentNode.getChildren();
-// for (LTTngTreeNode traceStateManagerNode : traceNodes) {
-// // The trace node needs to perform its first data request
-// // for this experiment with the main goal of building its
-// // checkpoints
-// if (traceStateManagerNode instanceof ILttExperimentSelectedListener) {
-// // no need to provide the trace to the trace manager
-// ((ILttExperimentSelectedListener) traceStateManagerNode).experimentUpdated(
-// new TmfExperimentUpdatedSignal(source, experiment, null), fwaitForCompletion);
-// }
-// }
-// }
}
-
+
/*
* (non-Javadoc)
*
- * @see org.eclipse.linuxtools.lttng.signal.ILttExperimentSelectedListener#
- * experimentUpdated
- * (org.eclipse.linuxtools.tmf.signal.TmfExperimentUpdatedSignal, boolean)
+ * @see
+ * org.eclipse.linuxtools.tmf.eventlog.ITmfEventLogEventListener#handleEvent
+ * (org.eclipse.linuxtools.tmf.eventlog.ITmfEventLogEvent)
*/
- public void experimentUpdated(TmfExperimentUpdatedSignal signal, boolean wait) {
- // NOTE: This represents the end of TMF indexing for a trace, however
- // the node was already existing and the state system check points are
- // already requested and built upon selection.
- // No action for the time being
+ @TmfSignalHandler
+ public void experimentSelected(TmfExperimentSelectedSignal signal) {
+ // TmfExperiment experiment = signal.getExperiment();
+ // ITmfTrace[] traces = experiment.getTraces();
+ // for (ITmfTrace trace : traces) {
+ //
+ // }
+ if (signal != null) {
+ fExperiment = signal.getExperiment();
+ traceSelected(fExperiment);
+ }
}
-
/**
- * @return the SelectedExperiment tree node
+ * A new Experiment selected, notification received from the framework
+ * Notify the new log selection to the state handling managers
+ *
+ * @param experiment
*/
- public LTTngTreeNode getSelectedExperiment() {
- return fSelectedExperiment;
+ private void traceSelected(TmfExperiment experiment) {
+ // TODO: Re-factor when multiple traces are supported
+ // traceId, as well as when the request can be specified at the trace
+ // level
+ // For the moment it does work for only one trace per experiment.
+ String experimentId = experiment.getExperimentId();
+ StateManager manager = StateManagerFactory.getManager(experimentId);
+ // TODO: clearAllData shall not be applied to all manager calls below
+ // since that would clean all data loaded within previous iterations in
+ // the future loop. i.e. It can be applied to first manager in the loop.
+ boolean clearAllData = true;
+ manager.setTraceSelection(experiment, clearAllData);
}
- /* (non-Javadoc)
- * @see org.eclipse.linuxtools.lttng.state.experiment.IStateExperimentManager#getExperimentTimeRange()
+ /**
+ * @return
*/
- @SuppressWarnings("unchecked")
public TmfTimeRange getExperimentTimeRange() {
TmfTimeRange timeRangeResult = null;
- if (fSelectedExperiment != null) {
- timeRangeResult = ((TmfExperiment<LttngEvent>) fSelectedExperiment
- .getValue()).getTimeRange();
+ if (fExperiment != null) {
+ timeRangeResult = fExperiment.getTimeRange();
}
return timeRangeResult;
}
- /*
- * (non-Javadoc)
- *
- * @see java.lang.Object#finalize()
- */
- @Override
- protected void finalize() {
- fexperimentListener.dispose();
- }
-
-
- /*
- * (non-Javadoc)
- *
- * @see
- * org.eclipse.linuxtools.lttng.state.experiment.IStateExperimentManager
- * #waitForComplete(boolean)
- */
- public void waitForCompletion(boolean wait) {
- fwaitForCompletion = wait;
- }
-
- private ITmfEventRequest<LttngEvent> buildCheckPoints(TmfExperiment<LttngEvent> experiment) {
- // validate
- if (experiment == null) {
- TraceDebug.debug("Received expriment is null");
- return null;
- }
-
- LTTngTreeNode experimentNode = getChildByName(experiment.getName());
- if (experimentNode == null) {
- TraceDebug.debug("Expriment Node " + experiment.getName() + " does not exist");
- return null;
- }
-
- // get the trace manager nodes associated to the experiment
- LTTngTreeNode[] traceNodes = experimentNode.getChildren();
- synchronized (ftraceToManagerMap) {
- ftraceToManagerMap.clear();
- }
-
- for (LTTngTreeNode traceStateManagerNode : traceNodes) {
- IStateTraceManager traceManager;
- try {
- traceManager = (IStateTraceManager) traceStateManagerNode;
- } catch (ClassCastException e) {
- System.out.println(e.getStackTrace().toString());
- return null;
- }
-
- // Clear all previously created check points as preparation to
- // re-build
- traceManager.clearCheckPoints();
-
- // build the trace to manager mapping for event dispatching
- synchronized (ftraceToManagerMap) {
- ftraceToManagerMap.put(traceManager.getTrace(), traceManager);
- }
- }
-
- // if no trace mapping
- if (ftraceToManagerMap.size() < 1) {
- TraceDebug.debug("No traces associated to experiment " + experiment.getName());
- return null;
- }
-
- // Prepare event data request to build state model
- ITmfEventRequest<LttngEvent> request = new TmfEventRequest<LttngEvent>(
- LttngEvent.class, TmfTimeRange.Eternity,
- TmfDataRequest.ALL_DATA, 1) {
-
- Long nbEvents = 0L;
-
- /*
- * (non-Javadoc)
- *
- * @see
- * org.eclipse.linuxtools.tmf.request.TmfDataRequest#handleData()
- */
- @Override
- public void handleData() {
- TmfEvent[] events = getData();
- if (events.length > 0) {
- nbEvents++;
-
- LttngEvent event = (LttngEvent) events[0];
- ITmfTrace trace = event.getParentTrace();
- IStateTraceManager traceManager = ftraceToManagerMap
- .get(trace);
- if (traceManager != null) {
- // obtain synthetic event
- LttngSyntheticEvent synEvent = updateSynEvent(event,
- traceManager);
- // update state system, and save check points as needed
- traceManager.handleEvent(synEvent, nbEvents);
- } else {
- TraceDebug
- .debug("StateTraceManager not found for trace"
- + trace.getName());
- }
- }
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * org.eclipse.linuxtools.tmf.request.TmfDataRequest#handleFailure()
- */
- public void handleFailure() {
- printCompletedMessage();
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * org.eclipse.linuxtools.tmf.request.TmfDataRequest#handleCancel()
- */
- public void handleCancel() {
- printCompletedMessage();
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * org.eclipse.linuxtools.tmf.request.TmfDataRequest#handleSuccess()
- */
- public void handleSuccess() {
- printCompletedMessage();
- }
-
- /**
- * @param header
- */
- private void printCompletedMessage() {
- // super.handleCompleted();
- if (TraceDebug.isDEBUG()) {
- TraceDebug.debug("Trace check point building completed, number of events handled: " + nbEvents
- + "\n\t\t");
- for (IStateTraceManager traceMgr : ftraceToManagerMap.values()) {
- TraceDebug.debug(traceMgr.toString() + "\n\t\t");
- }
- }
- }
- };
-
- // Execute event data request
- experiment.sendRequest(request);
- if (fwaitForCompletion) {
- try {
- request.waitForCompletion();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
-
- return request;
- }
-
- private LttngSyntheticEvent updateSynEvent(LttngEvent e,
- IStateTraceManager stateTraceManager) {
- if (syntheticEvent == null || syntheticEvent.getBaseEvent() != e) {
- syntheticEvent = new LttngSyntheticEvent(e);
- }
-
- // Trace model needed by application handlers
- syntheticEvent.setTraceModel(stateTraceManager.getStateModel());
- syntheticEvent.setSequenceInd(SequenceInd.UPDATE);
-
- return syntheticEvent;
- }
-
-}
\ No newline at end of file
+}