import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.widgets.Display;
+import org.eclipse.tracecompass.common.core.NonNullUtils;
import org.eclipse.tracecompass.internal.tmf.ui.Activator;
import org.eclipse.tracecompass.tmf.core.component.TmfComponent;
import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
import org.eclipse.tracecompass.tmf.core.event.ITmfEventField;
import org.eclipse.tracecompass.tmf.core.request.ITmfEventRequest;
-import org.eclipse.tracecompass.tmf.core.request.ITmfEventRequest.ExecutionType;
import org.eclipse.tracecompass.tmf.core.request.TmfEventRequest;
-import org.eclipse.tracecompass.tmf.core.signal.TmfWindowRangeUpdatedSignal;
+import org.eclipse.tracecompass.tmf.core.signal.TmfSelectionRangeUpdatedSignal;
import org.eclipse.tracecompass.tmf.core.signal.TmfSignal;
import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler;
-import org.eclipse.tracecompass.tmf.core.signal.TmfSelectionRangeUpdatedSignal;
import org.eclipse.tracecompass.tmf.core.signal.TmfTraceClosedSignal;
import org.eclipse.tracecompass.tmf.core.signal.TmfTraceOpenedSignal;
import org.eclipse.tracecompass.tmf.core.signal.TmfTraceSelectedSignal;
+import org.eclipse.tracecompass.tmf.core.signal.TmfWindowRangeUpdatedSignal;
import org.eclipse.tracecompass.tmf.core.timestamp.ITmfTimestamp;
import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimeRange;
import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp;
* @version 1.0
* @author Bernd Hufmann
*/
-public class TmfUml2SDSyncLoader extends TmfComponent implements IUml2SDLoader, ISDFindProvider, ISDFilterProvider, ISDAdvancedPagingProvider, ISelectionListener {
+public class TmfUml2SDSyncLoader extends TmfComponent implements IUml2SDLoader, ISDFindProvider, ISDFilterProvider, ISDAdvancedPagingProvider, ISelectionListener {
// ------------------------------------------------------------------------
// Constants
// Checkpoint and page attributes
/**
- * The checkpoints of the whole sequence diagram trace (i.e. start time stamp of each page)
+ * The checkpoints of the whole sequence diagram trace (i.e. start time
+ * stamp of each page)
*/
protected List<TmfTimeRange> fCheckPoints = new ArrayList<>(MAX_NUM_OF_MSG);
/**
*/
protected ITmfTimestamp fCurrentTime = null;
/**
- * Flag to specify that selection of message is done by selection or by signal.
+ * Flag to specify that selection of message is done by selection or by
+ * signal.
*/
protected volatile boolean fIsSelect = false;
*/
protected Criteria fFindCriteria = null;
/**
- * The current find index within the list of found nodes (<code>fFindeResults</code> within a page.
+ * The current find index within the list of found nodes
+ * (<code>fFindeResults</code> within a page.
*/
protected volatile int fCurrentFindIndex = 0;
/**
* Constructor
*
- * @param name Name of loader
+ * @param name
+ * Name of loader
*/
public TmfUml2SDSyncLoader(String name) {
super(name);
/**
* Handler for the trace opened signal.
- * @param signal The trace opened signal
+ *
+ * @param signal
+ * The trace opened signal
*/
@TmfSignalHandler
public void traceOpened(TmfTraceOpenedSignal signal) {
loadTrace();
}
-
/**
* Signal handler for the trace selected signal.
*
- * Spawns a request to index the trace (checkpoints creation) as well as it fills
- * the first page.
+ * Spawns a request to index the trace (checkpoints creation) as well as it
+ * fills the first page.
*
- * @param signal The trace selected signal
+ * @param signal
+ * The trace selected signal
*/
@TmfSignalHandler
public void traceSelected(TmfTraceSelectedSignal signal) {
}
/**
- * Method for loading the current selected trace into the view.
- * Sub-class need to override this method to add the view specific implementation.
+ * Method for loading the current selected trace into the view. Sub-class
+ * need to override this method to add the view specific implementation.
*/
protected void loadTrace() {
ITmfEventRequest indexRequest = null;
/**
* Signal handler for the trace closed signal.
*
- * @param signal The trace closed signal
+ * @param signal
+ * The trace closed signal
*/
@TmfSignalHandler
public void traceClosed(TmfTraceClosedSignal signal) {
@Override
public void dispose() {
- super.dispose();
- ITmfEventRequest indexRequest = null;
- fLock.lock();
- try {
- IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
- // During Eclipse shutdown the active workbench window is null
- if (window != null) {
- window.getSelectionService().removePostSelectionListener(this);
- }
-
- indexRequest = fIndexRequest;
- fIndexRequest = null;
- cancelOngoingRequests();
-
- fView.setSDFindProvider(null);
- fView.setSDPagingProvider(null);
- fView.setSDFilterProvider(null);
- fView = null;
- } finally {
- fLock.unlock();
- }
- if (indexRequest != null && !indexRequest.isCompleted()) {
- indexRequest.cancel();
- }
+ super.dispose();
+ ITmfEventRequest indexRequest = null;
+ fLock.lock();
+ try {
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ // During Eclipse shutdown the active workbench window is null
+ if (window != null) {
+ window.getSelectionService().removePostSelectionListener(this);
+ }
+
+ indexRequest = fIndexRequest;
+ fIndexRequest = null;
+ cancelOngoingRequests();
+
+ fView.setSDFindProvider(null);
+ fView.setSDPagingProvider(null);
+ fView.setSDFilterProvider(null);
+ fView = null;
+ } finally {
+ fLock.unlock();
+ }
+ if (indexRequest != null && !indexRequest.isCompleted()) {
+ indexRequest.cancel();
+ }
}
@Override
switch (nodeType) {
case ISDGraphNodeSupporter.LIFELINE:
return Messages.TmfUml2SDSyncLoader_CategoryLifeline;
- case ISDGraphNodeSupporter.SYNCMESSAGE:
- return Messages.TmfUml2SDSyncLoader_CategoryMessage;
+ case ISDGraphNodeSupporter.SYNCMESSAGE:
+ return Messages.TmfUml2SDSyncLoader_CategoryMessage;
default:
break;
}
fCurrentFindIndex = 0;
}
} else {
- fCurrentFindIndex++;
+ // ++ is not atomic, but we are in a lock
+ fCurrentFindIndex = fCurrentFindIndex + 1;
}
if (fFindResults.size() > fCurrentFindIndex) {
return true;
}
fFindResults = null;
- fCurrentFindIndex =0;
+ fCurrentFindIndex = 0;
return findInNextPages(fFindCriteria); // search in other page
} finally {
fLock.unlock();
cancelOngoingRequests();
if (filters == null) {
- fFilterCriteria = new ArrayList<>();
+ fFilterCriteria = new ArrayList<>();
} else {
List<FilterCriteria> list = filters;
- fFilterCriteria = new ArrayList<>(list);
+ fFilterCriteria = new ArrayList<>(list);
}
fillCurrentPage(fEvents);
cancelOngoingRequests();
fCurrentTime = null;
- fCurrentPage++;
+ // ++ is not atomic but we are in a lock
+ fCurrentPage = fCurrentPage + 1;
moveToPage();
} finally {
fLock.unlock();
cancelOngoingRequests();
fCurrentTime = null;
- fCurrentPage--;
+ // -- is not atomic but we are in a lock
+ fCurrentPage = fCurrentPage - 1;
moveToPage();
} finally {
fLock.unlock();
/**
* Resets loader attributes
*/
- protected void resetLoader() {
+ protected void resetLoader() {
fLock.lock();
try {
fCurrentTime = null;
fFindResults = null;
fView.setFrameSync(new Frame());
fFrame = null;
- }
- finally {
+ } finally {
fLock.unlock();
}
/**
* Fills current page with sequence diagram content.
*
- * @param events sequence diagram events
+ * @param events
+ * sequence diagram events
*/
protected void fillCurrentPage(List<ITmfSyncSequenceDiagramEvent> events) {
fView.toggleWaitCursorAsync(false);
}
- } finally {
+ } finally {
fLock.unlock();
}
}
});
}
- }
- finally {
+ } finally {
fLock.unlock();
}
}
try {
if (!fView.getSDWidget().isDisposed()) {
// Check for GUI thread
- if(Display.getCurrent() != null) {
+ if (Display.getCurrent() != null) {
// Already in GUI thread - execute directly
TmfSyncMessage prevMessage = null;
TmfSyncMessage syncMessage = null;
}
if (fIsSelect && isExactTime) {
fView.getSDWidget().moveTo(syncMessage);
- }
- else {
+ } else {
fView.getSDWidget().ensureVisible(syncMessage);
fView.getSDWidget().clearSelection();
fView.getSDWidget().redraw();
}
- }
- else {
+ } else {
// Not in GUI thread - queue action in GUI thread.
fView.getSDWidget().getDisplay().asyncExec(new Runnable() {
@Override
});
}
}
- }
- finally {
+ } finally {
fLock.unlock();
}
}
/**
* Moves to a certain page.
*
- * @param notifyAll true to broadcast time range signal to other signal handlers else false
+ * @param notifyAll
+ * true to broadcast time range signal to other signal handlers
+ * else false
*/
protected void moveToPage(boolean notifyAll) {
/**
* Gets page that contains timestamp
*
- * @param time The timestamp
+ * @param time
+ * The timestamp
* @return page that contains the time
*/
protected int getPage(ITmfTimestamp time) {
/**
* Background search in trace for expression in criteria.
*
- * @param findCriteria The find criteria
+ * @param findCriteria
+ * The find criteria
* @return true if background request was started else false
*/
protected boolean findInNextPages(Criteria findCriteria) {
return false;
}
- TmfTimeRange window = new TmfTimeRange(fCheckPoints.get(nextPage).getStartTime(), fCheckPoints.get(fCheckPoints.size()-1).getEndTime());
+ TmfTimeRange window = new TmfTimeRange(fCheckPoints.get(nextPage).getStartTime(), fCheckPoints.get(fCheckPoints.size() - 1).getEndTime());
fFindJob = new SearchJob(findCriteria, window);
fFindJob.schedule();
fView.toggleWaitCursorAsync(true);
/**
* Gets time range for time range signal.
*
- * @param startTime The start time of time range.
+ * @param startTime
+ * The start time of time range.
* @return the time range
*/
protected TmfTimeRange getSignalTimeRange(ITmfTimestamp startTime) {
fLock.lock();
try {
TmfTimeRange currentRange = TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange();
- long offset = fTrace == null ? 0 : currentRange.getEndTime().getDelta(currentRange.getStartTime()).normalize(0, startTime.getScale()).getValue();
- TmfTimestamp initialEndOfWindow = new TmfTimestamp(startTime.getValue() + offset, startTime.getScale());
+ long offset = fTrace == null ? 0 : currentRange.getEndTime().getDelta(currentRange.getStartTime()).toNanos();
+ ITmfTimestamp initialEndOfWindow = TmfTimestamp.create(startTime.getValue() + offset, startTime.getScale());
return new TmfTimeRange(startTime, initialEndOfWindow);
- }
- finally {
+ } finally {
fLock.unlock();
}
}
/**
* Checks if filter criteria matches the message name in given SD event.
*
- * @param sdEvent The SD event to check
+ * @param sdEvent
+ * The SD event to check
* @return true if match else false.
*/
protected boolean filterMessage(ITmfSyncSequenceDiagramEvent sdEvent) {
fLock.lock();
try {
if (fFilterCriteria != null) {
- for(FilterCriteria criteria : fFilterCriteria) {
+ for (FilterCriteria criteria : fFilterCriteria) {
if (criteria.isActive() && criteria.getCriteria().isSyncMessageSelected() && criteria.getCriteria().matches(sdEvent.getName())) {
return true;
}
}
/**
- * Checks if filter criteria matches a lifeline name (sender or receiver) in given SD event.
+ * Checks if filter criteria matches a lifeline name (sender or receiver) in
+ * given SD event.
*
- * @param lifeline the message receiver
+ * @param lifeline
+ * the message receiver
* @return true if match else false.
*/
protected boolean filterLifeLine(String lifeline) {
fLock.lock();
try {
if (fFilterCriteria != null) {
- for(FilterCriteria criteria : fFilterCriteria) {
+ for (FilterCriteria criteria : fFilterCriteria) {
if (criteria.isActive() && criteria.getCriteria().isLifeLineSelected() && criteria.getCriteria().matches(lifeline)) {
return true;
}
/**
* Constructor
*
- * @param findCriteria The search criteria
- * @param window Time range to search in
+ * @param findCriteria
+ * The search criteria
+ * @param window
+ * Time range to search in
*/
public SearchJob(Criteria findCriteria, TmfTimeRange window) {
super(Messages.TmfUml2SDSyncLoader_SearchJobDescrition);
if (fSearchRequest.isFound() && (fSearchRequest.getFoundTime() != null)) {
fCurrentTime = fSearchRequest.getFoundTime();
- // Avoid double-selection. Selection will be done when calling find(criteria)
- // after moving to relevant page
+ /*
+ * Avoid double-selection. Selection will be done when calling
+ * find(criteria) after moving to relevant page
+ */
fIsSelect = false;
if (!fView.getSDWidget().isDisposed()) {
fView.getSDWidget().getDisplay().asyncExec(new Runnable() {
}
});
}
- }
- else {
+ } else {
if (monitor.isCanceled()) {
status = Status.CANCEL_STATUS;
- }
- else {
+ } else {
// String was not found
status = new Status(IStatus.WARNING, Activator.PLUGIN_ID, Messages.TmfUml2SDSyncLoader_SearchNotFound);
}
}
/**
- * TMF event request for searching within trace.
+ * TMF event request for searching within trace.
*/
protected class SearchEventRequest extends TmfEventRequest {
/**
* Constructor
- * @param range see {@link TmfEventRequest#TmfEventRequest(Class, TmfTimeRange, long, int, org.eclipse.tracecompass.tmf.core.request.ITmfEventRequest.ExecutionType) TmfEventRequest}
- * @param nbRequested see {@link TmfEventRequest#TmfEventRequest(Class, TmfTimeRange, long, int, org.eclipse.tracecompass.tmf.core.request.ITmfEventRequest.ExecutionType) TmfEventRequest}
- * @param priority {@link ExecutionType#FOREGROUND} or {@link ExecutionType#BACKGROUND}
- * @param criteria The search criteria
+ *
+ * @param range
+ * see
+ * {@link TmfEventRequest#TmfEventRequest(Class, TmfTimeRange, long, int, org.eclipse.tracecompass.tmf.core.request.ITmfEventRequest.ExecutionType)
+ * TmfEventRequest}
+ * @param nbRequested
+ * see
+ * {@link TmfEventRequest#TmfEventRequest(Class, TmfTimeRange, long, int, org.eclipse.tracecompass.tmf.core.request.ITmfEventRequest.ExecutionType)
+ * TmfEventRequest}
+ * @param priority
+ * {@link org.eclipse.tracecompass.tmf.core.request.ITmfEventRequest.ExecutionType#FOREGROUND}
+ * or
+ * {@link org.eclipse.tracecompass.tmf.core.request.ITmfEventRequest.ExecutionType#BACKGROUND}
+ * @param criteria
+ * The search criteria
*/
public SearchEventRequest(TmfTimeRange range, int nbRequested, ExecutionType priority, Criteria criteria) {
this(range, nbRequested, priority, criteria, null);
/**
* Constructor
- * @param range see {@link TmfEventRequest#TmfEventRequest(Class, TmfTimeRange, long, int, org.eclipse.tracecompass.tmf.core.request.ITmfEventRequest.ExecutionType) TmfEventRequest}
- * @param nbRequested see {@link TmfEventRequest#TmfEventRequest(Class, TmfTimeRange, long, int, org.eclipse.tracecompass.tmf.core.request.ITmfEventRequest.ExecutionType) TmfEventRequest}
- * @param priority {@link ExecutionType#FOREGROUND} or {@link ExecutionType#BACKGROUND}
- * @param criteria The search criteria
- * @param monitor progress monitor
+ *
+ * @param range
+ * see
+ * {@link TmfEventRequest#TmfEventRequest(Class, TmfTimeRange, long, int, org.eclipse.tracecompass.tmf.core.request.ITmfEventRequest.ExecutionType)
+ * TmfEventRequest}
+ * @param nbRequested
+ * see
+ * {@link TmfEventRequest#TmfEventRequest(Class, TmfTimeRange, long, int, org.eclipse.tracecompass.tmf.core.request.ITmfEventRequest.ExecutionType)
+ * TmfEventRequest}
+ * @param priority
+ * {@link org.eclipse.tracecompass.tmf.core.request.ITmfEventRequest.ExecutionType#FOREGROUND}
+ * or
+ * {@link org.eclipse.tracecompass.tmf.core.request.ITmfEventRequest.ExecutionType#BACKGROUND}
+ * @param criteria
+ * The search criteria
+ * @param monitor
+ * progress monitor
*/
public SearchEventRequest(TmfTimeRange range, int nbRequested, ExecutionType priority, Criteria criteria, IProgressMonitor monitor) {
super(ITmfEvent.class, range, 0, nbRequested, priority);
public void handleData(ITmfEvent event) {
super.handleData(event);
- if ((fMonitor!= null) && fMonitor.isCanceled()) {
+ if ((fMonitor != null) && fMonitor.isCanceled()) {
super.cancel();
return;
}
/**
* Set progress monitor.
*
- * @param monitor The monitor to assign
+ * @param monitor
+ * The monitor to assign
*/
public void setMonitor(IProgressMonitor monitor) {
fMonitor = monitor;
protected static class IndexingJob extends Job {
/**
- * @param name The job name
+ * @param name
+ * The job name
*/
public IndexingJob(String name) {
super(name);
}
}
-
/**
- * Returns sequence diagram event if details in given event are available else null.
+ * Returns sequence diagram event if details in given event are available
+ * else null.
*
- * @param tmfEvent Event to parse for sequence diagram event details
+ * @param tmfEvent
+ * Event to parse for sequence diagram event details
* @return sequence diagram event if details are available else null
*/
- protected ITmfSyncSequenceDiagramEvent getSequenceDiagramEvent(ITmfEvent tmfEvent){
- //type = .*RECEIVE.* or .*SEND.*
- //content = sender:<sender name>:receiver:<receiver name>,signal:<signal name>
+ protected ITmfSyncSequenceDiagramEvent getSequenceDiagramEvent(ITmfEvent tmfEvent) {
+ // type = .*RECEIVE.* or .*SEND.*
+ // content = sender:<sender name>:receiver:<receiver
+ // name>,signal:<signal name>
String eventName = tmfEvent.getName();
if (eventName.contains(Messages.TmfUml2SDSyncLoader_EventTypeSend) || eventName.contains(Messages.TmfUml2SDSyncLoader_EventTypeReceive)) {
- Object sender = tmfEvent.getContent().getField(Messages.TmfUml2SDSyncLoader_FieldSender);
- Object receiver = tmfEvent.getContent().getField(Messages.TmfUml2SDSyncLoader_FieldReceiver);
- Object name = tmfEvent.getContent().getField(Messages.TmfUml2SDSyncLoader_FieldSignal);
- if ((sender instanceof ITmfEventField) && (receiver instanceof ITmfEventField) && (name instanceof ITmfEventField)) {
+ Object sender = tmfEvent.getContent().getFieldValue(Object.class, NonNullUtils.checkNotNull(Messages.TmfUml2SDSyncLoader_FieldSender));
+ Object receiver = tmfEvent.getContent().getFieldValue(Object.class, NonNullUtils.checkNotNull(Messages.TmfUml2SDSyncLoader_FieldReceiver));
+ ITmfEventField content = tmfEvent.getContent();
+ Object name = content.getFieldValue(Object.class, NonNullUtils.checkNotNull(Messages.TmfUml2SDSyncLoader_FieldSignal));
+ if ((sender != null) && (receiver != null) && (name != null)) {
ITmfSyncSequenceDiagramEvent sdEvent = new TmfSyncSequenceDiagramEvent(tmfEvent,
- ((ITmfEventField) sender).getValue().toString(),
- ((ITmfEventField) receiver).getValue().toString(),
- ((ITmfEventField) name).getValue().toString());
+ sender.toString(),
+ receiver.toString(),
+ name.toString());
return sdEvent;
}