com.aptana.ide.syncing.ui.wizards.RemoteProjectWizard.java Source code

Java tutorial

Introduction

Here is the source code for com.aptana.ide.syncing.ui.wizards.RemoteProjectWizard.java

Source

/**
 * This file Copyright (c) 2005-2010 Aptana, Inc. This program is
 * dual-licensed under both the Aptana Public License and the GNU General
 * Public license. You may elect to use one or the other of these licenses.
 * 
 * This program is distributed in the hope that it will be useful, but
 * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
 * NONINFRINGEMENT. Redistribution, except as permitted by whichever of
 * the GPL or APL you select, is prohibited.
 *
 * 1. For the GPL license (GPL), you can redistribute and/or modify this
 * program under the terms of the GNU General Public License,
 * Version 3, as published by the Free Software Foundation.  You should
 * have received a copy of the GNU General Public License, Version 3 along
 * with this program; if not, write to the Free Software Foundation, Inc., 51
 * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 * 
 * Aptana provides a special exception to allow redistribution of this file
 * with certain other free and open source software ("FOSS") code and certain additional terms
 * pursuant to Section 7 of the GPL. You may view the exception and these
 * terms on the web at http://www.aptana.com/legal/gpl/.
 * 
 * 2. For the Aptana Public License (APL), this program and the
 * accompanying materials are made available under the terms of the APL
 * v1.0 which accompanies this distribution, and is available at
 * http://www.aptana.com/legal/apl/.
 * 
 * You may view the GPL, Aptana's exception and additional terms, and the
 * APL in the file titled license.html at the root of the corresponding
 * plugin containing this source file.
 * 
 * Any modifications to this file must keep this entire header intact.
 */
package com.aptana.ide.syncing.ui.wizards;

import java.lang.reflect.InvocationTargetException;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceStatus;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExecutableExtension;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.osgi.util.NLS;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
import org.eclipse.ui.dialogs.WizardNewProjectCreationPage;
import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
import org.eclipse.ui.internal.wizards.newresource.ResourceMessages;
import org.eclipse.ui.progress.UIJob;
import org.eclipse.ui.wizards.newresource.BasicNewProjectResourceWizard;
import org.eclipse.ui.wizards.newresource.BasicNewResourceWizard;

import com.aptana.ide.core.io.ConnectionPointUtils;
import com.aptana.ide.core.io.CoreIOPlugin;
import com.aptana.ide.core.io.IConnectionPoint;
import com.aptana.ide.syncing.core.ISiteConnection;
import com.aptana.ide.syncing.core.SiteConnectionUtils;
import com.aptana.ide.syncing.core.SyncingPlugin;
import com.aptana.ide.syncing.ui.SyncingUIPlugin;
import com.aptana.ide.syncing.ui.actions.DownloadAction;

/**
 * @author Kevin Sawicki (ksawicki@aptana.com)
 */
@SuppressWarnings("restriction")
public class RemoteProjectWizard extends Wizard implements IExecutableExtension, INewWizard {

    public static final String ID = "com.aptana.ide.syncing.ui.wizards.RemoteProjectWizard"; //$NON-NLS-1$

    private WizardNewProjectCreationPage mainPage;
    private RemoteConnectionSelectionPage connectionPage;

    private IProject newProject;
    private IWorkbench workbench;
    private IStructuredSelection selection;
    private IConfigurationElement fConfigElement;

    public RemoteProjectWizard() {
        setWindowTitle(Messages.RemoteProjectWizard_TTL_ConnectHostedSiteWizard);
    }

    /**
     * @see org.eclipse.jface.wizard.Wizard#performFinish()
     */
    public boolean performFinish() {
        final IProject p = createNewProject();

        try {
            WorkspaceModifyOperation op = new WorkspaceModifyOperation() {

                protected void execute(IProgressMonitor monitor) {
                    createProject(p, monitor != null ? monitor : new NullProgressMonitor());
                }
            };

            getContainer().run(false, true, op);
        } catch (InvocationTargetException x) {
            return false;
        } catch (InterruptedException x) {
            return false;
        }

        return true;
    }

