io.sarl.eclipse.wizards.newproject.NewSarlProjectWizard.java Source code

Java tutorial

Introduction

Here is the source code for io.sarl.eclipse.wizards.newproject.NewSarlProjectWizard.java

Source

/*
 * $Id$
 *
 * SARL is an general-purpose agent programming language.
 * More details on http://www.sarl.io
 *
 * Copyright (C) 2014-2017 the original authors or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package io.sarl.eclipse.wizards.newproject;

import java.lang.reflect.InvocationTargetException;
import java.text.MessageFormat;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
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.QualifiedName;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart;
import org.eclipse.jdt.internal.ui.util.ExceptionHandler;
import org.eclipse.jdt.internal.ui.wizards.JavaProjectWizard;
import org.eclipse.jdt.internal.ui.wizards.NewElementWizard;
import org.eclipse.jdt.internal.ui.wizards.NewWizardMessages;
import org.eclipse.jdt.ui.IPackagesViewPart;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.wizards.newresource.BasicNewProjectResourceWizard;

import io.sarl.eclipse.SARLEclipseConfig;
import io.sarl.eclipse.SARLEclipsePlugin;
import io.sarl.eclipse.natures.SARLProjectConfigurator;
import io.sarl.eclipse.properties.RuntimeEnvironmentPropertyPage;
import io.sarl.eclipse.runtime.ISREInstall;
import io.sarl.eclipse.util.Utilities;
import io.sarl.lang.SARLConfig;
import io.sarl.lang.ui.preferences.SARLPreferences;

/**
 * SARL new project wizard.
 * Most part of the code of this class comes from {@link JavaProjectWizard}.
 *
 * @author $Author: ngaud$
 * @author $Author: sgalland$
 * @version $FullVersion$
 * @mavengroupid $GroupId$
 * @mavenartifactid $ArtifactId$
 */
public class NewSarlProjectWizard extends NewElementWizard implements IExecutableExtension {

    private MainProjectWizardPage firstPage;

    private BuildSettingWizardPage secondPage;

    private IConfigurationElement fConfigElement;

    /** Construct a new wizard for creating a SARL project.
     */
    public NewSarlProjectWizard() {
        this(null, null);
    }

    /** Construct a new wizard for creating a SARL project.
     *
     * @param pageOne - reference to the first page of the wizard.
     * @param pageTwo - reference to the second page of the wizard.
     */
    public NewSarlProjectWizard(MainProjectWizardPage pageOne, BuildSettingWizardPage pageTwo) {
        setDialogSettings(JavaPlugin.getDefault().getDialogSettings());
        this.firstPage = pageOne;
        this.secondPage = pageTwo;
    }

    @Override
    public void init(IWorkbench workbench, IStructuredSelection currentSelection) {
        super.init(workbench, currentSelection);
        setDefaultPageImageDescriptor(SARLEclipsePlugin.getDefault()
                .getImageDescriptor(SARLEclipseConfig.NEW_PROJECT_WIZARD_DIALOG_IMAGE));
        setWindowTitle(Messages.SARLProjectNewWizard_0);
    }

    @Override
    public void addPages() {
        if (this.firstPage == null) {
            this.firstPage = new MainProjectWizardPage();
        }
        addPage(this.firstPage);

        if (this.secondPage == null) {
            this.secondPage = new BuildSettingWizardPage(this.firstPage);
        }
        addPage(this.secondPage);

        this.firstPage.init(getSelection(), getActivePart());
    }

    private static boolean hasSourcePath(IJavaProject javaProject, IPath path) {
        if (path != null) {
            final IPath pathInProject = javaProject.getProject().getFullPath().append(path);
            try {
                for (final IClasspathEntry entry : javaProject.getRawClasspath()) {
                    if (entry.getEntryKind() == IClasspathEntry.CPE_SOURCE
                            && pathInProject.equals(entry.getPath())) {
                        return true;
                    }
                }
            } catch (Throwable exception) {
                //
            }
        }
        return false;
    }

    private static String buildInvalidOutputPathMessageFragment(IJavaProject javaProject) {
        final StringBuilder sourceFolders = new StringBuilder();
        try {
            for (final IClasspathEntry entry : javaProject.getRawClasspath()) {
                if (entry.getEntryKind() == IClasspathEntry.CPE_SOURCE) {
                    sourceFolders.append("\t"); //$NON-NLS-1$
                    sourceFolders.append(entry.getPath().toOSString());
                    sourceFolders.append("\n"); //$NON-NLS-1$
                }
            }
        } catch (Throwable exception) {
            //
        }
        return sourceFolders.toString();
    }

    private static String toOSString(IPath path) {
        if (path == null) {
            return Utilities.EMPTY_STRING;
        }
        return path.toOSString();
    }

