analysis: Move plugins to their own sub-directory
[deliverable/tracecompass.git] / org.eclipse.tracecompass.tmf.core / src / org / eclipse / tracecompass / tmf / core / component / TmfEventProvider.java
index 202e2bde571d1d653b4c673fb0f3e3a4660dfb6a..a98067d33261280fe97cedc49ec3015cad56907d 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2014 Ericsson
+ * Copyright (c) 2009, 2015 Ericsson
  *
  * All rights reserved. This program and the accompanying materials are
  * made available under the terms of the Eclipse Public License v1.0 which
@@ -24,12 +24,14 @@ import java.util.Timer;
 import java.util.TimerTask;
 
 import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.tracecompass.common.core.NonNullUtils;
 import org.eclipse.tracecompass.internal.tmf.core.TmfCoreTracer;
 import org.eclipse.tracecompass.internal.tmf.core.component.TmfEventThread;
 import org.eclipse.tracecompass.internal.tmf.core.component.TmfProviderManager;
 import org.eclipse.tracecompass.internal.tmf.core.request.TmfCoalescedEventRequest;
 import org.eclipse.tracecompass.internal.tmf.core.request.TmfRequestExecutor;
 import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
+import org.eclipse.tracecompass.tmf.core.filter.ITmfFilter;
 import org.eclipse.tracecompass.tmf.core.request.ITmfEventRequest;
 import org.eclipse.tracecompass.tmf.core.request.ITmfEventRequest.ExecutionType;
 import org.eclipse.tracecompass.tmf.core.signal.TmfEndSynchSignal;
@@ -46,16 +48,14 @@ import org.eclipse.tracecompass.tmf.core.trace.ITmfContext;
  * </p>
  *
  * @author Francois Chouinard
- * @since 3.0
  */
