Merge branch 'master' into lttng-kepler
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.core / src / org / eclipse / linuxtools / tmf / core / trace / TmfTrace.java
index 26c25e23968dbc36acaee7046c721f4dbbc165d3..1c29a40d63d026e87bcc0a8412b39dcd66ac09c6 100644 (file)
@@ -25,6 +25,9 @@ import org.eclipse.linuxtools.tmf.core.event.TmfTimestamp;
 import org.eclipse.linuxtools.tmf.core.exceptions.TmfTraceException;
 import org.eclipse.linuxtools.tmf.core.request.ITmfDataRequest;
 import org.eclipse.linuxtools.tmf.core.request.ITmfEventRequest;
+import org.eclipse.linuxtools.tmf.core.statesystem.ITmfStateSystem;
+import org.eclipse.linuxtools.tmf.core.statistics.ITmfStatistics;
+import org.eclipse.linuxtools.tmf.core.statistics.TmfStatistics;
 
 /**
  * Abstract implementation of ITmfTrace.
@@ -46,8 +49,6 @@ import org.eclipse.linuxtools.tmf.core.request.ITmfEventRequest;
  * TmfCheckpointIndexer (default). In this case, the trace cache size will be
  * used as checkpoint interval.
  *
- * @param <T> The trace event type
- *
  * @version 1.0
  * @author Francois Chouinard
  *
@@ -55,7 +56,7 @@ import org.eclipse.linuxtools.tmf.core.request.ITmfEventRequest;
  * @see ITmfTraceIndexer
  * @see ITmfEventParser
  */
