org.jboss.tools.jsf.ui.internal.handlers.AddJSFNatureHandler.java Source code

Java tutorial

Introduction

Here is the source code for org.jboss.tools.jsf.ui.internal.handlers.AddJSFNatureHandler.java

Source

/*******************************************************************************
 * Copyright (c) 2007-2013 Red Hat, Inc.
 * Distributed under license by Red Hat, Inc. All rights reserved.
 * This program is 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:
 *     Red Hat, Inc. - initial API and implementation
 ******************************************************************************/
package org.jboss.tools.jsf.ui.internal.handlers;

import java.util.Set;

import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.preference.PreferenceDialog;
import org.eclipse.jface.wizard.IWizard;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.PreferencesUtil;
import org.eclipse.wst.common.project.facet.core.IFacetedProject;
import org.eclipse.wst.common.project.facet.core.IFacetedProjectWorkingCopy;
import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
import org.eclipse.wst.common.project.facet.ui.internal.ConvertProjectToFacetedFormRunnable;
import org.eclipse.wst.common.project.facet.ui.internal.FacetsPropertyPage;
import org.eclipse.wst.common.project.facet.ui.internal.SharedWorkingCopyManager;
import org.jboss.tools.common.meta.key.WizardKeys;
import org.jboss.tools.common.model.ui.ModelUIPlugin;
import org.jboss.tools.common.model.ui.internal.handlers.AddNatureHandler;
import org.jboss.tools.common.model.ui.util.ExtensionPointUtils;
import org.jboss.tools.common.model.util.EclipseResourceUtil;
import org.jboss.tools.jsf.JSFModelPlugin;
import org.jboss.tools.jsf.project.JSFNature;
import org.jboss.tools.jsf.ui.JsfUiPlugin;
import org.jboss.tools.jsf.ui.wizard.project.ImportProjectWizard;
import org.jboss.tools.jst.web.WebModelPlugin;
import org.jboss.tools.jst.web.kb.internal.KbBuilder;
import org.jboss.tools.jst.web.kb.internal.KbProject;

public class AddJSFNatureHandler extends AddNatureHandler {
    boolean showDialog = true;

    public AddJSFNatureHandler() {
    }

    public AddJSFNatureHandler(boolean showDialog) {
        this.showDialog = showDialog;
    }

    protected IWizard getWizard(IProject project) {
        ImportProjectWizard wizard = (ImportProjectWizard) ExtensionPointUtils.findImportWizardsItem(
                JSFModelPlugin.PLUGIN_ID, "org.jboss.tools.jsf.ui.wizard.project.ImportProjectWizard" //$NON-NLS-1$
        );
        if (wizard == null)
            throw new IllegalArgumentException(
                    "Wizard org.jboss.tools.common.model.ui.wizards.ImportProjectWizard is not found."); //$NON-NLS-1$
        wizard.setInitialName(project.getName());
        wizard.setInitialLocation(findWebXML(project.getLocation().toString()));
        wizard.init(ModelUIPlugin.getDefault().getWorkbench(), null);
        wizard.setWindowTitle(WizardKeys.getString("ADD_JSF_NATURE")); //$NON-NLS-1$
        return wizard;
    }

    protected String getNatureID() {
        return JSFNature.NATURE_ID;
    }

    public Object execute(ExecutionEvent event) throws ExecutionException {
        findSelectedProject(event);
        ConvertProjectToFacetedFormRunnable
                .runInProgressDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), project);
        addJSFNature(project, showDialog);
        return null;
    }

    /**
     * Convenience method that adds JBoss Tools JSF nature to the project.
     * These are the limitations for the use of the method.
     * 1) It should be run from UI thread.
     * 2) It should be run on a faceted project.
     * 
     * @param project
     * @param showDialog
     */
    public static void addJSFNature(IProject project, boolean showDialog) {
        IFacetedProject fp = null;
        try {
            fp = ProjectFacetsManager.create(project);
            IFacetedProjectWorkingCopy wc = SharedWorkingCopyManager.getWorkingCopy(fp);
            Set<IProjectFacetVersion> vs = wc.getProjectFacets();

            IProjectFacetVersion web = null;
            IProjectFacetVersion jsf = null;

            for (IProjectFacetVersion v : vs) {
                String id = v.getProjectFacet().getId();
                if ("jst.web".equals(id)) { //$NON-NLS-1$
                    web = v;
                } else if ("jst.jsf".equals(id)) { //$NON-NLS-1$
                    jsf = v;
                }
            }

            if (web != null && jsf != null && wc.validate().isOK()) {
                WebModelPlugin.addNatureToProjectWithValidationSupport(project, KbBuilder.BUILDER_ID,
                        KbProject.NATURE_ID);
                EclipseResourceUtil.addNatureToProject(project, JSFNature.NATURE_ID);
                return;
            }

            if (web == null) {
                web = ProjectFacetsManager.getProjectFacet("jst.web").getLatestVersion(); //$NON-NLS-1$
                wc.addProjectFacet(web);
            }

            String webVersion = web.getVersionString();
            if ("2.2".equals(webVersion)) { //$NON-NLS-1$
                web = ProjectFacetsManager.getProjectFacet("jst.web").getVersion("2.3"); //$NON-NLS-1$ //$NON-NLS-2$
                wc.changeProjectFacetVersion(web);
                webVersion = web.getVersionString();
            }
            if (jsf == null) {
                jsf = ProjectFacetsManager.getProjectFacet("jst.jsf").getLatestVersion(); //$NON-NLS-1$
                if ("2.3".equals(webVersion) || "2.4".equals(webVersion)) { //$NON-NLS-1$ //$NON-NLS-2$
                    jsf = ProjectFacetsManager.getProjectFacet("jst.jsf").getVersion("1.1"); //$NON-NLS-1$ //$NON-NLS-2$
                }
                wc.addProjectFacet(jsf);
            }

            if (!showDialog) {
                IProjectFacetVersion latestJava = ProjectFacetsManager.getProjectFacet("java").getLatestVersion(); //$NON-NLS-1$
                wc.changeProjectFacetVersion(latestJava);

                wc.commitChanges(new NullProgressMonitor());
            } else {
                PreferenceDialog dialog = PreferencesUtil.createPropertyDialogOn(
                        PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), project,
                        FacetsPropertyPage.ID, new String[] { FacetsPropertyPage.ID }, null);
                dialog.open();
            }
        } catch (CoreException e) {
            JsfUiPlugin.getDefault().logError(e);
        } finally {
            if (fp != null) {
                SharedWorkingCopyManager.releaseWorkingCopy(fp);
            }
        }
    }
}