timing: avoid a division by zero with scatter viewer
[deliverable/tracecompass.git] / analysis / org.eclipse.tracecompass.analysis.timing.ui / src / org / eclipse / tracecompass / analysis / timing / ui / views / segmentstore / scatter / AbstractSegmentStoreScatterGraphViewer.java
index 23bc35c128b402b2c8d90b83b6a3254e474d14ad..fe2731c4da69a59a09291b7efd01b40e74d037e4 100644 (file)
@@ -13,6 +13,7 @@
 
 package org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.scatter;
 
+import java.text.Format;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -27,22 +28,23 @@ import org.eclipse.jdt.annotation.Nullable;
 import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Display;
-import org.eclipse.tracecompass.analysis.timing.core.segmentstore.AbstractSegmentStoreAnalysisModule;
 import org.eclipse.tracecompass.analysis.timing.core.segmentstore.IAnalysisProgressListener;
+import org.eclipse.tracecompass.analysis.timing.core.segmentstore.ISegmentStoreProvider;
+import org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.SubSecondTimeWithUnitFormat;
 import org.eclipse.tracecompass.common.core.NonNullUtils;
 import org.eclipse.tracecompass.internal.analysis.timing.ui.Activator;
-import org.eclipse.tracecompass.internal.analysis.timing.ui.views.segmentstore.scatter.SegmentStoreScatterGraphTooltipProvider;
 import org.eclipse.tracecompass.internal.analysis.timing.ui.views.segmentstore.scatter.Messages;
+import org.eclipse.tracecompass.internal.analysis.timing.ui.views.segmentstore.scatter.SegmentStoreScatterGraphTooltipProvider;
 import org.eclipse.tracecompass.segmentstore.core.ISegment;
 import org.eclipse.tracecompass.segmentstore.core.ISegmentStore;
 import org.eclipse.tracecompass.segmentstore.core.SegmentComparators;
+import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModule;
 import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler;
 import org.eclipse.tracecompass.tmf.core.signal.TmfSignalManager;
 import org.eclipse.tracecompass.tmf.core.signal.TmfTraceClosedSignal;
 import org.eclipse.tracecompass.tmf.core.signal.TmfTraceOpenedSignal;
 import org.eclipse.tracecompass.tmf.core.signal.TmfTraceSelectedSignal;
 import org.eclipse.tracecompass.tmf.core.signal.TmfWindowRangeUpdatedSignal;
-import org.eclipse.tracecompass.tmf.core.timestamp.ITmfTimestamp;
 import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimeRange;
 import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
 import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager;
