blob: 5abbc8cb68dff4e2c696d3d537ffcf693143456b [file] [log] [blame]
/*******************************************************************************
* 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;
}
}