    /** Validate the SARL properties of the new projects.
     *
     * @param element - the created element
     * @return validity
     */
    protected boolean validateSARLSpecificElements(IJavaElement element) {
        final IJavaProject javaProject = (IJavaProject) element;
        // Check if the "SARL" generation directory is a source folder.
        final IPath outputPath = SARLPreferences.getSARLOutputPathFor(javaProject.getProject());

        if (outputPath == null) {
            final String message = MessageFormat.format(Messages.BuildSettingWizardPage_0,
                    SARLConfig.FOLDER_SOURCE_GENERATED);
            final IStatus status = SARLEclipsePlugin.getDefault().createStatus(IStatus.ERROR, message);
            handleFinishException(getShell(), new InvocationTargetException(new CoreException(status)));
            return false;
        }
        if (!hasSourcePath(javaProject, outputPath)) {
            final String message = MessageFormat.format(Messages.SARLProjectCreationWizard_0,
                    toOSString(outputPath), buildInvalidOutputPathMessageFragment(javaProject));
            final IStatus status = SARLEclipsePlugin.getDefault().createStatus(IStatus.ERROR, message);
            handleFinishException(getShell(), new InvocationTargetException(new CoreException(status)));
            return false;
        }
        return true;
    }

    @Override
    protected void finishPage(IProgressMonitor monitor) throws InterruptedException, CoreException {
        // use the full progress monitor
        this.secondPage.performFinish(monitor);
    }

    @Override
    public boolean performFinish() {
        final boolean res = super.performFinish();
        if (res) {
            final IJavaProject newElement;
            try {
                newElement = getCreatedElement();
            } catch (Throwable e) {
                handleFinishException(getShell(), new InvocationTargetException(e));
                return false;
            }

            // Force SARL configuration
            SARLProjectConfigurator.configureSARLProject(newElement.getProject(), false, false,
                    new NullProgressMonitor());

            // Validate the SARL specific elements
            if (!validateSARLSpecificElements(newElement)) {
                return false;
            }

            final IWorkingSet[] workingSets = this.firstPage.getWorkingSets();
            if (workingSets.length > 0) {
                PlatformUI.getWorkbench().getWorkingSetManager().addToWorkingSets(newElement, workingSets);
            }

            try {
                newElement.getProject().refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
            } catch (CoreException e) {
                handleFinishException(getShell(), new InvocationTargetException(e));
                return false;
            }
            BasicNewProjectResourceWizard.updatePerspective(this.fConfigElement);
            selectAndReveal(newElement.getProject());

            Display.getDefault().asyncExec(new Runnable() {
                @Override
                public void run() {
                    final IWorkbenchPart activePart = getActivePart();
                    if (activePart instanceof IPackagesViewPart) {
                        final PackageExplorerPart view = PackageExplorerPart.openInActivePerspective();
                        view.tryToReveal(newElement);
                    }
                }
            });
        }
        return res;
    }

    /** Replies the active part in the workbench.
     *
     * @return the active part.
     */
    IWorkbenchPart getActivePart() {
        final IWorkbenchWindow activeWindow = getWorkbench().getActiveWorkbenchWindow();
        if (activeWindow != null) {
            final IWorkbenchPage activePage = activeWindow.getActivePage();
            if (activePage != null) {
                return activePage.getActivePart();
            }
        }
        return null;
    }

    @Override
    protected void handleFinishException(Shell shell, InvocationTargetException exception) {
        final String title = NewWizardMessages.JavaProjectWizard_op_error_title;
        final String message = NewWizardMessages.JavaProjectWizard_op_error_create_message;
        ExceptionHandler.handle(exception, getShell(), title, message);
    }

    @Override
    public void setInitializationData(IConfigurationElement cfig, String propertyName, Object data) {
        this.fConfigElement = cfig;
    }

    @Override
    public boolean performCancel() {
        this.secondPage.performCancel();
        return super.performCancel();
    }

    @Override
    public IJavaProject getCreatedElement() {
        final IJavaProject javaProject = this.secondPage.getJavaProject();

        try {
            // Set the SRE configuration
            final IProject project = javaProject.getProject();
            final ISREInstall sre = this.firstPage.getSRE();
            final boolean useDefaultSRE = sre == null || this.firstPage.isSystemDefaultSRE();
            QualifiedName qn = RuntimeEnvironmentPropertyPage
                    .qualify(RuntimeEnvironmentPropertyPage.PROPERTY_NAME_HAS_PROJECT_SPECIFIC);
            project.setPersistentProperty(qn, Boolean.toString(!useDefaultSRE));
            if (!useDefaultSRE) {
                assert sre != null;
                qn = RuntimeEnvironmentPropertyPage
                        .qualify(RuntimeEnvironmentPropertyPage.PROPERTY_NAME_USE_SYSTEM_WIDE_SRE);
                project.setPersistentProperty(qn, Boolean.FALSE.toString());
                qn = RuntimeEnvironmentPropertyPage
                        .qualify(RuntimeEnvironmentPropertyPage.PROPERTY_NAME_SRE_INSTALL_ID);
                project.setPersistentProperty(qn, sre.getId());
            }
        } catch (Throwable e) {
            throw new RuntimeException(e);
        }

        return javaProject;
    }

}