tmf: Rename time range signals
[deliverable/tracecompass.git] / org.eclipse.tracecompass.tmf.ui / src / org / eclipse / tracecompass / tmf / ui / views / uml2sd / loader / TmfUml2SDSyncLoader.java
CommitLineData
73005152 1/**********************************************************************
2c7fb5af 2 * Copyright (c) 2011, 2015 Ericsson
a55887ca 3 *
73005152
BH
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
a55887ca
AM
8 *
9 * Contributors:
73005152
BH
10 * Bernd Hufmann - Initial API and implementation
11 **********************************************************************/
c8422608 12
2bdf0193 13package org.eclipse.tracecompass.tmf.ui.views.uml2sd.loader;
73005152
BH
14
15import java.util.ArrayList;
16import java.util.HashMap;
17import java.util.List;
eb63f5ff 18import java.util.Map;
73005152
BH
19import java.util.concurrent.CopyOnWriteArrayList;
20import java.util.concurrent.locks.ReentrantLock;
21
22import org.eclipse.core.runtime.IProgressMonitor;
23import org.eclipse.core.runtime.IStatus;
24import org.eclipse.core.runtime.Status;
25import org.eclipse.core.runtime.jobs.Job;
26import org.eclipse.jface.viewers.ISelection;
27import org.eclipse.jface.viewers.StructuredSelection;
de7ddc02 28import org.eclipse.swt.widgets.Display;
2bdf0193
AM
29import org.eclipse.tracecompass.internal.tmf.ui.Activator;
30import org.eclipse.tracecompass.tmf.core.component.TmfComponent;
31import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
32import org.eclipse.tracecompass.tmf.core.event.ITmfEventField;
33import org.eclipse.tracecompass.tmf.core.request.ITmfEventRequest;
2c7fb5af 34import org.eclipse.tracecompass.tmf.core.request.ITmfEventRequest.ExecutionType;
2bdf0193 35import org.eclipse.tracecompass.tmf.core.request.TmfEventRequest;
97c71024 36import org.eclipse.tracecompass.tmf.core.signal.TmfWindowRangeUpdatedSignal;
2bdf0193
AM
37import org.eclipse.tracecompass.tmf.core.signal.TmfSignal;
38import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler;
97c71024 39import org.eclipse.tracecompass.tmf.core.signal.TmfSelectionRangeUpdatedSignal;
2bdf0193
AM
40import org.eclipse.tracecompass.tmf.core.signal.TmfTraceClosedSignal;
41import org.eclipse.tracecompass.tmf.core.signal.TmfTraceOpenedSignal;
42import org.eclipse.tracecompass.tmf.core.signal.TmfTraceSelectedSignal;
43import org.eclipse.tracecompass.tmf.core.timestamp.ITmfTimestamp;
44import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimeRange;
45import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp;
46import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
47import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager;
48import org.eclipse.tracecompass.tmf.core.uml2sd.ITmfSyncSequenceDiagramEvent;
49import org.eclipse.tracecompass.tmf.core.uml2sd.TmfSyncSequenceDiagramEvent;
50import org.eclipse.tracecompass.tmf.ui.editors.ITmfTraceEditor;
51import org.eclipse.tracecompass.tmf.ui.views.uml2sd.SDView;
52import org.eclipse.tracecompass.tmf.ui.views.uml2sd.core.Frame;
53import org.eclipse.tracecompass.tmf.ui.views.uml2sd.core.GraphNode;
54import org.eclipse.tracecompass.tmf.ui.views.uml2sd.core.Lifeline;
55import org.eclipse.tracecompass.tmf.ui.views.uml2sd.dialogs.Criteria;
56import org.eclipse.tracecompass.tmf.ui.views.uml2sd.dialogs.FilterCriteria;
57import org.eclipse.tracecompass.tmf.ui.views.uml2sd.dialogs.FilterListDialog;
58import org.eclipse.tracecompass.tmf.ui.views.uml2sd.handlers.provider.ISDAdvancedPagingProvider;
59import org.eclipse.tracecompass.tmf.ui.views.uml2sd.handlers.provider.ISDFilterProvider;
60import org.eclipse.tracecompass.tmf.ui.views.uml2sd.handlers.provider.ISDFindProvider;
61import org.eclipse.tracecompass.tmf.ui.views.uml2sd.handlers.provider.ISDGraphNodeSupporter;
62import org.eclipse.tracecompass.tmf.ui.views.uml2sd.load.IUml2SDLoader;
faa38350 63import org.eclipse.ui.IEditorPart;
73005152
BH
64import org.eclipse.ui.ISelectionListener;
65import org.eclipse.ui.IWorkbenchPart;
526d9026 66import org.eclipse.ui.IWorkbenchWindow;
73005152
BH
67import org.eclipse.ui.PlatformUI;
68import org.eclipse.ui.progress.IProgressConstants;
69
70/**
73005152 71 * <p>
a55887ca 72 * This class is a reference implementation of the
2c7fb5af 73 * <code>org.eclipse.tracecompass.tmf.ui.Uml2SDLoader</code> extension point. It
a55887ca
AM
74 * provides a Sequence Diagram loader for a user space trace with specific trace
75 * content for sending and receiving signals between components. I also includes
76 * a default implementation for the <code>ITmfEvent</code> parsing.
73005152 77 * </p>
a55887ca
AM
78 *
79 * The class <code>TmfUml2SDSyncLoader</code> analyzes events from type
80 * <code>ITmfEvent</code> and creates events type
81 * <code>ITmfSyncSequenceDiagramEvent</code> if the <code>ITmfEvent</code>
82 * contains all relevant information. The analysis checks that the event type
83 * strings contains either string SEND or RECEIVE. If event type matches these
84 * key words, the analyzer will look for strings sender, receiver and signal in
85 * the event fields of type <code>ITmfEventField</code>. If all the data is
86 * found a sequence diagram event from can be created. Note that Sync Messages
87 * are assumed, which means start and end time are the same. <br>
df0b8ff4 88 * <br>
a55887ca
AM
89 * The parsing of the <code>ITmfEvent</code> is done in the method
90 * <code>getSequnceDiagramEvent()</code> of class
91 * <code>TmfUml2SDSyncLoader</code>. By extending the class
92 * <code>TmfUml2SDSyncLoader</code> and overwriting
93 * <code>getSequnceDiagramEvent()</code> a customized parsing algorithm can be
94 * implemented.<br>
95 * <br>
96 * Note that combined traces of multiple components, that contain the trace
97 * information about the same interactions are not supported in the class
98 * <code>TmfUml2SDSyncLoader</code>.
99 *
df0b8ff4
BH
100 * @version 1.0
101 * @author Bernd Hufmann
73005152
BH
102 */
103public class TmfUml2SDSyncLoader extends TmfComponent implements IUml2SDLoader, ISDFindProvider, ISDFilterProvider, ISDAdvancedPagingProvider, ISelectionListener {
104
105 // ------------------------------------------------------------------------
df0b8ff4 106 // Constants
73005152 107 // ------------------------------------------------------------------------
672a642a 108
df0b8ff4
BH
109 /**
110 * Default title name.
111 */
f26e290b 112 protected static final String TITLE = Messages.TmfUml2SDSyncLoader_ViewName;
672a642a 113
df0b8ff4
BH
114 /**
115 * Maximum number of messages per page.
116 */
f26e290b
BH
117 protected static final int MAX_NUM_OF_MSG = 10000;
118
119 private static final int INDEXING_THREAD_SLEEP_VALUE = 100;
df0b8ff4
BH
120
121 // ------------------------------------------------------------------------
122 // Attributes
123 // ------------------------------------------------------------------------
73005152
BH
124
125 // Experiment attributes
df0b8ff4 126 /**
faa38350 127 * The TMF trace reference.
df0b8ff4 128 */
faa38350 129 protected ITmfTrace fTrace = null;
df0b8ff4
BH
130 /**
131 * The current indexing event request.
132 */
6256d8ad 133 protected ITmfEventRequest fIndexRequest = null;
df0b8ff4
BH
134 /**
135 * The current request to fill a page.
136 */
6256d8ad 137 protected ITmfEventRequest fPageRequest = null;
df0b8ff4
BH
138 /**
139 * Flag whether the time range signal was sent by this loader class or not
140 */
f26e290b 141 protected volatile boolean fIsSignalSent = false;
13e157b1 142
73005152 143 // The view and event attributes
df0b8ff4
BH
144 /**
145 * The sequence diagram view reference.
146 */
73005152 147 protected SDView fView = null;
df0b8ff4
BH
148 /**
149 * The current sequence diagram frame reference.
150 */
73005152 151 protected Frame fFrame = null;
df0b8ff4
BH
152 /**
153 * The list of sequence diagram events of current page.
154 */
507b1336 155 protected List<ITmfSyncSequenceDiagramEvent> fEvents = new ArrayList<>();
73005152
BH
156
157 // Checkpoint and page attributes
df0b8ff4
BH
158 /**
159 * The checkpoints of the whole sequence diagram trace (i.e. start time stamp of each page)
160 */
507b1336 161 protected List<TmfTimeRange> fCheckPoints = new ArrayList<>(MAX_NUM_OF_MSG);
df0b8ff4
BH
162 /**
163 * The current page displayed.
164 */
f26e290b 165 protected volatile int fCurrentPage = 0;
df0b8ff4
BH
166 /**
167 * The current time selected.
168 */
4df4581d 169 protected ITmfTimestamp fCurrentTime = null;
df0b8ff4
BH
170 /**
171 * Flag to specify that selection of message is done by selection or by signal.
172 */
f26e290b 173 protected volatile boolean fIsSelect = false;
73005152
BH
174
175 // Search attributes
df0b8ff4 176 /**
a55887ca 177 * The job for searching across pages.
df0b8ff4 178 */
73005152 179 protected SearchJob fFindJob = null;
df0b8ff4
BH
180 /**
181 * List of found nodes within a page.
182 */
507b1336 183 protected List<GraphNode> fFindResults = new ArrayList<>();
df0b8ff4
BH
184 /**
185 * The current find criteria reference
186 */
73005152 187 protected Criteria fFindCriteria = null;
df0b8ff4
BH
188 /**
189 * The current find index within the list of found nodes (<code>fFindeResults</code> within a page.
190 */
f26e290b 191 protected volatile int fCurrentFindIndex = 0;
73005152
BH
192
193 // Filter attributes
df0b8ff4
BH
194 /**
195 * The list of active filters.
196 */
73005152 197 protected List<FilterCriteria> fFilterCriteria = null;
a55887ca 198
73005152 199 // Thread synchronization
df0b8ff4
BH
200 /**
201 * The synchronization lock.
202 */
73005152 203 protected ReentrantLock fLock = new ReentrantLock();
a55887ca 204
73005152
BH
205 // ------------------------------------------------------------------------
206 // Constructors
207 // ------------------------------------------------------------------------
df0b8ff4
BH
208 /**
209 * Default constructor
210 */
73005152
BH
211 public TmfUml2SDSyncLoader() {
212 super(TITLE);
213 }
214
df0b8ff4
BH
215 /**
216 * Constructor
a55887ca 217 *
df0b8ff4
BH
218 * @param name Name of loader
219 */
73005152
BH
220 public TmfUml2SDSyncLoader(String name) {
221 super(name);
222 }
223
224 // ------------------------------------------------------------------------
225 // Operations
226 // ------------------------------------------------------------------------
3bd46eef 227
73005152 228 /**
df0b8ff4 229 * Returns the current time if available else null.
a55887ca 230 *
df0b8ff4 231 * @return the current time if available else null
73005152 232 */
4df4581d 233 public ITmfTimestamp getCurrentTime() {
a55887ca 234 fLock.lock();
73005152 235 try {
a55887ca 236 if (fCurrentTime != null) {
4593bd5b 237 return fCurrentTime;
73005152
BH
238 }
239 return null;
240 } finally {
241 fLock.unlock();
242 }
243 }
a55887ca 244
73005152
BH
245 /**
246 * Waits for the page request to be completed
247 */
248 public void waitForCompletion() {
249 fLock.lock();
6256d8ad 250 ITmfEventRequest request = fPageRequest;
73005152 251 fLock.unlock();
a55887ca
AM
252 if (request != null) {
253 try {
254 request.waitForCompletion();
255 } catch (InterruptedException e) {
256 // ignore
257 }
73005152
BH
258 }
259 }
260
fec1ac0b
BH
261 /**
262 * Handler for the trace opened signal.
263 * @param signal The trace opened signal
fec1ac0b
BH
264 */
265 @TmfSignalHandler
266 public void traceOpened(TmfTraceOpenedSignal signal) {
267 fTrace = signal.getTrace();
268 loadTrace();
269 }
270
271
73005152 272 /**
faa38350 273 * Signal handler for the trace selected signal.
a55887ca 274 *
faa38350 275 * Spawns a request to index the trace (checkpoints creation) as well as it fills
73005152 276 * the first page.
a55887ca 277 *
faa38350 278 * @param signal The trace selected signal
73005152 279 */
73005152 280 @TmfSignalHandler
faa38350 281 public void traceSelected(TmfTraceSelectedSignal signal) {
fec1ac0b
BH
282 // Update the trace reference
283 ITmfTrace trace = signal.getTrace();
284 if (!trace.equals(fTrace)) {
285 fTrace = trace;
286 }
287 loadTrace();
288 }
bfc779a0 289
fec1ac0b
BH
290 /**
291 * Method for loading the current selected trace into the view.
292 * Sub-class need to override this method to add the view specific implementation.
fec1ac0b
BH
293 */
294 protected void loadTrace() {
e5d31efe 295 ITmfEventRequest indexRequest = null;
a55887ca 296 fLock.lock();
faa38350 297
fec1ac0b 298 try {
77ab0271
BH
299 final Job job = new IndexingJob("Indexing " + getName() + "..."); //$NON-NLS-1$ //$NON-NLS-2$
300 job.setUser(false);
301 job.schedule();
73005152 302
77ab0271
BH
303 indexRequest = fIndexRequest;
304
305 cancelOngoingRequests();
73005152 306
77ab0271 307 TmfTimeRange window = TmfTimeRange.ETERNITY;
73005152 308
fd3f1eff 309 fIndexRequest = new TmfEventRequest(ITmfEvent.class, window, 0,
2740e05c 310 ITmfEventRequest.ALL_DATA, ITmfEventRequest.ExecutionType.BACKGROUND) {
73005152 311
77ab0271
BH
312 private ITmfTimestamp fFirstTime = null;
313 private ITmfTimestamp fLastTime = null;
314 private int fNbSeqEvents = 0;
507b1336 315 private final List<ITmfSyncSequenceDiagramEvent> fSdEvents = new ArrayList<>(MAX_NUM_OF_MSG);
73005152 316
77ab0271
BH
317 @Override
318 public void handleData(ITmfEvent event) {
319 super.handleData(event);
13e157b1 320
77ab0271 321 ITmfSyncSequenceDiagramEvent sdEvent = getSequenceDiagramEvent(event);
6cfc180e
GB
322 ITmfTimestamp firstTime = fFirstTime;
323 ITmfTimestamp lastTime = fLastTime;
77ab0271
BH
324
325 if (sdEvent != null) {
326 ++fNbSeqEvents;
327
6cfc180e
GB
328 if (firstTime == null) {
329 firstTime = event.getTimestamp();
330 fFirstTime = firstTime;
77ab0271 331 }
73005152 332
6cfc180e
GB
333 lastTime = event.getTimestamp();
334 fLastTime = lastTime;
77ab0271
BH
335
336 if ((fNbSeqEvents % MAX_NUM_OF_MSG) == 0) {
337 fLock.lock();
338 try {
6cfc180e 339 fCheckPoints.add(new TmfTimeRange(firstTime, lastTime));
77ab0271
BH
340 if (fView != null) {
341 fView.updateCoolBar();
342 }
343 } finally {
344 fLock.unlock();
345 }
346 fFirstTime = null;
347
348 }
349
350 if (fNbSeqEvents > MAX_NUM_OF_MSG) {
351 // page is full
352 return;
353 }
73005152 354
77ab0271 355 fSdEvents.add(sdEvent);
73005152 356
77ab0271
BH
357 if (fNbSeqEvents == MAX_NUM_OF_MSG) {
358 fillCurrentPage(fSdEvents);
359 }
73005152 360 }
77ab0271 361 }
73005152 362
77ab0271
BH
363 @Override
364 public void handleSuccess() {
6cfc180e
GB
365 final ITmfTimestamp firstTime = fFirstTime;
366 final ITmfTimestamp lastTime = fLastTime;
367 if ((firstTime != null) && (lastTime != null)) {
73005152
BH
368
369 fLock.lock();
370 try {
6cfc180e 371 fCheckPoints.add(new TmfTimeRange(firstTime, lastTime));
73005152
BH
372 if (fView != null) {
373 fView.updateCoolBar();
374 }
375 } finally {
376 fLock.unlock();
377 }
378 }
379
77ab0271 380 if (fNbSeqEvents <= MAX_NUM_OF_MSG) {
fec1ac0b
BH
381 fillCurrentPage(fSdEvents);
382 }
73005152 383
77ab0271
BH
384 super.handleSuccess();
385 }
fec1ac0b 386
77ab0271
BH
387 @Override
388 public void handleCompleted() {
389 if (fEvents.isEmpty()) {
390 fFrame = new Frame();
391 // make sure that view is not null when setting frame
392 SDView sdView;
393 fLock.lock();
394 try {
395 sdView = fView;
396 } finally {
397 fLock.unlock();
398 }
399 if (sdView != null) {
400 sdView.setFrameSync(fFrame);
fec1ac0b 401 }
73005152 402 }
77ab0271
BH
403 super.handleCompleted();
404 job.cancel();
73005152 405 }
77ab0271 406 };
73005152 407
77ab0271
BH
408 } finally {
409 fLock.unlock();
410 }
411 if (indexRequest != null && !indexRequest.isCompleted()) {
412 indexRequest.cancel();
413 }
414 resetLoader();
415 fTrace.sendRequest(fIndexRequest);
73005152
BH
416 }
417
418 /**
faa38350 419 * Signal handler for the trace closed signal.
a55887ca 420 *
faa38350 421 * @param signal The trace closed signal
73005152 422 */
13e157b1 423 @TmfSignalHandler
faa38350
PT
424 public void traceClosed(TmfTraceClosedSignal signal) {
425 if (signal.getTrace() != fTrace) {
828e5592
PT
426 return;
427 }
e5d31efe 428 ITmfEventRequest indexRequest = null;
13e157b1 429 fLock.lock();
73005152 430 try {
d10e93a2
PT
431 indexRequest = fIndexRequest;
432 fIndexRequest = null;
73005152
BH
433
434 cancelOngoingRequests();
435
436 if (fFilterCriteria != null) {
437 fFilterCriteria.clear();
438 }
439
440 FilterListDialog.deactivateSavedGlobalFilters();
73005152 441 } finally {
faa38350 442 fTrace = null;
73005152
BH
443 fLock.unlock();
444 }
d10e93a2
PT
445 if (indexRequest != null && !indexRequest.isCompleted()) {
446 indexRequest.cancel();
447 }
448
449 resetLoader();
73005152
BH
450 }
451
452 /**
97c71024
AM
453 * Moves to the page that contains the time provided by the signal. The
454 * messages will be selected if the provided time is the time of a message.
13e157b1 455 *
97c71024
AM
456 * @param signal
457 * The selection range signal
458 * @since 1.0
73005152
BH
459 */
460 @TmfSignalHandler
97c71024 461 public void selectionRangeUpdated(TmfSelectionRangeUpdatedSignal signal) {
73005152
BH
462 fLock.lock();
463 try {
aa63fb03 464 if ((signal.getSource() != this) && (fFrame != null) && (fCheckPoints.size() > 0)) {
0fcf3b09 465 fCurrentTime = signal.getBeginTime();
73005152
BH
466 fIsSelect = true;
467 moveToMessage();
468 }
469 } finally {
470 fLock.unlock();
471 }
472 }
473
474 /**
97c71024
AM
475 * Moves to the page that contains the current time provided by signal. No
476 * message will be selected however the focus will be set to the message if
477 * the provided time is the time of a message.
a55887ca 478 *
97c71024
AM
479 * @param signal
480 * The window range signal
481 * @since 1.0
73005152
BH
482 */
483 @TmfSignalHandler
97c71024 484 public void windowRangeUpdated(TmfWindowRangeUpdatedSignal signal) {
73005152
BH
485 fLock.lock();
486 try {
aa63fb03 487 if ((signal.getSource() != this) && (fFrame != null) && !fIsSignalSent && (fCheckPoints.size() > 0)) {
73005152 488 TmfTimeRange newTimeRange = signal.getCurrentRange();
73005152
BH
489
490 fIsSelect = false;
7d1ef69c 491 fCurrentTime = newTimeRange.getStartTime();
73005152
BH
492
493 moveToMessage();
494 }
495 } finally {
496 fLock.unlock();
497 }
498
499 }
13e157b1 500
73005152
BH
501 @Override
502 public void setViewer(SDView viewer) {
13e157b1
MK
503
504 fLock.lock();
73005152
BH
505 try {
506 fView = viewer;
507 PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService().addPostSelectionListener(this);
508 fView.setSDFindProvider(this);
509 fView.setSDPagingProvider(this);
510 fView.setSDFilterProvider(this);
511
512 resetLoader();
f28d404e 513 IEditorPart editor = fView.getSite().getPage().getActiveEditor();
faa38350
PT
514 if (editor instanceof ITmfTraceEditor) {
515 ITmfTrace trace = ((ITmfTraceEditor) editor).getTrace();
516 if (trace != null) {
517 traceSelected(new TmfTraceSelectedSignal(this, trace));
518 }
73005152
BH
519 }
520 } finally {
521 fLock.unlock();
522 }
523 }
524
73005152
BH
525 @Override
526 public String getTitleString() {
527 return getName();
528 }
529
73005152
BH
530 @Override
531 public void dispose() {
532 super.dispose();
e5d31efe 533 ITmfEventRequest indexRequest = null;
13e157b1 534 fLock.lock();
73005152 535 try {
526d9026
BH
536 IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
537 // During Eclipse shutdown the active workbench window is null
538 if (window != null) {
539 window.getSelectionService().removePostSelectionListener(this);
540 }
4b4a1525 541
d10e93a2
PT
542 indexRequest = fIndexRequest;
543 fIndexRequest = null;
4b4a1525
BH
544 cancelOngoingRequests();
545
73005152
BH
546 fView.setSDFindProvider(null);
547 fView.setSDPagingProvider(null);
548 fView.setSDFilterProvider(null);
549 fView = null;
550 } finally {
551 fLock.unlock();
552 }
d10e93a2
PT
553 if (indexRequest != null && !indexRequest.isCompleted()) {
554 indexRequest.cancel();
555 }
73005152
BH
556 }
557
73005152
BH
558 @Override
559 public boolean isNodeSupported(int nodeType) {
560 switch (nodeType) {
561 case ISDGraphNodeSupporter.LIFELINE:
562 case ISDGraphNodeSupporter.SYNCMESSAGE:
563 return true;
564
565 default:
566 break;
567 }
568 return false;
569 }
570
73005152
BH
571 @Override
572 public String getNodeName(int nodeType, String loaderClassName) {
573 switch (nodeType) {
574 case ISDGraphNodeSupporter.LIFELINE:
575 return Messages.TmfUml2SDSyncLoader_CategoryLifeline;
576 case ISDGraphNodeSupporter.SYNCMESSAGE:
577 return Messages.TmfUml2SDSyncLoader_CategoryMessage;
abbdd66a
AM
578 default:
579 break;
73005152
BH
580 }
581 return ""; //$NON-NLS-1$
582 }
583
73005152
BH
584 @Override
585 public void selectionChanged(IWorkbenchPart part, ISelection selection) {
586 ISelection sel = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService().getSelection();
13e157b1 587 if ((sel != null) && (sel instanceof StructuredSelection)) {
73005152
BH
588 StructuredSelection stSel = (StructuredSelection) sel;
589 if (stSel.getFirstElement() instanceof TmfSyncMessage) {
590 TmfSyncMessage syncMsg = ((TmfSyncMessage) stSel.getFirstElement());
6cfc180e
GB
591 ITmfTimestamp startTime = syncMsg.getStartTime();
592 if (startTime == null) {
593 startTime = TmfTimestamp.BIG_BANG;
594 }
97c71024 595 broadcast(new TmfSelectionRangeUpdatedSignal(this, startTime));
73005152
BH
596 }
597 }
598 }
599
73005152
BH
600 @Override
601 public boolean find(Criteria toSearch) {
602 fLock.lock();
603 try {
604 if (fFrame == null) {
605 return false;
606 }
607
13e157b1 608 if ((fFindResults == null) || (fFindCriteria == null) || !fFindCriteria.compareTo(toSearch)) {
507b1336 609 fFindResults = new CopyOnWriteArrayList<>();
73005152
BH
610 fFindCriteria = toSearch;
611 if (fFindCriteria.isLifeLineSelected()) {
612 for (int i = 0; i < fFrame.lifeLinesCount(); i++) {
613 if (fFindCriteria.matches(fFrame.getLifeline(i).getName())) {
614 fFindResults.add(fFrame.getLifeline(i));
615 }
616 }
617 }
618
507b1336 619 ArrayList<GraphNode> msgs = new ArrayList<>();
73005152
BH
620 if (fFindCriteria.isSyncMessageSelected()) {
621 for (int i = 0; i < fFrame.syncMessageCount(); i++) {
622 if (fFindCriteria.matches(fFrame.getSyncMessage(i).getName())) {
623 msgs.add(fFrame.getSyncMessage(i));
624 }
625 }
626 }
627
eb63f5ff 628 if (!msgs.isEmpty()) {
73005152
BH
629 fFindResults.addAll(msgs);
630 }
631
5b5b7df5 632 List<GraphNode> selection = fView.getSDWidget().getSelection();
13e157b1 633 if ((selection != null) && (selection.size() == 1)) {
73005152 634 fCurrentFindIndex = fFindResults.indexOf(selection.get(0)) + 1;
13e157b1 635 } else {
73005152 636 fCurrentFindIndex = 0;
13e157b1 637 }
73005152
BH
638 } else {
639 fCurrentFindIndex++;
640 }
641
642 if (fFindResults.size() > fCurrentFindIndex) {
13e157b1 643 GraphNode current = fFindResults.get(fCurrentFindIndex);
73005152
BH
644 fView.getSDWidget().moveTo(current);
645 return true;
73005152 646 }
abbdd66a
AM
647 fFindResults = null;
648 fCurrentFindIndex =0;
649 return findInNextPages(fFindCriteria); // search in other page
73005152
BH
650 } finally {
651 fLock.unlock();
652 }
653 }
654
73005152
BH
655 @Override
656 public void cancel() {
657 cancelOngoingRequests();
658 }
659
73005152 660 @Override
5b5b7df5 661 public boolean filter(List<FilterCriteria> filters) {
73005152
BH
662 fLock.lock();
663 try {
664 cancelOngoingRequests();
665
1ef1189a 666 if (filters == null) {
507b1336 667 fFilterCriteria = new ArrayList<>();
1ef1189a 668 } else {
5b5b7df5 669 List<FilterCriteria> list = filters;
507b1336 670 fFilterCriteria = new ArrayList<>(list);
1ef1189a 671 }
73005152
BH
672
673 fillCurrentPage(fEvents);
674
675 } finally {
676 fLock.unlock();
677 }
678 return true;
679 }
13e157b1 680
73005152
BH
681 @Override
682 public boolean hasNextPage() {
683 fLock.lock();
684 try {
685 int size = fCheckPoints.size();
686 if (size > 0) {
13e157b1 687 return fCurrentPage < (size - 1);
73005152
BH
688 }
689 } finally {
690 fLock.unlock();
691 }
692 return false;
693 }
694
73005152
BH
695 @Override
696 public boolean hasPrevPage() {
697 fLock.lock();
698 try {
699 return fCurrentPage > 0;
700 } finally {
701 fLock.unlock();
702 }
703 }
704
73005152
BH
705 @Override
706 public void nextPage() {
707 fLock.lock();
708 try {
709 // Safety check
13e157b1 710 if (fCurrentPage >= (fCheckPoints.size() - 1)) {
73005152 711 return;
13e157b1 712 }
73005152
BH
713
714 cancelOngoingRequests();
715 fCurrentTime = null;
716 fCurrentPage++;
717 moveToPage();
718 } finally {
719 fLock.unlock();
720 }
721 }
722
73005152
BH
723 @Override
724 public void prevPage() {
725 fLock.lock();
726 try {
727 // Safety check
13e157b1 728 if (fCurrentPage <= 0) {
73005152 729 return;
13e157b1 730 }
73005152
BH
731
732 cancelOngoingRequests();
733 fCurrentTime = null;
734 fCurrentPage--;
735 moveToPage();
736 } finally {
737 fLock.unlock();
738 }
739 }
13e157b1 740
73005152
BH
741 @Override
742 public void firstPage() {
743 fLock.lock();
744 try {
745
746 cancelOngoingRequests();
747 fCurrentTime = null;
748 fCurrentPage = 0;
749 moveToPage();
750 } finally {
751 fLock.unlock();
752 }
753 }
13e157b1 754
73005152
BH
755 @Override
756 public void lastPage() {
757 fLock.lock();
758 try {
759 cancelOngoingRequests();
760 fCurrentTime = null;
761 fCurrentPage = fCheckPoints.size() - 1;
762 moveToPage();
763 } finally {
764 fLock.unlock();
765 }
766 }
767
73005152
BH
768 @Override
769 public int currentPage() {
770 fLock.lock();
771 try {
772 return fCurrentPage;
773 } finally {
774 fLock.unlock();
775 }
776 }
777
73005152
BH
778 @Override
779 public int pagesCount() {
780 fLock.lock();
781 try {
782 return fCheckPoints.size();
783 } finally {
784 fLock.unlock();
785 }
786 }
787
73005152 788 @Override
eb63f5ff
BH
789 public void pageNumberChanged(int pagenNumber) {
790 int localPageNumber = pagenNumber;
a55887ca 791
73005152
BH
792 fLock.lock();
793 try {
794 cancelOngoingRequests();
795
eb63f5ff
BH
796 if (localPageNumber < 0) {
797 localPageNumber = 0;
73005152
BH
798 }
799 int size = fCheckPoints.size();
eb63f5ff
BH
800 if (localPageNumber > (size - 1)) {
801 localPageNumber = size - 1;
73005152 802 }
eb63f5ff 803 fCurrentPage = localPageNumber;
73005152
BH
804 moveToPage();
805 } finally {
806 fLock.unlock();
807 }
808 }
809
73005152
BH
810 @Override
811 public void broadcast(TmfSignal signal) {
812 fIsSignalSent = true;
813 super.broadcast(signal);
814 fIsSignalSent = false;
815 }
816
817 /**
818 * Cancels any ongoing find operation
819 */
820 protected void cancelOngoingRequests() {
13e157b1 821 fLock.lock();
e5d31efe 822 ITmfEventRequest pageRequest = null;
73005152
BH
823 try {
824 // Cancel the search thread
825 if (fFindJob != null) {
826 fFindJob.cancel();
827 }
df0b8ff4 828
73005152
BH
829 fFindResults = null;
830 fFindCriteria = null;
831 fCurrentFindIndex = 0;
832
d10e93a2
PT
833 pageRequest = fPageRequest;
834 fPageRequest = null;
73005152
BH
835 } finally {
836 fLock.unlock();
837 }
d10e93a2
PT
838 if (pageRequest != null && !pageRequest.isCompleted()) {
839 pageRequest.cancel();
840 }
73005152
BH
841 }
842
843 /**
844 * Resets loader attributes
845 */
846 protected void resetLoader() {
847 fLock.lock();
848 try {
849 fCurrentTime = null;
850 fEvents.clear();
851 fCheckPoints.clear();
852 fCurrentPage = 0;
853 fCurrentFindIndex = 0;
854 fFindCriteria = null;
855 fFindResults = null;
73005152
BH
856 fView.setFrameSync(new Frame());
857 fFrame = null;
858 }
859 finally {
860 fLock.unlock();
861 }
862
863 }
864
865 /**
866 * Fills current page with sequence diagram content.
a55887ca 867 *
73005152
BH
868 * @param events sequence diagram events
869 */
870 protected void fillCurrentPage(List<ITmfSyncSequenceDiagramEvent> events) {
871
872 fLock.lock();
873 try {
507b1336 874 fEvents = new ArrayList<>(events);
faa38350 875 if (fView != null && !events.isEmpty()) {
73005152
BH
876 fView.toggleWaitCursorAsync(true);
877 }
878 } finally {
879 fLock.unlock();
880 }
13e157b1 881
73005152 882 final Frame frame = new Frame();
73005152 883
eb63f5ff 884 if (!events.isEmpty()) {
507b1336 885 Map<String, Lifeline> nodeToLifelineMap = new HashMap<>();
73005152
BH
886
887 frame.setName(Messages.TmfUml2SDSyncLoader_FrameName);
888
889 for (int i = 0; i < events.size(); i++) {
890
891 ITmfSyncSequenceDiagramEvent sdEvent = events.get(i);
892
893 if ((nodeToLifelineMap.get(sdEvent.getSender()) == null) && (!filterLifeLine(sdEvent.getSender()))) {
894 Lifeline lifeline = new Lifeline();
895 lifeline.setName(sdEvent.getSender());
896 nodeToLifelineMap.put(sdEvent.getSender(), lifeline);
897 frame.addLifeLine(lifeline);
898 }
899
900 if ((nodeToLifelineMap.get(sdEvent.getReceiver()) == null) && (!filterLifeLine(sdEvent.getReceiver()))) {
901 Lifeline lifeline = new Lifeline();
902 lifeline.setName(sdEvent.getReceiver());
903 nodeToLifelineMap.put(sdEvent.getReceiver(), lifeline);
904 frame.addLifeLine(lifeline);
905 }
906 }
907
908 int eventOccurence = 1;
909
910 for (int i = 0; i < events.size(); i++) {
13e157b1 911 ITmfSyncSequenceDiagramEvent sdEvent = events.get(i);
73005152
BH
912
913 // Check message filter
914 if (filterMessage(sdEvent)) {
915 continue;
916 }
917
918 // Set the message sender and receiver
13e157b1
MK
919 Lifeline startLifeline = nodeToLifelineMap.get(sdEvent.getSender());
920 Lifeline endLifeline = nodeToLifelineMap.get(sdEvent.getReceiver());
73005152 921
13e157b1
MK
922 // Check if any of the lifelines were filtered
923 if ((startLifeline == null) || (endLifeline == null)) {
73005152
BH
924 continue;
925 }
926
927 int tmp = Math.max(startLifeline.getEventOccurrence(), endLifeline.getEventOccurrence());
928 eventOccurence = Math.max(eventOccurence, tmp);
13e157b1 929
73005152
BH
930 startLifeline.setCurrentEventOccurrence(eventOccurence);
931 endLifeline.setCurrentEventOccurrence(eventOccurence);
13e157b1 932
73005152 933 TmfSyncMessage message = new TmfSyncMessage(sdEvent, eventOccurence++);
13e157b1 934
73005152
BH
935 message.setStartLifeline(startLifeline);
936 message.setEndLifeline(endLifeline);
937
938 message.setTime(sdEvent.getStartTime());
939
940 // add the message to the frame
941 frame.addMessage(message);
13e157b1 942
73005152
BH
943 }
944 fLock.lock();
945 try {
946 if (!fView.getSDWidget().isDisposed()) {
947 fView.getSDWidget().getDisplay().asyncExec(new Runnable() {
948
949 @Override
950 public void run() {
951
952 fLock.lock();
953 try {
954 // check if view was disposed in the meanwhile
955 if ((fView != null) && (!fView.getSDWidget().isDisposed())) {
956 fFrame = frame;
957 fView.setFrame(fFrame);
958
959 if (fCurrentTime != null) {
960 moveToMessageInPage();
961 }
962
963 if (fFindCriteria != null) {
964 find(fFindCriteria);
965 }
13e157b1 966
73005152
BH
967 fView.toggleWaitCursorAsync(false);
968 }
969 } finally {
970 fLock.unlock();
971 }
972
973 }
974 });
975 }
976 }
977 finally {
978 fLock.unlock();
979 }
980 }
981 }
982
983 /**
984 * Moves to a certain message defined by timestamp (across pages)
985 */
986 protected void moveToMessage() {
987 int page = 0;
988
989 fLock.lock();
990 try {
991 page = getPage(fCurrentTime);
992
993 if (page == fCurrentPage) {
994 moveToMessageInPage();
995 return;
996 }
997 fCurrentPage = page;
998 moveToPage(false);
999 } finally {
1000 fLock.unlock();
1001 }
1002 }
1003
1004 /**
1005 * Moves to a certain message defined by timestamp in current page
1006 */
1007 protected void moveToMessageInPage() {
1008 fLock.lock();
1009 try {
d5efe032
AF
1010 if (!fView.getSDWidget().isDisposed()) {
1011 // Check for GUI thread
1012 if(Display.getCurrent() != null) {
1013 // Already in GUI thread - execute directly
1014 TmfSyncMessage prevMessage = null;
1015 TmfSyncMessage syncMessage = null;
1016 boolean isExactTime = false;
1017 for (int i = 0; i < fFrame.syncMessageCount(); i++) {
1018 if (fFrame.getSyncMessage(i) instanceof TmfSyncMessage) {
1019 syncMessage = (TmfSyncMessage) fFrame.getSyncMessage(i);
065cc19b 1020 if (syncMessage.getStartTime().compareTo(fCurrentTime) == 0) {
d5efe032
AF
1021 isExactTime = true;
1022 break;
065cc19b 1023 } else if ((syncMessage.getStartTime().compareTo(fCurrentTime) > 0) && (prevMessage != null)) {
d5efe032
AF
1024 syncMessage = prevMessage;
1025 break;
1026 }
1027 prevMessage = syncMessage;
1028 }
1029 }
1030 if (fIsSelect && isExactTime) {
1031 fView.getSDWidget().moveTo(syncMessage);
1032 }
1033 else {
1034 fView.getSDWidget().ensureVisible(syncMessage);
1035 fView.getSDWidget().clearSelection();
1036 fView.getSDWidget().redraw();
1037 }
1038 }
1039 else {
1040 // Not in GUI thread - queue action in GUI thread.
1041 fView.getSDWidget().getDisplay().asyncExec(new Runnable() {
1042 @Override
1043 public void run() {
1044 moveToMessageInPage();
1045 }
1046 });
1047 }
1048 }
73005152
BH
1049 }
1050 finally {
1051 fLock.unlock();
1052 }
1053 }
13e157b1 1054
73005152
BH
1055 /**
1056 * Moves to a certain message defined by timestamp (across pages)
1057 */
1058 protected void moveToPage() {
1059 moveToPage(true);
1060 }
1061
1062 /**
1063 * Moves to a certain page.
a55887ca 1064 *
73005152
BH
1065 * @param notifyAll true to broadcast time range signal to other signal handlers else false
1066 */
1067 protected void moveToPage(boolean notifyAll) {
1068
eb63f5ff 1069 TmfTimeRange window = null;
73005152
BH
1070
1071 fLock.lock();
1072 try {
1073 // Safety check
1074 if (fCurrentPage > fCheckPoints.size()) {
1075 return;
1076 }
1077 window = fCheckPoints.get(fCurrentPage);
1078 } finally {
1079 fLock.unlock();
1080 }
1081
eb63f5ff
BH
1082 if (window == null) {
1083 window = TmfTimeRange.ETERNITY;
1084 }
1085
fd3f1eff 1086 fPageRequest = new TmfEventRequest(ITmfEvent.class, window, 0,
2740e05c 1087 ITmfEventRequest.ALL_DATA, ITmfEventRequest.ExecutionType.FOREGROUND) {
507b1336 1088 private final List<ITmfSyncSequenceDiagramEvent> fSdEvent = new ArrayList<>();
73005152
BH
1089
1090 @Override
5419a136
AM
1091 public void handleData(ITmfEvent event) {
1092 super.handleData(event);
73005152 1093
9a43af17 1094 ITmfSyncSequenceDiagramEvent sdEvent = getSequenceDiagramEvent(event);
73005152
BH
1095
1096 if (sdEvent != null) {
1097 fSdEvent.add(sdEvent);
1098 }
1099 }
1100
1101 @Override
1102 public void handleSuccess() {
1103 fillCurrentPage(fSdEvent);
1104 super.handleSuccess();
1105 }
13e157b1 1106
73005152
BH
1107 };
1108
faa38350 1109 fTrace.sendRequest(fPageRequest);
73005152
BH
1110
1111 if (notifyAll) {
1112 TmfTimeRange timeRange = getSignalTimeRange(window.getStartTime());
97c71024 1113 broadcast(new TmfWindowRangeUpdatedSignal(this, timeRange));
73005152
BH
1114 }
1115 }
1116
1117 /**
1118 * Gets page that contains timestamp
a55887ca 1119 *
73005152
BH
1120 * @param time The timestamp
1121 * @return page that contains the time
1122 */
4df4581d 1123 protected int getPage(ITmfTimestamp time) {
73005152
BH
1124 int page;
1125 int size;
1126 fLock.lock();
1127 try {
1128 size = fCheckPoints.size();
13e157b1 1129 for (page = 0; page < size; page++) {
73005152 1130 TmfTimeRange timeRange = fCheckPoints.get(page);
065cc19b 1131 if (timeRange.getEndTime().compareTo(time) >= 0) {
73005152
BH
1132 break;
1133 }
1134 }
1135 if (page >= size) {
1136 page = size - 1;
1137 }
1138 return page;
1139 } finally {
1140 fLock.unlock();
1141 }
1142 }
13e157b1 1143
73005152
BH
1144 /**
1145 * Background search in trace for expression in criteria.
a55887ca 1146 *
73005152
BH
1147 * @param findCriteria The find criteria
1148 * @return true if background request was started else false
1149 */
1150 protected boolean findInNextPages(Criteria findCriteria) {
1151 fLock.lock();
1152 try {
1153 if (fFindJob != null) {
1154 return true;
1155 }
1156
1157 int nextPage = fCurrentPage + 1;
1158
1159 if ((nextPage) >= fCheckPoints.size()) {
1160 // we are at the end
1161 return false;
1162 }
1163
4593bd5b 1164 TmfTimeRange window = new TmfTimeRange(fCheckPoints.get(nextPage).getStartTime(), fCheckPoints.get(fCheckPoints.size()-1).getEndTime());
73005152
BH
1165 fFindJob = new SearchJob(findCriteria, window);
1166 fFindJob.schedule();
1167 fView.toggleWaitCursorAsync(true);
1168 } finally {
1169 fLock.unlock();
1170 }
1171 return true;
1172 }
1173
1174 /**
1175 * Gets time range for time range signal.
a55887ca 1176 *
73005152 1177 * @param startTime The start time of time range.
0d9a6d76 1178 * @return the time range
73005152 1179 */
4df4581d 1180 protected TmfTimeRange getSignalTimeRange(ITmfTimestamp startTime) {
73005152
BH
1181 fLock.lock();
1182 try {
21852dfa 1183 TmfTimeRange currentRange = TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange();
248af329 1184 long offset = fTrace == null ? 0 : currentRange.getEndTime().getDelta(currentRange.getStartTime()).normalize(0, startTime.getScale()).getValue();
065cc19b 1185 TmfTimestamp initialEndOfWindow = new TmfTimestamp(startTime.getValue() + offset, startTime.getScale());
73005152
BH
1186 return new TmfTimeRange(startTime, initialEndOfWindow);
1187 }
1188 finally {
1189 fLock.unlock();
1190 }
1191 }
1192
1193 /**
13e157b1 1194 * Checks if filter criteria matches the message name in given SD event.
a55887ca 1195 *
73005152
BH
1196 * @param sdEvent The SD event to check
1197 * @return true if match else false.
1198 */
1199 protected boolean filterMessage(ITmfSyncSequenceDiagramEvent sdEvent) {
1200 fLock.lock();
1201 try {
1202 if (fFilterCriteria != null) {
1203 for(FilterCriteria criteria : fFilterCriteria) {
eb63f5ff
BH
1204 if (criteria.isActive() && criteria.getCriteria().isSyncMessageSelected() && criteria.getCriteria().matches(sdEvent.getName())) {
1205 return true;
73005152
BH
1206 }
1207 }
1208 }
1209 } finally {
1210 fLock.unlock();
1211 }
1212 return false;
1213 }
1214
1215 /**
13e157b1 1216 * Checks if filter criteria matches a lifeline name (sender or receiver) in given SD event.
a55887ca 1217 *
0d9a6d76 1218 * @param lifeline the message receiver
73005152
BH
1219 * @return true if match else false.
1220 */
1221 protected boolean filterLifeLine(String lifeline) {
1222 fLock.lock();
1223 try {
1224 if (fFilterCriteria != null) {
1225 for(FilterCriteria criteria : fFilterCriteria) {
eb63f5ff
BH
1226 if (criteria.isActive() && criteria.getCriteria().isLifeLineSelected() && criteria.getCriteria().matches(lifeline)) {
1227 return true;
73005152
BH
1228 }
1229 }
1230 }
1231 } finally {
1232 fLock.unlock();
1233 }
1234 return false;
1235 }
1236
1237 /**
13e157b1 1238 * Job to search in trace for given time range.
73005152
BH
1239 */
1240 protected class SearchJob extends Job {
1241
df0b8ff4 1242 /**
a55887ca 1243 * The search event request.
df0b8ff4 1244 */
f26e290b 1245 protected final SearchEventRequest fSearchRequest;
13e157b1 1246
73005152
BH
1247 /**
1248 * Constructor
13e157b1 1249 *
73005152
BH
1250 * @param findCriteria The search criteria
1251 * @param window Time range to search in
1252 */
1253 public SearchJob(Criteria findCriteria, TmfTimeRange window) {
1254 super(Messages.TmfUml2SDSyncLoader_SearchJobDescrition);
2740e05c 1255 fSearchRequest = new SearchEventRequest(window, ITmfEventRequest.ALL_DATA,
fd3f1eff 1256 ITmfEventRequest.ExecutionType.FOREGROUND, findCriteria);
73005152
BH
1257 }
1258
73005152
BH
1259 @Override
1260 protected IStatus run(IProgressMonitor monitor) {
1261 fSearchRequest.setMonitor(monitor);
13e157b1 1262
faa38350 1263 fTrace.sendRequest(fSearchRequest);
73005152
BH
1264
1265 try {
1266 fSearchRequest.waitForCompletion();
1267 } catch (InterruptedException e) {
8fd82db5 1268 Activator.getDefault().logError("Search request interrupted!", e); //$NON-NLS-1$
73005152
BH
1269 }
1270
13e157b1
MK
1271 IStatus status = Status.OK_STATUS;
1272 if (fSearchRequest.isFound() && (fSearchRequest.getFoundTime() != null)) {
73005152 1273 fCurrentTime = fSearchRequest.getFoundTime();
13e157b1 1274
73005152
BH
1275 // Avoid double-selection. Selection will be done when calling find(criteria)
1276 // after moving to relevant page
13e157b1 1277 fIsSelect = false;
73005152
BH
1278 if (!fView.getSDWidget().isDisposed()) {
1279 fView.getSDWidget().getDisplay().asyncExec(new Runnable() {
1280
1281 @Override
1282 public void run() {
1283 moveToMessage();
1284 }
1285 });
1286 }
1287 }
1288 else {
1289 if (monitor.isCanceled()) {
1290 status = Status.CANCEL_STATUS;
1291 }
1292 else {
1293 // String was not found
abbdd66a 1294 status = new Status(IStatus.WARNING, Activator.PLUGIN_ID, Messages.TmfUml2SDSyncLoader_SearchNotFound);
73005152
BH
1295 }
1296 setProperty(IProgressConstants.KEEP_PROPERTY, Boolean.TRUE);
1297 }
1298 monitor.done();
1299
1300 fLock.lock();
1301 try {
1302 fView.toggleWaitCursorAsync(false);
1303 fFindJob = null;
1304 } finally {
1305 fLock.unlock();
1306 }
1307
1308 return status;
1309 }
13e157b1 1310
73005152
BH
1311 @Override
1312 protected void canceling() {
1313 fSearchRequest.cancel();
1314 fLock.lock();
1315 try {
1316 fFindJob = null;
1317 } finally {
1318 fLock.unlock();
1319 }
1320 }
1321 }
1322
1323 /**
13e157b1 1324 * TMF event request for searching within trace.
73005152 1325 */
6256d8ad 1326 protected class SearchEventRequest extends TmfEventRequest {
73005152 1327
df0b8ff4
BH
1328 /**
1329 * The find criteria.
1330 */
f26e290b 1331 private final Criteria fCriteria;
df0b8ff4
BH
1332 /**
1333 * A progress monitor
1334 */
73005152 1335 private IProgressMonitor fMonitor;
df0b8ff4
BH
1336 /**
1337 * Flag to indicate that node was found according the criteria .
1338 */
73005152 1339 private boolean fIsFound = false;
df0b8ff4
BH
1340 /**
1341 * Time stamp of found item.
1342 */
4df4581d 1343 private ITmfTimestamp fFoundTime = null;
73005152
BH
1344
1345 /**
13e157b1 1346 * Constructor
2c7fb5af
PT
1347 * @param range see {@link TmfEventRequest#TmfEventRequest(Class, TmfTimeRange, long, int, org.eclipse.tracecompass.tmf.core.request.ITmfEventRequest.ExecutionType) TmfEventRequest}
1348 * @param nbRequested see {@link TmfEventRequest#TmfEventRequest(Class, TmfTimeRange, long, int, org.eclipse.tracecompass.tmf.core.request.ITmfEventRequest.ExecutionType) TmfEventRequest}
1349 * @param priority {@link ExecutionType#FOREGROUND} or {@link ExecutionType#BACKGROUND}
73005152
BH
1350 * @param criteria The search criteria
1351 */
2c7fb5af
PT
1352 public SearchEventRequest(TmfTimeRange range, int nbRequested, ExecutionType priority, Criteria criteria) {
1353 this(range, nbRequested, priority, criteria, null);
73005152
BH
1354 }
1355
1356 /**
1357 * Constructor
2c7fb5af
PT
1358 * @param range see {@link TmfEventRequest#TmfEventRequest(Class, TmfTimeRange, long, int, org.eclipse.tracecompass.tmf.core.request.ITmfEventRequest.ExecutionType) TmfEventRequest}
1359 * @param nbRequested see {@link TmfEventRequest#TmfEventRequest(Class, TmfTimeRange, long, int, org.eclipse.tracecompass.tmf.core.request.ITmfEventRequest.ExecutionType) TmfEventRequest}
1360 * @param priority {@link ExecutionType#FOREGROUND} or {@link ExecutionType#BACKGROUND}
73005152
BH
1361 * @param criteria The search criteria
1362 * @param monitor progress monitor
1363 */
2c7fb5af
PT
1364 public SearchEventRequest(TmfTimeRange range, int nbRequested, ExecutionType priority, Criteria criteria, IProgressMonitor monitor) {
1365 super(ITmfEvent.class, range, 0, nbRequested, priority);
73005152
BH
1366 fCriteria = new Criteria(criteria);
1367 fMonitor = monitor;
1368 }
13e157b1 1369
73005152 1370 @Override
5419a136
AM
1371 public void handleData(ITmfEvent event) {
1372 super.handleData(event);
73005152
BH
1373
1374 if ((fMonitor!= null) && fMonitor.isCanceled()) {
e6ace8bb 1375 super.cancel();
73005152
BH
1376 return;
1377 }
1378
9a43af17 1379 ITmfSyncSequenceDiagramEvent sdEvent = getSequenceDiagramEvent(event);
13e157b1 1380
73005152
BH
1381 if (sdEvent != null) {
1382
1383 if (fCriteria.isLifeLineSelected()) {
1384 if (fCriteria.matches(sdEvent.getSender())) {
4593bd5b 1385 fFoundTime = event.getTimestamp();
73005152
BH
1386 fIsFound = true;
1387 super.cancel();
1388 }
1389
1390 if (fCriteria.matches(sdEvent.getReceiver())) {
4593bd5b 1391 fFoundTime = event.getTimestamp();
73005152
BH
1392 fIsFound = true;
1393 super.cancel();
1394 }
1395 }
1396
eb63f5ff 1397 if (fCriteria.isSyncMessageSelected() && fCriteria.matches(sdEvent.getName())) {
4593bd5b 1398 fFoundTime = event.getTimestamp();
eb63f5ff
BH
1399 fIsFound = true;
1400 super.cancel();
73005152
BH
1401 }
1402 }
1403 }
1404
73005152
BH
1405 /**
1406 * Set progress monitor.
a55887ca
AM
1407 *
1408 * @param monitor The monitor to assign
73005152
BH
1409 */
1410 public void setMonitor(IProgressMonitor monitor) {
1411 fMonitor = monitor;
1412 }
1413
1414 /**
1415 * Check if find criteria was met.
a55887ca 1416 *
73005152
BH
1417 * @return true if find criteria was met.
1418 */
1419 public boolean isFound() {
1420 return fIsFound;
1421 }
1422
1423 /**
df0b8ff4 1424 * Returns timestamp of found time.
a55887ca 1425 *
73005152
BH
1426 * @return timestamp of found time.
1427 */
4df4581d 1428 public ITmfTimestamp getFoundTime() {
73005152
BH
1429 return fFoundTime;
1430 }
1431 }
1432
3145ec83 1433 /**
a55887ca
AM
1434 * Job class to provide progress monitor feedback.
1435 *
3145ec83 1436 * @author Bernd Hufmann
3145ec83
BH
1437 */
1438 protected static class IndexingJob extends Job {
1439
4b4a1525
BH
1440 /**
1441 * @param name The job name
1442 */
3145ec83
BH
1443 public IndexingJob(String name) {
1444 super(name);
1445 }
1446
1447 @Override
1448 protected IStatus run(IProgressMonitor monitor) {
1449 while (!monitor.isCanceled()) {
1450 try {
f26e290b 1451 Thread.sleep(INDEXING_THREAD_SLEEP_VALUE);
3145ec83
BH
1452 } catch (InterruptedException e) {
1453 return Status.OK_STATUS;
1454 }
1455 }
1456 monitor.done();
1457 return Status.OK_STATUS;
1458 }
1459 }
1460
a55887ca 1461
73005152 1462 /**
df0b8ff4 1463 * Returns sequence diagram event if details in given event are available else null.
a55887ca 1464 *
73005152
BH
1465 * @param tmfEvent Event to parse for sequence diagram event details
1466 * @return sequence diagram event if details are available else null
1467 */
9a43af17 1468 protected ITmfSyncSequenceDiagramEvent getSequenceDiagramEvent(ITmfEvent tmfEvent){
73005152
BH
1469 //type = .*RECEIVE.* or .*SEND.*
1470 //content = sender:<sender name>:receiver:<receiver name>,signal:<signal name>
1471 String eventType = tmfEvent.getType().toString();
9a43af17
BH
1472 if (eventType.contains(Messages.TmfUml2SDSyncLoader_EventTypeSend) || eventType.contains(Messages.TmfUml2SDSyncLoader_EventTypeReceive)) {
1473 Object sender = tmfEvent.getContent().getField(Messages.TmfUml2SDSyncLoader_FieldSender);
1474 Object receiver = tmfEvent.getContent().getField(Messages.TmfUml2SDSyncLoader_FieldReceiver);
1475 Object name = tmfEvent.getContent().getField(Messages.TmfUml2SDSyncLoader_FieldSignal);
13e157b1 1476 if ((sender instanceof ITmfEventField) && (receiver instanceof ITmfEventField) && (name instanceof ITmfEventField)) {
4c564a2d 1477 ITmfSyncSequenceDiagramEvent sdEvent = new TmfSyncSequenceDiagramEvent(tmfEvent,
13e157b1
MK
1478 ((ITmfEventField) sender).getValue().toString(),
1479 ((ITmfEventField) receiver).getValue().toString(),
1480 ((ITmfEventField) name).getValue().toString());
4c564a2d
FC
1481
1482 return sdEvent;
1483 }
73005152
BH
1484 }
1485 return null;
1486 }
1487}
This page took 0.231073 seconds and 5 git commands to generate.