org.eclipse.jst.ws.internal.consumption.ui.common.FacetOperationDelegate.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.jst.ws.internal.consumption.ui.common.FacetOperationDelegate.java

Source

/*******************************************************************************
 * Copyright (c) 2009 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
 * yyyymmdd bug      Email and other contact information
 * -------- -------- -----------------------------------------------------------
 * 20090303   242635 mahutch@ca.ibm.com - Mark Hutchinson, Remove unnecessary UI dependencies from org.eclipse.jst.ws.consumption
 * 20090819   286874 zina@ca.ibm.com - Zina Mostafia
 *******************************************************************************/
package org.eclipse.jst.ws.internal.consumption.ui.common;

import java.lang.reflect.InvocationTargetException;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

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.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jst.ws.internal.common.J2EEUtils;
import org.eclipse.jst.ws.internal.consumption.ConsumptionMessages;
import org.eclipse.jst.ws.internal.consumption.common.FacetUtils;
import org.eclipse.jst.ws.internal.consumption.common.IFacetOperationDelegate;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PlatformUI;
import org.eclipse.wst.command.internal.env.core.common.StatusUtils;
import org.eclipse.wst.common.project.facet.core.IFacetedProject;
import org.eclipse.wst.common.project.facet.core.IProjectFacet;
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.core.runtime.IRuntime;
import org.osgi.framework.Bundle;

public class FacetOperationDelegate implements IFacetOperationDelegate {

    public IStatus addFacetsToProject(final IFacetedProject fproject, final Set projectFacetVersions) {
        final IStatus[] status = new IStatus[1];
        status[0] = Status.OK_STATUS;
        final Set actions = FacetUtils.getInstallActions(projectFacetVersions);

        // Create a runnable that applies the install actions to the faceted project
        IRunnableWithProgress runnable = new IRunnableWithProgress() {
            public void run(IProgressMonitor shellMonitor) throws InvocationTargetException, InterruptedException {
                try {
                    fproject.modify(actions, shellMonitor);
                    fixEJBClassPath(fproject);
                } catch (CoreException e) {
                    status[0] = getErrorStatusForAddingFacets(fproject.getProject().getName(), projectFacetVersions,
                            e);
                }
            }
        };

        // Run the runnable in another thread unless there is no UI thread (Ant scenarios)
        if (displayPresent()) {
            try {
                PlatformUI.getWorkbench().getProgressService().run(true, false, runnable);
            } catch (InvocationTargetException ite) {
                status[0] = getErrorStatusForAddingFacets(fproject.getProject().getName(), projectFacetVersions,
                        ite);
            } catch (InterruptedException ie) {
                status[0] = getErrorStatusForAddingFacets(fproject.getProject().getName(), projectFacetVersions,
                        ie);
            }
        } else {
            try {
                fproject.modify(actions, null);
                fixEJBClassPath(fproject);
            } catch (CoreException e) {
                status[0] = getErrorStatusForAddingFacets(fproject.getProject().getName(), projectFacetVersions, e);
            }
        }

        return status[0];
    }

    private void fixEJBClassPath(IFacetedProject project) {
        if (!J2EEUtils.isEJBComponent(project.getProject()))
            return;
        IProject ejbProject = project.getProject();
        IJavaProject javaProject = JavaCore.create(ejbProject);
        Path projectRoot = new Path(Path.ROOT.append(new Path(ejbProject.getName())).toString());
        IPath ejbModulePath = projectRoot.append("ejbModule");
        try {
            IClasspathEntry[] originalSet = javaProject.getRawClasspath();
            boolean foundEJBModulEntry = false;
            for (IClasspathEntry entry : originalSet) {
                if (entry.getPath().equals(ejbModulePath))
                    foundEJBModulEntry = true;
            }
            if (!foundEJBModulEntry) {
                IClasspathEntry[] newSet = new IClasspathEntry[originalSet.length + 1];
                int i = 0;

                for (IClasspathEntry entry : originalSet) {
                    newSet[i++] = entry;
                }
                newSet[i] = JavaCore.newSourceEntry(ejbModulePath);
                javaProject.setRawClasspath(newSet, null);
            }
        } catch (Exception e) {
            // TODO: handle exception
        }

    }

