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