/*******************************************************************************
* Copyright (c) 2006-2008 g-Eclipse Consortium
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Initial development of the original code was made for the g-Eclipse project
* funded by European Union project number: FP6-IST-034327
* http://www.geclipse.eu/
*
* Contributors:
* RUR (http://acet.rdg.ac.uk/)
* - Ashish Thandavan - initial API and implementation
* - David Johnson
******************************************************************************/
package eu.geclipse.workflow.ui.internal.actions;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.operations.OperationHistoryFactory;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.filesystem.URIUtil;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IObjectActionDelegate;
import org.eclipse.ui.IWorkbenchPart;
import eu.geclipse.core.model.GridModel;
import eu.geclipse.jsdl.JSDLJobDescription;
import eu.geclipse.workflow.model.IWorkflowJob;
import eu.geclipse.workflow.ui.edit.commands.CopyJobDescToWorkflowCommand;
import eu.geclipse.workflow.ui.edit.commands.UpdateJobPortsCommand;
import eu.geclipse.workflow.ui.edit.parts.WorkflowJobEditPart;
import eu.geclipse.workflow.ui.part.Messages;
/**
* @author athandava
*/
public class GetJobDescriptionFromFileAction implements IObjectActionDelegate {
/**
* The WorkflowJobEditPart that has been selected.
*/
protected WorkflowJobEditPart mySelectedElement;
protected IFile jsdlTarget;
String jobDescriptionInJSDL = null;
private Shell myShell;
private IFileStore wfRootFileStore = null;
private String[] dirs = null;
public void setActivePart( final IAction action, final IWorkbenchPart targetPart ) {
this.myShell = targetPart.getSite().getShell();
}
/**
* Fires up a GridFileDialog and fetches the contents of a user-chosen JSDL
* file.
*/
public void run( final IAction action ) {
FileDialog dialog = new FileDialog( this.myShell, SWT.OPEN );
String[] exts = {"*.jsdl"}; //$NON-NLS-1$
dialog.setFilterExtensions( exts );
// this bit find the root directory of the workflow
TransactionalEditingDomain domain = this.mySelectedElement.getEditingDomain();
ResourceSet resourceSet = domain.getResourceSet();
Resource res = resourceSet.getResources().get( 0 );
URI wfRootUri = res.getURI();
String wfRootPath = wfRootUri.path();
this.dirs = wfRootPath.split( "/" ); //$NON-NLS-1$
String projectName = this.dirs[ 2 ];
this.wfRootFileStore = GridModel.getRoot()
.getFileStore()
.getChild( projectName );
dialog.setFilterPath( this.wfRootFileStore.toString() );
if( dialog.open() != null ) {
String result = dialog.getFileName();
if( ( result != null ) && ( result.length() > 0 ) ) {
String filePath = dialog.getFilterPath() + "/" + result; //$NON-NLS-1$
// filePath = filePath.replace(' ', '+');
java.net.URI filePathUri = null;
filePathUri = URIUtil.toURI( filePath );
IFile jsdlFile = ResourcesPlugin.getWorkspace()
.getRoot()
.findFilesForLocationURI( filePathUri )[ 0 ];
IWorkflowJob selectedJob = ( IWorkflowJob )this.mySelectedElement.resolveSemanticElement();
if( !( selectedJob.getName() == null && selectedJob.getJobDescription() == null ) )
{
MessageDialog confirmDialog = new MessageDialog( null,
Messages.getString( "WorkflowJobDragDropEditPolicy_confirmationTitle" ), //$NON-NLS-1$
null,
Messages.getString( "WorkflowJobDragDropEditPolicy_userPrompt" ), //$NON-NLS-1$
true
? MessageDialog.QUESTION
: MessageDialog.WARNING,
new String[]{
IDialogConstants.YES_LABEL,
IDialogConstants.NO_LABEL
},
0 );
int confirmResult = confirmDialog.open();
if( confirmResult == 0 ) {
JSDLJobDescription jsdl = new JSDLJobDescription( jsdlFile );
AbstractTransactionalCommand copyCommand = new CopyJobDescToWorkflowCommand( this.mySelectedElement.resolveSemanticElement(),
jsdl );
AbstractTransactionalCommand updatePortsCommand = new UpdateJobPortsCommand( GetJobDescriptionFromFileAction.this.mySelectedElement,
jsdl );
try {
OperationHistoryFactory.getOperationHistory()
.execute( copyCommand, new NullProgressMonitor(), null );
OperationHistoryFactory.getOperationHistory()
.execute( updatePortsCommand, new NullProgressMonitor(), null );
} catch( ExecutionException eE ) {
eE.printStackTrace();
}
}
}
}
}
}
public void selectionChanged( final IAction action, final ISelection selection ) {
this.mySelectedElement = null;
if( selection instanceof IStructuredSelection ) {
IStructuredSelection structuredSelection = ( IStructuredSelection )selection;
if( structuredSelection.size() == 1
&& structuredSelection.getFirstElement() instanceof WorkflowJobEditPart )
{
this.mySelectedElement = ( WorkflowJobEditPart )structuredSelection.getFirstElement();
}
}
action.setEnabled( isEnabled() );
}
private boolean isEnabled() {
return this.mySelectedElement != null;
}
}