org.eclipse.jst.j2ee.project.facet.J2EEFacetInstallDelegate.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.jst.j2ee.project.facet.J2EEFacetInstallDelegate.java

Source

/*******************************************************************************
 * Copyright (c) 2003, 2013 IBM Corporation and others.
 * 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:
 * IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.j2ee.project.facet;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Collections;
import java.util.List;
import java.util.Map;

import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jem.util.UIContextDetermination;
import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
import org.eclipse.jst.j2ee.application.internal.operations.AddComponentToEnterpriseApplicationDataModelProvider;
import org.eclipse.jst.j2ee.application.internal.operations.IAddComponentToEnterpriseApplicationDataModelProperties;
import org.eclipse.jst.j2ee.internal.J2EEConstants;
import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
import org.eclipse.jst.j2ee.internal.project.ManifestFileCreationAction;
import org.eclipse.wst.common.componentcore.ComponentCore;
import org.eclipse.wst.common.componentcore.datamodel.properties.ICreateReferenceComponentsDataModelProperties;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
import org.eclipse.wst.common.internal.emf.resource.RendererFactory;
import org.eclipse.wst.common.project.facet.core.FacetedProjectFramework;
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.runtime.IRuntime;
import org.eclipse.wst.common.project.facet.core.runtime.IRuntimeComponent;
import org.eclipse.wst.web.internal.facet.RuntimePresetMappingRegistry;

public abstract class J2EEFacetInstallDelegate {

    protected static void addToClasspath(final IJavaProject jproj, final IClasspathEntry entry)
            throws CoreException {
        final IClasspathEntry[] existingEntries = jproj.getRawClasspath();
        for (IClasspathEntry existingEntry : existingEntries) {
            if (existingEntry.getPath().equals(entry.getPath())) { // see bug 423742
                return;
            }
        }
        final IClasspathEntry[] updated = new IClasspathEntry[existingEntries.length + 1];
        System.arraycopy(existingEntries, 0, updated, 0, existingEntries.length);
        updated[existingEntries.length] = entry;
        jproj.setRawClasspath(updated, null);
    }

    protected void installEARFacet(final String j2eeVersionText, final String earProjectName,
            final IRuntime runtime, final IProgressMonitor monitor) {
        IProject project = ProjectUtilities.getProject(earProjectName);
        if (project.exists())
            return;

        IFacetedProjectWorkingCopy fpjwc = null;
        try {
            fpjwc = FacetedProjectFramework.createNewProject();

            fpjwc.setProjectName(earProjectName);

            if (runtime != null) {
                fpjwc.setTargetedRuntimes(Collections.singleton(runtime));
            }

            fpjwc.setFixedProjectFacets(Collections.singleton(IJ2EEFacetConstants.ENTERPRISE_APPLICATION_FACET));
            fpjwc.setSelectedPreset(FacetedProjectFramework.DEFAULT_CONFIGURATION_PRESET_ID);

            if (j2eeVersionText != null) {
                final IProjectFacetVersion defaultEarFacetVersion = fpjwc
                        .getProjectFacetVersion(IJ2EEFacetConstants.ENTERPRISE_APPLICATION_FACET);

                if (!defaultEarFacetVersion.getVersionString().equals(j2eeVersionText)) {
                    String presetId = null;

                    if (runtime != null) {
                        for (IRuntimeComponent rc : runtime.getRuntimeComponents()) {
                            presetId = RuntimePresetMappingRegistry.INSTANCE.getPresetID(
                                    rc.getRuntimeComponentType().getId(),
                                    rc.getRuntimeComponentVersion().getVersionString(),
                                    IJ2EEFacetConstants.ENTERPRISE_APPLICATION_FACET.getId(), j2eeVersionText);

                            if (presetId != null) {
                                break;
                            }
                        }
                    }

                    final IProjectFacetVersion earFacetVersion = IJ2EEFacetConstants.ENTERPRISE_APPLICATION_FACET
                            .getVersion(j2eeVersionText);

                    // Note that the next call is necessary even if a preset is going to be selected 
                    // later since it allows the dynamic preset to adjust for the ear facet version.

                    fpjwc.setProjectFacets(Collections.singleton(earFacetVersion));

                    if (presetId != null) {
                        fpjwc.setSelectedPreset(presetId);
                    }
                }
            }

            try {
                fpjwc.commitChanges(null);
            } catch (CoreException e) {
                J2EEPlugin.logError(e);
            }
        } finally {
            if (fpjwc != null) {
                fpjwc.dispose();
            }
        }
    }

    protected void createManifest(IProject project, IContainer aFolder, IProgressMonitor monitor)
            throws CoreException, InvocationTargetException, InterruptedException {

        IFile file = aFolder.getFile(new Path(J2EEConstants.MANIFEST_URI));
        if (file.exists())
            return;
        try {
            ManifestFileCreationAction.createManifestFile(file, project);
        } catch (CoreException e) {
            J2EEPlugin.logError(e);
        } catch (IOException e) {
            J2EEPlugin.logError(e);
        }
    }

    protected void addToEar(IVirtualComponent earComp, IVirtualComponent j2eeComp, String moduleURI) {
        final IDataModel dataModel = DataModelFactory
                .createDataModel(new AddComponentToEnterpriseApplicationDataModelProvider());
        Map map = (Map) dataModel
                .getProperty(IAddComponentToEnterpriseApplicationDataModelProperties.TARGET_COMPONENTS_TO_URI_MAP);
        map.put(j2eeComp, moduleURI);

        dataModel.setProperty(ICreateReferenceComponentsDataModelProperties.SOURCE_COMPONENT, earComp);

        List modList = (List) dataModel
                .getProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST);
        modList.add(j2eeComp);
        dataModel.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST, modList);
        try {
            dataModel.getDefaultOperation().execute(null, null);
        } catch (ExecutionException e) {
            J2EEPlugin.logError(e);
        }
    }

    protected void installAndAddModuletoEAR(String j2eeVersionText, String earProjectName, IRuntime runtime,
            IProject moduleProject, String moduleURI, IProgressMonitor monitor) {

        installEARFacet(j2eeVersionText, earProjectName, runtime, monitor);

        final IVirtualComponent c = ComponentCore.createComponent(moduleProject);
        final IProject earProject = ProjectUtilities.getProject(earProjectName);
        final IVirtualComponent earComp = ComponentCore.createComponent(earProject);

        if (UIContextDetermination.getCurrentContext() == UIContextDetermination.HEADLESS_CONTEXT) {
            boolean isValidating = RendererFactory.getDefaultRendererFactory().isValidating();
            try {
                if (isValidating) {
                    RendererFactory.getDefaultRendererFactory().setValidating(false);
                }
                addToEar(earComp, c, moduleURI);
            } finally {
                RendererFactory.getDefaultRendererFactory().setValidating(isValidating);
            }
        } else
            addToEar(earComp, c, moduleURI);
    }

    /**
     * This method will set the output property on the model element for the given component.
     * 
     * @param model
     * @param component
     */
    protected void setOutputFolder(IDataModel model, IVirtualComponent component) {
        IJavaProject javaProject = JavaCore.create(component.getProject());
        IPath currentDefaultOutput = null;
        try {
            currentDefaultOutput = javaProject.getOutputLocation();
            component.setMetaProperty("java-output-path", currentDefaultOutput.toString()); //$NON-NLS-1$         
        } catch (JavaModelException e) {
            org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin.logError(e);
        }
    }

}