96f5476c372df7c297973561b7a40b3982993873
[deliverable/tracecompass.git] / tmf / org.lttng.scope.tmf2.views.ui / src / org / lttng / scope / tmf2 / views / ui / timeline / widgets / timegraph / toolbar / drawnevents / PredicateDrawnEventProvider.java
1 /*
2 * Copyright (C) 2017 EfficiOS Inc., Alexandre Montplaisir <alexmonthy@efficios.com>
3 *
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
8 */
9
10 package org.lttng.scope.tmf2.views.ui.timeline.widgets.timegraph.toolbar.drawnevents;
11
12 import java.util.Collections;
13 import java.util.LinkedList;
14 import java.util.List;
15 import java.util.Objects;
16 import java.util.Optional;
17 import java.util.concurrent.FutureTask;
18 import java.util.function.Predicate;
19
20 import org.eclipse.jdt.annotation.Nullable;
21 import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
22 import org.eclipse.tracecompass.tmf.core.request.ITmfEventRequest;
23 import org.eclipse.tracecompass.tmf.core.request.ITmfEventRequest.ExecutionType;
24 import org.eclipse.tracecompass.tmf.core.request.TmfEventRequest;
25 import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
26 import org.lttng.scope.tmf2.views.core.TimeRange;
27 import org.lttng.scope.tmf2.views.core.context.ViewGroupContext;
28 import org.lttng.scope.tmf2.views.core.timegraph.model.provider.ITimeGraphModelProvider;
29 import org.lttng.scope.tmf2.views.core.timegraph.model.provider.drawnevents.TimeGraphDrawnEventProvider;
30 import org.lttng.scope.tmf2.views.core.timegraph.model.render.TimeGraphEvent;
31 import org.lttng.scope.tmf2.views.core.timegraph.model.render.drawnevents.TimeGraphDrawnEvent;
32 import org.lttng.scope.tmf2.views.core.timegraph.model.render.drawnevents.TimeGraphDrawnEventRender;
33 import org.lttng.scope.tmf2.views.core.timegraph.model.render.drawnevents.TimeGraphDrawnEventSeries;
34 import org.lttng.scope.tmf2.views.core.timegraph.model.render.tree.TimeGraphTreeElement;
35 import org.lttng.scope.tmf2.views.core.timegraph.model.render.tree.TimeGraphTreeRender;
36
37 import com.google.common.collect.ImmutableList;
38
39 class PredicateDrawnEventProvider extends TimeGraphDrawnEventProvider {
40
41 /** Maximum number of matching events */
42 private static final int MAX = 2000;
43
44 private final ITimeGraphModelProvider fModelProvider;
45 private final Predicate<ITmfEvent> fPredicate;
46
47 public PredicateDrawnEventProvider(TimeGraphDrawnEventSeries drawnEventSeries,
48 ITimeGraphModelProvider modelProvider,
49 Predicate<ITmfEvent> predicate) {
50 super(drawnEventSeries);
51 fModelProvider = modelProvider;
52 fPredicate = predicate;
53
54 /* Just use whatever trace is currently active */
55 traceProperty().bind(ViewGroupContext.getCurrent().currentTraceProperty());
56 }
57
58 @Override
59 public TimeGraphDrawnEventRender getEventRender(TimeGraphTreeRender treeRender,
60 TimeRange timeRange, @Nullable FutureTask<?> task) {
61
62 /* Very TMF-specific */
63 ITmfTrace trace = traceProperty().get();
64 if (trace == null) {
65 return new TimeGraphDrawnEventRender(timeRange, Collections.EMPTY_LIST);
66 }
67
68 long startIndex = 0;
69
70 List<ITmfEvent> traceEvents = new LinkedList<>();
71 TmfEventRequest req = new TmfEventRequest(ITmfEvent.class,
72 timeRange.toTmfTimeRange(),
73 startIndex,
74 ITmfEventRequest.ALL_DATA,
75 ExecutionType.BACKGROUND) {
76
77 private int matches = 0;
78
79 @Override
80 public void handleData(ITmfEvent event) {
81 super.handleData(event);
82 if (task != null && task.isCancelled()) {
83 cancel();
84 }
85
86 if (fPredicate.test(event)) {
87 matches++;
88 traceEvents.add(event);
89 if (matches > MAX) {
90 done();
91 }
92 }
93 }
94 };
95 trace.sendRequest(req);
96 try {
97 req.waitForCompletion();
98 } catch (InterruptedException e) {
99 }
100
101 if (req.isCancelled()) {
102 return new TimeGraphDrawnEventRender(timeRange, Collections.EMPTY_LIST);
103 }
104
105 List<TimeGraphDrawnEvent> drawnEvents = traceEvents.stream()
106 /* trace event -> TimeGraphEvent */
107 .map(traceEvent -> {
108 long timestamp = traceEvent.getTimestamp().toNanos();
109 /*
110 * Find the matching tree element for this trace event, if
111 * there is one.
112 */
113 Optional<TimeGraphTreeElement> treeElem = treeRender.getAllTreeElements().stream()
114 .filter(elem -> {
115 Predicate<ITmfEvent> predicate = elem.getEventMatching();
116 if (predicate == null) {
117 return false;
118 }
119 return predicate.test(traceEvent);
120 })
121 .findFirst();
122
123 if (!treeElem.isPresent()) {
124 return null;
125 }
126 return new TimeGraphEvent(timestamp, treeElem.get());
127 })
128 .filter(Objects::nonNull)
129 /* TimeGraphEvent -> TimeGraphDrawnEvent */
130 .map(tgEvent -> new TimeGraphDrawnEvent(tgEvent, getEventSeries(), null))
131 .collect(ImmutableList.toImmutableList());
132
133 return new TimeGraphDrawnEventRender(timeRange, drawnEvents);
134 }
135
136 }
This page took 0.032707 seconds and 4 git commands to generate.