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;
+  }
+
 }