    private IProject createNewProject() {
        if (newProject != null) {
            return newProject;
        }

        // get a project handle
        final IProject newProjectHandle = mainPage.getProjectHandle();
        // get a project descriptor
        IPath newPath = null;
        if (!mainPage.useDefaults()) {
            newPath = mainPage.getLocationPath();
        }

        IWorkspace workspace = ResourcesPlugin.getWorkspace();
        final IProjectDescription description = workspace.newProjectDescription(newProjectHandle.getName());
        description.setLocation(newPath);
        description.setNatureIds(new String[] { "com.aptana.ide.project.remote.nature" }); //$NON-NLS-1$

        // create the new project operation
        WorkspaceModifyOperation op = new WorkspaceModifyOperation() {

            protected void execute(IProgressMonitor monitor) throws CoreException {
                if (monitor != null) {
                    monitor.beginTask(Messages.RemoteProjectWizard_MSG_CreatingRemoteProject, 1);
                }
                createProject(description, newProjectHandle, monitor);
                if (monitor != null) {
                    monitor.worked(1);
                    monitor.done();
                }
            }
        };

        // run the new project creation operation
        try {
            getContainer().run(true, true, op);
        } catch (InterruptedException e) {
            return null;
        } catch (InvocationTargetException e) {
            // i.e. one of the steps resulted in a core exception
            Throwable t = e.getTargetException();
            if (t instanceof CoreException) {
                if (((CoreException) t).getStatus().getCode() == IResourceStatus.CASE_VARIANT_EXISTS) {
                    MessageDialog.openError(getShell(), ResourceMessages.NewProject_errorMessage, NLS
                            .bind(ResourceMessages.NewProject_caseVariantExistsError, newProjectHandle.getName()));
                } else {
                    ErrorDialog.openError(getShell(), ResourceMessages.NewProject_errorMessage, null,
                            ((CoreException) t).getStatus());
                }
            } else {
                // CoreExceptions are handled above, but unexpected runtime
                // exceptions and errors may still occur.
                IDEWorkbenchPlugin.getDefault().getLog()
                        .log(new Status(IStatus.ERROR, IDEWorkbenchPlugin.IDE_WORKBENCH, 0, t.toString(), t));
                MessageDialog.openError(getShell(), ResourceMessages.NewProject_errorMessage,
                        NLS.bind(ResourceMessages.NewProject_internalError, t.getMessage()));
            }
            return null;
        }

        newProject = newProjectHandle;

        return newProject;
    }

    /**
     * Creates a project resource given the project handle and description.
     * 
     * @param description
     *            the project description to create a project resource for
     * @param projectHandle
     *            the project handle to create a project resource for
     * @param monitor
     *            the progress monitor to show visual progress with
     * @exception CoreException
     *                if the operation fails
     * @exception OperationCanceledException
     *                if the operation is canceled
     */
    private void createProject(IProjectDescription description, final IProject projectHandle,
            IProgressMonitor monitor) throws CoreException, OperationCanceledException {
        try {
            monitor.beginTask("", 2000);//$NON-NLS-1$

            projectHandle.create(description, new SubProgressMonitor(monitor, 1000));

            if (monitor.isCanceled()) {
                throw new OperationCanceledException();
            }

            projectHandle.open(IResource.BACKGROUND_REFRESH, new SubProgressMonitor(monitor, 1000));

            IConnectionPoint site = connectionPage.getSite();
            if (site == null) {
                return;
            }
            IConnectionPoint source = ConnectionPointUtils.findOrCreateWorkspaceConnectionPoint(projectHandle);
            CoreIOPlugin.getConnectionPointManager().addConnectionPoint(source);

            ISiteConnection connection = SiteConnectionUtils.createSite(projectHandle.getName(), source, site);
            SyncingPlugin.getSiteConnectionManager().addSiteConnection(connection);
            if (connectionPage.isSynchronize()) {
                UIJob syncJob = new UIJob(Messages.RemoteProjectWizard_UIJOB_Synchronizing) {

                    public IStatus runInUIThread(IProgressMonitor monitor) {
                        DownloadAction action = new DownloadAction();
                        action.setActivePart(null, PlatformUI.getWorkbench().getActiveWorkbenchWindow()
                                .getActivePage().getActivePart());
                        action.setSelection(new StructuredSelection(projectHandle));
                        action.run(null);
                        return Status.OK_STATUS;
                    }
                };
                syncJob.schedule();
            }
        } finally {
            monitor.done();
        }
    }

    /**
     * Creates the project
     * 
     * @param p
     * @param monitor
     */
    protected void createProject(IProject p, IProgressMonitor monitor) {
        if (newProject == null) {
            return;
        }

        BasicNewProjectResourceWizard.updatePerspective(fConfigElement);
        BasicNewResourceWizard.selectAndReveal(newProject, workbench.getActiveWorkbenchWindow());
    }

    /**
     * @see org.eclipse.jface.wizard.Wizard#addPages()
     */
    public void addPages() {
        super.addPages();

        mainPage = new WizardNewProjectCreationPage("basicNewProjectPage");//$NON-NLS-1$
        mainPage.setTitle(Messages.RemoteProjectWizard_TTL_CreateNewExistingHostedSiteProject);
        mainPage.setDescription(Messages.RemoteProjectWizard_LBL_CreateNameAndLocationForLocalProject);
        mainPage.setPageComplete(false);
        addPage(mainPage);

        connectionPage = new RemoteConnectionSelectionPage(selection);
        connectionPage.setTitle(Messages.RemoteProjectWizard_TTL_SelectRemoteConnection);
        connectionPage.setPageComplete(false);
        addPage(connectionPage);

        setDefaultPageImageDescriptor(
                SyncingUIPlugin.getImageDescriptor("icons/full/obj16/remote_project_wizard.gif")); //$NON-NLS-1$
    }

    /**
     * @see org.eclipse.core.runtime.IExecutableExtension#setInitializationData(org.eclipse.core.runtime.IConfigurationElement,
     *      java.lang.String, java.lang.Object)
     */
    public void setInitializationData(IConfigurationElement config, String propertyName, Object data)
            throws CoreException {
        this.fConfigElement = config;
    }

    /**
     * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench,
     *      org.eclipse.jface.viewers.IStructuredSelection)
     */
    public void init(IWorkbench workbench, IStructuredSelection selection) {
        this.workbench = workbench;
        this.selection = selection;
    }
}