1 /*******************************************************************************
2 * Copyright (c) 2015 Ericsson
4 * All rights reserved. This program and the accompanying materials are made
5 * 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 * Bernd Hufmann - Initial API and implementation
11 *******************************************************************************/
12 package org
.eclipse
.tracecompass
.internal
.analysis
.os
.linux
.ui
.views
.latency
.statistics
;
14 import static org
.eclipse
.tracecompass
.common
.core
.NonNullUtils
.checkNotNull
;
16 import java
.text
.NumberFormat
;
17 import java
.util
.ArrayList
;
18 import java
.util
.List
;
19 import java
.util
.Locale
;
21 import org
.eclipse
.jdt
.annotation
.Nullable
;
22 import org
.eclipse
.jface
.viewers
.Viewer
;
23 import org
.eclipse
.jface
.viewers
.ViewerComparator
;
24 import org
.eclipse
.swt
.widgets
.Composite
;
25 import org
.eclipse
.tracecompass
.internal
.analysis
.os
.linux
.core
.latency
.statistics
.LatencyStatistics
;
26 import org
.eclipse
.tracecompass
.internal
.analysis
.os
.linux
.ui
.Activator
;
27 import org
.eclipse
.tracecompass
.tmf
.core
.analysis
.TmfAbstractAnalysisModule
;
28 import org
.eclipse
.tracecompass
.tmf
.core
.exceptions
.TmfAnalysisException
;
29 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.ITmfTrace
;
30 import org
.eclipse
.tracecompass
.tmf
.ui
.viewers
.tree
.AbstractTmfTreeViewer
;
31 import org
.eclipse
.tracecompass
.tmf
.ui
.viewers
.tree
.ITmfTreeColumnDataProvider
;
32 import org
.eclipse
.tracecompass
.tmf
.ui
.viewers
.tree
.TmfTreeColumnData
;
33 import org
.eclipse
.tracecompass
.tmf
.ui
.viewers
.tree
.TmfTreeViewerEntry
;
36 * An abstract tree viewer implementation for displaying latency statistics
38 * @author Bernd Hufmann
41 public abstract class AbstractLatencyStatisticsViewer
extends AbstractTmfTreeViewer
{
43 private static final NumberFormat FORMATTER
= checkNotNull(NumberFormat
.getNumberInstance(Locale
.getDefault()));
45 @Nullable private TmfAbstractAnalysisModule fModule
;
47 private static final String
[] COLUMN_NAMES
= new String
[] {
48 checkNotNull(Messages
.LatencyStatistics_LevelLabel
),
49 checkNotNull(Messages
.LatencyStatistics_MinLabel
),
50 checkNotNull(Messages
.LatencyStatistics_MaxLabel
),
51 checkNotNull(Messages
.LatencyStatistics_AverageLabel
)
58 * the parent composite
60 public AbstractLatencyStatisticsViewer(Composite parent
) {
62 setLabelProvider(new LatencyLabelProvider());
65 /** Provides label for the Latency tree viewer cells */
66 protected static class LatencyLabelProvider
extends TreeLabelProvider
{
69 public String
getColumnText(@Nullable Object element
, int columnIndex
) {
70 String value
= ""; //$NON-NLS-1$
71 if (element
instanceof HiddenTreeViewerEntry
) {
72 if (columnIndex
== 0) {
73 value
= ((HiddenTreeViewerEntry
) element
).getName();
76 LatencyTreeViewerEntry obj
= (LatencyTreeViewerEntry
) element
;
78 if (columnIndex
== 0) {
79 value
= String
.valueOf(obj
.getName());
80 } else if (columnIndex
== 1) {
81 value
= toFormattedString(obj
.getEntry().getMin());
82 } else if (columnIndex
== 2) {
83 value
= String
.valueOf(toFormattedString(obj
.getEntry().getMax()));
84 } else if (columnIndex
== 3) {
85 value
= String
.valueOf(toFormattedString(obj
.getEntry().getAverage()));
89 return checkNotNull(value
);
94 * Creates the statistics analysis module
96 * @return the statistics analysis module
98 @Nullable protected abstract TmfAbstractAnalysisModule
createStatisticsAnalysiModule();
101 * Gets the statistics analysis module
102 * @return the statistics analysis module
104 @Nullable public TmfAbstractAnalysisModule
getStatisticsAnalysisModule() {
109 protected ITmfTreeColumnDataProvider
getColumnDataProvider() {
110 return new ITmfTreeColumnDataProvider() {
113 public List
<TmfTreeColumnData
> getColumnData() {
114 /* All columns are sortable */
115 List
<TmfTreeColumnData
> columns
= new ArrayList
<>();
116 TmfTreeColumnData column
= new TmfTreeColumnData(COLUMN_NAMES
[0]);
117 column
.setComparator(new ViewerComparator() {
119 public int compare(@Nullable Viewer viewer
, @Nullable Object e1
, @Nullable Object e2
) {
120 if ((e1
== null) || (e2
== null)) {
124 LatencyTreeViewerEntry n1
= (LatencyTreeViewerEntry
) e1
;
125 LatencyTreeViewerEntry n2
= (LatencyTreeViewerEntry
) e2
;
127 return n1
.getName().compareTo(n2
.getName());
132 column
= new TmfTreeColumnData(COLUMN_NAMES
[1]);
133 column
.setComparator(new ViewerComparator() {
135 public int compare(@Nullable Viewer viewer
, @Nullable Object e1
, @Nullable Object e2
) {
136 if ((e1
== null) || (e2
== null)) {
140 LatencyTreeViewerEntry n1
= (LatencyTreeViewerEntry
) e1
;
141 LatencyTreeViewerEntry n2
= (LatencyTreeViewerEntry
) e2
;
143 return Long
.compare(n1
.getEntry().getMin(), n2
.getEntry().getMin());
148 column
= new TmfTreeColumnData(COLUMN_NAMES
[2]);
149 column
.setComparator(new ViewerComparator() {
151 public int compare(@Nullable Viewer viewer
, @Nullable Object e1
, @Nullable Object e2
) {
152 if ((e1
== null) || (e2
== null)) {
156 LatencyTreeViewerEntry n1
= (LatencyTreeViewerEntry
) e1
;
157 LatencyTreeViewerEntry n2
= (LatencyTreeViewerEntry
) e2
;
159 return Long
.compare(n1
.getEntry().getMax(), n2
.getEntry().getMax());
164 column
= new TmfTreeColumnData(COLUMN_NAMES
[3]);
165 column
.setComparator(new ViewerComparator() {
167 public int compare(@Nullable Viewer viewer
, @Nullable Object e1
, @Nullable Object e2
) {
168 if ((e1
== null) || (e2
== null)) {
172 LatencyTreeViewerEntry n1
= (LatencyTreeViewerEntry
) e1
;
173 LatencyTreeViewerEntry n2
= (LatencyTreeViewerEntry
) e2
;
175 return Double
.compare(n1
.getEntry().getAverage(), n2
.getEntry().getAverage());
189 public void initializeDataSource() {
190 /* Should not be called while trace is still null */
191 ITmfTrace trace
= checkNotNull(getTrace());
192 TmfAbstractAnalysisModule module
= createStatisticsAnalysiModule();
193 if (module
== null) {
197 module
.setTrace(trace
);
200 } catch (TmfAnalysisException e
) {
201 Activator
.getDefault().logError("Error initializing statistics analysis module", e
); //$NON-NLS-1$
206 * Formats a double value string
210 * @return formatted value
212 protected static String
toFormattedString(double value
) {
213 // The cast to long is needed because the formatter cannot truncate the number.
214 String percentageString
= checkNotNull(String
.format("%s", FORMATTER
.format(value
))); //$NON-NLS-1$
215 return percentageString
;
219 * Class for defining an entry in the statistics tree.
221 protected class LatencyTreeViewerEntry
extends TmfTreeViewerEntry
{
222 private LatencyStatistics fEntry
;
231 * latency statistics object
233 public LatencyTreeViewerEntry(String name
, LatencyStatistics entry
) {
239 * Gets the statistics object
241 * @return statistics object
243 public LatencyStatistics
getEntry() {
250 * Class to define a level in the tree that doesn't have any values.
252 protected class HiddenTreeViewerEntry
extends LatencyTreeViewerEntry
{
257 * the name of the level
259 public HiddenTreeViewerEntry(String name
) {
260 super(name
, new LatencyStatistics());