com.salesforce.ide.ui.wizards.project.ProjectCreateOperation.java Source code

Java tutorial

Introduction

Here is the source code for com.salesforce.ide.ui.wizards.project.ProjectCreateOperation.java

Source

/*******************************************************************************
 * Copyright (c) 2014 Salesforce.com, inc..
 * 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
 * 
 * Contributors:
 *     Salesforce.com, inc. - initial API and implementation
 ******************************************************************************/
package com.salesforce.ide.ui.wizards.project;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;

import org.apache.log4j.Logger;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableContext;

import com.salesforce.ide.core.internal.utils.DialogUtils;
import com.salesforce.ide.core.internal.utils.Utils;
import com.salesforce.ide.core.project.ForceProjectException;
import com.salesforce.ide.core.project.ProjectController;
import com.salesforce.ide.core.project.ProjectModel;
import com.salesforce.ide.core.remote.ForceConnectionException;
import com.salesforce.ide.core.remote.ForceException;
import com.salesforce.ide.core.remote.InsufficientPermissionsException;
import com.salesforce.ide.core.services.ServiceTimeoutException;
import com.salesforce.ide.ui.internal.BaseWorkspaceModifyOperation;
import com.salesforce.ide.ui.internal.startup.ForceStartup;
import com.salesforce.ide.ui.internal.utils.UIMessages;

/**
 * Creates Force.com project by establishing a Force.com connection, creating a project, saving preferences and loading
 * scontrols, packages, triggers, and the schema.
 * 
 * @author cwall
 */
public class ProjectCreateOperation extends BaseWorkspaceModifyOperation {

    private static final Logger logger = Logger.getLogger(ProjectCreateOperation.class);

    //  V A R I A B L E S
    protected ProjectController projectController = null;
    protected IRunnableContext progressContainer = null;
    protected boolean success = true; // determines if fetch components into project
    protected boolean abortProjectCreation = false;

    //  C O N S T R U C T O R S
    public ProjectCreateOperation(ProjectController projectWizardController, IRunnableContext container) {
        this.projectController = projectWizardController;
        this.progressContainer = container;
    }

    public ProjectCreateOperation(ProjectController projectWizardController) {
        this.projectController = projectWizardController;
    }

    //  M E T H O D S
    protected ProjectModel getProjectModel() {
        return projectController.getProjectModel();
    }

    public boolean create() throws InvocationTargetException, InterruptedException {
        // create new project
        if (progressContainer == null) {
            progressContainer = new ProgressMonitorDialog(getShell());
        }
        progressContainer.run(false, true, this);
        return success;
    }

