use of org.eclipse.tracecompass.segmentstore.core.ISegmentStore in project tracecompass by tracecompass.
the class AbstractSegmentStoreTableViewer method setData.
/**
* Set the data into the viewer. It will update the model. If the provider
* is an analysis, the analysis will be scheduled.
*
* @param provider
* segment store provider
*/
public synchronized void setData(@Nullable ISegmentStoreProvider provider) {
// Set the current segment store provider
fSegmentProvider = provider;
if (provider == null) {
updateModel(null);
return;
}
createProviderColumns();
/*
* If the listener is null then the table is updated from another viewer.
* Otherwise this class is responsible to load the trace.
*/
SegmentStoreProviderProgressListener listener = fListener;
if (listener == null) {
return;
}
ISegmentStore<ISegment> segStore = provider.getSegmentStore();
// If results are not null, then the segment of the provider is ready
// and model can be updated
// FIXME Filtering should be done at the data provider level
Map<@NonNull Integer, @NonNull Predicate<@NonNull Multimap<@NonNull String, @NonNull Object>>> predicates = generateRegexPredicate();
Predicate<ISegment> predicate = (segment) -> {
// Get the filter external input data
Multimap<@NonNull String, @NonNull Object> input = ISegmentStoreProvider.getFilterInput(provider, segment);
/*
* Test each predicates and set the status of the property
* associated to the predicate
*/
boolean activateProperty = false;
for (Map.Entry<Integer, Predicate<Multimap<String, Object>>> mapEntry : predicates.entrySet()) {
Integer property = Objects.requireNonNull(mapEntry.getKey());
Predicate<Multimap<String, Object>> value = Objects.requireNonNull(mapEntry.getValue());
if (property == CoreFilterProperty.DIMMED || property == CoreFilterProperty.EXCLUDE) {
boolean status = value.test(input);
activateProperty |= status;
}
}
return activateProperty;
};
if (segStore != null) {
// Cancel the current filtering job
Job job = fFilteringJob;
if (job != null) {
job.cancel();
}
if (predicates.isEmpty()) {
updateModel(segStore);
return;
}
job = new Job(Messages.SegmentStoreTableViewer_FilteringData) {
@Override
protected IStatus run(@Nullable IProgressMonitor monitor) {
try (ScopeLog log = new ScopeLog(LOGGER, Level.FINE, "SegmentStoreTable:Filtering")) {
// $NON-NLS-1$
SubMonitor subMonitor = SubMonitor.convert(monitor);
ISegmentStore<ISegment> filteredStore = new ArrayListStore<>();
for (ISegment segment : segStore) {
if (subMonitor.isCanceled()) {
return Status.CANCEL_STATUS;
}
if (predicate.test(segment)) {
filteredStore.add(segment);
}
}
if (subMonitor.isCanceled()) {
return Status.CANCEL_STATUS;
}
updateModel(filteredStore);
return Status.OK_STATUS;
}
}
};
fFilteringJob = job;
job.schedule();
return;
}
// If results are null, then add completion listener and if the provider
// is an analysis, run the analysis
updateModel(null);
provider.addListener(listener);
if (provider instanceof IAnalysisModule) {
((IAnalysisModule) provider).schedule();
}
}
use of org.eclipse.tracecompass.segmentstore.core.ISegmentStore in project tracecompass by tracecompass.
the class AbstractSegmentStoreDensityViewer method computeData.
@Nullable
private Map<String, SegmentStoreWithRange<ISegment>> computeData(final TmfTimeRange timeRange, final AxisRange durationRange) {
Map<String, SegmentStoreWithRange<ISegment>> retVal = new HashMap<>();
for (Entry<String, ISegmentStoreProvider> entry : fSegmentStoreProviders.entrySet()) {
final ISegmentStoreProvider segmentProvider = Objects.requireNonNull(entry.getValue());
final ISegmentStore<ISegment> segStore = segmentProvider.getSegmentStore();
if (segStore == null) {
continue;
}
// Filter on the segment duration if necessary
if (durationRange.getLower() > Double.MIN_VALUE || durationRange.getUpper() < Double.MAX_VALUE) {
Predicate<ISegment> predicate = segment -> segment.getLength() >= durationRange.getLower() && segment.getLength() <= durationRange.getUpper();
retVal.put(entry.getKey(), new SegmentStoreWithRange<>(segStore, timeRange, predicate));
} else {
retVal.put(entry.getKey(), new SegmentStoreWithRange<>(segStore, timeRange));
}
}
return retVal;
}
use of org.eclipse.tracecompass.segmentstore.core.ISegmentStore in project tracecompass by tracecompass.
the class AbstractSegmentStoreTableViewer method updateModel.
/**
* Update the data in the table viewer
*
* @param dataInput
* New data input
*/
public void updateModel(@Nullable final Object dataInput) {
final TableViewer tableViewer = getTableViewer();
Display.getDefault().asyncExec(() -> {
try (ScopeLog sl = new ScopeLog(LOGGER, Level.FINE, "updateModel")) {
// $NON-NLS-1$
if (!tableViewer.getTable().isDisposed()) {
// Go to the top of the table
tableViewer.getTable().setTopIndex(0);
ISelection selection = tableViewer.getSelection();
ISegment selected = null;
if (!selection.isEmpty() && selection instanceof StructuredSelection) {
Object firstElement = ((StructuredSelection) selection).getFirstElement();
if (firstElement instanceof ISegment) {
selected = (ISegment) firstElement;
}
}
// Reset selected row
if (dataInput == null) {
tableViewer.setSelection(StructuredSelection.EMPTY);
tableViewer.setInput(null);
tableViewer.setItemCount(0);
return;
}
addPackListener();
tableViewer.setInput(dataInput);
SegmentStoreContentProvider contentProvider = (SegmentStoreContentProvider) getTableViewer().getContentProvider();
long segmentCount = contentProvider.getSegmentCount();
String contentProviderName = contentProvider.getClass().getSimpleName();
// $NON-NLS-1$
TraceCompassLogUtils.traceCounter(LOGGER, Level.FINE, "SegmentStoreTableViewer#updateModel", contentProviderName, segmentCount);
if (segmentCount > MAX_ITEMS) {
tableViewer.setItemCount(MAX_ITEMS);
// $NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
Activator.getDefault().logWarning("Too many items to display for " + contentProviderName + ". Cannot display " + segmentCount + " in a reasonable timeframe.");
} else {
tableViewer.setItemCount((int) segmentCount);
}
boolean found = false;
if (selected != null && dataInput instanceof ISegmentStore<?>) {
ISegmentStore<?> store = (ISegmentStore<?>) dataInput;
for (ISegment segment : store.getIntersectingElements(selected.getEnd())) {
if (isSameish(segment, selected)) {
selection = new StructuredSelection(segment);
tableViewer.setSelection(selection, true);
found = true;
break;
}
}
}
if (!found) {
tableViewer.setSelection(StructuredSelection.EMPTY);
}
}
}
});
}
Aggregations