521181 : ensure utility facet is added to overlays
Signed-off-by: Fred Bricon <fbricon@gmail.com>
diff --git a/org.eclipse.m2e.wtp/src/org/eclipse/m2e/wtp/AbstractProjectConfiguratorDelegate.java b/org.eclipse.m2e.wtp/src/org/eclipse/m2e/wtp/AbstractProjectConfiguratorDelegate.java
index 4cc4c9a..6198984 100644
--- a/org.eclipse.m2e.wtp/src/org/eclipse/m2e/wtp/AbstractProjectConfiguratorDelegate.java
+++ b/org.eclipse.m2e.wtp/src/org/eclipse/m2e/wtp/AbstractProjectConfiguratorDelegate.java
@@ -32,6 +32,7 @@
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jst.common.project.facet.WtpUtils;
import org.eclipse.jst.j2ee.classpathdep.IClasspathDependencyConstants;
import org.eclipse.m2e.core.MavenPlugin;
import org.eclipse.m2e.core.internal.IMavenConstants;
@@ -120,107 +121,7 @@
}
protected void configureWtpUtil(IMavenProjectFacade facade, IProgressMonitor monitor) throws CoreException {
- // Adding utility facet on JEE projects is not allowed
- IProject project = facade.getProject();
- MavenProject mavenProject = facade.getMavenProject();
- if( !WTPProjectsUtil.isJavaProject(facade)
- || WTPProjectsUtil.isJavaEEProject(project)
- || WebFragmentUtil.isQualifiedAsWebFragment(facade)) {
- return;
- }
-
- //MECLIPSEWTP-66 delete extra MANIFEST.MF
- IPath[] sourceRoots = MavenProjectUtils.getSourceLocations(project, mavenProject.getCompileSourceRoots());
- IPath[] resourceRoots = MavenProjectUtils.getResourceLocations(project, mavenProject.getResources());
-
- //MECLIPSEWTP-182 check if the Java Project configurator has been successfully run before doing anything :
- if (!checkJavaConfiguration(project, sourceRoots, resourceRoots)) {
- LOG.warn(NLS.bind(Messages.AbstractProjectConfiguratorDelegate_Error_Inconsistent_Java_Configuration, project.getName()));
- return;
- }
-
- boolean isDebugEnabled = DebugUtilities.isDebugEnabled();
- if (isDebugEnabled) {
- DebugUtilities.debug(DebugUtilities.dumpProjectState("Before configuration ",project)); //$NON-NLS-1$
- }
-
- // 2 - check if the manifest already exists, and its parent folder
-
- IFacetedProject facetedProject = ProjectFacetsManager.create(project, true, monitor);
- Set<Action> actions = new LinkedHashSet<>();
- installJavaFacet(actions, project, facetedProject);
-
- if(!facetedProject.hasProjectFacet(WTPProjectsUtil.UTILITY_FACET)) {
- actions.add(new IFacetedProject.Action(IFacetedProject.Action.Type.INSTALL, WTPProjectsUtil.UTILITY_10, null));
- } else if(!facetedProject.hasProjectFacet(WTPProjectsUtil.UTILITY_10)) {
- actions.add(new IFacetedProject.Action(IFacetedProject.Action.Type.VERSION_CHANGE, WTPProjectsUtil.UTILITY_10,
- null));
- }
-
- if (!actions.isEmpty()) {
- ResourceCleaner fileCleaner = new ResourceCleaner(project);
- try {
- addFoldersToClean(fileCleaner, facade);
- facetedProject.modify(actions, monitor);
- } finally {
- //Remove any unwanted MANIFEST.MF the Facet installation has created
- fileCleaner.cleanUp();
- }
- }
-
- fixMissingModuleCoreNature(project, monitor);
-
- if (isDebugEnabled) {
- DebugUtilities.debug(DebugUtilities.dumpProjectState("after configuration ",project)); //$NON-NLS-1$
- }
- //MNGECLIPSE-904 remove tests folder links for utility jars
- removeTestFolderLinks(project, mavenProject, monitor, "/"); //$NON-NLS-1$
-
- //Remove "library unavailable at runtime" warning.
- if (isDebugEnabled) {
- DebugUtilities.debug(DebugUtilities.dumpProjectState("after removing test folders ",project)); //$NON-NLS-1$
- }
-
- setNonDependencyAttributeToContainer(project, monitor);
-
- WTPProjectsUtil.removeWTPClasspathContainer(project);
- }
-
- /**
- * Checks the maven source folders are correctly added to the project classpath
- */
- private boolean checkJavaConfiguration(IProject project, IPath[] sourceRoots, IPath[] resourceRoots) throws JavaModelException {
- IJavaProject javaProject = JavaCore.create(project);
- if (javaProject == null) {
- return false;
- }
- IClasspathEntry[] cpEntries = javaProject.getRawClasspath();
- if (cpEntries == null) {
- return false;
- }
- Set<IPath> currentPaths = new HashSet<>();
- for (IClasspathEntry entry : cpEntries) {
- if (IClasspathEntry.CPE_SOURCE == entry.getEntryKind()){
- currentPaths.add(entry.getPath().makeRelativeTo(project.getFullPath()));
- }
- }
- for(IPath mavenSource : sourceRoots) {
- if (mavenSource != null && !mavenSource.isEmpty()) {
- IFolder sourceFolder = project.getFolder(mavenSource);
- if (sourceFolder.exists() && !currentPaths.contains(mavenSource)) {
- return false;
- }
- }
- }
- for(IPath mavenSource : resourceRoots) {
- if (mavenSource != null && !mavenSource.isEmpty()) {
- IFolder resourceFolder = project.getFolder(mavenSource);
- if (resourceFolder.exists() && !currentPaths.contains(mavenSource)) {
- return false;
- }
- }
- }
- return true;
+ WTPProjectsUtil.configureWtpUtil(facade, monitor);
}
/**
@@ -326,35 +227,13 @@
}
@Override
-public void setModuleDependencies(IProject project, MavenProject mavenProject, IProgressMonitor monitor)
+ public void setModuleDependencies(IProject project, MavenProject mavenProject, IProgressMonitor monitor)
throws CoreException {
// do nothing
}
protected void addFoldersToClean(ResourceCleaner fileCleaner, IMavenProjectFacade facade) {
- for (IPath p : facade.getCompileSourceLocations()) {
- if (p != null) {
- fileCleaner.addFiles(p.append("META-INF/MANIFEST.MF")); //$NON-NLS-1$
- fileCleaner.addFolder(p);
- }
- }
- for (IPath p : facade.getResourceLocations()) {
- if (p != null) {
- fileCleaner.addFiles(p.append("META-INF/MANIFEST.MF")); //$NON-NLS-1$
- fileCleaner.addFolder(p);
- }
- }
- // add default resource folder
- IPath defaultResource = new Path("src/main/resources"); //$NON-NLS-1$
- fileCleaner.addFiles(defaultResource.append("META-INF/MANIFEST.MF")); //$NON-NLS-1$
- fileCleaner.addFolder(defaultResource);
-
- for (IPath p : facade.getTestCompileSourceLocations()) {
- if (p != null) fileCleaner.addFolder(p);
- }
- for (IPath p : facade.getTestResourceLocations()) {
- if (p != null) fileCleaner.addFolder(p);
- }
+ WTPProjectsUtil.addFoldersToClean(fileCleaner, facade);
}
/**
diff --git a/org.eclipse.m2e.wtp/src/org/eclipse/m2e/wtp/OverlayConfigurator.java b/org.eclipse.m2e.wtp/src/org/eclipse/m2e/wtp/OverlayConfigurator.java
index 021af14..f3eb261 100644
--- a/org.eclipse.m2e.wtp/src/org/eclipse/m2e/wtp/OverlayConfigurator.java
+++ b/org.eclipse.m2e.wtp/src/org/eclipse/m2e/wtp/OverlayConfigurator.java
@@ -97,7 +97,7 @@
if (warComponent == null) {
return;
}
-
+
Set<IVirtualReference> newOverlayRefs = new LinkedHashSet<>();
MavenSessionHelper helper = new MavenSessionHelper(mavenProject);
try {
@@ -119,7 +119,7 @@
if (overlay.shouldSkip()) {
continue;
}
-
+
Artifact artifact = overlay.getArtifact();
IOverlayVirtualComponent overlayComponent = null;
IMavenProjectFacade workspaceDependency = projectManager.getMavenProject(
@@ -134,6 +134,7 @@
if (overlayProject.equals(project)) {
overlayComponent = OverlayComponentCore.createSelfOverlayComponent(project);
} else if (workspaceDependency.getFullPath(artifact.getFile()) != null){
+ WTPProjectsUtil.configureWtpUtil(workspaceDependency, monitor);
overlayComponent = OverlayComponentCore.createOverlayComponent(overlayProject);
} else {
//Dependency resolution is off
@@ -158,9 +159,9 @@
}
IVirtualReference[] oldOverlayRefs = WTPProjectsUtil.extractHardReferences(warComponent, true);
-
+
IVirtualReference[] updatedOverlayRefs = newOverlayRefs.toArray(new IVirtualReference[newOverlayRefs.size()]);
-
+
if (WTPProjectsUtil.hasChanged2(oldOverlayRefs, updatedOverlayRefs)){
//Only write in the .component file if necessary
IVirtualReference[] nonOverlayRefs = WTPProjectsUtil.extractHardReferences(warComponent, false);
diff --git a/org.eclipse.m2e.wtp/src/org/eclipse/m2e/wtp/WTPProjectsUtil.java b/org.eclipse.m2e.wtp/src/org/eclipse/m2e/wtp/WTPProjectsUtil.java
index 340aa8e..1f758cc 100644
--- a/org.eclipse.m2e.wtp/src/org/eclipse/m2e/wtp/WTPProjectsUtil.java
+++ b/org.eclipse.m2e.wtp/src/org/eclipse/m2e/wtp/WTPProjectsUtil.java
@@ -11,7 +11,9 @@
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -48,6 +50,7 @@
import org.eclipse.m2e.core.project.configurator.AbstractProjectConfigurator;
import org.eclipse.m2e.jdt.internal.MavenClasspathHelpers;
import org.eclipse.m2e.wtp.internal.Messages;
+import org.eclipse.m2e.wtp.internal.utilities.DebugUtilities;
import org.eclipse.m2e.wtp.internal.webfragment.WebFragmentUtil;
import org.eclipse.m2e.wtp.overlay.modulecore.IOverlayVirtualComponent;
import org.eclipse.osgi.util.NLS;
@@ -687,5 +690,137 @@
}
}
return id.equals(lastConfigurator);
- }
+ }
+
+
+ public static void configureWtpUtil(IMavenProjectFacade facade, IProgressMonitor monitor) throws CoreException {
+ // Adding utility facet on JEE projects is not allowed
+ IProject project = facade.getProject();
+ MavenProject mavenProject = facade.getMavenProject();
+ if( !WTPProjectsUtil.isJavaProject(facade)
+ || WTPProjectsUtil.isJavaEEProject(project)
+ || WebFragmentUtil.isQualifiedAsWebFragment(facade)) {
+ return;
+ }
+
+ //MECLIPSEWTP-66 delete extra MANIFEST.MF
+ IPath[] sourceRoots = MavenProjectUtils.getSourceLocations(project, mavenProject.getCompileSourceRoots());
+ IPath[] resourceRoots = MavenProjectUtils.getResourceLocations(project, mavenProject.getResources());
+
+ //MECLIPSEWTP-182 check if the Java Project configurator has been successfully run before doing anything :
+ if (!checkJavaConfiguration(project, sourceRoots, resourceRoots)) {
+ LOG.warn(NLS.bind(Messages.AbstractProjectConfiguratorDelegate_Error_Inconsistent_Java_Configuration, project.getName()));
+ return;
+ }
+
+ boolean isDebugEnabled = DebugUtilities.isDebugEnabled();
+ if (isDebugEnabled) {
+ DebugUtilities.debug(DebugUtilities.dumpProjectState("Before configuration ",project)); //$NON-NLS-1$
+ }
+
+ // 2 - check if the manifest already exists, and its parent folder
+
+ IFacetedProject facetedProject = ProjectFacetsManager.create(project, true, monitor);
+ Set<Action> actions = new LinkedHashSet<>();
+ installJavaFacet(actions, project, facetedProject);
+
+ if(!facetedProject.hasProjectFacet(WTPProjectsUtil.UTILITY_FACET)) {
+ actions.add(new IFacetedProject.Action(IFacetedProject.Action.Type.INSTALL, WTPProjectsUtil.UTILITY_10, null));
+ } else if(!facetedProject.hasProjectFacet(WTPProjectsUtil.UTILITY_10)) {
+ actions.add(new IFacetedProject.Action(IFacetedProject.Action.Type.VERSION_CHANGE, WTPProjectsUtil.UTILITY_10,
+ null));
+ }
+
+ if (!actions.isEmpty()) {
+ ResourceCleaner fileCleaner = new ResourceCleaner(project);
+ try {
+ addFoldersToClean(fileCleaner, facade);
+ facetedProject.modify(actions, monitor);
+ } finally {
+ //Remove any unwanted MANIFEST.MF the Facet installation has created
+ fileCleaner.cleanUp();
+ }
+ }
+
+ fixMissingModuleCoreNature(project, monitor);
+
+ if (isDebugEnabled) {
+ DebugUtilities.debug(DebugUtilities.dumpProjectState("after configuration ",project)); //$NON-NLS-1$
+ }
+ //MNGECLIPSE-904 remove tests folder links for utility jars
+ removeTestFolderLinks(project, mavenProject, monitor, "/"); //$NON-NLS-1$
+
+ //Remove "library unavailable at runtime" warning.
+ if (isDebugEnabled) {
+ DebugUtilities.debug(DebugUtilities.dumpProjectState("after removing test folders ",project)); //$NON-NLS-1$
+ }
+
+ setNonDependencyAttributeToContainer(project, monitor);
+
+ WTPProjectsUtil.removeWTPClasspathContainer(project);
+ }
+
+ public static void addFoldersToClean(ResourceCleaner fileCleaner, IMavenProjectFacade facade) {
+ for (IPath p : facade.getCompileSourceLocations()) {
+ if (p != null) {
+ fileCleaner.addFiles(p.append("META-INF/MANIFEST.MF")); //$NON-NLS-1$
+ fileCleaner.addFolder(p);
+ }
+ }
+ for (IPath p : facade.getResourceLocations()) {
+ if (p != null) {
+ fileCleaner.addFiles(p.append("META-INF/MANIFEST.MF")); //$NON-NLS-1$
+ fileCleaner.addFolder(p);
+ }
+ }
+ // add default resource folder
+ IPath defaultResource = new Path("src/main/resources"); //$NON-NLS-1$
+ fileCleaner.addFiles(defaultResource.append("META-INF/MANIFEST.MF")); //$NON-NLS-1$
+ fileCleaner.addFolder(defaultResource);
+
+ for (IPath p : facade.getTestCompileSourceLocations()) {
+ if (p != null) fileCleaner.addFolder(p);
+ }
+ for (IPath p : facade.getTestResourceLocations()) {
+ if (p != null) fileCleaner.addFolder(p);
+ }
+ }
+
+ /**
+ * Checks the maven source folders are correctly added to the project classpath
+ */
+ private static boolean checkJavaConfiguration(IProject project, IPath[] sourceRoots, IPath[] resourceRoots) throws JavaModelException {
+ IJavaProject javaProject = JavaCore.create(project);
+ if (javaProject == null) {
+ return false;
+ }
+ IClasspathEntry[] cpEntries = javaProject.getRawClasspath();
+ if (cpEntries == null) {
+ return false;
+ }
+ Set<IPath> currentPaths = new HashSet<>();
+ for (IClasspathEntry entry : cpEntries) {
+ if (IClasspathEntry.CPE_SOURCE == entry.getEntryKind()){
+ currentPaths.add(entry.getPath().makeRelativeTo(project.getFullPath()));
+ }
+ }
+ for(IPath mavenSource : sourceRoots) {
+ if (mavenSource != null && !mavenSource.isEmpty()) {
+ IFolder sourceFolder = project.getFolder(mavenSource);
+ if (sourceFolder.exists() && !currentPaths.contains(mavenSource)) {
+ return false;
+ }
+ }
+ }
+ for(IPath mavenSource : resourceRoots) {
+ if (mavenSource != null && !mavenSource.isEmpty()) {
+ IFolder resourceFolder = project.getFolder(mavenSource);
+ if (resourceFolder.exists() && !currentPaths.contains(mavenSource)) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
}