@@ -61,7 +63,7 @@ import org.swtchart.LineStyle;
 import org.swtchart.Range;
 
 /**
- * Displays the segment store analysis data in a scatter graph
+ * Displays the segment store provider data in a scatter graph
  *
  * @author France Lapointe Nguyen
  * @author Matthew Khouzam - reduced memory usage
@@ -69,6 +71,8 @@ import org.swtchart.Range;
  */
 public abstract class AbstractSegmentStoreScatterGraphViewer extends TmfCommonXLineChartViewer {
 
+    private static final Format FORMAT = new SubSecondTimeWithUnitFormat();
+
     private final class CompactingSegmentStoreQuery extends Job {
         private static final long MAX_POINTS = 1000;
         private final TmfTimeRange fCurrentRange;
@@ -85,27 +89,27 @@ public abstract class AbstractSegmentStoreScatterGraphViewer extends TmfCommonXL
                 return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Monitor is null"); //$NON-NLS-1$
             }
 
-            AbstractSegmentStoreAnalysisModule module = getAnalysisModule();
-            final long startTimeInNanos = getTimeInNanos(fCurrentRange.getStartTime());
-            final long endTimeInNanos = getTimeInNanos(fCurrentRange.getEndTime());
-            if (module == null) {
+            ISegmentStoreProvider segmentProvider = getSegmentProvider();
+            final long startTimeInNanos = fCurrentRange.getStartTime().toNanos();
+            final long endTimeInNanos = fCurrentRange.getEndTime().toNanos();
+            if (segmentProvider == null) {
                 setWindowRange(startTimeInNanos, endTimeInNanos);
                 redraw(statusMonitor, startTimeInNanos, startTimeInNanos, Collections.EMPTY_LIST);
-                return new Status(IStatus.WARNING, Activator.PLUGIN_ID, "Analysis module not available"); //$NON-NLS-1$
+                return new Status(IStatus.WARNING, Activator.PLUGIN_ID, "segment provider not available"); //$NON-NLS-1$
             }
 
-            final ISegmentStore<ISegment> results = module.getResults();
-            if (results == null) {
+            final ISegmentStore<ISegment> segStore = segmentProvider.getSegmentStore();
+            if (segStore == null) {
                 setWindowRange(startTimeInNanos, endTimeInNanos);
                 redraw(statusMonitor, startTimeInNanos, startTimeInNanos, Collections.EMPTY_LIST);
-                return new Status(IStatus.INFO, Activator.PLUGIN_ID, "Analysis module does not have results"); //$NON-NLS-1$
+                return new Status(IStatus.INFO, Activator.PLUGIN_ID, "Segment provider does not have segments"); //$NON-NLS-1$
             }
 
             final long startTime = fCurrentRange.getStartTime().getValue();
             final long endTime = fCurrentRange.getEndTime().getValue();
             fPixelStart = startTime;
-            fPixelSize = (endTime - startTime) / MAX_POINTS;
-            final Iterable<ISegment> intersectingElements = results.getIntersectingElements(startTime, endTime);
+            fPixelSize = Math.max(1, (endTime - startTime) / MAX_POINTS);
+            final Iterable<ISegment> intersectingElements = segStore.getIntersectingElements(startTime, endTime);
 
             final List<ISegment> list = convertIterableToList(intersectingElements, statusMonitor);
             final List<ISegment> displayData = (!list.isEmpty()) ? compactList(startTime, list, statusMonitor) : list;
@@ -114,9 +118,9 @@ public abstract class AbstractSegmentStoreScatterGraphViewer extends TmfCommonXL
             redraw(statusMonitor, startTime, endTime, displayData);
 
             if (statusMonitor.isCanceled()) {
-                return NonNullUtils.checkNotNull(Status.CANCEL_STATUS);
+                return Status.CANCEL_STATUS;
             }
-            return NonNullUtils.checkNotNull(Status.OK_STATUS);
+            return Status.OK_STATUS;
 
         }
 
@@ -188,16 +192,16 @@ public abstract class AbstractSegmentStoreScatterGraphViewer extends TmfCommonXL
     // ------------------------------------------------------------------------
 
     /**
-     * Listener to update the model with the semgent store analysis results
-     * once the analysis is fully completed
+     * Listener to update the model with the segment store provider results once
+     * its segment store is fully completed
      */
-    private final class AnalysisProgressListener implements IAnalysisProgressListener {
+    private final class SegmentStoreProviderProgressListener implements IAnalysisProgressListener {
 
         @Override
-        public void onComplete(AbstractSegmentStoreAnalysisModule activeAnalysis, ISegmentStore<ISegment> results) {
+        public void onComplete(ISegmentStoreProvider segmentProvider, ISegmentStore<ISegment> segmentStore) {
             // Only update the model if trace that was analyzed is active trace
-            if (activeAnalysis.equals(getAnalysisModule())) {
-                updateModel(results);
+            if (segmentProvider.equals(getSegmentProvider())) {
+                updateModel(segmentStore);
                 updateRange(TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange());
             }
         }
@@ -212,14 +216,14 @@ public abstract class AbstractSegmentStoreScatterGraphViewer extends TmfCommonXL
     private Collection<ISegment> fDisplayData = Collections.EMPTY_LIST;
 
     /**
-     * Analysis completion listener
+     * Provider completion listener
      */
-    private AnalysisProgressListener fListener;
+    private SegmentStoreProviderProgressListener fListener;
 
     /**
-     * Current analysis module
+     * Current segment provider
      */
-    private @Nullable AbstractSegmentStoreAnalysisModule fAnalysisModule;
+    private @Nullable ISegmentStoreProvider fSegmentProvider;
 
     private @Nullable Job fCompactingJob;
 
@@ -242,18 +246,19 @@ public abstract class AbstractSegmentStoreScatterGraphViewer extends TmfCommonXL
     public AbstractSegmentStoreScatterGraphViewer(Composite parent, String title, String xLabel, String yLabel) {
         super(parent, title, xLabel, yLabel);
         setTooltipProvider(new SegmentStoreScatterGraphTooltipProvider(this));
-        fListener = new AnalysisProgressListener();
+        fListener = new SegmentStoreProviderProgressListener();
         ITmfTrace trace = TmfTraceManager.getInstance().getActiveTrace();
-        initializeModule(trace);
+        initializeProvider(trace);
         getSwtChart().getLegend().setVisible(false);
+        getSwtChart().getAxisSet().getYAxis(0).getTick().setFormat(FORMAT);
     }
 
-    private final void initializeModule(@Nullable ITmfTrace trace) {
+    private final void initializeProvider(@Nullable ITmfTrace trace) {
         if (trace != null) {
-            final AbstractSegmentStoreAnalysisModule analysisModuleOfClass = getSegmentStoreAnalysisModule(trace);
-            if (analysisModuleOfClass != null) {
-                analysisModuleOfClass.addListener(fListener);
-                setData(analysisModuleOfClass);
+            final ISegmentStoreProvider segmentStoreProvider = getSegmentStoreProvider(trace);
+            if (segmentStoreProvider != null) {
+                segmentStoreProvider.addListener(fListener);
+                setData(segmentStoreProvider);
                 updateRange(TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange());
             }
         }
@@ -272,8 +277,8 @@ public abstract class AbstractSegmentStoreScatterGraphViewer extends TmfCommonXL
     public void updateModel(@Nullable ISegmentStore<ISegment> dataInput) {
         // Update new window range
         TmfTimeRange currentRange = TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange();
-        long currentStart = getTimeInNanos(currentRange.getStartTime());
-        long currentEnd = getTimeInNanos(currentRange.getEndTime());
+        long currentStart = currentRange.getStartTime().toNanos();
+        long currentEnd = currentRange.getEndTime().toNanos();
         if (dataInput == null) {
             if (!getDisplay().isDisposed()) {
                 Display.getDefault().syncExec(new Runnable() {
@@ -299,9 +304,9 @@ public abstract class AbstractSegmentStoreScatterGraphViewer extends TmfCommonXL
     @Override
     protected void initializeDataSource() {
         ITmfTrace trace = getTrace();
-        initializeModule(trace);
+        initializeProvider(trace);
         if (trace != null) {
-            setData(getSegmentStoreAnalysisModule(trace));
+            setData(getSegmentStoreProvider(trace));
         }
     }
 
@@ -384,39 +389,42 @@ public abstract class AbstractSegmentStoreScatterGraphViewer extends TmfCommonXL
     }
 
     /**
-     * Set the data into the viewer. Will update model is analysis is completed
-     * or run analysis if not completed
+     * Set the data into the viewer. If the provider is an analysis, it will
+     * update the model if the analysis is completed or run the analysis if not
+     * completed
      *
-     * @param analysis
-     *            Segment store analysis module
+     * @param provider
+     *            Segment store provider
      */
-    public void setData(@Nullable AbstractSegmentStoreAnalysisModule analysis) {
-        if (analysis == null) {
+    public void setData(@Nullable ISegmentStoreProvider provider) {
+        if (provider == null) {
             updateModel(null);
             return;
         }
-        ISegmentStore<ISegment> results = analysis.getResults();
-        // If results are not null, then analysis is completed and model can be
-        // updated
-        if (results != null) {
-            updateModel(results);
-            setAnalysisModule(analysis);
+        ISegmentStore<ISegment> segStore = provider.getSegmentStore();
+        // If results are not null, then segment store is completed and model
+        // can be updated
+        if (segStore != null) {
+            updateModel(segStore);
+            setSegmentProvider(provider);
             return;
         }
         updateModel(null);
-        analysis.addListener(fListener);
-        analysis.schedule();
-        setAnalysisModule(analysis);
+        provider.addListener(fListener);
+        if (provider instanceof IAnalysisModule) {
+            ((IAnalysisModule) provider).schedule();
+        }
+        setSegmentProvider(provider);
     }
 
     /**
-     * Returns the segment store analysis module
+     * Returns the segment store provider
      *
      * @param trace
      *            The trace to consider
-     * @return the analysis module
+     * @return the segment store provider
      */
-    protected @Nullable abstract AbstractSegmentStoreAnalysisModule getSegmentStoreAnalysisModule(ITmfTrace trace);
+    protected @Nullable abstract ISegmentStoreProvider getSegmentStoreProvider(ITmfTrace trace);
 
     // ------------------------------------------------------------------------
     // Signal handlers
@@ -438,9 +446,9 @@ public abstract class AbstractSegmentStoreScatterGraphViewer extends TmfCommonXL
         if (trace != null) {
             final TmfTimeRange timeRange = TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange();
             setWindowRange(
-                    timeRange.getStartTime().normalize(0, ITmfTimestamp.NANOSECOND_SCALE).getValue(),
-                    timeRange.getEndTime().normalize(0, ITmfTimestamp.NANOSECOND_SCALE).getValue());
-            setData(getSegmentStoreAnalysisModule(trace));
+                    timeRange.getStartTime().toNanos(),
+                    timeRange.getEndTime().toNanos());
+            setData(getSegmentStoreProvider(trace));
             updateRange(timeRange);
         }
     }
@@ -460,12 +468,12 @@ public abstract class AbstractSegmentStoreScatterGraphViewer extends TmfCommonXL
         setTrace(trace);
         if (trace != null) {
 
-            final AbstractSegmentStoreAnalysisModule analysisModuleOfClass = getSegmentStoreAnalysisModule(trace);
+            final ISegmentStoreProvider segmentStoreProvider = getSegmentStoreProvider(trace);
             final TmfTimeRange timeRange = TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange();
             setWindowRange(
-                    getTimeInNanos(timeRange.getStartTime()),
-                    getTimeInNanos(timeRange.getEndTime()));
-            setData(analysisModuleOfClass);
+                    timeRange.getStartTime().toNanos(),
+                    timeRange.getEndTime().toNanos());
+            setData(segmentStoreProvider);
         }
 
     }
@@ -491,9 +499,9 @@ public abstract class AbstractSegmentStoreScatterGraphViewer extends TmfCommonXL
         if (signal != null) {
             // Check if there is no more opened trace
             if (TmfTraceManager.getInstance().getActiveTrace() == null) {
-                AbstractSegmentStoreAnalysisModule analysis = getAnalysisModule();
-                if (analysis != null) {
-                    analysis.removeListener(fListener);
+                ISegmentStoreProvider provider = getSegmentProvider();
+                if (provider != null) {
+                    provider.removeListener(fListener);
                 }
                 clearContent();
             }
@@ -520,15 +528,11 @@ public abstract class AbstractSegmentStoreScatterGraphViewer extends TmfCommonXL
         }
     }
 
-    private @Nullable AbstractSegmentStoreAnalysisModule getAnalysisModule() {
-        return fAnalysisModule;
-    }
-
-    private void setAnalysisModule(AbstractSegmentStoreAnalysisModule analysisModule) {
-        fAnalysisModule = analysisModule;
+    private @Nullable ISegmentStoreProvider getSegmentProvider() {
+        return fSegmentProvider;
     }
 
-    private static long getTimeInNanos(final ITmfTimestamp currentTime) {
-        return currentTime.normalize(0, ITmfTimestamp.NANOSECOND_SCALE).getValue();
+    private void setSegmentProvider(ISegmentStoreProvider provider) {
+        fSegmentProvider = provider;
     }
 }
\ No newline at end of file
This page took 0.046994 seconds and 5 git commands to generate.