1 /*******************************************************************************
2 * Copyright (c) 2015 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 * Mathieu Denis - Initial API and implementation
11 * Alexis Cabana-Loriaux - Extract the class in a compilation unit
12 *******************************************************************************/
14 package org
.eclipse
.tracecompass
.internal
.tmf
.ui
.viewers
.statistics
;
18 import org
.eclipse
.core
.runtime
.IProgressMonitor
;
19 import org
.eclipse
.core
.runtime
.IStatus
;
20 import org
.eclipse
.core
.runtime
.Status
;
21 import org
.eclipse
.core
.runtime
.jobs
.Job
;
22 import org
.eclipse
.tracecompass
.internal
.tmf
.ui
.viewers
.piecharts
.model
.TmfPieChartStatisticsModel
;
23 import org
.eclipse
.tracecompass
.internal
.tmf
.ui
.viewers
.statistics
.model
.TmfStatisticsTree
;
24 import org
.eclipse
.tracecompass
.internal
.tmf
.ui
.viewers
.statistics
.model
.TmfStatisticsTreeManager
;
25 import org
.eclipse
.tracecompass
.statesystem
.core
.ITmfStateSystem
;
26 import org
.eclipse
.tracecompass
.tmf
.core
.statistics
.ITmfStatistics
;
27 import org
.eclipse
.tracecompass
.tmf
.core
.statistics
.TmfStatisticsEventTypesModule
;
28 import org
.eclipse
.tracecompass
.tmf
.core
.statistics
.TmfStatisticsModule
;
29 import org
.eclipse
.tracecompass
.tmf
.core
.timestamp
.TmfTimeRange
;
30 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.ITmfTrace
;
33 * Class used to update the Statistics view. Normally, it should only be used by
36 * @author Mathieu Denis
38 class StatisticsUpdateJob
extends Job
{
40 private final ITmfTrace fJobTrace
;
41 private final boolean fIsGlobal
;
42 private final TmfStatisticsModule fStatsMod
;
43 private final TmfStatisticsViewer fViewer
;
46 * The delay (in ms) between each update in live-reading mode
48 private static final long LIVE_UPDATE_DELAY
= 1000;
50 private TmfTimeRange fTimerange
;
54 * The name of the working job
58 * If the query is for the global time-range or a selection
63 * The statistics module of the trace
65 * The viewer to update
67 public StatisticsUpdateJob(String name
, ITmfTrace trace
, boolean isGlobal
, TmfTimeRange timerange
, TmfStatisticsModule statsMod
, TmfStatisticsViewer viewer
) {
71 fTimerange
= timerange
;
77 protected IStatus
run(IProgressMonitor monitor
) {
79 /* Wait until the analysis is ready to be queried */
80 if (!fStatsMod
.waitForInitialization()) {
81 return Status
.CANCEL_STATUS
;
83 ITmfStatistics stats
= fStatsMod
.getStatistics();
85 /* It should have worked, but didn't */
86 throw new IllegalStateException();
90 * TODO Eventually this could be exposed through the
91 * TmfStateSystemAnalysisModule directly.
93 ITmfStateSystem ss
= fStatsMod
.getStateSystem(TmfStatisticsEventTypesModule
.ID
);
96 * It should be instantiated after the
97 * statsMod.waitForInitialization() above.
99 throw new IllegalStateException();
103 * Periodically update the statistics while they are being built (or, if
104 * the back-end is already completely built, it will skip over the
105 * while() immediately.
109 boolean finished
= false;
111 /* This model update is done every second */
112 if (monitor
.isCanceled()) {
113 fViewer
.removeFromJobs(fIsGlobal
, fJobTrace
);
114 return Status
.CANCEL_STATUS
;
116 finished
= ss
.waitUntilBuilt(LIVE_UPDATE_DELAY
);
117 TmfTimeRange localtimeRange
= fTimerange
;
119 * The generic statistics are stored in nanoseconds, so we must make
120 * sure the time range is scaled correctly.
122 start
= localtimeRange
.getStartTime().toNanos();
123 end
= localtimeRange
.getEndTime().toNanos();
125 Map
<String
, Long
> map
= stats
.getEventTypesInRange(start
, end
);
130 /* Query one last time for the final values */
131 Map
<String
, Long
> map
= stats
.getEventTypesInRange(start
, end
);
133 fViewer
.refreshPieCharts(fIsGlobal
, !fIsGlobal
);
135 * Remove job from map so that new range selection updates can be
138 fViewer
.removeFromJobs(fIsGlobal
, fJobTrace
);
139 return Status
.OK_STATUS
;
143 * Update the tree for a given trace
145 private void updateStats(Map
<String
, Long
> eventsPerType
) {
147 final TmfStatisticsTree statsData
= TmfStatisticsTreeManager
.getStatTree(fViewer
.getTreeID());
148 if (statsData
== null) {
149 /* The stat tree has been disposed, abort mission. */
153 Map
<String
, Long
> map
= eventsPerType
;
154 String name
= fJobTrace
.getName();
158 * "Global", "partial", "total", etc., it's all very confusing...
160 * The base view shows the total count for the trace and for
161 * each even types, organized in columns like this:
163 * | Global | Time range |
164 * trace name | A | B |
166 * <event 1> | C | D |
167 * <event 2> | ... | ... |
170 * Here, we called the cells like this:
173 * C : GlobalTypeCount(s)
174 * D : TimeRangeTypeCount(s)
178 /* Fill in an the event counts (either cells C or D) */
179 for (Map
.Entry
<String
, Long
> entry
: map
.entrySet()) {
180 statsData
.setTypeCount(name
, entry
.getKey(), fIsGlobal
, entry
.getValue());
184 * Calculate the totals (cell A or B, depending if isGlobal). We will
185 * use the results of the previous request instead of sending another
188 long globalTotal
= 0;
189 for (long val
: map
.values()) {
192 /* Update both the tree model and the piechart model */
193 statsData
.setTotal(name
, fIsGlobal
, globalTotal
);
194 TmfPieChartStatisticsModel model
= fViewer
.getPieChartModel();
196 model
.setPieChartTypeCount(fIsGlobal
, fJobTrace
, eventsPerType
);
198 /* notify that the viewer needs to be refreshed */
199 fViewer
.modelComplete(fIsGlobal
);