/*******************************************************************************
- * 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
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;
* </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) */
// ITmfRequestHandler
// ------------------------------------------------------------------------
- /**
- * @since 3.0
- */
@Override
public void sendRequest(final ITmfEventRequest request) {
synchronized (fLock) {
TmfCoreTracer.traceRequest(request.getRequestId(), "SENT to provider " + getName()); //$NON-NLS-1$
}
+ if (request.getProviderFilter() == null) {
+ request.setProviderFilter(this);
+ }
+
if (sendWithParent(request)) {
return;
}
// fire request if all pending requests are received
if (fRequestPendingCounter == 0) {
fireRequest(false);
+ fireRequest(true);
}
}
}
*
* @param request
* The request to copy
- * @since 3.0
*/
protected void newCoalescedEventRequest(ITmfEventRequest request) {
synchronized (fLock) {
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$
*
* @param request
* The request to add to the list
- * @since 3.0
*/
protected void coalesceEventRequest(ITmfEventRequest request) {
synchronized (fLock) {
*
* @param request
* The data request
- * @since 3.0
*/
protected void queueRequest(final ITmfEventRequest request) {
* The request
* @return An application specific context; null if request can't be
* serviced
- * @since 3.0
*/
public abstract ITmfContext armRequest(ITmfEventRequest request);
* @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);
/**
* @return the shutdown state (i.e. if it is accepting new requests)
- * @since 2.0
*/
protected boolean executorIsShutdown() {
return fExecutor.isShutdown();
/**
* @return the termination state
- * @since 2.0
*/
protected boolean executorIsTerminated() {
return fExecutor.isTerminated();
return null;
}
- @SuppressWarnings("null")
@Override
public ITmfEventProvider getChild(int index) {
- return fChildren.get(index);
+ return NonNullUtils.checkNotNull(fChildren.get(index));
}
@Override
if (!(child instanceof TmfEventProvider)) {
throw new IllegalArgumentException();
}
+ child.setParent(this);
fChildren.add((TmfEventProvider)child);
}
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)
// ------------------------------------------------------------------------