-public abstract class TmfEventProvider extends TmfComponent implements ITmfEventProvider {
+public abstract class TmfEventProvider extends TmfComponent implements ITmfEventProvider, ITmfFilter {
 
     // ------------------------------------------------------------------------
     // Constants
     // ------------------------------------------------------------------------
 
-    /** Default amount of events per request "chunk"
-     * @since 3.0 */
+    /** Default amount of events per request "chunk" */
     public static final int DEFAULT_BLOCK_SIZE = 50000;
 
     /** Delay for coalescing background requests (in milli-seconds) */
@@ -181,9 +181,6 @@ public abstract class TmfEventProvider extends TmfComponent implements ITmfEvent
     // ITmfRequestHandler
     // ------------------------------------------------------------------------
 
-    /**
-     * @since 3.0
-     */
     @Override
     public void sendRequest(final ITmfEventRequest request) {
         synchronized (fLock) {
@@ -192,6 +189,10 @@ public abstract class TmfEventProvider extends TmfComponent implements ITmfEvent
                 TmfCoreTracer.traceRequest(request.getRequestId(), "SENT to provider " + getName()); //$NON-NLS-1$
             }
 
+            if (request.getProviderFilter() == null) {
+                request.setProviderFilter(this);
+            }
+
             if (sendWithParent(request)) {
                 return;
             }
@@ -272,6 +273,7 @@ public abstract class TmfEventProvider extends TmfComponent implements ITmfEvent
                 // fire request if all pending requests are received
                 if (fRequestPendingCounter == 0) {
                     fireRequest(false);
+                    fireRequest(true);
                 }
             }
         }
@@ -287,7 +289,6 @@ public abstract class TmfEventProvider extends TmfComponent implements ITmfEvent
      *
      * @param request
      *            The request to copy
-     * @since 3.0
      */
     protected void newCoalescedEventRequest(ITmfEventRequest request) {
         synchronized (fLock) {
@@ -298,6 +299,7 @@ public abstract class TmfEventProvider extends TmfComponent implements ITmfEvent
                     request.getNbRequested(),
                     request.getExecType());
             coalescedRequest.addRequest(request);
+            coalescedRequest.setProviderFilter(this);
             if (TmfCoreTracer.isRequestTraced()) {
                 TmfCoreTracer.traceRequest(request.getRequestId(), "COALESCED with " + coalescedRequest.getRequestId()); //$NON-NLS-1$
                 TmfCoreTracer.traceRequest(coalescedRequest.getRequestId(), "now contains " + coalescedRequest.getSubRequestIds()); //$NON-NLS-1$
@@ -312,7 +314,6 @@ public abstract class TmfEventProvider extends TmfComponent implements ITmfEvent
      *
      * @param request
      *            The request to add to the list
-     * @since 3.0
      */
     protected void coalesceEventRequest(ITmfEventRequest request) {
         synchronized (fLock) {
@@ -397,7 +398,6 @@ public abstract class TmfEventProvider extends TmfComponent implements ITmfEvent
      *
      * @param request
      *            The data request
-     * @since 3.0
      */
     protected void queueRequest(final ITmfEventRequest request) {
 
@@ -423,7 +423,6 @@ public abstract class TmfEventProvider extends TmfComponent implements ITmfEvent
      *            The request
      * @return An application specific context; null if request can't be
      *         serviced
-     * @since 3.0
      */
     public abstract ITmfContext armRequest(ITmfEventRequest request);
 
@@ -437,7 +436,6 @@ public abstract class TmfEventProvider extends TmfComponent implements ITmfEvent
      * @param nbRead
      *            The number of events read so far
      * @return true if completion criteria is met
-     * @since 3.0
      */
     public boolean isCompleted(ITmfEventRequest request, ITmfEvent event, int nbRead) {
         boolean requestCompleted = isCompleted2(request, nbRead);
@@ -458,7 +456,6 @@ public abstract class TmfEventProvider extends TmfComponent implements ITmfEvent
 
     /**
      * @return the shutdown state (i.e. if it is accepting new requests)
-     * @since 2.0
      */
     protected boolean executorIsShutdown() {
         return fExecutor.isShutdown();
@@ -466,7 +463,6 @@ public abstract class TmfEventProvider extends TmfComponent implements ITmfEvent
 
     /**
      * @return the termination state
-     * @since 2.0
      */
     protected boolean executorIsTerminated() {
         return fExecutor.isTerminated();
@@ -557,10 +553,9 @@ public abstract class TmfEventProvider extends TmfComponent implements ITmfEvent
         return null;
     }
 
-    @SuppressWarnings("null")
     @Override
     public ITmfEventProvider getChild(int index) {
-        return fChildren.get(index);
+        return NonNullUtils.checkNotNull(fChildren.get(index));
     }
 
     @Override
@@ -568,6 +563,7 @@ public abstract class TmfEventProvider extends TmfComponent implements ITmfEvent
         if (!(child instanceof TmfEventProvider)) {
             throw new IllegalArgumentException();
         }
+        child.setParent(this);
         fChildren.add((TmfEventProvider)child);
     }
 
@@ -576,6 +572,33 @@ public abstract class TmfEventProvider extends TmfComponent implements ITmfEvent
         return fChildren.size();
     }
 
+    /**
+     * Returns true if an event was provided by this event provider or one of
+     * its children event providers else false.
+     *
+     * @param event
+     *            the event to check
+     * @return <code>true</code> if event was provided by this provider or one
+     *         of its children else <code>false</code>
+     */
+    @Override
+    public boolean matches(ITmfEvent event) {
+        if ((event.getTrace() == this)) {
+            return true;
+        }
+        if (fChildren.size() > 0) {
+            synchronized (fLock) {
+                List <TmfEventProvider> children = getChildren(TmfEventProvider.class);
+                for (TmfEventProvider child : children) {
+                    if (child.matches(event)) {
+                        return true;
+                    }
+                }
+            }
+        }
+        return false;
+    }
+
     // ------------------------------------------------------------------------
     // Debug code (will also used in tests using reflection)
     // ------------------------------------------------------------------------
This page took 0.027199 seconds and 5 git commands to generate.