/*
* 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.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Display;
import org.eclipse.swt.widgets.Label;
import de.rcenvironment.core.component.execution.api.ComponentExecutionInformation;
import de.rcenvironment.core.component.execution.api.ComponentExecutionService;
import de.rcenvironment.core.utils.common.rpc.RemoteOperationException;
import de.rcenvironment.core.utils.incubator.ServiceRegistry;
import de.rcenvironment.core.utils.incubator.ServiceRegistryAccess;
import de.rcenvironment.toolkit.modules.concurrency.api.AsyncTaskService;
import de.rcenvironment.toolkit.modules.concurrency.api.TaskDescription;
/**
* Wizard page to enter the component verification token.
*
* @author Doreen Seider
*/
public class ComponentResultVerificationInfoWizardPage extends WizardPage {
private static final String RETRIEVING = "[Fetching...]";
private static final String UNKNOWN = "[Unknown]";
private static final String TITLE = "Tool Result Verification";
private String verificationToken = null;
private Label compNameLabel;
private Label wfNameLabel;
private Label compHostLabel;
private Label wfHostLabel;
private AsyncTaskService asyncTaskService;
private ComponentExecutionService componentExecutionService;
private Button verifyButton;
private Button denyButton;
private Display display;
private ComponentExecutionInformation compExeInfo = null;
protected ComponentResultVerificationInfoWizardPage() {
super(TITLE);
setTitle(TITLE);
ServiceRegistryAccess registryAccess = ServiceRegistry.createAccessFor(this);
asyncTaskService = registryAccess.getService(AsyncTaskService.class);
componentExecutionService = registryAccess.getService(ComponentExecutionService.class);
}
@Override
public void createControl(Composite parent) {
display = parent.getDisplay();
Composite content = new Composite(parent, SWT.NONE);
content.setLayout(new GridLayout(2, false));
GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
content.setLayoutData(layoutData);
Label compNameLeftLabel = new Label(content, SWT.NONE);
compNameLeftLabel.setText("Tool:");
compNameLabel = new Label(content, SWT.NONE);
layoutData = new GridData(SWT.FILL, SWT.NONE, true, false);
compNameLabel.setLayoutData(layoutData);
Label compHostLeftLabel = new Label(content, SWT.NONE);
compHostLeftLabel.setText("Tool host machine:");
compHostLabel = new Label(content, SWT.NONE);
layoutData = new GridData(SWT.FILL, SWT.NONE, true, false);
compHostLabel.setLayoutData(layoutData);
Label wfNameLeftLabel = new Label(content, SWT.NONE);
wfNameLeftLabel.setText("Workflow:");
wfNameLabel = new Label(content, SWT.NONE);
layoutData = new GridData(SWT.FILL, SWT.NONE, true, false);
wfNameLabel.setLayoutData(layoutData);
Label wfHostLeftLabel = new Label(content, SWT.NONE);
wfHostLeftLabel.setText("Workflow host machine:");
wfHostLabel = new Label(content, SWT.NONE);
layoutData = new GridData(SWT.FILL, SWT.NONE, true, false);
wfHostLabel.setLayoutData(layoutData);
Label separator = new Label(content, SWT.HORIZONTAL | SWT.SEPARATOR);
layoutData = new GridData(GridData.FILL_HORIZONTAL);
layoutData.horizontalSpan = 2;
separator.setLayoutData(layoutData);
Composite decisionComposite = new Composite(content, SWT.NONE);
decisionComposite.setLayout(new GridLayout(2, true));
layoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
layoutData.horizontalSpan = 2;
decisionComposite.setLayoutData(layoutData);
verifyButton = new Button(decisionComposite, SWT.RADIO);
verifyButton.setText("Approve tool results");
layoutData = new GridData(SWT.FILL, SWT.NONE, true, false);
layoutData.horizontalAlignment = SWT.RIGHT;
verifyButton.setLayoutData(layoutData);
verifyButton.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent event) {
widgetDefaultSelected(event);
}
@Override
public void widgetDefaultSelected(SelectionEvent event) {
validateInput();
}
});
denyButton = new Button(decisionComposite, SWT.RADIO);
denyButton.setText("Reject tool results");
layoutData = new GridData(SWT.FILL, SWT.NONE, true, false);
layoutData.horizontalAlignment = SWT.LEFT;
denyButton.setLayoutData(layoutData);
denyButton.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent event) {
widgetDefaultSelected(event);
}
@Override
public void widgetDefaultSelected(SelectionEvent event) {
validateInput();
}
});
setControl(content);
setComponentInfos();
validateInput();
}
private void setComponentInfos() {
if (compExeInfo == null) {
compNameLabel.setText(UNKNOWN);
wfNameLabel.setText(UNKNOWN);
compHostLabel.setText(UNKNOWN);
wfHostLabel.setText(UNKNOWN);
} else {
compNameLabel.setText(compExeInfo.getInstanceName());
wfNameLabel.setText(compExeInfo.getWorkflowInstanceName());
compHostLabel.setText(compExeInfo.getNodeId().getAssociatedDisplayName());
wfHostLabel.setText(compExeInfo.getWorkflowNodeId().getAssociatedDisplayName());
}
}
private void clearComponentInfos() {
compNameLabel.setText(RETRIEVING);
wfNameLabel.setText(RETRIEVING);
compHostLabel.setText(RETRIEVING);
wfHostLabel.setText(RETRIEVING);
}
private void setupDecisionButtons(boolean enable) {
verifyButton.setEnabled(enable);
denyButton.setEnabled(enable);
if (!enable) {
verifyButton.setSelection(enable);
denyButton.setSelection(enable);
}
}
private void validateInput(String errorMessage) {
setErrorMessage(errorMessage);
setPageComplete(false);
setupDecisionButtons(false);
}
private void validateInput() {
if (compNameLabel.getText().toString().equals(UNKNOWN)) {
setErrorMessage("No tool run found that belongs to key: " + verificationToken);
setPageComplete(false);
setupDecisionButtons(false);
} else if (compNameLabel.getText().toString().equals(RETRIEVING)) {
setErrorMessage(null);
setDescription("Verify results of tool run (as soon as information fetched)");
setPageComplete(false);
setupDecisionButtons(false);
} else if (!verifyButton.getSelection() && !denyButton.getSelection()) {
setErrorMessage("Decide whether to confirm or deny the tool results");
setPageComplete(false);
setupDecisionButtons(true);
} else {
setErrorMessage(null);
setDescription("Verify results of tool run");
setPageComplete(true);
setupDecisionButtons(true);
}
}
protected void setVerificationToken(final String verificationToken) {
if (verificationToken != null && (this.verificationToken == null || !this.verificationToken.equals(verificationToken))) {
this.verificationToken = verificationToken;
clearComponentInfos();
validateInput();
asyncTaskService.submit(new Runnable() {
@TaskDescription("Fetch component information for result verification")
@Override
public void run() {
try {
final ComponentExecutionInformation info =
componentExecutionService.getComponentExecutionInformation(verificationToken);
display.asyncExec(new Runnable() {
@Override
public void run() {
if (ComponentResultVerificationInfoWizardPage.this.verificationToken != null
&& ComponentResultVerificationInfoWizardPage.this.verificationToken.equals(verificationToken)) {
ComponentResultVerificationInfoWizardPage.this.compExeInfo = info;
setComponentInfos();
validateInput();
}
}
});
} catch (final RemoteOperationException e) {
LogFactory.getLog(getClass()).error("Failed to fetch information about component execution: " + e.getMessage());
display.asyncExec(new Runnable() {
@Override
public void run() {
setComponentInfos();
validateInput("Failed to find tool run: " + e.getMessage());
}
});
}
}
});
}
}
protected String getVerificationToken() {
return this.verificationToken;
}
protected boolean getVerificationResult() {
return verifyButton.getSelection();
}
protected ComponentExecutionInformation getComponentExecutionInformation() {
return this.compExeInfo;
}
}