    @Override
    protected void execute(IProgressMonitor monitor)
            throws CoreException, InvocationTargetException, InterruptedException {

        // start task
        if (monitor == null) {
            monitor = new NullProgressMonitor();
        }

        // disable manifest listener so retreive overwrite of package.xml does not trigger refresh dialog
        ForceStartup.removePackageManifestChangeListener();

        monitor.beginTask("", 20);

        try {
            // test and save connection
            monitorWork(monitor);
            monitor.subTask(UIMessages.getString("ProjectCreateWizard.CreateOperation.EstablishConnection.label"));
            saveConnection(monitor);
            monitorWork(monitor);

            // create project
            monitor.subTask(UIMessages.getString("ProjectCreateWizard.CreateOperation.CreateProject.label"));
            projectController.createProject(false, monitor);
            monitorWork(monitor);

            // save settings to project
            monitor.subTask(UIMessages.getString("ProjectCreateWizard.CreateOperation.SaveSettings.label"));
            projectController.saveSettings(monitor);
            monitorWork(monitor);

            // generate project structure including generic unpackaged/package.xml
            projectController.generateProjectStructure(monitor);
            monitorWork(monitor);

            // fetch components
            monitor.subTask(UIMessages.getString("ProjectCreateWizard.CreateOperation.FetchComponents.label"));
            fetchComponents(monitor);

            monitorWork(monitor);

            // schema
            monitor.subTask(UIMessages.getString("ProjectCreateWizard.CreateOperation.GenerateSchema.label"));
            try {
                projectController.generateSchemaFile(new SubProgressMonitor(monitor, 2));
            } catch (IOException e) {
                logger.warn("Unable to generate schema file", e);
            }
            monitorWork(monitor);

            monitor.subTask(UIMessages.getString("ProjectCreateWizard.CreateOperation.OpenProject.label"));
            monitor.done();

            success = true;

            projectController.postFinish();

        } catch (InterruptedException e) {
            if (logger.isInfoEnabled()) {
                logger.info("Fetch remote components canceled by user");
            }
            success = false;
            monitor.subTask(UIMessages.getString("ProjectCreateWizard.CreateOperation.DeleteProject.label"));
            deleteProject(monitor);
            throw e;
        } catch (CoreException e) {
            String logMessage = Utils.generateCoreExceptionLog(e);
            logger.warn("Unable to finish '"
                    + (getProjectModel() != null && Utils.isNotEmpty(getProjectModel().getProjectName())
                            ? getProjectModel().getProjectName()
                            : "")
                    + "' project creation: " + logMessage, e);
            success = false;
            monitor.subTask(UIMessages.getString("ProjectCreateWizard.CreateOperation.DeleteProject.label"));
            deleteProject(monitor);
        } catch (Exception e) {
            logger.warn("Unable to finish '"
                    + (getProjectModel() != null && Utils.isNotEmpty(getProjectModel().getProjectName())
                            ? getProjectModel().getProjectName()
                            : "")
                    + "' project creation", e);
            success = false;
            monitor.subTask(UIMessages.getString("ProjectCreateWizard.CreateOperation.DeleteProject.label"));
            deleteProject(monitor);
        } finally {
            ForceStartup.addPackageManifestChangeListener();
        }
    }

    public void deleteProject(IProgressMonitor monitor) {
        projectController.cleanUp(monitor);
    }

    protected void saveConnection(IProgressMonitor monitor) throws InterruptedException, Exception {
        try {
            projectController.saveConnection(new SubProgressMonitor(monitor, 2));
        } catch (ForceException e) {
            boolean retry = DialogUtils.getInstance().retryConnection(e, monitor);
            if (retry) {
                saveConnection(monitor);
            } else {
                throw new ForceProjectException(e, "Unable to save connection");
            }
        }
    }

    protected void fetchComponents(IProgressMonitor monitor) throws InterruptedException, Exception {
        fetchComponents(null, monitor);
    }

    protected void fetchComponents(ServiceTimeoutException ex, IProgressMonitor monitor)
            throws InterruptedException, Exception {
        try {
            if (ex != null) {
                projectController.fetchComponents(ex, new SubProgressMonitor(monitor, 5));
            } else {
                projectController.fetchComponents(new SubProgressMonitor(monitor, 5));
            }
        } catch (ForceConnectionException e) {
            boolean retry = DialogUtils.getInstance().retryConnection(e, monitor);
            if (retry) {
                fetchComponents(monitor);
            } else {
                throw new ForceProjectException(e, "User cancelled fetch components due to connection exceptions");
            }
        } catch (ServiceTimeoutException e) {
            boolean proceed = DialogUtils.getInstance().presentCycleLimitExceptionDialog(e, monitor);
            if (proceed) {
                fetchComponents(e, monitor);
            } else {
                throw new ForceProjectException(e,
                        "User cancelled fetch components due to cycle polling limits reached");
            }
        } catch (InsufficientPermissionsException e) {
            e.setShowUpdateCredentialsMessage(false);
            DialogUtils.getInstance().presentInsufficientPermissionsDialog(e);
        } catch (Exception e) {
            DialogUtils.getInstance().presentFetchExceptionDialog(e, monitor);
        }
    }
}