tmf : Add search dialog to timegraph views
[deliverable/tracecompass.git] / tmf / org.eclipse.tracecompass.tmf.ui / src / org / eclipse / tracecompass / tmf / ui / views / timechart / TimeChartAnalysisEntry.java
CommitLineData
6151d86c 1/*******************************************************************************
36299425 2 * Copyright (c) 2010, 2016 Ericsson
6151d86c
PT
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 * Contributors:
10 * Patrick Tasse - Initial API and implementation
11 *******************************************************************************/
12
2bdf0193 13package org.eclipse.tracecompass.tmf.ui.views.timechart;
6151d86c 14
df2597e0
AM
15import static org.eclipse.tracecompass.common.core.NonNullUtils.checkNotNull;
16
6151d86c 17import java.util.Iterator;
30652cc3 18import java.util.List;
6151d86c
PT
19import java.util.NoSuchElementException;
20import java.util.Vector;
36299425 21import java.util.regex.Pattern;
6151d86c 22
df2597e0 23import org.eclipse.jdt.annotation.NonNull;
2bdf0193
AM
24import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
25import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.ITimeEvent;
26import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.ITimeGraphEntry;
6151d86c
PT
27
28/**
29 * An entry (row) in the time chart analysis view
30 *
31 * @version 1.0
32 * @author Patrick Tasse
33 */
34public class TimeChartAnalysisEntry implements ITimeGraphEntry {
35
36 private final ITmfTrace fTrace;
37 private final Vector<TimeChartEvent> fTraceEvents;
38 private int fPower = 0; // 2^fPower nanoseconds per vector position
39 private long fReferenceTime = -1; // time corresponding to beginning of index 0
40 private long fStartTime = -1; // time of first event
41 private long fStopTime = -1; // time of last event
42 private long fLastRank = -1; // rank of last processed trace event
43
44 TimeChartAnalysisEntry(ITmfTrace trace, int modelSize) {
45 fTrace = trace;
507b1336 46 fTraceEvents = new Vector<>(modelSize);
6151d86c
PT
47 }
48
49 @Override
df2597e0 50 public List<@NonNull ITimeGraphEntry> getChildren() {
6151d86c
PT
51 return null;
52 }
53
54 @Override
55 public ITimeGraphEntry getParent() {
56 return null;
57 }
58
59 @Override
60 public boolean hasChildren() {
61 return false;
62 }
63
64 @Override
65 public String getName() {
66 return fTrace.getName();
67 }
68
69 @Override
70 public long getStartTime() {
71 return fStartTime;
72 }
73
74 @Override
75 public long getEndTime() {
76 return fStopTime;
77 }
78
79 @Override
80 public boolean hasTimeEvents() {
81 return true;
82 }
83
84 @Override
df2597e0 85 public Iterator<@NonNull ITimeEvent> getTimeEventsIterator() {
6151d86c
PT
86 return new EntryIterator(0, Long.MAX_VALUE, 0);
87 }
88
89 @Override
df2597e0 90 public Iterator<@NonNull ITimeEvent> getTimeEventsIterator(long startTime, long stopTime, long maxDuration) {
6151d86c
PT
91 return new EntryIterator(startTime, stopTime, maxDuration);
92 }
93
df2597e0 94 private class EntryIterator implements Iterator<@NonNull ITimeEvent> {
6151d86c
PT
95 private final long fIteratorStartTime;
96 private final long fIteratorStopTime;
97 private final long fIteratorMaxDuration;
98 private long lastTime = -1;
99 private TimeChartEvent next = null;
100 private Iterator<ITimeEvent> nestedIterator = null;
101
102 public EntryIterator(long startTime, long stopTime, long maxDuration) {
103 fIteratorStartTime = startTime;
104 fIteratorStopTime = stopTime;
105 fIteratorMaxDuration = maxDuration;
106 }
107
108 @Override
109 public boolean hasNext() {
110 synchronized (fTraceEvents) {
111 if (next != null) {
112 return true;
113 }
114 if (nestedIterator != null) {
115 if (nestedIterator.hasNext()) {
116 return true;
117 }
118 nestedIterator = null;
119 }
120 long time = (lastTime == -1) ? fStartTime : lastTime;
121 int index = (fReferenceTime == -1) ? 0 : (int) ((time - fReferenceTime) >> fPower);
122 while (index < fTraceEvents.size()) {
123 TimeChartEvent event = fTraceEvents.get(index++);
124 if (event != null && (lastTime == -1 || event.getTime() > time)) {
125 if (event.getTime() + event.getDuration() >= fIteratorStartTime && event.getTime() <= fIteratorStopTime) {
126 if (event.getItemizedEntry() == null || event.getDuration() <= fIteratorMaxDuration) {
127 lastTime = event.getTime() + event.getDuration();
128 next = event;
129 return true;
130 }
131 nestedIterator = event.getItemizedEntry().getTimeEventsIterator(fIteratorStartTime, fIteratorStopTime, fIteratorMaxDuration);
132 return nestedIterator.hasNext();
133 }
134 }
135 }
136 return false;
137 }
138 }
139
140 @Override
141 public TimeChartEvent next() {
142 synchronized (fTraceEvents) {
143 if (nestedIterator != null) {
144 TimeChartEvent event = (TimeChartEvent) nestedIterator.next();
145 lastTime = event.getTime() + event.getDuration();
146 return event;
147 }
148 if (hasNext()) {
df2597e0 149 TimeChartEvent event = checkNotNull(next);
6151d86c
PT
150 next = null;
151 return event;
152 }
153 throw new NoSuchElementException();
154 }
155 }
156
157 @Override
158 public void remove() {
159 throw new UnsupportedOperationException();
160 }
161
162 }
163
164 /**
165 * Add a time event to the time chart entry
166 *
167 * @param timeEvent
168 * The event to add
169 */
170 public void addTraceEvent(ITimeEvent timeEvent) {
171 long time = timeEvent.getTime();
172 synchronized (fTraceEvents) {
173 long index = (fReferenceTime == -1) ? 0 : (time - fReferenceTime) >> fPower;
174 if (index < 0) {
175 if (fTraceEvents.capacity() - fTraceEvents.size() < -index) {
176 int powershift = (-index + fTraceEvents.size() <= 2 * fTraceEvents.capacity()) ? 1 :
177 (int) Math.ceil(Math.log((double) (-index + fTraceEvents.size()) / fTraceEvents.capacity()) / Math.log(2));
178 merge(powershift);
179 index = (int) ((time - fReferenceTime) >> fPower);
180 }
181 shift((int) -index);
182 index = 0;
183 fTraceEvents.set(0, (TimeChartEvent) timeEvent);
184 } else if (index < fTraceEvents.capacity()) {
185 if (index >= fTraceEvents.size()) {
186 fTraceEvents.setSize((int) index + 1);
187 }
188 } else {
189 int powershift = (index < 2 * fTraceEvents.capacity()) ? 1 :
190 (int) Math.ceil(Math.log((double) (index + 1) / fTraceEvents.capacity()) / Math.log(2));
191 merge(powershift);
192 index = (int) ((time - fReferenceTime) >> fPower);
193 fTraceEvents.setSize((int) index + 1);
194 }
195 TimeChartEvent event = fTraceEvents.get((int) index);
196 if (event == null) {
197 fTraceEvents.set((int) index, (TimeChartEvent) timeEvent);
198 } else {
199 if (event.getItemizedEntry() == null) {
200 event.merge((TimeChartEvent) timeEvent);
201 } else {
d5efe032 202 event.mergeDecorations((TimeChartEvent) timeEvent);
6151d86c
PT
203 event.getItemizedEntry().addTraceEvent(timeEvent);
204 }
205 }
206 if (fReferenceTime == -1 || time < fReferenceTime) {
207 fReferenceTime = (time >> fPower) << fPower;
208 }
209 if (fStartTime == -1 || time < fStartTime) {
210 fStartTime = time;
211 }
212 if (fStopTime == -1 || time > fStopTime) {
213 fStopTime = time;
214 }
215 }
216 }
217
218 private void merge(int powershift) {
219 fPower += powershift;
220 fReferenceTime = (fReferenceTime >> fPower) << fPower;
221 int index = 0;
222 for (int i = 0; i < fTraceEvents.size(); i++) {
223 TimeChartEvent event = fTraceEvents.get(i);
224 if (event != null) {
225 index = (int) ((event.getTime() - fReferenceTime) >> fPower);
226 TimeChartEvent mergedEvent = fTraceEvents.get(index);
227 if (mergedEvent == null) {
228 fTraceEvents.set(index, event);
229 } else {
230 mergedEvent.merge(event);
231 }
232 if (i != index) {
233 fTraceEvents.set(i, null);
234 }
235 }
236 }
237 fTraceEvents.setSize(index + 1);
238 }
239
240 private void shift(int indexshift) {
241 int oldSize = fTraceEvents.size();
242 fTraceEvents.setSize(oldSize + indexshift);
243 for (int i = oldSize - 1; i >= 0; i--) {
244 fTraceEvents.set(i + indexshift, fTraceEvents.get(i));
245 }
246 for (int i = 0; i < indexshift; i++) {
247 fTraceEvents.set(i, null);
248 }
249 }
250
251 /**
252 * Retrieve the trace associated with this entry
253 *
254 * @return The trace object
255 */
256 public ITmfTrace getTrace() {
257 return fTrace;
258 }
259
260 /**
261 * Set the last rank of the entry
262 *
263 * @param rank
264 * The rank to set
265 */
266 public void setLastRank(long rank) {
267 fLastRank = rank;
268 }
269
270 /**
271 * Retrieve the last rank of the entry
272 *
273 * @return The last rank
274 */
275 public long getLastRank() {
276 return fLastRank;
277 }
36299425
JCK
278
279 /**
280 * @since 2.0
281 */
282 @Override
283 public boolean matches(@NonNull Pattern pattern) {
284 return getName() != null ? pattern.matcher(getName()).find() : false;
285 }
6151d86c 286}
This page took 0.09649 seconds and 5 git commands to generate.