2 * Copyright (C) 2017 EfficiOS Inc., Alexandre Montplaisir <alexmonthy@efficios.com>
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
10 package org
.lttng
.scope
.tmf2
.views
.ui
.timeline
.widgets
.timegraph
.toolbar
.drawnevents
;
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
;
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
;
37 import com
.google
.common
.collect
.ImmutableList
;
39 class PredicateDrawnEventProvider
extends TimeGraphDrawnEventProvider
{
41 /** Maximum number of matching events */
42 private static final int MAX
= 2000;
44 private final ITimeGraphModelProvider fModelProvider
;
45 private final Predicate
<ITmfEvent
> fPredicate
;
47 public PredicateDrawnEventProvider(TimeGraphDrawnEventSeries drawnEventSeries
,
48 ITimeGraphModelProvider modelProvider
,
49 Predicate
<ITmfEvent
> predicate
) {
50 super(drawnEventSeries
);
51 fModelProvider
= modelProvider
;
52 fPredicate
= predicate
;
54 /* Just use whatever trace is currently active */
55 traceProperty().bind(ViewGroupContext
.getCurrent().currentTraceProperty());
59 public TimeGraphDrawnEventRender
getEventRender(TimeGraphTreeRender treeRender
,
60 TimeRange timeRange
, @Nullable FutureTask
<?
> task
) {
62 /* Very TMF-specific */
63 ITmfTrace trace
= traceProperty().get();
65 return new TimeGraphDrawnEventRender(timeRange
, Collections
.EMPTY_LIST
);
70 List
<ITmfEvent
> traceEvents
= new LinkedList
<>();
71 TmfEventRequest req
= new TmfEventRequest(ITmfEvent
.class,
72 timeRange
.toTmfTimeRange(),
74 ITmfEventRequest
.ALL_DATA
,
75 ExecutionType
.BACKGROUND
) {
77 private int matches
= 0;
80 public void handleData(ITmfEvent event
) {
81 super.handleData(event
);
82 if (task
!= null && task
.isCancelled()) {
86 if (fPredicate
.test(event
)) {
88 traceEvents
.add(event
);
95 trace
.sendRequest(req
);
97 req
.waitForCompletion();
98 } catch (InterruptedException e
) {
101 if (req
.isCancelled()) {
102 return new TimeGraphDrawnEventRender(timeRange
, Collections
.EMPTY_LIST
);
105 List
<TimeGraphDrawnEvent
> drawnEvents
= traceEvents
.stream()
106 /* trace event -> TimeGraphEvent */
108 long timestamp
= traceEvent
.getTimestamp().toNanos();
110 * Find the matching tree element for this trace event, if
113 Optional
<TimeGraphTreeElement
> treeElem
= treeRender
.getAllTreeElements().stream()
115 Predicate
<ITmfEvent
> predicate
= elem
.getEventMatching();
116 if (predicate
== null) {
119 return predicate
.test(traceEvent
);
123 if (!treeElem
.isPresent()) {
126 return new TimeGraphEvent(timestamp
, treeElem
.get());
128 .filter(Objects
::nonNull
)
129 /* TimeGraphEvent -> TimeGraphDrawnEvent */
130 .map(tgEvent
-> new TimeGraphDrawnEvent(tgEvent
, getEventSeries(), null))
131 .collect(ImmutableList
.toImmutableList());
133 return new TimeGraphDrawnEventRender(timeRange
, drawnEvents
);