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