    public IStatus createNewFacetedProject(final String projectName) {
        final IStatus[] status = new IStatus[1];
        status[0] = Status.OK_STATUS;
        IProject project = ProjectUtilities.getProject(projectName);
        if (!project.exists()) {
            // Create a runnable that creates a new faceted project.
            IRunnableWithProgress runnable = new IRunnableWithProgress() {
                public void run(IProgressMonitor shellMonitor)
                        throws InvocationTargetException, InterruptedException {
                    try {
                        IFacetedProject fProject = ProjectFacetsManager.create(projectName, null, shellMonitor);
                        if (fProject == null) {
                            status[0] = StatusUtils.errorStatus(NLS.bind(
                                    ConsumptionMessages.MSG_ERROR_PROJECT_CREATION, new String[] { projectName }));
                        }
                    } catch (CoreException e) {
                        status[0] = StatusUtils.errorStatus(NLS.bind(ConsumptionMessages.MSG_ERROR_PROJECT_CREATION,
                                new String[] { projectName }), e);
                    }
                }
            };

            // Run the runnable in another thread unless there is no UI thread (Ant scenarios)
            try {
                if (displayPresent()) {
                    PlatformUI.getWorkbench().getProgressService().run(true, false, runnable);
                } else {
                    try {
                        IFacetedProject fProject = ProjectFacetsManager.create(projectName, null, null);
                        if (fProject == null) {
                            status[0] = StatusUtils.errorStatus(NLS.bind(
                                    ConsumptionMessages.MSG_ERROR_PROJECT_CREATION, new String[] { projectName }));
                        }
                    } catch (CoreException e) {
                        status[0] = StatusUtils.errorStatus(NLS.bind(ConsumptionMessages.MSG_ERROR_PROJECT_CREATION,
                                new String[] { projectName }), e);
                    }
                }
            } catch (InvocationTargetException ite) {
                status[0] = StatusUtils.errorStatus(
                        NLS.bind(ConsumptionMessages.MSG_ERROR_PROJECT_CREATION, new String[] { projectName }),
                        ite);
            } catch (InterruptedException ie) {
                status[0] = StatusUtils.errorStatus(
                        NLS.bind(ConsumptionMessages.MSG_ERROR_PROJECT_CREATION, new String[] { projectName }), ie);
            }
        }

        return status[0];
    }

    public IStatus setFacetRuntimeOnProject(final IFacetedProject fProject, final IRuntime fRuntime) {
        final IStatus[] status = new IStatus[1];
        status[0] = Status.OK_STATUS;

        // Create a runnable that sets the facet runtime on the faceted project
        IRunnableWithProgress runnable = new IRunnableWithProgress() {
            public void run(IProgressMonitor shellMonitor) throws InvocationTargetException, InterruptedException {
                try {
                    fProject.setTargetedRuntimes(Collections.singleton(fRuntime), shellMonitor);
                } catch (CoreException e) {
                    status[0] = StatusUtils.errorStatus(NLS.bind(ConsumptionMessages.MSG_ERROR_SETTING_RUNTIME,
                            new String[] { fProject.getProject().getName(), fRuntime.getName() }), e);
                }
            }
        };

        // Run the runnable in another thread unless there is no UI thread (Ant scenarios)
        if (displayPresent()) {
            try {
                PlatformUI.getWorkbench().getProgressService().run(true, false, runnable);
            } catch (InvocationTargetException ite) {
                status[0] = StatusUtils.errorStatus(NLS.bind(ConsumptionMessages.MSG_ERROR_SETTING_RUNTIME,
                        new String[] { fProject.getProject().getName(), fRuntime.getName() }), ite);
            } catch (InterruptedException ie) {
                status[0] = StatusUtils.errorStatus(NLS.bind(ConsumptionMessages.MSG_ERROR_SETTING_RUNTIME,
                        new String[] { fProject.getProject().getName(), fRuntime.getName() }), ie);
            }
        } else {
            try {
                fProject.setTargetedRuntimes(Collections.singleton(fRuntime), null);

            } catch (CoreException e) {
                status[0] = StatusUtils.errorStatus(NLS.bind(ConsumptionMessages.MSG_ERROR_SETTING_RUNTIME,
                        new String[] { fProject.getProject().getName(), fRuntime.getName() }), e);
            }
        }

        return status[0];
    }

    public IStatus setFixedFacetsOnProject(final IFacetedProject fProject, final Set fixedFacets) {
        final IStatus[] status = new IStatus[1];
        status[0] = Status.OK_STATUS;

        // Create a runnable that sets the fixed facets on the faceted project
        IRunnableWithProgress runnable = new IRunnableWithProgress() {
            public void run(IProgressMonitor shellMonitor) throws InvocationTargetException, InterruptedException {
                try {
                    fProject.setFixedProjectFacets(fixedFacets);
                } catch (CoreException e) {
                    status[0] = getErrorStatusForSettingFixedFacets(fProject.getProject().getName(), fixedFacets,
                            e);
                }
            }
        };

        // Run the runnable in another thread unless there is no UI thread (Ant scenarios)
        if (displayPresent()) {
            try {
                PlatformUI.getWorkbench().getProgressService().run(true, false, runnable);
            } catch (InvocationTargetException ite) {
                status[0] = getErrorStatusForSettingFixedFacets(fProject.getProject().getName(), fixedFacets, ite);
            } catch (InterruptedException ie) {
                status[0] = getErrorStatusForSettingFixedFacets(fProject.getProject().getName(), fixedFacets, ie);
            }
        } else {
            try {
                fProject.setFixedProjectFacets(fixedFacets);
            } catch (CoreException e) {
                status[0] = getErrorStatusForSettingFixedFacets(fProject.getProject().getName(), fixedFacets, e);
            }
        }

        return status[0];
    }

