[581877] Optionally consider package requirements for TP minimization

https://bugs.eclipse.org/bugs/show_bug.cgi?id=581877
diff --git a/plugins/org.eclipse.oomph.p2.core/src/org/eclipse/oomph/p2/internal/core/RootAnalyzer.java b/plugins/org.eclipse.oomph.p2.core/src/org/eclipse/oomph/p2/internal/core/RootAnalyzer.java
index d97645e..999803e 100644
--- a/plugins/org.eclipse.oomph.p2.core/src/org/eclipse/oomph/p2/internal/core/RootAnalyzer.java
+++ b/plugins/org.eclipse.oomph.p2.core/src/org/eclipse/oomph/p2/internal/core/RootAnalyzer.java
@@ -66,24 +66,37 @@
 
   public static void removeImplicitUnits(Map<IMetadataRepository, Set<IInstallableUnit>> result, IProgressMonitor monitor, boolean onlyIfRedundant)
   {
+    removeImplicitUnits(result, monitor, onlyIfRedundant, true);
+
+  }
+
+  public static void removeImplicitUnits(Map<IMetadataRepository, Set<IInstallableUnit>> result, IProgressMonitor monitor, boolean onlyIfRedundant,
+      boolean ignoreJavaRequirements)
+  {
     for (Map.Entry<IMetadataRepository, Set<IInstallableUnit>> entry : result.entrySet())
     {
       IMetadataRepository metadataRepository = entry.getKey();
       Set<IInstallableUnit> ius = entry.getValue();
 
-      removeImplicitUnits(ius, metadataRepository, monitor, onlyIfRedundant);
+      removeImplicitUnits(ius, metadataRepository, monitor, onlyIfRedundant, ignoreJavaRequirements);
     }
   }
 
   public static void removeImplicitUnits(Set<IInstallableUnit> ius, IQueryable<IInstallableUnit> queryable, IProgressMonitor monitor, boolean onlyIfRedundant)
   {
+    removeImplicitUnits(ius, queryable, monitor, onlyIfRedundant, true);
+  }
+
+  public static void removeImplicitUnits(Set<IInstallableUnit> ius, IQueryable<IInstallableUnit> queryable, IProgressMonitor monitor, boolean onlyIfRedundant,
+      boolean ignoreJavaRequirements)
+  {
     Set<IInstallableUnit> rootIUs = new HashSet<>(ius);
     Set<IInstallableUnit> currentlyVisitingIUs = new HashSet<>();
     Set<IInstallableUnit> visitedIUs = new HashSet<>();
 
     for (IInstallableUnit iu : ius)
     {
-      removeImplicitUnits(iu, rootIUs, currentlyVisitingIUs, visitedIUs, queryable, monitor, onlyIfRedundant);
+      removeImplicitUnits(iu, rootIUs, currentlyVisitingIUs, visitedIUs, queryable, monitor, onlyIfRedundant, ignoreJavaRequirements);
     }
 
     if (rootIUs.size() < ius.size())
@@ -93,14 +106,15 @@
   }
 
   private static void removeImplicitUnits(IInstallableUnit iu, Set<IInstallableUnit> rootIUs, Set<IInstallableUnit> currentlyVisitingIUs,
-      Set<IInstallableUnit> visitedIUs, IQueryable<IInstallableUnit> queryable, IProgressMonitor monitor, boolean onlyIfRedundant)
+      Set<IInstallableUnit> visitedIUs, IQueryable<IInstallableUnit> queryable, IProgressMonitor monitor, boolean onlyIfRedundant,
+      boolean ignoreJavaRequirements)
   {
     if (visitedIUs.add(iu))
     {
       currentlyVisitingIUs.add(iu);
       for (IRequirement requirement : iu.getRequirements())
       {
-        if (!isTypeRequirement(requirement) && !isJavaPackageRequirment(requirement))
+        if (!isTypeRequirement(requirement) && !ignoreJavaRequirements || !isJavaPackageRequirment(requirement))
         {
           for (IInstallableUnit requiredIU : P2Util.asIterable(queryable.query(QueryUtil.createMatchQuery(requirement.getMatches()), null)))
           {
@@ -113,7 +127,7 @@
                 rootIUs.remove(requiredIU);
               }
 
-              removeImplicitUnits(requiredIU, rootIUs, currentlyVisitingIUs, visitedIUs, queryable, monitor, onlyIfRedundant);
+              removeImplicitUnits(requiredIU, rootIUs, currentlyVisitingIUs, visitedIUs, queryable, monitor, onlyIfRedundant, ignoreJavaRequirements);
             }
           }
         }
diff --git a/plugins/org.eclipse.oomph.targlets.core/src/org/eclipse/oomph/targlets/internal/core/listeners/TargetDefinitionGenerator.java b/plugins/org.eclipse.oomph.targlets.core/src/org/eclipse/oomph/targlets/internal/core/listeners/TargetDefinitionGenerator.java
index 7655e87..9be5093 100644
--- a/plugins/org.eclipse.oomph.targlets.core/src/org/eclipse/oomph/targlets/internal/core/listeners/TargetDefinitionGenerator.java
+++ b/plugins/org.eclipse.oomph.targlets.core/src/org/eclipse/oomph/targlets/internal/core/listeners/TargetDefinitionGenerator.java
@@ -125,6 +125,8 @@
 
   public static final String ANNOTATION_SORT_LOCATIONS = "sortLocations"; //$NON-NLS-1$
 
+  public static final String ANNOTATION_IGNORE_JAVA_REQUIREMENTS = "ignoreJavaRequirements"; //$NON-NLS-1$
+
   public static final String ANNOTATION_GENERATE_SERVER_XML = "generateServerXML"; //$NON-NLS-1$
 
   public static final String NESTED_ANNOTATION_REPOSITORY_IDS = "RepositoryIDs"; //$NON-NLS-1$
@@ -193,6 +195,7 @@
     final boolean sortLocations = isAnnotationDetail(annotation, ANNOTATION_SORT_LOCATIONS, false);
     final boolean generateImplicitUnits = isAnnotationDetail(annotation, ANNOTATION_GENERATE_IMPLICIT_UNITS, false);
     final boolean minimizeImplicitUnits = isAnnotationDetail(annotation, ANNOTATION_MINIMIZE_IMPLICIT_UNITS, false);
+    final boolean ignoreJavaRequirements = isAnnotationDetail(annotation, ANNOTATION_IGNORE_JAVA_REQUIREMENTS, true);
     final boolean versions = isAnnotationDetail(annotation, ANNOTATION_GENERATE_VERSIONS, false);
     final boolean includeAllPlatforms = isAnnotationDetail(annotation, ANNOTATION_INCLUDE_ALL_PLATFORMS, targlet.isIncludeAllPlatforms());
     final boolean includeConfigurePhase = isAnnotationDetail(annotation, ANNOTATION_INCLUDE_CONFIGURE_PHASE, true);
@@ -212,7 +215,8 @@
     }
 
     final Map<IMetadataRepository, Set<IInstallableUnit>> repositoryIUs = analyzeRepositories(targlet, profile, artificialRoot, metadataRepositories,
-        workspaceIUInfos, extraUnits, preferredURLs, generateImplicitUnits, minimizeImplicitUnits, singleLocation, sortLocations, monitor);
+        workspaceIUInfos, extraUnits, preferredURLs, generateImplicitUnits, minimizeImplicitUnits, singleLocation, sortLocations, ignoreJavaRequirements,
+        monitor);
 
     List<String> targetReferences = new ArrayList<>();
     for (String composedTarget : composedTargets)
