/*********************************************************************************************
* Copyright (c) 2014-2015 Software Behaviour Analysis Lab, Concordia University, Montreal, Canada
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of Eclipse Public License v1.0 License which
* accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Syed Shariyar Murtaza -- Initial design and implementation
**********************************************************************************************/
package org.eclipse.tracecompass.totalads.ui.diagnosis;
import java.io.File;
import java.util.HashSet;
import java.util.Iterator;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.tracecompass.totalads.readers.ITraceTypeReader;
import org.eclipse.tracecompass.totalads.readers.TraceTypeFactory;
import org.eclipse.tracecompass.totalads.ui.diagnosis.BackgroundTesting;
import org.eclipse.tracecompass.totalads.ui.diagnosis.DiagnosisView;
import org.eclipse.tracecompass.totalads.ui.diagnosis.Messages;
import org.eclipse.tracecompass.totalads.ui.io.DirectoryBrowser;
import org.eclipse.tracecompass.totalads.ui.io.TracingTypeSelector;
import org.eclipse.tracecompass.totalads.ui.results.ResultsAndFeedback;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
/**
* This class creates the GUI elements/widgets for the diagnosis view. It
* creates a diagnosis tab and then creates other GUI widgets by instantiating
* SWT widgets.
*
* @author <p>
* Syed Shariyar Murtaza justsshary@hotmail.com
* </p>
*
*/
public class Diagnosis {
// Initializes variables
private TracingTypeSelector fTraceTypeSelector;
private Text fTxtTMFTraceID;
private Text fTxtTestTraceDir;
private DirectoryBrowser fTraceBrowser;
private StringBuilder fTmfTracePath;
private StringBuilder fCurrentlySelectedTracesPath;
private ResultsAndFeedback fResultsAndFeedback;
private Button fBtnSelTestTraces;
private Button fBtnSelTMFTrace;
private HashSet<String> fModelsList;
private Button fBtnEvaluateModels;
private Button fBtnStop;
private ExecutorService fExecutor;
/**
* Constructor
*/
public Diagnosis() {
fModelsList = new HashSet<>();
}
/**
* Creates GUI widgets
*
* @param compParent
* Composite
*/
public void createControl(Composite compParent) {
fTmfTracePath = new StringBuilder();
fCurrentlySelectedTracesPath = new StringBuilder();
// Making scrollable composite
ScrolledComposite scrolCompDiag = new ScrolledComposite(compParent, SWT.H_SCROLL | SWT.V_SCROLL);
Composite compDiagnosis = new Composite(scrolCompDiag, SWT.NONE);
// tbItmDiagnosis.setControl(scrolCompAnom);
// Designing the Layout of the GUI Items for the LiveMonitor Tab Item
GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
gridData.horizontalSpan = 1;
compDiagnosis.setLayoutData(gridData);
compDiagnosis.setLayout(new GridLayout(1, false));
// /////////////////////////////////////////////////////////////////////////
// Creating GUI widgets for selection of a trace type and a selection of
// the model
// /////////////////////////////////////////////////////////////////
selectTraceTypeAndTraces(compDiagnosis);
addEvaluateButton(compDiagnosis);
// Create GUI elements for a selection of a trace
// Adjust settings for scrollable tab Item
scrolCompDiag.setContent(compDiagnosis);
// Set the minimum size
scrolCompDiag.setMinSize(200, 200);
// Expand both horizontally and vertically
scrolCompDiag.setExpandHorizontal(true);
scrolCompDiag.setExpandVertical(true);
}
/**
* Creates GUI widgets for a selection of traces and trace types
*
* @param compDiagnosis
* Composite of LiveMonitor
*/
private void selectTraceTypeAndTraces(Composite compDiagnosis) {
/**
* Group trace selection
*/
Group grpTraceSelection = new Group(compDiagnosis, SWT.NONE);
grpTraceSelection.setText(Messages.Diagnosis_SelTraces);
grpTraceSelection.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
grpTraceSelection.setLayout(new GridLayout(4, false));
// Creating widgets for the selection of a trace type
Composite compTraceType = new Composite(grpTraceSelection, SWT.NONE);
compTraceType.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 4, 1));
compTraceType.setLayout(new GridLayout(2, false));
Label lblTraceType = new Label(compTraceType, SWT.NONE);
lblTraceType.setLayoutData(new GridData(SWT.LEFT, SWT.BOTTOM, false, false, 1, 1));
lblTraceType.setText(Messages.Diagnosis_SelTraceType);
fTraceTypeSelector = new TracingTypeSelector(compTraceType, new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1));
fBtnSelTestTraces = new Button(grpTraceSelection, SWT.RADIO);
fBtnSelTestTraces.setText(Messages.Diagnosis_SelTestFolder);
fBtnSelTestTraces.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false, 2, 1));
fBtnSelTestTraces.setSelection(true);
fBtnSelTMFTrace = new Button(grpTraceSelection, SWT.RADIO);
fBtnSelTMFTrace.setText(Messages.Diagnosis_SelectTMFTrace);
fBtnSelTMFTrace.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false, 2, 1));
fTxtTestTraceDir = new Text(grpTraceSelection, SWT.BORDER);
fTxtTestTraceDir.setEnabled(true);
fTxtTestTraceDir.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
fTraceBrowser = new DirectoryBrowser(grpTraceSelection, fTxtTestTraceDir, new GridData(SWT.RIGHT, SWT.TOP, false, false));
fTxtTMFTraceID = new Text(grpTraceSelection, SWT.BORDER);
fTxtTMFTraceID.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 1, 1));
fTxtTMFTraceID.setEditable(false);
fTxtTMFTraceID.setEnabled(false);
// Adding an event handler for the radio button fBtnSelTestTraces
fBtnSelTestTraces.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
fTxtTestTraceDir.setEnabled(true);
fTxtTMFTraceID.setEnabled(false);
fTraceBrowser.enableBrowsing();
fTxtTMFTraceID.setText(""); //$NON-NLS-1$
fTxtTestTraceDir.setText(""); //$NON-NLS-1$
fCurrentlySelectedTracesPath.delete(0, fCurrentlySelectedTracesPath.length());// first
// clearing
// current
// path
}
});
// Adding an event handler for the radio button fBtnSelTMFTrace
fBtnSelTMFTrace.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
fTxtTestTraceDir.setEnabled(false);
fTxtTMFTraceID.setEnabled(true);
fTraceBrowser.disableBrowsing();
setTMFTraceToCurrentTracePath();
}
});
//
// Adding an event handler for the text box of fTxtTestTraceDir to update
// the path
fTxtTestTraceDir.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
fCurrentlySelectedTracesPath.delete(0, fCurrentlySelectedTracesPath.length());// first
fCurrentlySelectedTracesPath.append(fTxtTestTraceDir.getText());
}
});
/**
* End group trace selection
*/
}
/**
* Adds the evaluation button
*
* @param compParent
* Composite
*/
private void addEvaluateButton(Composite compParent) {
// Creating widgets for the selection of a trace type
Composite compButtons = new Composite(compParent, SWT.NONE);
compButtons.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 4, 1));
compButtons.setLayout(new GridLayout(2, false));
fBtnEvaluateModels = new Button(compButtons, SWT.NONE);
fBtnEvaluateModels.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, true, false));
fBtnEvaluateModels.setText(Messages.Diagnosis_StartEval);
fBtnStop = new Button(compButtons, SWT.NONE);
fBtnStop.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false, false));
fBtnStop.setText(Messages.Diagnosis_StopEval);
fBtnStop.setEnabled(false);
/**
* Event handler for the evaluate button
*/
fBtnEvaluateModels.addMouseListener(new MouseAdapter() {
@Override
public void mouseUp(MouseEvent e) {
String msgTitle="TotalADS"; //$NON-NLS-1$
if (fModelsList.size() <= 0) {
MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
msgTitle,Messages.Diagnosis_SelModel);
return;
}
if (fCurrentlySelectedTracesPath.length() <= 0) {
MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
msgTitle,Messages.Diagnosis_SelTrace);
return;
}
Iterator<String> it = fModelsList.iterator();
ITraceTypeReader traceReader = fTraceTypeSelector.getSelectedType();
String[] modelNames = new String[fModelsList.size()];
int counter = 0;
while (it.hasNext()) {
modelNames[counter] = it.next();
counter++;
}
fResultsAndFeedback.clearData();
fBtnEvaluateModels.setEnabled(false);
fBtnStop.setEnabled(true);
BackgroundTesting testTheModel = new BackgroundTesting(fCurrentlySelectedTracesPath.toString(), traceReader,
modelNames, fBtnEvaluateModels, fBtnStop, fResultsAndFeedback);
fExecutor = Executors.newSingleThreadExecutor();
fExecutor.execute(testTheModel);
}
});
//
// Event handler for the stop button
//
fBtnStop.addMouseListener(new MouseAdapter() {
@Override
public void mouseUp(MouseEvent e) {
fBtnStop.setEnabled(false);
fExecutor.shutdownNow();
}
});
}
/**
* This function gets updated when a user selects a trace in TMF Views
*
* @param traceLocation
* Trace location
* @param traceTypeName
* Trace type
*/
public void updateOnTraceSelection(String traceLocation, String traceTypeName) {
fTmfTracePath.delete(0, fTmfTracePath.length());
fTmfTracePath.append(traceLocation);
if (fBtnSelTMFTrace.getSelection()) {
setTMFTraceToCurrentTracePath();
}
}
/**
* Sets the ResultsAndFeddback object to a local variable
*
* @param resultsAndFeedback
* An object to display results
*/
public void setResultsAndFeedbackInstance(ResultsAndFeedback resultsAndFeedback) {
this.fResultsAndFeedback = resultsAndFeedback;
}
/**
* This function gets called from {@link DiagnosisView} to get updated for
* the currently selected models
*
* @param listOfModels
* List of models
*/
public void updateonModelSelection(HashSet<String> listOfModels) {
this.fModelsList = listOfModels;
}
/**
* Sets the current trace path to the path of a TMF trace and also adjusts
* the text boxes accordingly
*/
private void setTMFTraceToCurrentTracePath() {
fTxtTestTraceDir.setText(""); //$NON-NLS-1$
File file = new File(fTmfTracePath.toString());
String traceName = file.getName();
fTxtTMFTraceID.setText(""); //$NON-NLS-1$
// clear it and copy the path, don't make a copy of the reference of the
// object because it is a different object
fCurrentlySelectedTracesPath.delete(0, fCurrentlySelectedTracesPath.length());
if (!traceName.isEmpty()) {
fTxtTMFTraceID.setText(NLS.bind(Messages.Diagnosis_TraceInTMF, traceName));
fCurrentlySelectedTracesPath.append(fTmfTracePath.toString());
// Make sure that only LTTng system call trace reader is selected
// for TMF traces
ITraceTypeReader lttngReader = TraceTypeFactory.getInstance().getCTFKernelReaderOrSimpleTextReader(true);
fTraceTypeSelector.selectTraceType(lttngReader.getName());
}
}
}