    // Check to see if SWT is active and the Display is present or not
    private static boolean displayPresent() {
        Bundle b = Platform.getBundle("org.eclipse.swt");
        if (b == null) {
            return false;
        }
        if ((b.getState() != Bundle.RESOLVED && b.getState() != Bundle.ACTIVE)) {
            return false;
        }
        try {
            if (Display.getCurrent() == null) {
                return false;
            } else {
                return true;
            }
        } catch (NoClassDefFoundError e1) {
            return false;
        } catch (Exception e) {
            // if the Display class cannot be loaded for whatever reason
            return false;

        }
    }

    // the following private methods had to be copied from FacetUtils
    /**
     * Returns a translatable delimited list of facet labels derived from the
     * provided set of facets
     * 
     * @param facets
     *            a set containing elements of type {@link IProjectFacet}
     * @return String a delimited list of facet labels
     */
    private static String getFacetListMessageString(Set facets) {
        String facetListMessage = "";
        int size = facets.size();
        if (size > 0) {
            Iterator itr = facets.iterator();
            IProjectFacet firstProjectFacet = (IProjectFacet) itr.next();
            facetListMessage = firstProjectFacet.getLabel();

            // Continue appending to facetListMessage until all the facet labels
            // are in the list.
            while (itr.hasNext()) {
                IProjectFacet projectFacet = (IProjectFacet) itr.next();
                String pfLabel = projectFacet.getLabel();
                facetListMessage = NLS.bind(ConsumptionMessages.MSG_FACETS,
                        new String[] { facetListMessage, pfLabel });
            }
        }

        return facetListMessage;
    }

    /**
     * Returns an error status indicating that the facets could not be set as
     * fixed facets on the faceted project
     * 
     * @param projectName
     *            a project name to insert in the error message in the IStatus
     * @param facets
     *            a set containing elements of type {@link IProjectFacet}. The
     *            facets in this set will be listed in the error message in the
     *            IStatus.
     * @param t
     *            a Throwable which will be inserted in the IStatus
     * @return an IStatus with severity IStatus.ERROR
     */
    private static IStatus getErrorStatusForSettingFixedFacets(String projectName, Set facets, Throwable t) {
        IStatus status = Status.OK_STATUS;
        int size = facets.size();
        if (size > 0) {
            String facetList = getFacetListMessageString(facets);
            status = StatusUtils.errorStatus(
                    NLS.bind(ConsumptionMessages.MSG_ERROR_FIXED_FACETS, new String[] { projectName, facetList }),
                    t);
        }

        return status;
    }

    /**
     * Returns an error status indicating that the facet versions could not be
     * added to the faceted project
     * 
     * @param projectName
     *            a project name to insert in the error message in the IStatus
     * @param projectFacetVersions
     *            a set containing elements of type {@link IProjectFacetVersion}
     *            . The facets in this set will be listed in the error message
     *            in the IStatus.
     * @param t
     *            a Throwable which will be inserted in the IStatus
     * @return an IStatus with severity IStatus.ERROR
     */
    private static IStatus getErrorStatusForAddingFacets(String projectName, Set projectFacetVersions,
            Throwable t) {
        IStatus status = Status.OK_STATUS;
        int size = projectFacetVersions.size();
        if (size > 0) {
            Set facets = new HashSet();
            // Iterate over projectFacetVersions to form a set of IProjectFacets
            Iterator itr = projectFacetVersions.iterator();
            while (itr.hasNext()) {
                IProjectFacetVersion projectFacet = (IProjectFacetVersion) itr.next();
                IProjectFacet facet = projectFacet.getProjectFacet();
                facets.add(facet);
            }
            String facetList = getFacetListMessageString(facets);
            status = StatusUtils.errorStatus(NLS.bind(ConsumptionMessages.MSG_ERROR_ADDING_FACETS_TO_PROJECT,
                    new String[] { projectName, facetList }), t);
        }

        return status;
    }

}