@@ -669,9 +673,8 @@
   private static Map<IMetadataRepository, Set<IInstallableUnit>> analyzeRepositories(Targlet targlet, Profile profile, IInstallableUnit artificialRoot,
       List<IMetadataRepository> metadataRepositories, Map<IInstallableUnit, WorkspaceIUInfo> workspaceIUInfos, Set<IVersionedId> extraUnits,
       List<String> preferredURLs, boolean generateImplicitUnits, boolean minimizeImplicitUnits, boolean singleLocation, boolean sortLocations,
-      IProgressMonitor monitor)
+      boolean ignoreJavaRequirements, IProgressMonitor monitor)
   {
-
     Set<String> workspaceIDs = new HashSet<>();
     for (IInstallableUnit iu : workspaceIUInfos.keySet())
     {
@@ -708,7 +711,8 @@
 
     Map<String, IMetadataRepository> queryables = sortMetadataRepositories(targlet, metadataRepositories, preferredURLs, monitor);
 
-    return assignUnits(queryables, extraUnits, generateImplicitUnits, minimizeImplicitUnits, singleLocation, sortLocations, profileIUs, monitor);
+    return assignUnits(queryables, extraUnits, generateImplicitUnits, minimizeImplicitUnits, singleLocation, sortLocations, ignoreJavaRequirements, profileIUs,
+        monitor);
   }
 
   private static Map<String, IMetadataRepository> sortMetadataRepositories(Targlet targlet, List<IMetadataRepository> metadataRepositories,
@@ -771,8 +775,8 @@
   }
 
   private static Map<IMetadataRepository, Set<IInstallableUnit>> assignUnits(Map<String, IMetadataRepository> queryables, Set<IVersionedId> extraUnits,
-      boolean generateImplicitUnits, boolean minimizeImplicitUnits, boolean singleLocation, boolean sortLocations, Set<IInstallableUnit> resolvedIUs,
-      IProgressMonitor monitor)
+      boolean generateImplicitUnits, boolean minimizeImplicitUnits, boolean singleLocation, boolean sortLocations, boolean igoreJavaRquirements,
+      Set<IInstallableUnit> resolvedIUs, IProgressMonitor monitor)
   {
     Map<IMetadataRepository, Set<IInstallableUnit>> result = sortLocations ? new TreeMap<>(new Comparator<IMetadataRepository>()
     {
@@ -800,7 +804,7 @@
 
           if (!generateImplicitUnits)
           {
-            RootAnalyzer.removeImplicitUnits(ius, queryable, monitor, false);
+            RootAnalyzer.removeImplicitUnits(ius, queryable, monitor, false, igoreJavaRquirements);
           }
           else if (minimizeImplicitUnits)
           {
@@ -837,7 +841,7 @@
 
       if (!generateImplicitUnits)
       {
-        RootAnalyzer.removeImplicitUnits(result, monitor, false);
+        RootAnalyzer.removeImplicitUnits(result, monitor, false, igoreJavaRquirements);
       }
       else if (minimizeImplicitUnits)
       {
diff --git a/releng/org.eclipse.oomph.parent/tp/org.eclipse.oomph.tp.target b/releng/org.eclipse.oomph.parent/tp/org.eclipse.oomph.tp.target
index 6d88328..f7e8658 100644
--- a/releng/org.eclipse.oomph.parent/tp/org.eclipse.oomph.tp.target
+++ b/releng/org.eclipse.oomph.parent/tp/org.eclipse.oomph.tp.target
@@ -1,17 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <?pde version="3.8"?>
-<target name="Generated from Oomph" sequenceNumber="115">
+<target name="Generated from Oomph" sequenceNumber="116">
   <locations>
     <location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit">
-      <unit id="javaewah" version="0.0.0"/>
-      <unit id="net.i2p.crypto.eddsa" version="0.0.0"/>
-      <unit id="org.apache.commons.cli" version="0.0.0"/>
-      <unit id="org.apache.commons.collections" version="0.0.0"/>
-      <unit id="org.apache.commons.commons-beanutils" version="0.0.0"/>
-      <unit id="org.apache.commons.compress" version="0.0.0"/>
-      <unit id="org.apache.commons.io" version="0.0.0"/>
-      <unit id="org.apache.sshd.osgi" version="0.0.0"/>
-      <unit id="org.apache.sshd.sftp" version="0.0.0"/>
       <unit id="org.eclipse.egit.feature.group" version="0.0.0"/>
       <unit id="org.eclipse.emf.sdk.feature.group" version="0.0.0"/>
       <unit id="org.eclipse.equinox.executable.feature.group" version="0.0.0"/>
@@ -26,9 +17,6 @@
       <unit id="org.eclipse.swtbot.generator" version="0.0.0"/>
       <unit id="org.eclipse.userstorage.oauth" version="0.0.0"/>
       <unit id="org.eclipse.userstorage.tests" version="0.0.0"/>
-      <unit id="org.jdom" version="0.0.0"/>
-      <unit id="slf4j.api" version="0.0.0"/>
-      <unit id="slf4j.nop" version="0.0.0"/>
       <repository location="https://download.eclipse.org/eclipse/updates/4.28-I-builds"/>
       <repository location="https://download.eclipse.org/egit/updates-stable-nightly"/>
       <repository location="https://download.eclipse.org/justj/jres/17/updates/milestone/latest"/>
diff --git a/setups/Oomph.setup b/setups/Oomph.setup
index 53e9c48..e06a32d 100644
--- a/setups/Oomph.setup
+++ b/setups/Oomph.setup
@@ -440,6 +440,10 @@
               key="includeSource">
             <value>true</value>
           </detail>
+          <detail
+              key="ignoreJavaRequirements">
+            <value>false</value>
+          </detail>
         </annotation>
         <requirement
             name="*"/>