/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.gui.workflow;
import java.io.File;
import org.apache.commons.logging.LogFactory;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.MessageDialogWithToggle;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PlatformUI;
import de.rcenvironment.core.component.workflow.execution.spi.WorkflowDescriptionLoaderCallback;
import de.rcenvironment.core.component.workflow.model.api.WorkflowDescription;
import de.rcenvironment.core.utils.common.StringUtils;
/**
* Loads {@link WorkflowDescription} from a {@link File} or an {@link IFile} with some GUI-specific handling like updating the workspace
* after updated was performed.
*
* @author Doreen Seider
*/
public final class GUIWorkflowDescriptionLoaderCallback implements WorkflowDescriptionLoaderCallback {
/** Preferences key. */
public static final String PREFS_KEY_UPDATEAUTOMATICALLY = "de.rcenvironment.rce.gui.workflow.editor.updateautomatically";
private static final String WORKFLOW_FILE_ERROR = "Workflow File Error";
private IFile wfFileFromWorkspace = null;
public GUIWorkflowDescriptionLoaderCallback() {
}
public GUIWorkflowDescriptionLoaderCallback(IFile wfFile) {
wfFileFromWorkspace = wfFile;
}
@Override
public void onNonSilentWorkflowFileUpdated(String message, final String backupFilename) {
refreshWorkflowIfLoadedFromWorkspace();
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
IPreferenceStore prefs = Activator.getInstance().getPreferenceStore();
if (!prefs.getString(PREFS_KEY_UPDATEAUTOMATICALLY).equals(String.valueOf(true))) {
MessageDialogWithToggle dialog = MessageDialogWithToggle.openInformation(
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
Messages.incompatibleVersionTitle,
StringUtils.format(Messages.incompatibleVersionMessage, backupFilename),
Messages.updateIncompatibleVersionSilently,
false, prefs, PREFS_KEY_UPDATEAUTOMATICALLY);
prefs.putValue(PREFS_KEY_UPDATEAUTOMATICALLY, String.valueOf(dialog.getToggleState()));
}
}
});
}
@Override
public void onSilentWorkflowFileUpdated(String message) {
refreshWorkflowIfLoadedFromWorkspace();
}
@Override
public boolean arePartlyParsedWorkflowConsiderValid() {
return true;
}
@Override
public void onWorkflowFileParsingPartlyFailed(final String backupFilename) {
refreshWorkflowIfLoadedFromWorkspace();
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
WORKFLOW_FILE_ERROR, StringUtils.format("Failed to parse the workflow. "
+ " Most likely reasons:\n\na) Workflow file was opened with a newer version of RCE before.\nb) An integrated tool "
+ "has changed its inputs/outputs.\n\nSome parts of the workflow were skipped. See log for more details."
+ "\n\nA backup file was created: %s", backupFilename));
}
});
}
private void refreshWorkflowIfLoadedFromWorkspace() {
if (wfFileFromWorkspace != null) {
try {
wfFileFromWorkspace.getProject().refreshLocal(IProject.DEPTH_INFINITE, new NullProgressMonitor());
} catch (CoreException e) {
LogFactory.getLog(getClass()).error(StringUtils.format(
"Failed to refresh the workspace after workflow file '%s' was updated",
wfFileFromWorkspace.getRawLocation().toOSString()));
}
}
}
}