blob: a9ba8398673e354ba1f62194c4ab8ba6ab5190f1 [file] [log] [blame]
/**
*
*/
package net.sf.taverna.t2.workbench.report.view;
import java.awt.event.ActionEvent;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.swing.AbstractAction;
import javax.swing.JOptionPane;
import net.sf.taverna.t2.visit.VisitReport;
import net.sf.taverna.t2.visit.VisitReport.Status;
import net.sf.taverna.t2.workbench.MainWindow;
import net.sf.taverna.t2.workbench.edits.EditManager;
import net.sf.taverna.t2.workbench.file.FileManager;
import net.sf.taverna.t2.workbench.report.ReportManager;
import net.sf.taverna.t2.workbench.ui.SwingWorkerCompletionWaiter;
import net.sf.taverna.t2.workbench.ui.Workbench;
/**
* @author alanrw
*
*/
public class ReportOnWorkflowAction extends AbstractAction {
private final boolean includeTimeConsuming;
private final boolean remember;
private Dataflow specifiedDataflow;
private static final String namedComponent = "reportView";
private final FileManager fileManager;
private final ReportManager reportManager;
private final Workbench workbench;
private final EditManager editManager;
public ReportOnWorkflowAction(String name, boolean includeTimeConsuming, boolean remember,
EditManager editManager, FileManager fileManager, ReportManager reportManager, Workbench workbench) {
super(name);
this.includeTimeConsuming = includeTimeConsuming;
this.remember = remember;
this.editManager = editManager;
this.fileManager = fileManager;
this.reportManager = reportManager;
this.workbench = workbench;
this.specifiedDataflow = null;
}
public ReportOnWorkflowAction(String name, Dataflow dataflow, boolean includeTimeConsuming,
boolean remember, EditManager editManager, FileManager fileManager, ReportManager reportManager,
Workbench workbench) {
super(name);
this.specifiedDataflow = dataflow;
this.includeTimeConsuming = includeTimeConsuming;
this.remember = remember;
this.editManager = editManager;
this.fileManager = fileManager;
this.reportManager = reportManager;
this.workbench = workbench;
}
/*
* (non-Javadoc)
*
* @see
* java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
public void actionPerformed(ActionEvent e) {
if (validateWorkflow()) {
checkStatus();
}
}
/**
* Check the status and pop up a warning if something is wrong.
*
*/
public void checkStatus() {
Dataflow dataflow;
if (specifiedDataflow == null) {
dataflow = fileManager.getCurrentDataflow();
} else {
dataflow = specifiedDataflow;
}
Status status = reportManager.getStatus(dataflow);
int messageType;
String message;
if (status.equals(Status.OK)) {
messageType = JOptionPane.INFORMATION_MESSAGE;
message = "Workflow validated OK.";
} else {
StringBuffer sb = new StringBuffer();
Map<Object, Set<VisitReport>> reports = reportManager.getReports(dataflow);
int errorCount = 0;
int warningCount = 0;
// Find warnings
for (Entry<Object, Set<VisitReport>> entry : reports.entrySet()) {
for (VisitReport report : entry.getValue()) {
if (report.getStatus().equals(Status.SEVERE)) {
errorCount++;
} else if (report.getStatus().equals(Status.WARNING)) {
warningCount++;
}
}
}
if (status.equals(Status.WARNING)) {
messageType = JOptionPane.WARNING_MESSAGE;
message = "Validation reported ";
} else { // SEVERE
messageType = JOptionPane.ERROR_MESSAGE;
message = "Validation reported ";
if (errorCount == 1) {
message += "one error";
} else {
message += errorCount + " errors";
}
if (warningCount != 0) {
message += " and ";
}
}
if (warningCount == 1) {
message += "one warning";
} else if (warningCount > 0) {
message += warningCount + " warnings";
}
}
JOptionPane.showMessageDialog(MainWindow.getMainWindow(), message, "Workflow validation",
messageType);
workbench.getPerspectives().setWorkflowPerspective();
workbench.makeNamedComponentVisible(namedComponent);
}
/**
* Perform validation on workflow.
*
* @return <code>true</code> if the validation was not cancelled.
*/
public boolean validateWorkflow() {
Dataflow dataflow;
if (specifiedDataflow == null) {
dataflow = fileManager.getCurrentDataflow();
} else {
dataflow = specifiedDataflow;
}
ValidateSwingWorker validateSwingWorker = new ValidateSwingWorker(dataflow,
includeTimeConsuming, remember, editManager, reportManager);
ValidateInProgressDialog dialog = new ValidateInProgressDialog();
validateSwingWorker.addPropertyChangeListener(new SwingWorkerCompletionWaiter(dialog));
validateSwingWorker.execute();
// Give a chance to the SwingWorker to finish so we do not have to
// display
// the dialog if copying of the workflow is quick (so it won't flicker
// on the screen)
try {
Thread.sleep(500);
} catch (InterruptedException ex) {
}
if (!validateSwingWorker.isDone()) {
dialog.setVisible(true); // this will block the GUI
}
boolean userCancelled = dialog.hasUserCancelled(); // see if user
// cancelled the
// dialog
if (userCancelled) {
validateSwingWorker.cancel(true);
}
return !userCancelled;
}
}