-public abstract class TmfTrace<T extends ITmfEvent> extends TmfEventProvider<T> implements ITmfTrace<T> {
+public abstract class TmfTrace extends TmfEventProvider implements ITmfTrace {
 
     // ------------------------------------------------------------------------
     // Attributes
@@ -81,10 +82,13 @@ public abstract class TmfTrace<T extends ITmfEvent> extends TmfEventProvider<T>
     private long fStreamingInterval = 0;
 
     // The trace indexer
-    private ITmfTraceIndexer<ITmfTrace<ITmfEvent>> fIndexer;
+    private ITmfTraceIndexer fIndexer;
 
     // The trace parser
-    private ITmfEventParser<T> fParser;
+    private ITmfEventParser fParser;
+
+    // The trace's statistics
+    private ITmfStatistics fStatistics;
 
     // ------------------------------------------------------------------------
     // Construction
@@ -107,7 +111,7 @@ public abstract class TmfTrace<T extends ITmfEvent> extends TmfEventProvider<T>
      * @param cacheSize the trace cache size
      * @throws TmfTraceException
      */
-    protected TmfTrace(final IResource resource, final Class<T> type, final String path, final int cacheSize) throws TmfTraceException {
+    protected TmfTrace(final IResource resource, final Class<? extends ITmfEvent> type, final String path, final int cacheSize) throws TmfTraceException {
         this(resource, type, path, cacheSize, 0);
     }
 
@@ -122,7 +126,7 @@ public abstract class TmfTrace<T extends ITmfEvent> extends TmfEventProvider<T>
      * @param interval the trace streaming interval
      * @throws TmfTraceException
      */
-    protected TmfTrace(final IResource resource, final Class<T> type, final String path, final int cacheSize, final long interval) throws TmfTraceException {
+    protected TmfTrace(final IResource resource, final Class<? extends ITmfEvent> type, final String path, final int cacheSize, final long interval) throws TmfTraceException {
         this(resource, type, path, cacheSize, interval, null);
     }
 
@@ -137,8 +141,8 @@ public abstract class TmfTrace<T extends ITmfEvent> extends TmfEventProvider<T>
      * @param indexer the trace indexer
      * @throws TmfTraceException
      */
-    protected TmfTrace(final IResource resource, final Class<T> type, final String path, final int cacheSize,
-            final long interval, final ITmfTraceIndexer<?> indexer) throws TmfTraceException {
+    protected TmfTrace(final IResource resource, final Class<? extends ITmfEvent> type, final String path, final int cacheSize,
+            final long interval, final ITmfTraceIndexer indexer) throws TmfTraceException {
         this(resource, type, path, cacheSize, interval, indexer, null);
     }
 
@@ -153,9 +157,8 @@ public abstract class TmfTrace<T extends ITmfEvent> extends TmfEventProvider<T>
      * @param parser the trace event parser
      * @throws TmfTraceException
      */
-    @SuppressWarnings({ "unchecked", "rawtypes" })
-    protected TmfTrace(final IResource resource, final Class<T> type, final String path, final int cacheSize,
-            final long interval, final ITmfTraceIndexer<?> indexer, final ITmfEventParser<T> parser) throws TmfTraceException {
+    protected TmfTrace(final IResource resource, final Class<? extends ITmfEvent> type, final String path, final int cacheSize,
+            final long interval, final ITmfTraceIndexer indexer, final ITmfEventParser parser) throws TmfTraceException {
         super();
         fCacheSize = (cacheSize > 0) ? cacheSize : ITmfTrace.DEFAULT_TRACE_CACHE_SIZE;
         fStreamingInterval = interval;
@@ -170,8 +173,7 @@ public abstract class TmfTrace<T extends ITmfEvent> extends TmfEventProvider<T>
      * @param trace the original trace
      * @throws TmfTraceException Should not happen usually
      */
-    @SuppressWarnings({ "unchecked", "rawtypes" })
-    public TmfTrace(final TmfTrace<T> trace) throws TmfTraceException {
+    public TmfTrace(final TmfTrace trace) throws TmfTraceException {
         super();
         if (trace == null) {
             throw new IllegalArgumentException();
@@ -191,8 +193,7 @@ public abstract class TmfTrace<T extends ITmfEvent> extends TmfEventProvider<T>
      * @see org.eclipse.linuxtools.tmf.core.trace.ITmfTrace#initTrace(org.eclipse.core.resources.IResource, java.lang.String, java.lang.Class)
      */
     @Override
-    @SuppressWarnings({ "unchecked", "rawtypes" })
-    public void initTrace(final IResource resource, final String path, final Class<T> type) throws TmfTraceException {
+    public void initTrace(final IResource resource, final String path, final Class<? extends ITmfEvent> type) throws TmfTraceException {
         fIndexer = new TmfCheckpointIndexer(this, fCacheSize);
         initialize(resource, path, type);
     }
@@ -206,8 +207,7 @@ public abstract class TmfTrace<T extends ITmfEvent> extends TmfEventProvider<T>
      *
      * @throws TmfTraceException
      */
-    @SuppressWarnings("unchecked")
-    protected void initialize(final IResource resource, final String path, final Class<T> type) throws TmfTraceException {
+    protected void initialize(final IResource resource, final String path, final Class<? extends ITmfEvent> type) throws TmfTraceException {
         if (path == null) {
             throw new TmfTraceException("Invalid trace path"); //$NON-NLS-1$
         }
@@ -221,12 +221,14 @@ public abstract class TmfTrace<T extends ITmfEvent> extends TmfEventProvider<T>
         }
         if (fParser == null) {
             if (this instanceof ITmfEventParser) {
-                fParser = (ITmfEventParser<T>) this;
+                fParser = (ITmfEventParser) this;
             } else {
                 throw new TmfTraceException("Invalid trace parser"); //$NON-NLS-1$
             }
         }
         super.init(traceName, type);
+
+        buildStatistics();
     }
 
     /**
@@ -249,6 +251,20 @@ public abstract class TmfTrace<T extends ITmfEvent> extends TmfEventProvider<T>
         getIndexer().buildIndex(0, TmfTimeRange.ETERNITY, waitForCompletion);
     }
 
+    /**
+     * The default implementation of TmfTrace uses a TmfStatistics backend.
+     * Override this if you want to specify another type (or none at all).
+     *
+     * @since 2.0
+     */
+    protected void buildStatistics() throws TmfTraceException {
+        /*
+         * Initialize the statistics provider, but only if a Resource has been
+         * set (so we don't build it for experiments, for unit tests, etc.)
+         */
+        fStatistics = (fResource == null ? null : new TmfStatistics(this) );
+    }
+
     /**
      * Clears the trace
      */
@@ -269,8 +285,8 @@ public abstract class TmfTrace<T extends ITmfEvent> extends TmfEventProvider<T>
      * @see org.eclipse.linuxtools.tmf.core.trace.ITmfTrace#getEventType()
      */
     @Override
-    public Class<T> getEventType() {
-        return (Class<T>) super.getType();
+    public Class<ITmfEvent> getEventType() {
+        return (Class<ITmfEvent>) super.getType();
     }
 
     /* (non-Javadoc)
@@ -308,17 +324,37 @@ public abstract class TmfTrace<T extends ITmfEvent> extends TmfEventProvider<T>
     /**
      * @return the trace indexer
      */
-    protected ITmfTraceIndexer<ITmfTrace<ITmfEvent>> getIndexer() {
+    protected ITmfTraceIndexer getIndexer() {
         return fIndexer;
     }
 
     /**
      * @return the trace parser
      */
-    protected ITmfEventParser<T> getParser() {
+    protected ITmfEventParser getParser() {
         return fParser;
     }
 
+    /**
+     * @since 2.0
+     */
+    @Override
+    public ITmfStatistics getStatistics() {
+        return fStatistics;
+    }
+
+    /**
+     * @since 2.0
+     */
+    @Override
+    public ITmfStateSystem getStateSystem() {
+        /*
+         * By default, no state system is used. Sub-classes can specify their
+         * own behaviour.
+         */
+        return null;
+    }
+
     // ------------------------------------------------------------------------
     // ITmfTrace - Trace characteristics getters
     // ------------------------------------------------------------------------
@@ -420,7 +456,7 @@ public abstract class TmfTrace<T extends ITmfEvent> extends TmfEventProvider<T>
      *
      * @param indexer the trace indexer
      */
-    protected void setIndexer(final ITmfTraceIndexer<ITmfTrace<ITmfEvent>> indexer) {
+    protected void setIndexer(final ITmfTraceIndexer indexer) {
         fIndexer = indexer;
     }
 
@@ -429,7 +465,7 @@ public abstract class TmfTrace<T extends ITmfEvent> extends TmfEventProvider<T>
      *
      * @param parser the new trace parser
      */
-    protected void setParser(final ITmfEventParser<T> parser) {
+    protected void setParser(final ITmfEventParser parser) {
         fParser = parser;
     }
 
@@ -445,7 +481,7 @@ public abstract class TmfTrace<T extends ITmfEvent> extends TmfEventProvider<T>
 
         // A rank <= 0 indicates to seek the first event
         if (rank <= 0) {
-            ITmfContext context = seekEvent((ITmfLocation<?>) null);
+            ITmfContext context = seekEvent((ITmfLocation) null);
             context.setRank(0);
             return context;
         }
@@ -472,7 +508,7 @@ public abstract class TmfTrace<T extends ITmfEvent> extends TmfEventProvider<T>
 
         // A null timestamp indicates to seek the first event
         if (timestamp == null) {
-            ITmfContext context = seekEvent((ITmfLocation<?>) null);
+            ITmfContext context = seekEvent((ITmfLocation) null);
             context.setRank(0);
             return context;
         }
@@ -504,9 +540,9 @@ public abstract class TmfTrace<T extends ITmfEvent> extends TmfEventProvider<T>
      * @see org.eclipse.linuxtools.tmf.core.trace.ITmfTrace#readNextEvent(org.eclipse.linuxtools.tmf.core.trace.ITmfContext)
      */
     @Override
-    public synchronized T getNext(final ITmfContext context) {
+    public synchronized ITmfEvent getNext(final ITmfContext context) {
         // parseEvent() does not update the context
-        final T event = fParser.parseEvent(context);
+        final ITmfEvent event = fParser.parseEvent(context);
         if (event != null) {
             updateAttributes(context, event.getTimestamp());
             context.setLocation(getCurrentLocation());
@@ -544,7 +580,9 @@ public abstract class TmfTrace<T extends ITmfEvent> extends TmfEventProvider<T>
             if (fNbEvents <= rank) {
                 fNbEvents = rank + 1;
             }
-            fIndexer.updateIndex(context, timestamp);
+            if (fIndexer != null) {
+                fIndexer.updateIndex(context, timestamp);
+            }
         }
     }
 
@@ -556,13 +594,13 @@ public abstract class TmfTrace<T extends ITmfEvent> extends TmfEventProvider<T>
      * @see org.eclipse.linuxtools.tmf.core.component.TmfDataProvider#armRequest(org.eclipse.linuxtools.tmf.core.request.ITmfDataRequest)
      */
     @Override
-    protected ITmfContext armRequest(final ITmfDataRequest<T> request) {
-        if ((request instanceof ITmfEventRequest<?>)
-            && !TmfTimestamp.BIG_BANG.equals(((ITmfEventRequest<T>) request).getRange().getStartTime())
+    protected ITmfContext armRequest(final ITmfDataRequest request) {
+        if ((request instanceof ITmfEventRequest)
+            && !TmfTimestamp.BIG_BANG.equals(((ITmfEventRequest) request).getRange().getStartTime())
             && (request.getIndex() == 0))
         {
-            final ITmfContext context = seekEvent(((ITmfEventRequest<T>) request).getRange().getStartTime());
-            ((ITmfEventRequest<T>) request).setStartIndex((int) context.getRank());
+            final ITmfContext context = seekEvent(((ITmfEventRequest) request).getRange().getStartTime());
+            ((ITmfEventRequest) request).setStartIndex((int) context.getRank());
             return context;
 
         }
This page took 0.028306 seconds and 5 git commands to generate.