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
.tmf
.component
.TmfComponent
;
27 import org
.eclipse
.linuxtools
.tmf
.event
.TmfEvent
;
28 import org
.eclipse
.linuxtools
.tmf
.event
.TmfEventField
;
29 import org
.eclipse
.linuxtools
.tmf
.event
.TmfNoSuchFieldException
;
30 import org
.eclipse
.linuxtools
.tmf
.event
.TmfTimeRange
;
31 import org
.eclipse
.linuxtools
.tmf
.event
.TmfTimestamp
;
32 import org
.eclipse
.linuxtools
.tmf
.experiment
.TmfExperiment
;
33 import org
.eclipse
.linuxtools
.tmf
.request
.ITmfDataRequest
;
34 import org
.eclipse
.linuxtools
.tmf
.request
.ITmfEventRequest
;
35 import org
.eclipse
.linuxtools
.tmf
.request
.TmfDataRequest
;
36 import org
.eclipse
.linuxtools
.tmf
.request
.TmfEventRequest
;
37 import org
.eclipse
.linuxtools
.tmf
.signal
.TmfExperimentDisposedSignal
;
38 import org
.eclipse
.linuxtools
.tmf
.signal
.TmfExperimentSelectedSignal
;
39 import org
.eclipse
.linuxtools
.tmf
.signal
.TmfRangeSynchSignal
;
40 import org
.eclipse
.linuxtools
.tmf
.signal
.TmfSignal
;
41 import org
.eclipse
.linuxtools
.tmf
.signal
.TmfSignalHandler
;
42 import org
.eclipse
.linuxtools
.tmf
.signal
.TmfTimeSynchSignal
;
43 import org
.eclipse
.linuxtools
.tmf
.ui
.TmfUiPlugin
;
44 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.SDView
;
45 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.core
.Frame
;
46 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.core
.GraphNode
;
47 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.core
.Lifeline
;
48 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.handlers
.provider
.ISDAdvancedPagingProvider
;
49 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.handlers
.provider
.ISDFilterProvider
;
50 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.handlers
.provider
.ISDFindProvider
;
51 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.handlers
.provider
.ISDGraphNodeSupporter
;
52 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.handlers
.widgets
.Criteria
;
53 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.handlers
.widgets
.FilterCriteria
;
54 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.handlers
.widgets
.FilterListDialog
;
55 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.load
.IUml2SDLoader
;
56 import org
.eclipse
.linuxtools
.tmf
.uml2sd
.ITmfSyncSequenceDiagramEvent
;
57 import org
.eclipse
.linuxtools
.tmf
.uml2sd
.TmfSyncSequenceDiagramEvent
;
58 import org
.eclipse
.swt
.widgets
.Display
;
59 import org
.eclipse
.ui
.ISelectionListener
;
60 import org
.eclipse
.ui
.IWorkbenchPart
;
61 import org
.eclipse
.ui
.PlatformUI
;
62 import org
.eclipse
.ui
.progress
.IProgressConstants
;
65 * <b><u>TmfUml2SDSyncLoader</u></b>
67 * Implementation of the org.eclipse.linuxtools.tmf.ui.Uml2SDLoader extension point to provide
68 * a Sequence Diagram loader for a UST trace with specific trace content for sending and
69 * receiving signals between components. Includes default implementation for the TmfEvent parsing.
72 public class TmfUml2SDSyncLoader
extends TmfComponent
implements IUml2SDLoader
, ISDFindProvider
, ISDFilterProvider
, ISDAdvancedPagingProvider
, ISelectionListener
{
74 // ------------------------------------------------------------------------
76 // ------------------------------------------------------------------------
77 protected final static String TITLE
= Messages
.TmfUml2SDSyncLoader_ViewName
;
78 protected final static int DEFAULT_BLOCK_SIZE
= 50000;
79 protected final static int MAX_NUM_OF_MSG
= 10000;
80 protected static final long INITIAL_WINDOW_OFFSET
= (1L * 100 * 1000 * 1000); // .1sec
82 // Experiment attributes
83 protected TmfExperiment
<TmfEvent
> fExperiment
= null;
84 protected ITmfEventRequest
<TmfEvent
> fIndexRequest
= null;
85 protected ITmfEventRequest
<TmfEvent
> fPageRequest
= null;
86 volatile protected boolean fIsSignalSent
= false;
87 volatile protected long fInitialWindow
= INITIAL_WINDOW_OFFSET
;
89 // The view and event attributes
90 protected SDView fView
= null;
91 protected Frame fFrame
= null;
92 protected List
<ITmfSyncSequenceDiagramEvent
> fEvents
= new ArrayList
<ITmfSyncSequenceDiagramEvent
>();
94 // Checkpoint and page attributes
95 protected List
<TmfTimeRange
> fCheckPoints
= new ArrayList
<TmfTimeRange
>(MAX_NUM_OF_MSG
);
96 volatile protected int fCurrentPage
= 0;
97 protected TmfTimestamp fCurrentTime
= null;
98 volatile protected boolean fIsSelect
= false;
101 protected SearchJob fFindJob
= null;
102 protected List
<GraphNode
> fFindResults
= new ArrayList
<GraphNode
>();
103 protected Criteria fFindCriteria
= null;
104 volatile protected int fCurrentFindIndex
= 0;
107 protected List
<FilterCriteria
> fFilterCriteria
= null;
109 // Thread synchronization
110 protected ReentrantLock fLock
= new ReentrantLock();
112 // ------------------------------------------------------------------------
114 // ------------------------------------------------------------------------
116 public TmfUml2SDSyncLoader() {
120 public TmfUml2SDSyncLoader(String name
) {
124 // ------------------------------------------------------------------------
126 // ------------------------------------------------------------------------
129 * @return returns the current time if available else null
131 public TmfTimestamp
getCurrentTime() {
134 if (fCurrentTime
!= null) {
135 return fCurrentTime
.clone();
144 * Waits for the page request to be completed
146 public void waitForCompletion() {
148 ITmfEventRequest
<TmfEvent
> request
= fPageRequest
;
152 request
.waitForCompletion();
153 } catch (InterruptedException e
) {
159 * Spawns a request to index the experiment (checkpoints creation) as well as it fills
162 * @param signal The experiment selected signal
164 @SuppressWarnings("unchecked")
166 public void experimentSelected(TmfExperimentSelectedSignal
<TmfEvent
> signal
) {
170 // Update the trace reference
171 TmfExperiment
<TmfEvent
> exp
= (TmfExperiment
<TmfEvent
>) signal
.getExperiment();
172 if (!exp
.equals(fExperiment
)) {
176 // TmfTimeRange window = getInitTRange(fExperiment.getTimeRange());
177 TmfTimeRange window
= TmfTimeRange
.Eternity
;
179 fIndexRequest
= new TmfEventRequest
<TmfEvent
>(TmfEvent
.class, window
, TmfDataRequest
.ALL_DATA
, DEFAULT_BLOCK_SIZE
, ITmfDataRequest
.ExecutionType
.BACKGROUND
) {
181 private TmfTimestamp fFirstTime
= null;
182 private TmfTimestamp fLastTime
= null;
183 private int fNbSeqEvents
= 0;
184 private List
<ITmfSyncSequenceDiagramEvent
> fSdEvents
= new ArrayList
<ITmfSyncSequenceDiagramEvent
>(MAX_NUM_OF_MSG
);
187 public void handleData(TmfEvent event
) {
188 super.handleData(event
);
190 ITmfSyncSequenceDiagramEvent sdEvent
= getSequnceDiagramEvent(event
);
192 if (sdEvent
!= null) {
195 if (fFirstTime
== null) {
196 fFirstTime
= event
.getTimestamp().clone();
199 fLastTime
= event
.getTimestamp().clone();
201 if ((fNbSeqEvents
% MAX_NUM_OF_MSG
) == 0) {
204 fCheckPoints
.add(new TmfTimeRange(fFirstTime
, fLastTime
));
206 fView
.updateCoolBar();
215 if (fNbSeqEvents
> MAX_NUM_OF_MSG
) {
220 fSdEvents
.add(sdEvent
);
222 if (fNbSeqEvents
== MAX_NUM_OF_MSG
) {
223 fillCurrentPage(fSdEvents
);
229 public void handleSuccess() {
230 // long indexingEnd = System.nanoTime();
231 if ((fFirstTime
!= null) && (fLastTime
!= null)) {
235 fCheckPoints
.add(new TmfTimeRange(fFirstTime
, fLastTime
));
237 fView
.updateCoolBar();
244 if (fNbSeqEvents
<= MAX_NUM_OF_MSG
) {
245 fillCurrentPage(fSdEvents
);
248 super.handleSuccess();
252 public void handleCompleted() {
253 if (fEvents
.size() == 0) {
254 fFrame
= new Frame();
255 fView
.setFrameSync(fFrame
);
257 super.handleCompleted();
261 ((TmfExperiment
<TmfEvent
>) fExperiment
).sendRequest((ITmfDataRequest
<TmfEvent
>) fIndexRequest
);
268 * @param signal The experiment disposed signal
271 public void experimentDisposed(TmfExperimentDisposedSignal
<TmfEvent
> signal
) {
274 if ((fIndexRequest
!= null) && !fIndexRequest
.isCompleted()) {
275 fIndexRequest
.cancel();
276 fIndexRequest
= null;
279 cancelOngoingRequests();
281 if (fFilterCriteria
!= null) {
282 fFilterCriteria
.clear();
285 FilterListDialog
.deactivateSavedGlobalFilters();
294 * Moves to the page that contains the time provided by the signal. The messages will be selected
295 * if the provided time is the time of a message.
297 * @param signal The Time synch signal.
300 public void synchToTime(TmfTimeSynchSignal signal
) {
303 if ((signal
.getSource() != this) && (fFrame
!= null)) {
305 fCurrentTime
= signal
.getCurrentTime();
315 * Moves to the page that contains the current time provided by signal.
316 * No message will be selected however the focus will be set to the message
317 * if the provided time is the time of a message.
319 * @param signal The time range sync signal
322 public void synchToTimeRange(TmfRangeSynchSignal signal
) {
325 if ((signal
.getSource() != this) && (fFrame
!= null) && !fIsSignalSent
) {
326 TmfTimeRange newTimeRange
= signal
.getCurrentRange();
327 TmfTimestamp delta
= newTimeRange
.getEndTime().getDelta(newTimeRange
.getStartTime());
328 fInitialWindow
= delta
.getValue();
331 fCurrentTime
= newTimeRange
.getStartTime();
343 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.load.IUml2SDLoader#setViewer(org.eclipse.linuxtools.tmf.ui.views.uml2sd.SDView)
345 @SuppressWarnings("unchecked")
347 public void setViewer(SDView viewer
) {
352 PlatformUI
.getWorkbench().getActiveWorkbenchWindow().getSelectionService().addPostSelectionListener(this);
353 fView
.setSDFindProvider(this);
354 fView
.setSDPagingProvider(this);
355 fView
.setSDFilterProvider(this);
359 fExperiment
= (TmfExperiment
<TmfEvent
>) TmfExperiment
.getCurrentExperiment();
360 if (fExperiment
!= null) {
361 experimentSelected(new TmfExperimentSelectedSignal
<TmfEvent
>(this, fExperiment
));
370 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.load.IUml2SDLoader#getTitleString()
373 public String
getTitleString() {
379 * @see org.eclipse.linuxtools.tmf.component.TmfComponent#dispose()
382 public void dispose() {
386 PlatformUI
.getWorkbench().getActiveWorkbenchWindow().getSelectionService().removePostSelectionListener(this);
387 fView
.setSDFindProvider(null);
388 fView
.setSDPagingProvider(null);
389 fView
.setSDFilterProvider(null);
398 * @see org.eclipse.hyades.uml2sd.ui.actions.provider.ISDGraphNodeSupporter#isNodeSupported(int)
401 public boolean isNodeSupported(int nodeType
) {
403 case ISDGraphNodeSupporter
.LIFELINE
:
404 case ISDGraphNodeSupporter
.SYNCMESSAGE
:
415 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.ISDGraphNodeSupporter#getNodeName(int, java.lang.String)
418 public String
getNodeName(int nodeType
, String loaderClassName
) {
420 case ISDGraphNodeSupporter
.LIFELINE
:
421 return Messages
.TmfUml2SDSyncLoader_CategoryLifeline
;
422 case ISDGraphNodeSupporter
.SYNCMESSAGE
:
423 return Messages
.TmfUml2SDSyncLoader_CategoryMessage
;
425 return ""; //$NON-NLS-1$
430 * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
433 public void selectionChanged(IWorkbenchPart part
, ISelection selection
) {
434 ISelection sel
= PlatformUI
.getWorkbench().getActiveWorkbenchWindow().getSelectionService().getSelection();
435 if (sel
!= null && (sel
instanceof StructuredSelection
)) {
436 StructuredSelection stSel
= (StructuredSelection
) sel
;
437 if (stSel
.getFirstElement() instanceof TmfSyncMessage
) {
438 TmfSyncMessage syncMsg
= ((TmfSyncMessage
) stSel
.getFirstElement());
439 broadcast(new TmfTimeSynchSignal(this, syncMsg
.getStartTime()));
447 * org.eclipse.hyades.uml2sd.ui.actions.provider.ISDFindProvider#find(org.eclipse.hyades.uml2sd.ui.actions.widgets.Criteria)
450 public boolean find(Criteria toSearch
) {
453 if (fFrame
== null) {
457 if (fFindResults
== null || fFindCriteria
== null || !fFindCriteria
.compareTo(toSearch
)) {
458 fFindResults
= new CopyOnWriteArrayList
<GraphNode
>();
459 fFindCriteria
= toSearch
;
460 if (fFindCriteria
.isLifeLineSelected()) {
461 for (int i
= 0; i
< fFrame
.lifeLinesCount(); i
++) {
462 if (fFindCriteria
.matches(fFrame
.getLifeline(i
).getName())) {
463 fFindResults
.add(fFrame
.getLifeline(i
));
468 ArrayList
<GraphNode
> msgs
= new ArrayList
<GraphNode
>();
469 if (fFindCriteria
.isSyncMessageSelected()) {
470 for (int i
= 0; i
< fFrame
.syncMessageCount(); i
++) {
471 if (fFindCriteria
.matches(fFrame
.getSyncMessage(i
).getName())) {
472 msgs
.add(fFrame
.getSyncMessage(i
));
477 if (msgs
.size() > 0) {
478 fFindResults
.addAll(msgs
);
481 @SuppressWarnings("rawtypes")
482 List selection
= fView
.getSDWidget().getSelection();
483 if (selection
!= null && selection
.size() == 1)
484 fCurrentFindIndex
= fFindResults
.indexOf(selection
.get(0)) + 1;
486 fCurrentFindIndex
= 0;
491 if (fFindResults
.size() > fCurrentFindIndex
) {
492 GraphNode current
= (GraphNode
) fFindResults
.get(fCurrentFindIndex
);
493 fView
.getSDWidget().moveTo(current
);
497 fCurrentFindIndex
=0;
498 return findInNextPages(fFindCriteria
); // search in other page
507 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.ISDFindProvider#cancel()
510 public void cancel() {
511 cancelOngoingRequests();
516 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.ISDFilterProvider#filter(java.util.List)
518 @SuppressWarnings("unchecked")
520 public boolean filter(List
<?
> filters
) {
523 cancelOngoingRequests();
525 List
<FilterCriteria
> list
= (List
<FilterCriteria
>)filters
;
526 fFilterCriteria
= new ArrayList
<FilterCriteria
>(list
);
528 fillCurrentPage(fEvents
);
538 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.ISDPagingProvider#hasNextPage()
541 public boolean hasNextPage() {
544 int size
= fCheckPoints
.size();
546 return fCurrentPage
< size
- 1;
556 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.ISDPagingProvider#hasPrevPage()
559 public boolean hasPrevPage() {
562 return fCurrentPage
> 0;
570 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.ISDPagingProvider#nextPage()
573 public void nextPage() {
577 if (fCurrentPage
>= fCheckPoints
.size() - 1)
580 cancelOngoingRequests();
591 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.ISDPagingProvider#prevPage()
594 public void prevPage() {
598 if (fCurrentPage
<= 0)
601 cancelOngoingRequests();
612 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.ISDPagingProvider#firstPage()
615 public void firstPage() {
619 cancelOngoingRequests();
630 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.ISDPagingProvider#lastPage()
633 public void lastPage() {
636 cancelOngoingRequests();
638 fCurrentPage
= fCheckPoints
.size() - 1;
647 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.ISDAdvancedPagingProvider#currentPage()
650 public int currentPage() {
661 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.ISDAdvancedPagingProvider#pagesCount()
664 public int pagesCount() {
667 return fCheckPoints
.size();
675 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.ISDAdvancedPagingProvider#pageNumberChanged(int)
678 public void pageNumberChanged(int pageNumber
) {
681 cancelOngoingRequests();
683 if (pageNumber
< 0) {
686 int size
= fCheckPoints
.size();
687 if (pageNumber
> size
- 1) {
688 pageNumber
= size
- 1;
690 fCurrentPage
= pageNumber
;
699 * @see org.eclipse.linuxtools.tmf.component.TmfComponent#broadcast(org.eclipse.linuxtools.tmf.signal.TmfSignal)
702 public void broadcast(TmfSignal signal
) {
703 fIsSignalSent
= true;
704 super.broadcast(signal
);
705 fIsSignalSent
= false;
709 * Cancels any ongoing find operation
711 protected void cancelOngoingRequests() {
714 // Cancel the search thread
715 if (fFindJob
!= null) {
719 fFindCriteria
= null;
720 fCurrentFindIndex
= 0;
722 if ((fPageRequest
!= null) && !fPageRequest
.isCompleted()) {
723 fPageRequest
.cancel();
732 * Resets loader attributes
734 protected void resetLoader() {
739 fCheckPoints
.clear();
741 fCurrentFindIndex
= 0;
742 fFindCriteria
= null;
744 fInitialWindow
= INITIAL_WINDOW_OFFSET
;
745 fView
.setFrameSync(new Frame());
755 * Fills current page with sequence diagram content.
756 * @param events sequence diagram events
758 protected void fillCurrentPage(List
<ITmfSyncSequenceDiagramEvent
> events
) {
762 fEvents
= new ArrayList
<ITmfSyncSequenceDiagramEvent
>(events
);
764 fView
.toggleWaitCursorAsync(true);
770 final Frame frame
= new Frame();
771 if (events
.size() > 0) {
773 HashMap
<String
, Lifeline
> nodeToLifelineMap
= new HashMap
<String
, Lifeline
>();
775 frame
.setName(Messages
.TmfUml2SDSyncLoader_FrameName
);
777 for (int i
= 0; i
< events
.size(); i
++) {
779 ITmfSyncSequenceDiagramEvent sdEvent
= events
.get(i
);
781 if ((nodeToLifelineMap
.get(sdEvent
.getSender()) == null) && (!filterLifeLine(sdEvent
.getSender()))) {
782 Lifeline lifeline
= new Lifeline();
783 lifeline
.setName(sdEvent
.getSender());
784 nodeToLifelineMap
.put(sdEvent
.getSender(), lifeline
);
785 frame
.addLifeLine(lifeline
);
788 if ((nodeToLifelineMap
.get(sdEvent
.getReceiver()) == null) && (!filterLifeLine(sdEvent
.getReceiver()))) {
789 Lifeline lifeline
= new Lifeline();
790 lifeline
.setName(sdEvent
.getReceiver());
791 nodeToLifelineMap
.put(sdEvent
.getReceiver(), lifeline
);
792 frame
.addLifeLine(lifeline
);
796 int eventOccurence
= 1;
798 for (int i
= 0; i
< events
.size(); i
++) {
799 ITmfSyncSequenceDiagramEvent sdEvent
= (TmfSyncSequenceDiagramEvent
) events
.get(i
);
801 // Check message filter
802 if (filterMessage(sdEvent
)) {
806 // Set the message sender and receiver
807 Lifeline startLifeline
= (Lifeline
) nodeToLifelineMap
.get(sdEvent
.getSender());
808 Lifeline endLifeline
= (Lifeline
) nodeToLifelineMap
.get(sdEvent
.getReceiver());
810 // Check if any of the lifelines were filtered
811 if (startLifeline
== null || endLifeline
== null) {
815 int tmp
= Math
.max(startLifeline
.getEventOccurrence(), endLifeline
.getEventOccurrence());
816 eventOccurence
= Math
.max(eventOccurence
, tmp
);
818 startLifeline
.setCurrentEventOccurrence(eventOccurence
);
819 endLifeline
.setCurrentEventOccurrence(eventOccurence
);
821 TmfSyncMessage message
= new TmfSyncMessage(sdEvent
, eventOccurence
++);
823 message
.setStartLifeline(startLifeline
);
824 message
.setEndLifeline(endLifeline
);
826 message
.setTime(sdEvent
.getStartTime());
828 // add the message to the frame
829 frame
.addMessage(message
);
834 if (!fView
.getSDWidget().isDisposed()) {
835 fView
.getSDWidget().getDisplay().asyncExec(new Runnable() {
842 // check if view was disposed in the meanwhile
843 if ((fView
!= null) && (!fView
.getSDWidget().isDisposed())) {
845 fView
.setFrame(fFrame
);
847 if (fCurrentTime
!= null) {
848 moveToMessageInPage();
851 if (fFindCriteria
!= null) {
855 fView
.toggleWaitCursorAsync(false);
872 * Moves to a certain message defined by timestamp (across pages)
874 protected void moveToMessage() {
879 page
= getPage(fCurrentTime
);
881 if (page
== fCurrentPage
) {
882 moveToMessageInPage();
893 * Moves to a certain message defined by timestamp in current page
895 protected void moveToMessageInPage() {
898 if (!fView
.getSDWidget().isDisposed()) {
899 // Check for GUI thread
900 if(Display
.getCurrent() != null) {
901 // Already in GUI thread - execute directly
902 TmfSyncMessage prevMessage
= null;
903 TmfSyncMessage syncMessage
= null;
904 boolean isExactTime
= false;
905 for (int i
= 0; i
< fFrame
.syncMessageCount(); i
++) {
906 if (fFrame
.getSyncMessage(i
) instanceof TmfSyncMessage
) {
907 syncMessage
= (TmfSyncMessage
) fFrame
.getSyncMessage(i
);
908 if (syncMessage
.getStartTime().compareTo(fCurrentTime
, false) == 0) {
912 else if (syncMessage
.getStartTime().compareTo(fCurrentTime
, false) > 0) {
913 if (prevMessage
!= null) {
914 syncMessage
= prevMessage
;
918 prevMessage
= syncMessage
;
921 if (fIsSelect
&& isExactTime
) {
922 fView
.getSDWidget().moveTo(syncMessage
);
925 fView
.getSDWidget().ensureVisible(syncMessage
);
926 fView
.getSDWidget().clearSelection();
927 fView
.getSDWidget().redraw();
931 // Not in GUI thread - queue action in GUI thread.
932 fView
.getSDWidget().getDisplay().asyncExec(new Runnable() {
935 moveToMessageInPage();
947 * Moves to a certain message defined by timestamp (across pages)
949 protected void moveToPage() {
954 * Moves to a certain page.
955 * @param notifyAll true to broadcast time range signal to other signal handlers else false
957 protected void moveToPage(boolean notifyAll
) {
959 TmfTimeRange window
= TmfTimeRange
.Eternity
;
964 if (fCurrentPage
> fCheckPoints
.size()) {
967 window
= fCheckPoints
.get(fCurrentPage
);
972 fPageRequest
= new TmfEventRequest
<TmfEvent
>(TmfEvent
.class, window
, TmfDataRequest
.ALL_DATA
, 1, ITmfDataRequest
.ExecutionType
.FOREGROUND
) {
973 private List
<ITmfSyncSequenceDiagramEvent
> fSdEvent
= new ArrayList
<ITmfSyncSequenceDiagramEvent
>();
976 public void handleData(TmfEvent event
) {
977 super.handleData(event
);
979 ITmfSyncSequenceDiagramEvent sdEvent
= getSequnceDiagramEvent(event
);
981 if (sdEvent
!= null) {
982 fSdEvent
.add(sdEvent
);
987 public void handleSuccess() {
988 fillCurrentPage(fSdEvent
);
989 super.handleSuccess();
994 ((TmfExperiment
<TmfEvent
>) fExperiment
).sendRequest((ITmfDataRequest
<TmfEvent
>) fPageRequest
);
997 TmfTimeRange timeRange
= getSignalTimeRange(window
.getStartTime());
998 broadcast(new TmfRangeSynchSignal(this, timeRange
, timeRange
.getStartTime()));
1003 * Gets page that contains timestamp
1004 * @param time The timestamp
1005 * @return page that contains the time
1007 protected int getPage(TmfTimestamp time
) {
1012 size
= fCheckPoints
.size();
1013 for (page
= 0; page
< size
; page
++) {
1014 TmfTimeRange timeRange
= fCheckPoints
.get(page
);
1015 if (timeRange
.getEndTime().compareTo(time
, false) >= 0) {
1029 * Background search in trace for expression in criteria.
1030 * @param findCriteria The find criteria
1031 * @return true if background request was started else false
1033 protected boolean findInNextPages(Criteria findCriteria
) {
1036 if (fFindJob
!= null) {
1040 int nextPage
= fCurrentPage
+ 1;
1042 if ((nextPage
) >= fCheckPoints
.size()) {
1043 // we are at the end
1047 TmfTimeRange window
= new TmfTimeRange(fCheckPoints
.get(nextPage
).getStartTime().clone(), fCheckPoints
.get(fCheckPoints
.size()-1).getEndTime().clone());
1048 fFindJob
= new SearchJob(findCriteria
, window
);
1049 fFindJob
.schedule();
1050 fView
.toggleWaitCursorAsync(true);
1058 * Gets time range for time range signal.
1059 * @param startTime The start time of time range.
1062 protected TmfTimeRange
getSignalTimeRange(TmfTimestamp startTime
) {
1065 TmfTimestamp initialEndOfWindow
= new TmfTimestamp(startTime
.getValue() + fInitialWindow
, startTime
.getScale(), startTime
.getPrecision());
1066 return new TmfTimeRange(startTime
, initialEndOfWindow
);
1074 * Checks if filter criteria matches the message name in given SD event.
1075 * @param sdEvent The SD event to check
1076 * @return true if match else false.
1078 protected boolean filterMessage(ITmfSyncSequenceDiagramEvent sdEvent
) {
1081 if (fFilterCriteria
!= null) {
1082 for(FilterCriteria criteria
: fFilterCriteria
) {
1083 if (criteria
.isActive() && criteria
.getCriteria().isSyncMessageSelected() ) {
1085 if(criteria
.getCriteria().matches(sdEvent
.getName())) {
1098 * Checks if filter criteria matches a lifeline name (sender or receiver) in given SD event.
1099 * @param sdEvent The SD event to check
1100 * @return true if match else false.
1102 protected boolean filterLifeLine(String lifeline
) {
1105 if (fFilterCriteria
!= null) {
1106 for(FilterCriteria criteria
: fFilterCriteria
) {
1107 if (criteria
.isActive() && criteria
.getCriteria().isLifeLineSelected()) {
1109 if(criteria
.getCriteria().matches(lifeline
)) {
1122 * Job to search in trace for given time range.
1124 protected class SearchJob
extends Job
{
1126 final protected SearchEventRequest fSearchRequest
;
1131 * @param findCriteria The search criteria
1132 * @param window Time range to search in
1134 public SearchJob(Criteria findCriteria
, TmfTimeRange window
) {
1135 super(Messages
.TmfUml2SDSyncLoader_SearchJobDescrition
);
1136 fSearchRequest
= new SearchEventRequest(window
, TmfDataRequest
.ALL_DATA
, 1, ITmfDataRequest
.ExecutionType
.FOREGROUND
, findCriteria
);
1141 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
1144 protected IStatus
run(IProgressMonitor monitor
) {
1145 fSearchRequest
.setMonitor(monitor
);
1147 ((TmfExperiment
<TmfEvent
>) fExperiment
).sendRequest((ITmfDataRequest
<TmfEvent
>) fSearchRequest
);
1150 fSearchRequest
.waitForCompletion();
1151 } catch (InterruptedException e
) {
1152 e
.printStackTrace();
1155 IStatus status
= Status
.OK_STATUS
;
1156 if (fSearchRequest
.isFound() && fSearchRequest
.getFoundTime() != null) {
1157 fCurrentTime
= fSearchRequest
.getFoundTime();
1159 // Avoid double-selection. Selection will be done when calling find(criteria)
1160 // after moving to relevant page
1162 if (!fView
.getSDWidget().isDisposed()) {
1163 fView
.getSDWidget().getDisplay().asyncExec(new Runnable() {
1173 if (monitor
.isCanceled()) {
1174 status
= Status
.CANCEL_STATUS
;
1177 // String was not found
1178 status
= new Status(Status
.WARNING
, TmfUiPlugin
.PLUGIN_ID
, Messages
.TmfUml2SDSyncLoader_SearchNotFound
);
1180 setProperty(IProgressConstants
.KEEP_PROPERTY
, Boolean
.TRUE
);
1186 fView
.toggleWaitCursorAsync(false);
1197 * @see org.eclipse.core.runtime.jobs.Job#canceling()
1200 protected void canceling() {
1201 fSearchRequest
.cancel();
1212 * TMF event request for searching within trace.
1214 protected class SearchEventRequest
extends TmfEventRequest
<TmfEvent
> {
1216 final private Criteria fCriteria
;
1218 private IProgressMonitor fMonitor
;
1219 private boolean fIsFound
= false;
1220 private TmfTimestamp fFoundTime
= null;
1224 * @param range @see org.eclipse.linuxtools.tmf.request.TmfEventRequest#TmfEventRequest(...)
1225 * @param nbRequested @see org.eclipse.linuxtools.tmf.request.TmfEventRequest#handleData(...)
1226 * @param blockSize @see org.eclipse.linuxtools.tmf.request.TmfEventRequest#handleData(...)
1227 * @param execType @see org.eclipse.linuxtools.tmf.request.TmfEventRequest#handleData(...)
1228 * @param criteria The search criteria
1230 public SearchEventRequest(TmfTimeRange range
, int nbRequested
, int blockSize
, ExecutionType execType
, Criteria criteria
) {
1231 this(range
, nbRequested
, blockSize
, execType
, criteria
, null);
1236 * @param range @see org.eclipse.linuxtools.tmf.request.TmfEventRequest#TmfEventRequest(...)
1237 * @param nbRequested @see org.eclipse.linuxtools.tmf.request.TmfEventRequest#TmfEventRequest(...)
1238 * @param blockSize @see org.eclipse.linuxtools.tmf.request.TmfEventRequest#TmfEventRequest(...)
1239 * @param execType @see org.eclipse.linuxtools.tmf.request.TmfEventRequest#TmfEventRequest(...)
1240 * @param criteria The search criteria
1241 * @param monitor progress monitor
1243 public SearchEventRequest(TmfTimeRange range
, int nbRequested
, int blockSize
, ExecutionType execType
, Criteria criteria
, IProgressMonitor monitor
) {
1244 super(TmfEvent
.class, range
, nbRequested
, blockSize
, execType
);
1245 fCriteria
= new Criteria(criteria
);
1251 * @see org.eclipse.linuxtools.tmf.request.TmfDataRequest#handleData(org.eclipse.linuxtools.tmf.event.TmfData)
1254 public void handleData(TmfEvent event
) {
1255 super.handleData(event
);
1257 if ((fMonitor
!= null) && fMonitor
.isCanceled()) {
1262 ITmfSyncSequenceDiagramEvent sdEvent
= getSequnceDiagramEvent(event
);
1264 if (sdEvent
!= null) {
1266 if (fCriteria
.isLifeLineSelected()) {
1267 if (fCriteria
.matches(sdEvent
.getSender())) {
1268 fFoundTime
= event
.getTimestamp().clone();
1273 if (fCriteria
.matches(sdEvent
.getReceiver())) {
1274 fFoundTime
= event
.getTimestamp().clone();
1280 if (fCriteria
.isSyncMessageSelected()) {
1281 if (fCriteria
.matches(sdEvent
.getName())) {
1282 fFoundTime
= event
.getTimestamp().clone();
1292 * @see org.eclipse.linuxtools.tmf.request.TmfDataRequest#handleCompleted()
1295 public void handleCompleted() {
1296 super.handleCompleted();
1300 * Set progress monitor.
1303 public void setMonitor(IProgressMonitor monitor
) {
1308 * Check if find criteria was met.
1309 * @return true if find criteria was met.
1311 public boolean isFound() {
1316 * @return timestamp of found time.
1318 public TmfTimestamp
getFoundTime() {
1324 * @param tmfEvent Event to parse for sequence diagram event details
1325 * @return sequence diagram event if details are available else null
1327 protected ITmfSyncSequenceDiagramEvent
getSequnceDiagramEvent(TmfEvent tmfEvent
){
1328 //type = .*RECEIVE.* or .*SEND.*
1329 //content = sender:<sender name>:receiver:<receiver name>,signal:<signal name>
1330 String eventType
= tmfEvent
.getType().toString();
1331 if (eventType
.contains(Messages
.TmfUml2SDSyncCloader_EventTypeSend
) ||
1332 eventType
.contains(Messages
.TmfUml2SDSyncCloader_EventTypeReceive
)) {
1334 Object sender
= tmfEvent
.getContent().getField(Messages
.TmfUml2SDSyncCloader_FieldSender
);
1335 Object receiver
= tmfEvent
.getContent().getField(Messages
.TmfUml2SDSyncCloader_FieldReceiver
);
1336 Object name
= tmfEvent
.getContent().getField(Messages
.TmfUml2SDSyncCloader_FieldSignal
);
1337 if ((sender
instanceof TmfEventField
) && (receiver
instanceof TmfEventField
) && (name
instanceof TmfEventField
)) {
1338 ITmfSyncSequenceDiagramEvent sdEvent
= new TmfSyncSequenceDiagramEvent(tmfEvent
,
1339 ((TmfEventField
)sender
).getValue().toString(),
1340 ((TmfEventField
)receiver
).getValue().toString(),
1341 ((TmfEventField
)name
).getValue().toString());
1345 } catch (TmfNoSuchFieldException e
) {