1 /*******************************************************************************
2 * Copyright (c) 2009 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
.ui
.views
.common
;
14 import org
.eclipse
.linuxtools
.lttng
.state
.IStateDataRequestListener
;
15 import org
.eclipse
.linuxtools
.lttng
.state
.RequestCompletedSignal
;
16 import org
.eclipse
.linuxtools
.lttng
.state
.RequestStartedSignal
;
17 import org
.eclipse
.linuxtools
.lttng
.state
.StateDataRequest
;
18 import org
.eclipse
.linuxtools
.lttng
.state
.StateManager
;
19 import org
.eclipse
.linuxtools
.lttng
.state
.experiment
.StateManagerFactory
;
20 import org
.eclipse
.linuxtools
.lttng
.ui
.TraceDebug
;
21 import org
.eclipse
.linuxtools
.lttng
.ui
.views
.common
.DataRequestState
.RequestState
;
22 import org
.eclipse
.linuxtools
.tmf
.event
.TmfTimeRange
;
23 import org
.eclipse
.linuxtools
.tmf
.event
.TmfTimestamp
;
24 import org
.eclipse
.linuxtools
.tmf
.signal
.TmfSignalHandler
;
25 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.TmfView
;
29 * Abstract class used as a base for views handling specific time range data
33 * The class handles a single element queue of data requests, and a list of
34 * requests in progress i.e. request can be triggered from different sources
35 * e.g. opening a file as well as a new selected time window
41 public abstract class AbsTimeUpdateView
extends TmfView
implements
42 IStateDataRequestListener
{
44 // ========================================================================
46 // ========================================================================
47 private DataRequestState reqState
= new DataRequestState();
48 private String viewID
= "";
50 // ========================================================================
52 // ========================================================================
53 public AbsTimeUpdateView(String viewID
) {
57 // ========================================================================
59 // ========================================================================
63 * @seeorg.eclipse.linuxtools.lttng.state.IStateDataRequestListener#
64 * processingStarted(org.eclipse.linuxtools.lttng.state.StateDataRequest)
67 public synchronized void processingStarted(RequestStartedSignal signal
) {
68 StateDataRequest request
= signal
.getRequest();
69 if (request
!= null) {
70 // Check if a newer request is in the queue
71 TmfTimeRange newerReq
= reqState
.peekQueued();
72 if (newerReq
== null) {
73 reqState
.setState(DataRequestState
.RequestState
.BUSY
);
74 reqState
.setCurrentRequest(request
);
78 StateManager smanager
= request
.getStateManager();
79 // Clear the children on the Processes related to this
81 // Leave the GUI in charge of the updated data.
82 String traceId
= smanager
.getEventLog().getName();
83 ModelUpdatePrep(traceId
);
85 // clean up any possible pending request
88 // Start the new request.
89 StateManagerFactory
.getExperimentManager()
90 .readExperimentTimeWindow(newerReq
, viewID
, this);
98 * @seeorg.eclipse.linuxtools.lttng.state.IStateDataRequestListener#
99 * processingCompleted(org.eclipse.linuxtools.lttng.state.StateDataRequest)
102 public synchronized void processingCompleted(RequestCompletedSignal signal
) {
103 StateDataRequest request
= signal
.getRequest();
105 if (request
== null) {
108 reqState
.setCurrentRequest(null);
112 // No data refresh actions for cancelled requests.
113 if (request
.isCancelled() || request
.isFailed()) {
115 requestStateUpdate();
117 if (TraceDebug
.isDEBUG()) {
118 TmfTimeRange trange
= request
.getRange();
119 if (request
.isCancelled()) {
120 TraceDebug
.debug("Request cancelled "
121 + trange
.getStartTime() + "-" + trange
.getEndTime()
122 + " Handled Events: " + request
.getNumOfEvents());
123 } else if (request
.isFailed()) {
124 TraceDebug
.debug("Request Failed " + trange
.getStartTime()
125 + "-" + trange
.getEndTime() + " Handled Events: "
126 + request
.getNumOfEvents());
132 ModelUpdateComplete(request
);
133 requestStateUpdate();
138 * Evaluates the need to either send a new data request or queue the request
139 * till next available opportunity. One element queue to keep the latest
144 public synchronized void dataRequest(TmfTimeRange trange
) {
145 if (trange
!= null) {
146 // cancelPendingRequests();
147 StateDataRequest currentRequest
= reqState
.getCurrentRequest();
148 // If a request is ongoing queue the new request
149 if (reqState
.getState().equals(RequestState
.BUSY
)) {
150 reqState
.setQueued(trange
);
151 currentRequest
= reqState
.getCurrentRequest();
152 if (currentRequest
!= null) {
153 currentRequest
.cancel();
156 .debug("Exception : State busy but current request is null");
159 // Set the state to busy
160 reqState
.setState(DataRequestState
.RequestState
.BUSY
);
162 if (TraceDebug
.isDEBUG()) {
164 .debug("Requesting data: " + trange
.getStartTime()
165 + "-" + trange
.getEndTime());
167 // no request is ongoing, proceed with request
168 StateManagerFactory
.getExperimentManager()
169 .readExperimentTimeWindow(trange
, viewID
, this);
176 * Check for pending request an either send a new request or change the
179 private synchronized void requestStateUpdate() {
180 // Check if a new time range update is waiting to be processed
181 TmfTimeRange queuedRequest
= reqState
.popQueued();
182 if (queuedRequest
!= null) {
183 // Trigger the pending request
184 if (TraceDebug
.isDEBUG()) {
185 TmfTimestamp start
= queuedRequest
.getStartTime();
186 TmfTimestamp end
= queuedRequest
.getEndTime();
187 TraceDebug
.debug("New request about to start: " + start
+ "-"
191 StateManagerFactory
.getExperimentManager()
192 .readExperimentTimeWindow(queuedRequest
, viewID
, this);
194 // All requests cancelled and no more pending requests
195 TraceDebug
.debug("No requests pending in the queue");
196 reqState
.setState(RequestState
.IDLE
);
202 * Request the Time Analysis widget to enable or disable the wait cursor
203 * e.g. data request in progress or data request completed
207 protected abstract void waitCursor(boolean waitInd
);
210 * View preparation to override the current local information related to the
215 public abstract void ModelUpdatePrep(String traceId
);
218 * Actions taken by the view to refresh its widget(s) with the updated data
223 public abstract void ModelUpdateComplete(StateDataRequest request
);