/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.gui.workflow.verify;
import org.apache.commons.logging.LogFactory;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.swt.widgets.Display;
import de.rcenvironment.core.component.execution.api.ComponentExecutionInformation;
import de.rcenvironment.core.component.execution.api.ComponentExecutionService;
import de.rcenvironment.core.component.execution.api.ExecutionControllerException;
import de.rcenvironment.core.utils.common.StringUtils;
import de.rcenvironment.core.utils.common.rpc.RemoteOperationException;
import de.rcenvironment.core.utils.incubator.ServiceRegistry;
import de.rcenvironment.core.utils.incubator.ServiceRegistryAccess;
/**
* Wizard page for component result verification.
*
* @author Doreen Seider
*/
public class ComponentResultVerificationWizard extends Wizard {
private ComponentResultVerificationInfoWizardPage decisionPage;
private ComponentExecutionService componentExecutionService;
public ComponentResultVerificationWizard() {
ServiceRegistryAccess registryAccess = ServiceRegistry.createAccessFor(this);
componentExecutionService = registryAccess.getService(ComponentExecutionService.class);
setWindowTitle("Tool Result Verification");
}
@Override
public void addPages() {
addPage(new ComponentResultVerificationTokenWizardPage());
decisionPage = new ComponentResultVerificationInfoWizardPage();
addPage(decisionPage);
}
@Override
public boolean performCancel() {
decisionPage.setVerificationToken(null);
return super.performCancel();
}
@Override
public boolean performFinish() {
final String verificationToken = decisionPage.getVerificationToken();
final ComponentExecutionInformation compExeInfo = decisionPage.getComponentExecutionInformation();
final boolean verificationResult = decisionPage.getVerificationResult();
Job job = new Job("Send verification results for tool run") {
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
boolean successfullyApplied =
componentExecutionService.verifyResults(compExeInfo.getExecutionIdentifier(), compExeInfo.getNodeId(),
verificationToken, verificationResult);
if (!successfullyApplied) {
openErrorDialog(compExeInfo);
}
} catch (RemoteOperationException | ExecutionControllerException e) {
LogFactory.getLog(ComponentResultVerificationWizard.class)
.error(StringUtils.format("Error when sending verification results for component '%s' (%s) of workflow '%s' (%s)",
compExeInfo.getInstanceName(), compExeInfo.getExecutionIdentifier(), compExeInfo.getWorkflowInstanceName(),
compExeInfo.getWorkflowExecutionIdentifier()), e);
if (e instanceof RemoteOperationException) {
openErrorDialog((RemoteOperationException) e, compExeInfo);
} else {
openErrorDialog(compExeInfo);
}
}
return Status.OK_STATUS;
}
};
job.setUser(true);
job.schedule();
return true;
}
private void openErrorDialog(ComponentExecutionInformation compExeInfo) {
openErrorDialog(null, compExeInfo);
}
private void openErrorDialog(final RemoteOperationException e, final ComponentExecutionInformation compExeInfo) {
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
String errorMessage;
if (e != null) {
errorMessage = StringUtils.format("Failed to send verification results for tool '%s' to '%s'.\n\nReason: %s",
compExeInfo.getInstanceName(), compExeInfo.getNodeId().getAssociatedDisplayName(), e.getMessage());
} else {
errorMessage = StringUtils.format("Failed to send verification results for tool '%s' to '%s'. "
+ "Most likely reason: In the meantime, verification results are already sent by someone else.",
compExeInfo.getInstanceName(), compExeInfo.getNodeId().getAssociatedDisplayName());
}
MessageDialog.openError(ComponentResultVerificationWizard.this.getShell(), "Error Sending Verification Results",
errorMessage);
}
});
}
}