/****************************************************************************** * Copyright (c) 2006 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 * project g-Eclipse founded by European Union * project number: FP6-IST-034327 http://www.geclipse.eu/ * * Contributor(s): * Mathias Stuempert - FZK * Pawel Wolniewicz - PSNC *****************************************************************************/ package eu.geclipse.ui.internal.actions; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.ui.IWorkbenchSite; import org.eclipse.ui.actions.SelectionListenerAction; import eu.geclipse.core.model.IGridContainer; import eu.geclipse.core.model.IGridElement; import eu.geclipse.core.model.IGridJobDescription; import eu.geclipse.core.model.IGridProject; import eu.geclipse.core.reporting.ProblemException; import eu.geclipse.ui.internal.Activator; import eu.geclipse.ui.wizards.jobsubmission.JobCreatorSelectionWizard; /** * Action dedicated to the submission of Grid jobs. */ public class SubmitJobAction extends SelectionListenerAction { /** * The workbench site this action belongs to. */ private IWorkbenchSite site; private List<IGridJobDescription> jobDescriptions; protected SubmitJobAction( final IWorkbenchSite site ) { super( Messages.getString( "SubmitJobAction.title" ) ); //$NON-NLS-1$ this.site = site; this.jobDescriptions = new ArrayList<IGridJobDescription>(); } /* * (non-Javadoc) * * @see org.eclipse.jface.action.Action#run() */ @Override public void run() { if( this.jobDescriptions.size() > 0 ) { JobCreatorSelectionWizard wizard = new JobCreatorSelectionWizard( this.jobDescriptions); WizardDialog dialog = new WizardDialog( this.site.getShell(), wizard ); dialog.setBlockOnOpen( false ); dialog.open(); } } /* * (non-Javadoc) * * @see org.eclipse.ui.actions.BaseSelectionListenerAction#updateSelection(org.eclipse.jface.viewers.IStructuredSelection) */ @Override protected boolean updateSelection( final IStructuredSelection selection ) { boolean enabled = ! selection.isEmpty() && super.updateSelection( selection ); if ( enabled ) { this.jobDescriptions.clear(); IGridProject project = null; Iterator<?> iter = selection.iterator(); while( iter.hasNext() && enabled ) { Object element = iter.next(); List<IGridJobDescription> descriptions = getJobDescriptions( element ); if( descriptions != null && !descriptions.isEmpty() ) { if( project == null ) { project = descriptions.get( 0 ).getProject(); } if(project != descriptions.get( 0 ).getProject()){ //job description from different projects cannot be submitted together return false; } this.jobDescriptions.addAll( descriptions ); } else { enabled = false; } } } return enabled && ( this.jobDescriptions != null ); } private List<IGridJobDescription> getJobDescriptions( final Object element ) { List<IGridJobDescription> descriptions = null; if( element instanceof IGridJobDescription ) { descriptions = Collections.singletonList( ( IGridJobDescription )element ); } else if( element instanceof IGridContainer ) { IGridContainer container = ( IGridContainer )element; descriptions = getDescriptionsFromContainer( container ); } if( descriptions == null && element instanceof IAdaptable ) { IGridJobDescription jsdl = ( IGridJobDescription )( ( IAdaptable )element ).getAdapter( IGridJobDescription.class ); if( jsdl != null ) { descriptions = Collections.singletonList( jsdl ); } } return descriptions; } private List<IGridJobDescription> getDescriptionsFromContainer( final IGridContainer container ) { List<IGridJobDescription> descriptions = null; if( container.isLocal() ) { try { for( IGridElement gridElement : container.getChildren( null ) ) { if( gridElement instanceof IGridJobDescription ) { if( descriptions == null ) { descriptions = new ArrayList<IGridJobDescription>(); } descriptions.add( ( IGridJobDescription )gridElement ); } } } catch( ProblemException exception ) { Activator.logException( exception ); } } return descriptions; } }