1 /**********************************************************************
2 * Copyright (c) 2011 Ericsson
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * Bernd Hufmann - Initial API and implementation
11 **********************************************************************/
12 package org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.impl
;
14 import java
.util
.ArrayList
;
15 import java
.util
.HashMap
;
16 import java
.util
.List
;
17 import java
.util
.concurrent
.CopyOnWriteArrayList
;
18 import java
.util
.concurrent
.locks
.ReentrantLock
;
20 import org
.eclipse
.core
.runtime
.IProgressMonitor
;
21 import org
.eclipse
.core
.runtime
.IStatus
;
22 import org
.eclipse
.core
.runtime
.Status
;
23 import org
.eclipse
.core
.runtime
.jobs
.Job
;
24 import org
.eclipse
.jface
.viewers
.ISelection
;
25 import org
.eclipse
.jface
.viewers
.StructuredSelection
;
26 import org
.eclipse
.linuxtools
.internal
.tmf
.ui
.TmfUiPlugin
;
27 import org
.eclipse
.linuxtools
.tmf
.core
.component
.TmfComponent
;
28 import org
.eclipse
.linuxtools
.tmf
.core
.event
.ITmfEvent
;
29 import org
.eclipse
.linuxtools
.tmf
.core
.event
.ITmfEventField
;
30 import org
.eclipse
.linuxtools
.tmf
.core
.event
.ITmfTimestamp
;
31 import org
.eclipse
.linuxtools
.tmf
.core
.event
.TmfEvent
;
32 import org
.eclipse
.linuxtools
.tmf
.core
.event
.TmfTimeRange
;
33 import org
.eclipse
.linuxtools
.tmf
.core
.event
.TmfTimestamp
;
34 import org
.eclipse
.linuxtools
.tmf
.core
.experiment
.TmfExperiment
;
35 import org
.eclipse
.linuxtools
.tmf
.core
.request
.ITmfDataRequest
;
36 import org
.eclipse
.linuxtools
.tmf
.core
.request
.ITmfEventRequest
;
37 import org
.eclipse
.linuxtools
.tmf
.core
.request
.TmfDataRequest
;
38 import org
.eclipse
.linuxtools
.tmf
.core
.request
.TmfEventRequest
;
39 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfExperimentDisposedSignal
;
40 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfExperimentSelectedSignal
;
41 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfRangeSynchSignal
;
42 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfSignal
;
43 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfSignalHandler
;
44 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfTimeSynchSignal
;
45 import org
.eclipse
.linuxtools
.tmf
.core
.uml2sd
.ITmfSyncSequenceDiagramEvent
;
46 import org
.eclipse
.linuxtools
.tmf
.core
.uml2sd
.TmfSyncSequenceDiagramEvent
;
47 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.SDView
;
48 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.core
.Frame
;
49 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.core
.GraphNode
;
50 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.core
.Lifeline
;
51 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.handlers
.provider
.ISDAdvancedPagingProvider
;
52 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.handlers
.provider
.ISDFilterProvider
;
53 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.handlers
.provider
.ISDFindProvider
;
54 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.handlers
.provider
.ISDGraphNodeSupporter
;
55 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.handlers
.widgets
.Criteria
;
56 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.handlers
.widgets
.FilterCriteria
;
57 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.handlers
.widgets
.FilterListDialog
;
58 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.load
.IUml2SDLoader
;
59 import org
.eclipse
.swt
.widgets
.Display
;
60 import org
.eclipse
.ui
.ISelectionListener
;
61 import org
.eclipse
.ui
.IWorkbenchPart
;
62 import org
.eclipse
.ui
.PlatformUI
;
63 import org
.eclipse
.ui
.progress
.IProgressConstants
;
66 * <b><u>TmfUml2SDSyncLoader</u></b>
68 * Implementation of the org.eclipse.linuxtools.tmf.ui.Uml2SDLoader extension point to provide
69 * a Sequence Diagram loader for a UST trace with specific trace content for sending and
70 * receiving signals between components. Includes default implementation for the TmfEvent parsing.
73 public class TmfUml2SDSyncLoader
extends TmfComponent
implements IUml2SDLoader
, ISDFindProvider
, ISDFilterProvider
, ISDAdvancedPagingProvider
, ISelectionListener
{
75 // ------------------------------------------------------------------------
77 // ------------------------------------------------------------------------
78 protected final static String TITLE
= Messages
.TmfUml2SDSyncLoader_ViewName
;
79 protected final static int DEFAULT_BLOCK_SIZE
= 50000;
80 protected final static int MAX_NUM_OF_MSG
= 10000;
81 protected static final long INITIAL_WINDOW_OFFSET
= (1L * 100 * 1000 * 1000); // .1sec
83 // Experiment attributes
84 protected TmfExperiment
<ITmfEvent
> fExperiment
= null;
85 protected ITmfEventRequest
<ITmfEvent
> fIndexRequest
= null;
86 protected ITmfEventRequest
<ITmfEvent
> fPageRequest
= null;
87 volatile protected boolean fIsSignalSent
= false;
88 volatile protected long fInitialWindow
= INITIAL_WINDOW_OFFSET
;
90 // The view and event attributes
91 protected SDView fView
= null;
92 protected Frame fFrame
= null;
93 protected List
<ITmfSyncSequenceDiagramEvent
> fEvents
= new ArrayList
<ITmfSyncSequenceDiagramEvent
>();
95 // Checkpoint and page attributes
96 protected List
<TmfTimeRange
> fCheckPoints
= new ArrayList
<TmfTimeRange
>(MAX_NUM_OF_MSG
);
97 volatile protected int fCurrentPage
= 0;
98 protected ITmfTimestamp fCurrentTime
= null;
99 volatile protected boolean fIsSelect
= false;
102 protected SearchJob fFindJob
= null;
103 protected List
<GraphNode
> fFindResults
= new ArrayList
<GraphNode
>();
104 protected Criteria fFindCriteria
= null;
105 volatile protected int fCurrentFindIndex
= 0;
108 protected List
<FilterCriteria
> fFilterCriteria
= null;
110 // Thread synchronization
111 protected ReentrantLock fLock
= new ReentrantLock();
113 // ------------------------------------------------------------------------
115 // ------------------------------------------------------------------------
117 public TmfUml2SDSyncLoader() {
121 public TmfUml2SDSyncLoader(String name
) {
125 // ------------------------------------------------------------------------
127 // ------------------------------------------------------------------------
130 * @return returns the current time if available else null
132 public ITmfTimestamp
getCurrentTime() {
135 if (fCurrentTime
!= null) {
136 return fCurrentTime
.clone();
145 * Waits for the page request to be completed
147 public void waitForCompletion() {
149 ITmfEventRequest
<ITmfEvent
> request
= fPageRequest
;
151 if (request
!= null) {
153 request
.waitForCompletion();
154 } catch (InterruptedException e
) {
161 * Spawns a request to index the experiment (checkpoints creation) as well as it fills
164 * @param signal The experiment selected signal
166 @SuppressWarnings("unchecked")
168 public void experimentSelected(TmfExperimentSelectedSignal
<ITmfEvent
> signal
) {
170 final Job job
= new Job("Indexing " + getName() + "...") { //$NON-NLS-1$ //$NON-NLS-2$
172 protected IStatus
run(IProgressMonitor monitor
) {
173 while (!monitor
.isCanceled()) {
176 } catch (InterruptedException e
) {
177 return Status
.OK_STATUS
;
181 return Status
.OK_STATUS
;
189 // Update the trace reference
190 TmfExperiment
<ITmfEvent
> exp
= (TmfExperiment
<ITmfEvent
>) signal
.getExperiment();
191 if (!exp
.equals(fExperiment
)) {
195 // TmfTimeRange window = getInitTRange(fExperiment.getTimeRange());
196 TmfTimeRange window
= TmfTimeRange
.ETERNITY
;
198 fIndexRequest
= new TmfEventRequest
<ITmfEvent
>(ITmfEvent
.class, window
, TmfDataRequest
.ALL_DATA
, DEFAULT_BLOCK_SIZE
, ITmfDataRequest
.ExecutionType
.BACKGROUND
) {
200 private ITmfTimestamp fFirstTime
= null;
201 private ITmfTimestamp fLastTime
= null;
202 private int fNbSeqEvents
= 0;
203 private final List
<ITmfSyncSequenceDiagramEvent
> fSdEvents
= new ArrayList
<ITmfSyncSequenceDiagramEvent
>(MAX_NUM_OF_MSG
);
206 public void handleData(ITmfEvent event
) {
207 super.handleData(event
);
209 ITmfSyncSequenceDiagramEvent sdEvent
= getSequnceDiagramEvent(event
);
211 if (sdEvent
!= null) {
214 if (fFirstTime
== null) {
215 fFirstTime
= event
.getTimestamp().clone();
218 fLastTime
= event
.getTimestamp().clone();
220 if ((fNbSeqEvents
% MAX_NUM_OF_MSG
) == 0) {
223 fCheckPoints
.add(new TmfTimeRange(fFirstTime
, fLastTime
));
225 fView
.updateCoolBar();
234 if (fNbSeqEvents
> MAX_NUM_OF_MSG
) {
239 fSdEvents
.add(sdEvent
);
241 if (fNbSeqEvents
== MAX_NUM_OF_MSG
) {
242 fillCurrentPage(fSdEvents
);
248 public void handleSuccess() {
249 // long indexingEnd = System.nanoTime();
250 if ((fFirstTime
!= null) && (fLastTime
!= null)) {
254 fCheckPoints
.add(new TmfTimeRange(fFirstTime
, fLastTime
));
256 fView
.updateCoolBar();
263 if (fNbSeqEvents
<= MAX_NUM_OF_MSG
) {
264 fillCurrentPage(fSdEvents
);
267 super.handleSuccess();
271 public void handleCompleted() {
272 if (fEvents
.size() == 0) {
273 fFrame
= new Frame();
274 fView
.setFrameSync(fFrame
);
276 super.handleCompleted();
281 fExperiment
.sendRequest(fIndexRequest
);
289 * @param signal The experiment disposed signal
292 public void experimentDisposed(TmfExperimentDisposedSignal
<TmfEvent
> signal
) {
293 if (signal
.getExperiment() != TmfExperiment
.getCurrentExperiment()) {
298 if ((fIndexRequest
!= null) && !fIndexRequest
.isCompleted()) {
299 fIndexRequest
.cancel();
300 fIndexRequest
= null;
303 cancelOngoingRequests();
305 if (fFilterCriteria
!= null) {
306 fFilterCriteria
.clear();
309 FilterListDialog
.deactivateSavedGlobalFilters();
318 * Moves to the page that contains the time provided by the signal. The messages will be selected
319 * if the provided time is the time of a message.
321 * @param signal The Time synch signal.
324 public void synchToTime(TmfTimeSynchSignal signal
) {
327 if ((signal
.getSource() != this) && (fFrame
!= null)) {
329 fCurrentTime
= signal
.getCurrentTime();
339 * Moves to the page that contains the current time provided by signal.
340 * No message will be selected however the focus will be set to the message
341 * if the provided time is the time of a message.
343 * @param signal The time range sync signal
346 public void synchToTimeRange(TmfRangeSynchSignal signal
) {
349 if ((signal
.getSource() != this) && (fFrame
!= null) && !fIsSignalSent
) {
350 TmfTimeRange newTimeRange
= signal
.getCurrentRange();
351 ITmfTimestamp delta
= newTimeRange
.getEndTime().getDelta(newTimeRange
.getStartTime());
352 fInitialWindow
= delta
.getValue();
355 fCurrentTime
= newTimeRange
.getStartTime();
367 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.load.IUml2SDLoader#setViewer(org.eclipse.linuxtools.tmf.ui.views.uml2sd.SDView)
369 @SuppressWarnings("unchecked")
371 public void setViewer(SDView viewer
) {
376 PlatformUI
.getWorkbench().getActiveWorkbenchWindow().getSelectionService().addPostSelectionListener(this);
377 fView
.setSDFindProvider(this);
378 fView
.setSDPagingProvider(this);
379 fView
.setSDFilterProvider(this);
383 fExperiment
= (TmfExperiment
<ITmfEvent
>) TmfExperiment
.getCurrentExperiment();
384 if (fExperiment
!= null) {
385 experimentSelected(new TmfExperimentSelectedSignal
<ITmfEvent
>(this, fExperiment
));
394 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.load.IUml2SDLoader#getTitleString()
397 public String
getTitleString() {
403 * @see org.eclipse.linuxtools.tmf.component.TmfComponent#dispose()
406 public void dispose() {
410 PlatformUI
.getWorkbench().getActiveWorkbenchWindow().getSelectionService().removePostSelectionListener(this);
411 fView
.setSDFindProvider(null);
412 fView
.setSDPagingProvider(null);
413 fView
.setSDFilterProvider(null);
422 * @see org.eclipse.hyades.uml2sd.ui.actions.provider.ISDGraphNodeSupporter#isNodeSupported(int)
425 public boolean isNodeSupported(int nodeType
) {
427 case ISDGraphNodeSupporter
.LIFELINE
:
428 case ISDGraphNodeSupporter
.SYNCMESSAGE
:
439 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.ISDGraphNodeSupporter#getNodeName(int, java.lang.String)
442 public String
getNodeName(int nodeType
, String loaderClassName
) {
444 case ISDGraphNodeSupporter
.LIFELINE
:
445 return Messages
.TmfUml2SDSyncLoader_CategoryLifeline
;
446 case ISDGraphNodeSupporter
.SYNCMESSAGE
:
447 return Messages
.TmfUml2SDSyncLoader_CategoryMessage
;
449 return ""; //$NON-NLS-1$
454 * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
457 public void selectionChanged(IWorkbenchPart part
, ISelection selection
) {
458 ISelection sel
= PlatformUI
.getWorkbench().getActiveWorkbenchWindow().getSelectionService().getSelection();
459 if ((sel
!= null) && (sel
instanceof StructuredSelection
)) {
460 StructuredSelection stSel
= (StructuredSelection
) sel
;
461 if (stSel
.getFirstElement() instanceof TmfSyncMessage
) {
462 TmfSyncMessage syncMsg
= ((TmfSyncMessage
) stSel
.getFirstElement());
463 broadcast(new TmfTimeSynchSignal(this, syncMsg
.getStartTime()));
471 * org.eclipse.hyades.uml2sd.ui.actions.provider.ISDFindProvider#find(org.eclipse.hyades.uml2sd.ui.actions.widgets.Criteria)
474 public boolean find(Criteria toSearch
) {
477 if (fFrame
== null) {
481 if ((fFindResults
== null) || (fFindCriteria
== null) || !fFindCriteria
.compareTo(toSearch
)) {
482 fFindResults
= new CopyOnWriteArrayList
<GraphNode
>();
483 fFindCriteria
= toSearch
;
484 if (fFindCriteria
.isLifeLineSelected()) {
485 for (int i
= 0; i
< fFrame
.lifeLinesCount(); i
++) {
486 if (fFindCriteria
.matches(fFrame
.getLifeline(i
).getName())) {
487 fFindResults
.add(fFrame
.getLifeline(i
));
492 ArrayList
<GraphNode
> msgs
= new ArrayList
<GraphNode
>();
493 if (fFindCriteria
.isSyncMessageSelected()) {
494 for (int i
= 0; i
< fFrame
.syncMessageCount(); i
++) {
495 if (fFindCriteria
.matches(fFrame
.getSyncMessage(i
).getName())) {
496 msgs
.add(fFrame
.getSyncMessage(i
));
501 if (msgs
.size() > 0) {
502 fFindResults
.addAll(msgs
);
505 @SuppressWarnings("rawtypes")
506 List selection
= fView
.getSDWidget().getSelection();
507 if ((selection
!= null) && (selection
.size() == 1)) {
508 fCurrentFindIndex
= fFindResults
.indexOf(selection
.get(0)) + 1;
510 fCurrentFindIndex
= 0;
516 if (fFindResults
.size() > fCurrentFindIndex
) {
517 GraphNode current
= fFindResults
.get(fCurrentFindIndex
);
518 fView
.getSDWidget().moveTo(current
);
522 fCurrentFindIndex
=0;
523 return findInNextPages(fFindCriteria
); // search in other page
532 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.ISDFindProvider#cancel()
535 public void cancel() {
536 cancelOngoingRequests();
541 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.ISDFilterProvider#filter(java.util.List)
543 @SuppressWarnings("unchecked")
545 public boolean filter(List
<?
> filters
) {
548 cancelOngoingRequests();
550 List
<FilterCriteria
> list
= (List
<FilterCriteria
>)filters
;
551 fFilterCriteria
= new ArrayList
<FilterCriteria
>(list
);
553 fillCurrentPage(fEvents
);
563 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.ISDPagingProvider#hasNextPage()
566 public boolean hasNextPage() {
569 int size
= fCheckPoints
.size();
571 return fCurrentPage
< (size
- 1);
581 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.ISDPagingProvider#hasPrevPage()
584 public boolean hasPrevPage() {
587 return fCurrentPage
> 0;
595 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.ISDPagingProvider#nextPage()
598 public void nextPage() {
602 if (fCurrentPage
>= (fCheckPoints
.size() - 1)) {
606 cancelOngoingRequests();
617 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.ISDPagingProvider#prevPage()
620 public void prevPage() {
624 if (fCurrentPage
<= 0) {
628 cancelOngoingRequests();
639 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.ISDPagingProvider#firstPage()
642 public void firstPage() {
646 cancelOngoingRequests();
657 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.ISDPagingProvider#lastPage()
660 public void lastPage() {
663 cancelOngoingRequests();
665 fCurrentPage
= fCheckPoints
.size() - 1;
674 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.ISDAdvancedPagingProvider#currentPage()
677 public int currentPage() {
688 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.ISDAdvancedPagingProvider#pagesCount()
691 public int pagesCount() {
694 return fCheckPoints
.size();
702 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.ISDAdvancedPagingProvider#pageNumberChanged(int)
705 public void pageNumberChanged(int pageNumber
) {
708 cancelOngoingRequests();
710 if (pageNumber
< 0) {
713 int size
= fCheckPoints
.size();
714 if (pageNumber
> (size
- 1)) {
715 pageNumber
= size
- 1;
717 fCurrentPage
= pageNumber
;
726 * @see org.eclipse.linuxtools.tmf.component.TmfComponent#broadcast(org.eclipse.linuxtools.tmf.signal.TmfSignal)
729 public void broadcast(TmfSignal signal
) {
730 fIsSignalSent
= true;
731 super.broadcast(signal
);
732 fIsSignalSent
= false;
736 * Cancels any ongoing find operation
738 protected void cancelOngoingRequests() {
741 // Cancel the search thread
742 if (fFindJob
!= null) {
746 fFindCriteria
= null;
747 fCurrentFindIndex
= 0;
749 if ((fPageRequest
!= null) && !fPageRequest
.isCompleted()) {
750 fPageRequest
.cancel();
759 * Resets loader attributes
761 protected void resetLoader() {
766 fCheckPoints
.clear();
768 fCurrentFindIndex
= 0;
769 fFindCriteria
= null;
771 fInitialWindow
= INITIAL_WINDOW_OFFSET
;
772 fView
.setFrameSync(new Frame());
782 * Fills current page with sequence diagram content.
783 * @param events sequence diagram events
785 protected void fillCurrentPage(List
<ITmfSyncSequenceDiagramEvent
> events
) {
789 fEvents
= new ArrayList
<ITmfSyncSequenceDiagramEvent
>(events
);
791 fView
.toggleWaitCursorAsync(true);
797 final Frame frame
= new Frame();
798 if (events
.size() > 0) {
800 HashMap
<String
, Lifeline
> nodeToLifelineMap
= new HashMap
<String
, Lifeline
>();
802 frame
.setName(Messages
.TmfUml2SDSyncLoader_FrameName
);
804 for (int i
= 0; i
< events
.size(); i
++) {
806 ITmfSyncSequenceDiagramEvent sdEvent
= events
.get(i
);
808 if ((nodeToLifelineMap
.get(sdEvent
.getSender()) == null) && (!filterLifeLine(sdEvent
.getSender()))) {
809 Lifeline lifeline
= new Lifeline();
810 lifeline
.setName(sdEvent
.getSender());
811 nodeToLifelineMap
.put(sdEvent
.getSender(), lifeline
);
812 frame
.addLifeLine(lifeline
);
815 if ((nodeToLifelineMap
.get(sdEvent
.getReceiver()) == null) && (!filterLifeLine(sdEvent
.getReceiver()))) {
816 Lifeline lifeline
= new Lifeline();
817 lifeline
.setName(sdEvent
.getReceiver());
818 nodeToLifelineMap
.put(sdEvent
.getReceiver(), lifeline
);
819 frame
.addLifeLine(lifeline
);
823 int eventOccurence
= 1;
825 for (int i
= 0; i
< events
.size(); i
++) {
826 ITmfSyncSequenceDiagramEvent sdEvent
= events
.get(i
);
828 // Check message filter
829 if (filterMessage(sdEvent
)) {
833 // Set the message sender and receiver
834 Lifeline startLifeline
= nodeToLifelineMap
.get(sdEvent
.getSender());
835 Lifeline endLifeline
= nodeToLifelineMap
.get(sdEvent
.getReceiver());
837 // Check if any of the lifelines were filtered
838 if ((startLifeline
== null) || (endLifeline
== null)) {
842 int tmp
= Math
.max(startLifeline
.getEventOccurrence(), endLifeline
.getEventOccurrence());
843 eventOccurence
= Math
.max(eventOccurence
, tmp
);
845 startLifeline
.setCurrentEventOccurrence(eventOccurence
);
846 endLifeline
.setCurrentEventOccurrence(eventOccurence
);
848 TmfSyncMessage message
= new TmfSyncMessage(sdEvent
, eventOccurence
++);
850 message
.setStartLifeline(startLifeline
);
851 message
.setEndLifeline(endLifeline
);
853 message
.setTime(sdEvent
.getStartTime());
855 // add the message to the frame
856 frame
.addMessage(message
);
861 if (!fView
.getSDWidget().isDisposed()) {
862 fView
.getSDWidget().getDisplay().asyncExec(new Runnable() {
869 // check if view was disposed in the meanwhile
870 if ((fView
!= null) && (!fView
.getSDWidget().isDisposed())) {
872 fView
.setFrame(fFrame
);
874 if (fCurrentTime
!= null) {
875 moveToMessageInPage();
878 if (fFindCriteria
!= null) {
882 fView
.toggleWaitCursorAsync(false);
899 * Moves to a certain message defined by timestamp (across pages)
901 protected void moveToMessage() {
906 page
= getPage(fCurrentTime
);
908 if (page
== fCurrentPage
) {
909 moveToMessageInPage();
920 * Moves to a certain message defined by timestamp in current page
922 protected void moveToMessageInPage() {
925 if (!fView
.getSDWidget().isDisposed()) {
926 // Check for GUI thread
927 if(Display
.getCurrent() != null) {
928 // Already in GUI thread - execute directly
929 TmfSyncMessage prevMessage
= null;
930 TmfSyncMessage syncMessage
= null;
931 boolean isExactTime
= false;
932 for (int i
= 0; i
< fFrame
.syncMessageCount(); i
++) {
933 if (fFrame
.getSyncMessage(i
) instanceof TmfSyncMessage
) {
934 syncMessage
= (TmfSyncMessage
) fFrame
.getSyncMessage(i
);
935 if (syncMessage
.getStartTime().compareTo(fCurrentTime
, false) == 0) {
939 else if (syncMessage
.getStartTime().compareTo(fCurrentTime
, false) > 0) {
940 if (prevMessage
!= null) {
941 syncMessage
= prevMessage
;
945 prevMessage
= syncMessage
;
948 if (fIsSelect
&& isExactTime
) {
949 fView
.getSDWidget().moveTo(syncMessage
);
952 fView
.getSDWidget().ensureVisible(syncMessage
);
953 fView
.getSDWidget().clearSelection();
954 fView
.getSDWidget().redraw();
958 // Not in GUI thread - queue action in GUI thread.
959 fView
.getSDWidget().getDisplay().asyncExec(new Runnable() {
962 moveToMessageInPage();
974 * Moves to a certain message defined by timestamp (across pages)
976 protected void moveToPage() {
981 * Moves to a certain page.
982 * @param notifyAll true to broadcast time range signal to other signal handlers else false
984 protected void moveToPage(boolean notifyAll
) {
986 TmfTimeRange window
= TmfTimeRange
.ETERNITY
;
991 if (fCurrentPage
> fCheckPoints
.size()) {
994 window
= fCheckPoints
.get(fCurrentPage
);
999 fPageRequest
= new TmfEventRequest
<ITmfEvent
>(ITmfEvent
.class, window
, TmfDataRequest
.ALL_DATA
, 1, ITmfDataRequest
.ExecutionType
.FOREGROUND
) {
1000 private final List
<ITmfSyncSequenceDiagramEvent
> fSdEvent
= new ArrayList
<ITmfSyncSequenceDiagramEvent
>();
1003 public void handleData(ITmfEvent event
) {
1004 super.handleData(event
);
1006 ITmfSyncSequenceDiagramEvent sdEvent
= getSequnceDiagramEvent(event
);
1008 if (sdEvent
!= null) {
1009 fSdEvent
.add(sdEvent
);
1014 public void handleSuccess() {
1015 fillCurrentPage(fSdEvent
);
1016 super.handleSuccess();
1021 fExperiment
.sendRequest(fPageRequest
);
1024 TmfTimeRange timeRange
= getSignalTimeRange(window
.getStartTime());
1025 broadcast(new TmfRangeSynchSignal(this, timeRange
, timeRange
.getStartTime()));
1030 * Gets page that contains timestamp
1031 * @param time The timestamp
1032 * @return page that contains the time
1034 protected int getPage(ITmfTimestamp time
) {
1039 size
= fCheckPoints
.size();
1040 for (page
= 0; page
< size
; page
++) {
1041 TmfTimeRange timeRange
= fCheckPoints
.get(page
);
1042 if (timeRange
.getEndTime().compareTo(time
, false) >= 0) {
1056 * Background search in trace for expression in criteria.
1057 * @param findCriteria The find criteria
1058 * @return true if background request was started else false
1060 protected boolean findInNextPages(Criteria findCriteria
) {
1063 if (fFindJob
!= null) {
1067 int nextPage
= fCurrentPage
+ 1;
1069 if ((nextPage
) >= fCheckPoints
.size()) {
1070 // we are at the end
1074 TmfTimeRange window
= new TmfTimeRange(fCheckPoints
.get(nextPage
).getStartTime().clone(), fCheckPoints
.get(fCheckPoints
.size()-1).getEndTime().clone());
1075 fFindJob
= new SearchJob(findCriteria
, window
);
1076 fFindJob
.schedule();
1077 fView
.toggleWaitCursorAsync(true);
1085 * Gets time range for time range signal.
1086 * @param startTime The start time of time range.
1087 * @return the time range
1089 protected TmfTimeRange
getSignalTimeRange(ITmfTimestamp startTime
) {
1092 TmfTimestamp initialEndOfWindow
= new TmfTimestamp(startTime
.getValue() + fInitialWindow
, startTime
.getScale(), startTime
.getPrecision());
1093 return new TmfTimeRange(startTime
, initialEndOfWindow
);
1101 * Checks if filter criteria matches the message name in given SD event.
1102 * @param sdEvent The SD event to check
1103 * @return true if match else false.
1105 protected boolean filterMessage(ITmfSyncSequenceDiagramEvent sdEvent
) {
1108 if (fFilterCriteria
!= null) {
1109 for(FilterCriteria criteria
: fFilterCriteria
) {
1110 if (criteria
.isActive() && criteria
.getCriteria().isSyncMessageSelected() ) {
1112 if(criteria
.getCriteria().matches(sdEvent
.getName())) {
1125 * Checks if filter criteria matches a lifeline name (sender or receiver) in given SD event.
1126 * @param lifeline the message receiver
1127 * @return true if match else false.
1129 protected boolean filterLifeLine(String lifeline
) {
1132 if (fFilterCriteria
!= null) {
1133 for(FilterCriteria criteria
: fFilterCriteria
) {
1134 if (criteria
.isActive() && criteria
.getCriteria().isLifeLineSelected()) {
1136 if(criteria
.getCriteria().matches(lifeline
)) {
1149 * Job to search in trace for given time range.
1151 protected class SearchJob
extends Job
{
1153 final protected SearchEventRequest fSearchRequest
;
1158 * @param findCriteria The search criteria
1159 * @param window Time range to search in
1161 public SearchJob(Criteria findCriteria
, TmfTimeRange window
) {
1162 super(Messages
.TmfUml2SDSyncLoader_SearchJobDescrition
);
1163 fSearchRequest
= new SearchEventRequest(window
, TmfDataRequest
.ALL_DATA
, 1, ITmfDataRequest
.ExecutionType
.FOREGROUND
, findCriteria
);
1168 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
1171 protected IStatus
run(IProgressMonitor monitor
) {
1172 fSearchRequest
.setMonitor(monitor
);
1174 fExperiment
.sendRequest(fSearchRequest
);
1177 fSearchRequest
.waitForCompletion();
1178 } catch (InterruptedException e
) {
1179 e
.printStackTrace();
1182 IStatus status
= Status
.OK_STATUS
;
1183 if (fSearchRequest
.isFound() && (fSearchRequest
.getFoundTime() != null)) {
1184 fCurrentTime
= fSearchRequest
.getFoundTime();
1186 // Avoid double-selection. Selection will be done when calling find(criteria)
1187 // after moving to relevant page
1189 if (!fView
.getSDWidget().isDisposed()) {
1190 fView
.getSDWidget().getDisplay().asyncExec(new Runnable() {
1200 if (monitor
.isCanceled()) {
1201 status
= Status
.CANCEL_STATUS
;
1204 // String was not found
1205 status
= new Status(Status
.WARNING
, TmfUiPlugin
.PLUGIN_ID
, Messages
.TmfUml2SDSyncLoader_SearchNotFound
);
1207 setProperty(IProgressConstants
.KEEP_PROPERTY
, Boolean
.TRUE
);
1213 fView
.toggleWaitCursorAsync(false);
1224 * @see org.eclipse.core.runtime.jobs.Job#canceling()
1227 protected void canceling() {
1228 fSearchRequest
.cancel();
1239 * TMF event request for searching within trace.
1241 protected class SearchEventRequest
extends TmfEventRequest
<ITmfEvent
> {
1243 final private Criteria fCriteria
;
1245 private IProgressMonitor fMonitor
;
1246 private boolean fIsFound
= false;
1247 private ITmfTimestamp fFoundTime
= null;
1251 * @param range @see org.eclipse.linuxtools.tmf.request.TmfEventRequest#TmfEventRequest(...)
1252 * @param nbRequested @see org.eclipse.linuxtools.tmf.request.TmfEventRequest#handleData(...)
1253 * @param blockSize @see org.eclipse.linuxtools.tmf.request.TmfEventRequest#handleData(...)
1254 * @param execType @see org.eclipse.linuxtools.tmf.request.TmfEventRequest#handleData(...)
1255 * @param criteria The search criteria
1257 public SearchEventRequest(TmfTimeRange range
, int nbRequested
, int blockSize
, ExecutionType execType
, Criteria criteria
) {
1258 this(range
, nbRequested
, blockSize
, execType
, criteria
, null);
1263 * @param range @see org.eclipse.linuxtools.tmf.request.TmfEventRequest#TmfEventRequest(...)
1264 * @param nbRequested @see org.eclipse.linuxtools.tmf.request.TmfEventRequest#TmfEventRequest(...)
1265 * @param blockSize @see org.eclipse.linuxtools.tmf.request.TmfEventRequest#TmfEventRequest(...)
1266 * @param execType @see org.eclipse.linuxtools.tmf.request.TmfEventRequest#TmfEventRequest(...)
1267 * @param criteria The search criteria
1268 * @param monitor progress monitor
1270 public SearchEventRequest(TmfTimeRange range
, int nbRequested
, int blockSize
, ExecutionType execType
, Criteria criteria
, IProgressMonitor monitor
) {
1271 super(ITmfEvent
.class, range
, nbRequested
, blockSize
, execType
);
1272 fCriteria
= new Criteria(criteria
);
1278 * @see org.eclipse.linuxtools.tmf.request.TmfDataRequest#handleData(org.eclipse.linuxtools.tmf.event.TmfData)
1281 public void handleData(ITmfEvent event
) {
1282 super.handleData(event
);
1284 if ((fMonitor
!= null) && fMonitor
.isCanceled()) {
1289 ITmfSyncSequenceDiagramEvent sdEvent
= getSequnceDiagramEvent(event
);
1291 if (sdEvent
!= null) {
1293 if (fCriteria
.isLifeLineSelected()) {
1294 if (fCriteria
.matches(sdEvent
.getSender())) {
1295 fFoundTime
= event
.getTimestamp().clone();
1300 if (fCriteria
.matches(sdEvent
.getReceiver())) {
1301 fFoundTime
= event
.getTimestamp().clone();
1307 if (fCriteria
.isSyncMessageSelected()) {
1308 if (fCriteria
.matches(sdEvent
.getName())) {
1309 fFoundTime
= event
.getTimestamp().clone();
1319 * @see org.eclipse.linuxtools.tmf.request.TmfDataRequest#handleCompleted()
1322 public void handleCompleted() {
1323 super.handleCompleted();
1327 * Set progress monitor.
1330 public void setMonitor(IProgressMonitor monitor
) {
1335 * Check if find criteria was met.
1336 * @return true if find criteria was met.
1338 public boolean isFound() {
1343 * @return timestamp of found time.
1345 public ITmfTimestamp
getFoundTime() {
1351 * @param tmfEvent Event to parse for sequence diagram event details
1352 * @return sequence diagram event if details are available else null
1354 protected ITmfSyncSequenceDiagramEvent
getSequnceDiagramEvent(ITmfEvent tmfEvent
){
1355 //type = .*RECEIVE.* or .*SEND.*
1356 //content = sender:<sender name>:receiver:<receiver name>,signal:<signal name>
1357 String eventType
= tmfEvent
.getType().toString();
1358 if (eventType
.contains(Messages
.TmfUml2SDSyncCloader_EventTypeSend
) || eventType
.contains(Messages
.TmfUml2SDSyncCloader_EventTypeReceive
)) {
1359 Object sender
= tmfEvent
.getContent().getField(Messages
.TmfUml2SDSyncCloader_FieldSender
);
1360 Object receiver
= tmfEvent
.getContent().getField(Messages
.TmfUml2SDSyncCloader_FieldReceiver
);
1361 Object name
= tmfEvent
.getContent().getField(Messages
.TmfUml2SDSyncCloader_FieldSignal
);
1362 if ((sender
instanceof ITmfEventField
) && (receiver
instanceof ITmfEventField
) && (name
instanceof ITmfEventField
)) {
1363 ITmfSyncSequenceDiagramEvent sdEvent
= new TmfSyncSequenceDiagramEvent(tmfEvent
,
1364 ((ITmfEventField
) sender
).getValue().toString(),
1365 ((ITmfEventField
) receiver
).getValue().toString(),
1366 ((ITmfEventField
) name
).getValue().toString());