blob: 68fd6007ab9cb4109692241559de139e7d0b71c1 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2018 École Polytechnique de Montréal
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/
package org.eclipse.tracecompass.internal.provisional.tmf.core.model.filters;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;
import java.util.WeakHashMap;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.tracecompass.internal.tmf.core.filter.TmfFilterHelper;
import org.eclipse.tracecompass.tmf.core.filter.ITmfFilter;
import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler;
import org.eclipse.tracecompass.tmf.core.signal.TmfTraceClosedSignal;
import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
/**
* A common class for all filters, either event filters or regexes
*
* @author Geneviève Bastien
*/
@NonNullByDefault
public class TraceCompassFilter {
private final @Nullable ITmfFilter fEventFilter;
private final Collection<String> fRegex;
private static final Map<ITmfTrace, TraceCompassFilter> FILTER_MAP = new WeakHashMap<>();
private TraceCompassFilter(@Nullable ITmfFilter filter, Collection<String> regex) {
fEventFilter = filter;
fRegex = regex;
}
/**
* Factory method to get a new filter from an event filter
*
* @param filter
* The event filter from which to create this filter
* @param trace
* The trace this filter applies to
* @return A new filter
*/
public synchronized static TraceCompassFilter fromEventFilter(ITmfFilter filter, ITmfTrace trace) {
TraceCompassFilter traceCompassFilter = new TraceCompassFilter(filter, Collections.singleton(TmfFilterHelper.getRegexFromFilter(filter)));
FILTER_MAP.put(trace, traceCompassFilter);
return traceCompassFilter;
}
/**
* Factory method to get a new filter from a regex
*
* @param regex
* The regex from which to create the filter
* @param trace
* The trace this filter applies to
* @return A new filter
*/
public synchronized static TraceCompassFilter fromRegex(Collection<String> regex, ITmfTrace trace) {
ITmfFilter filter = TmfFilterHelper.buildFilterFromRegex(regex, trace);
TraceCompassFilter traceCompassFilter = new TraceCompassFilter(filter, regex);
FILTER_MAP.put(trace, traceCompassFilter);
return traceCompassFilter;
}
/**
* Get the event filter being applied. This filter should be applied on data
* sources based on events. For other types of data sources, use the
* {@link #getRegexes()} method to get the filter string.
*
* @return The filter, or <code>null</code> if filters should be removed
*/
public @Nullable ITmfFilter getEventFilter() {
return fEventFilter;
}
/**
* Get the filter regexes, that should be used to filter data from a source
* that is not based on event. For event-based filters, use
* {@link #getEventFilter()} instead
*
* @return The regex to filter anything that is not event-based
*/
public Collection<String> getRegexes() {
return fRegex;
}
/**
* Remove filters for the closed trace
*
* @param signal
* The trace closed signal
*/
@TmfSignalHandler
public synchronized static void traceClosed(final TmfTraceClosedSignal signal) {
FILTER_MAP.remove(signal.getTrace());
}
/**
* Get the filter that is active for a given trace
*
* @param trace
* The trace to get the filter for
* @return The filter to apply, or <code>null</code> if no filter is set
*/
public static @Nullable TraceCompassFilter getFilterForTrace(ITmfTrace trace) {
return FILTER_MAP.get(trace);
}
}