/***************************************************************************** * 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 founded by European Union * project number: FP6-IST-034327 http://www.geclipse.eu/ * * Contributors: * Mathias Stuempert - initial API and implementation *****************************************************************************/ package eu.geclipse.ui.wizards; import java.lang.reflect.InvocationTargetException; import java.net.URI; import java.net.URL; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.wizard.IWizardContainer; import org.eclipse.jface.wizard.IWizardPage; import org.eclipse.jface.wizard.Wizard; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.ui.INewWizard; import org.eclipse.ui.IWorkbench; import eu.geclipse.core.ICoreProblems; import eu.geclipse.core.model.GridModel; import eu.geclipse.core.model.IGridContainer; import eu.geclipse.core.model.IGridElement; import eu.geclipse.core.reporting.ProblemException; import eu.geclipse.ui.actions.MountAction; import eu.geclipse.ui.dialogs.ProblemDialog; import eu.geclipse.ui.internal.Activator; /** * Wizard for the creation of new connections. Can both create local * and global connections. */ public class ConnectionWizard extends Wizard implements INewWizard { protected static final String CONNECTION_PREFIX = "."; //$NON-NLS-1$ protected static final String CONNECTION_SUFFIX = ".fs"; //$NON-NLS-1$ IWizardPage firstPage; private boolean createGlobalConnection; private ISelection initialSelection; private URI initialURI; private String initialName; private ConnectionDefinitionWizardPage definitionPage; /** * Create a new connection wizard for local connections. */ public ConnectionWizard() { this( null, null, false ); } public ConnectionWizard( final URI initialURI, final String initialName ) { this( initialURI, initialName, false ); } /** * Create a new connection wizard. * * @param createGlobalConnection If true a connection wizard for * the creation of global connections will be initialized. */ public ConnectionWizard( final boolean createGlobalConnection ) { this( null, null, createGlobalConnection ); } public ConnectionWizard( final URI initialURI, final String initialName, final boolean createGlobalConnection ) { URL imgURL = Activator.getDefault().getBundle().getResource( "icons/wizban/newconn_wiz.gif" ); //$NON-NLS-1$ setDefaultPageImageDescriptor( ImageDescriptor.createFromURL( imgURL ) ); setNeedsProgressMonitor( true ); this.createGlobalConnection = createGlobalConnection; this.initialURI = initialURI; this.initialName = initialName; } @Override public void addPages() { if ( this.initialSelection == null ) { this.initialSelection = StructuredSelection.EMPTY; } if ( this.createGlobalConnection ) { this.firstPage = new ConnectionNameWizardPage( this.initialName ); } else { this.firstPage = new ConnectionLocationWizardPage( Messages.getString("ConnectionWizard.location_page_name"), //$NON-NLS-1$ ( IStructuredSelection ) this.initialSelection ); this.firstPage.setTitle( Messages.getString("ConnectionWizard.location_page_title") ); //$NON-NLS-1$ this.firstPage.setDescription( Messages.getString("ConnectionWizard.location_page_description") ); //$NON-NLS-1$ if ( this.initialName != null ) { ( ( ConnectionLocationWizardPage ) this.firstPage ).setFileName( this.initialName ); } } addPage( this.firstPage ); IGridContainer mountPoint = getMountPoint(); this.definitionPage = new ConnectionDefinitionWizardPage( mountPoint, this.initialURI ); addPage( this.definitionPage ); } @Override public boolean canFinish() { IWizardContainer container = getContainer(); IWizardPage currentPage = container.getCurrentPage(); return ( ( currentPage != this.firstPage ) || ( this.initialURI != null ) ) && super.canFinish(); } @Override public String getWindowTitle() { return Messages.getString("ConnectionWizard.window_title"); //$NON-NLS-1$ } @Override public boolean performFinish() { boolean result = true; URI uri = this.definitionPage.getURI(); if ( uri != null ) { try { if ( ConnectionWizard.this.createGlobalConnection ) { result = createGlobalConnection( uri ); } else { result = createLocalConnection( uri ); } } catch ( ProblemException pExc ) { ProblemDialog.openProblem( getShell(), "Mount failed", "Unable to create connection", pExc ); result = false; } } return result; } public void init( final IWorkbench workbench, final IStructuredSelection selection ) { this.initialSelection = selection; } protected boolean createGlobalConnection( final URI uri ) throws ProblemException { boolean result = true; ConnectionNameWizardPage page = ( ConnectionNameWizardPage ) this.firstPage; final String name = page.getConnectionName(); try { getContainer().run( true, true, new IRunnableWithProgress() { public void run( final IProgressMonitor monitor ) throws InvocationTargetException ,InterruptedException { try { MountAction.createGlobalMount( uri, name, monitor ); } catch ( CoreException pExc ) { throw new InvocationTargetException( pExc ); } finally { monitor.done(); } } } ); } catch ( InvocationTargetException itExc ) { Throwable t = itExc.getCause(); if ( t instanceof ProblemException ) { throw ( ProblemException ) t; } if ( t == null ) { t = itExc; } throw new ProblemException( ICoreProblems.MODEL_ELEMENT_CREATE_FAILED, "Unable to create connection", t, Activator.PLUGIN_ID ); } catch ( InterruptedException intExc ) { result = false; } return result; } protected boolean createLocalConnection( final URI uri ) throws ProblemException { boolean result = true; ConnectionLocationWizardPage page = ( ConnectionLocationWizardPage ) this.firstPage; final IPath path = page.getContainerFullPath().append( page.getFileName() ); try { getContainer().run( true, true, new IRunnableWithProgress() { public void run( final IProgressMonitor monitor ) throws InvocationTargetException, InterruptedException { try { MountAction.createLocalMount( uri, path, monitor ); } catch ( CoreException cExc ) { throw new InvocationTargetException( cExc ); } } } ); } catch ( InvocationTargetException itExc ) { Throwable t = itExc.getCause(); if ( t instanceof ProblemException ) { throw ( ProblemException ) t; } if ( t == null ) { t = itExc; } throw new ProblemException( ICoreProblems.MODEL_ELEMENT_CREATE_FAILED, "Unable to create connection", t, Activator.PLUGIN_ID ); } catch ( InterruptedException intExc ) { result = false; } return result; } private IGridContainer getMountPoint() { IGridContainer result = null; if ( ( this.initialSelection != null ) && ( this.initialSelection instanceof StructuredSelection ) ) { StructuredSelection sSelection = ( StructuredSelection ) this.initialSelection; Object object = sSelection.getFirstElement(); if ( object instanceof IGridContainer ) { result = ( IGridContainer ) object; } else if ( object instanceof IResource ) { IGridElement element = GridModel.getRoot().findElement( ( IResource ) object ); if ( ( element != null ) && ( element instanceof IGridContainer ) ) { result = ( IGridContainer ) element; } } else if ( object instanceof IAdaptable ) { result = ( IGridContainer ) ( ( IAdaptable ) object ).getAdapter( IGridContainer.class ); } } return result; } private void setCurrentErrorMessage( final IWizardPage fromPage ) { String errorMessage = fromPage.getErrorMessage(); WizardPage toPage = ( WizardPage ) getContainer().getCurrentPage(); toPage.setErrorMessage( errorMessage ); } }