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
.ITmfTimestamp
;
30 import org
.eclipse
.tracecompass
.tmf
.core
.timestamp
.TmfTimeRange
;
31 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.ITmfTrace
;
34 * Class used to update the Statistics view. Normally, it should only be used by
37 * @author Mathieu Denis
39 class StatisticsUpdateJob
extends Job
{
41 private final ITmfTrace fJobTrace
;
42 private final boolean fIsGlobal
;
43 private final TmfStatisticsModule fStatsMod
;
44 private final TmfStatisticsViewer fViewer
;
47 * The delay (in ms) between each update in live-reading mode
49 private static final long LIVE_UPDATE_DELAY
= 1000;
52 * Timestamp scale used for all statistics (nanosecond)
54 private static final byte TIME_SCALE
= ITmfTimestamp
.NANOSECOND_SCALE
;
55 private TmfTimeRange fTimerange
;
59 * The name of the working job
63 * If the query is for the global time-range or a selection
68 * The statistics module of the trace
70 * The viewer to update
72 public StatisticsUpdateJob(String name
, ITmfTrace trace
, boolean isGlobal
, TmfTimeRange timerange
, TmfStatisticsModule statsMod
, TmfStatisticsViewer viewer
) {
76 fTimerange
= timerange
;
82 protected IStatus
run(IProgressMonitor monitor
) {
84 /* Wait until the analysis is ready to be queried */
85 fStatsMod
.waitForInitialization();
86 ITmfStatistics stats
= fStatsMod
.getStatistics();
88 /* It should have worked, but didn't */
89 throw new IllegalStateException();
93 * TODO Eventually this could be exposed through the
94 * TmfStateSystemAnalysisModule directly.
96 ITmfStateSystem ss
= fStatsMod
.getStateSystem(TmfStatisticsEventTypesModule
.ID
);
99 * It should be instantiated after the
100 * statsMod.waitForInitialization() above.
102 throw new IllegalStateException();
106 * Periodically update the statistics while they are being built (or, if
107 * the back-end is already completely built, it will skip over the
108 * while() immediately.
112 boolean finished
= false;
114 /* This model update is done every second */
115 if (monitor
.isCanceled()) {
116 fViewer
.removeFromJobs(fIsGlobal
, fJobTrace
);
117 return Status
.CANCEL_STATUS
;
119 finished
= ss
.waitUntilBuilt(LIVE_UPDATE_DELAY
);
120 TmfTimeRange localtimeRange
= fTimerange
;
122 * The generic statistics are stored in nanoseconds, so we must make
123 * sure the time range is scaled correctly.
125 start
= localtimeRange
.getStartTime().normalize(0, TIME_SCALE
).getValue();
126 end
= localtimeRange
.getEndTime().normalize(0, TIME_SCALE
).getValue();
128 Map
<String
, Long
> map
= stats
.getEventTypesInRange(start
, end
);
133 /* Query one last time for the final values */
134 Map
<String
, Long
> map
= stats
.getEventTypesInRange(start
, end
);
136 fViewer
.refreshPieCharts(fIsGlobal
, !fIsGlobal
);
138 * Remove job from map so that new range selection updates can be
141 fViewer
.removeFromJobs(fIsGlobal
, fJobTrace
);
142 return Status
.OK_STATUS
;
146 * Update the tree for a given trace
148 private void updateStats(Map
<String
, Long
> eventsPerType
) {
150 final TmfStatisticsTree statsData
= TmfStatisticsTreeManager
.getStatTree(fViewer
.getTreeID());
151 if (statsData
== null) {
152 /* The stat tree has been disposed, abort mission. */
156 Map
<String
, Long
> map
= eventsPerType
;
157 String name
= fJobTrace
.getName();
161 * "Global", "partial", "total", etc., it's all very confusing...
163 * The base view shows the total count for the trace and for
164 * each even types, organized in columns like this:
166 * | Global | Time range |
167 * trace name | A | B |
169 * <event 1> | C | D |
170 * <event 2> | ... | ... |
173 * Here, we called the cells like this:
176 * C : GlobalTypeCount(s)
177 * D : TimeRangeTypeCount(s)
181 /* Fill in an the event counts (either cells C or D) */
182 for (Map
.Entry
<String
, Long
> entry
: map
.entrySet()) {
183 statsData
.setTypeCount(name
, entry
.getKey(), fIsGlobal
, entry
.getValue());
187 * Calculate the totals (cell A or B, depending if isGlobal). We will
188 * use the results of the previous request instead of sending another
191 long globalTotal
= 0;
192 for (long val
: map
.values()) {
195 /* Update both the tree model and the piechart model */
196 statsData
.setTotal(name
, fIsGlobal
, globalTotal
);
197 TmfPieChartStatisticsModel model
= fViewer
.getPieChartModel();
199 model
.setPieChartTypeCount(fIsGlobal
, fJobTrace
, eventsPerType
);
201 /* notify that the viewer needs to be refreshed */
202 fViewer
.modelComplete(fIsGlobal
);