You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by kw...@apache.org on 2022/12/08 17:04:56 UTC

[jackrabbit-filevault-package-maven-plugin] 01/01: JCRVLT-431 Consider OSGi configurations/bundles for package type calculation

This is an automated email from the ASF dual-hosted git repository.

kwin pushed a commit to branch feature/improve-package-type-detection
in repository https://gitbox.apache.org/repos/asf/jackrabbit-filevault-package-maven-plugin.git

commit 563586922a5638fff43c65214763c594459b6b43
Author: Konrad Windszus <kw...@apache.org>
AuthorDate: Thu Dec 8 18:04:48 2022 +0100

    JCRVLT-431 Consider OSGi configurations/bundles for package type
    calculation
---
 .../maven/packaging/mojo/GenerateMetadataMojo.java | 30 ++++++++----
 .../packaging/mojo/GenerateMetadataMojoTest.java   | 56 +++++++++++++++++++++-
 2 files changed, 75 insertions(+), 11 deletions(-)

diff --git a/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/mojo/GenerateMetadataMojo.java b/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/mojo/GenerateMetadataMojo.java
index 011fe8b..d9296f2 100644
--- a/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/mojo/GenerateMetadataMojo.java
+++ b/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/mojo/GenerateMetadataMojo.java
@@ -192,7 +192,7 @@ public class GenerateMetadataMojo extends AbstractMetadataPackageMojo {
      * In addition optionally a number of {@code include} and {@code exclude} elements are supported below {@code includes}/{@code excludes} respectively.
      */
     @Parameter
-    private final Filters filters = new Filters();
+    Filters filters = new Filters();
 
     /**
      * Optional file that specifies the source of the workspace filter. The filters specified in the configuration
@@ -234,7 +234,7 @@ public class GenerateMetadataMojo extends AbstractMetadataPackageMojo {
      * </table>
      */
     @Parameter
-    private final Properties properties = new Properties();
+    private Properties properties = new Properties();
 
     /**
      * Specifies <a href="https://jackrabbit.apache.org/filevault/packagedefinition.html">JCR package definition properties</a> to be serialized into the {@code META-INF/vault/definition/.content.xml} file.
@@ -242,7 +242,7 @@ public class GenerateMetadataMojo extends AbstractMetadataPackageMojo {
      * Properties canonically stored somewhere else (like package properties or filter rules) should not be set.
      */
     @Parameter
-    private final Map<String,String> packageDefinitionProperties = new HashMap<>();
+    private Map<String,String> packageDefinitionProperties = new HashMap<>();
 
     /**
      * Defines the list of dependencies
@@ -365,7 +365,7 @@ public class GenerateMetadataMojo extends AbstractMetadataPackageMojo {
      * <i>The difference between {@link #embeddeds} and {@link #subPackages} is that for the former an explicit target is given while for the latter the target is being computed from the artifact's vault property file.</i>
      */
     @Parameter
-    private Embedded[] embeddeds = new Embedded[0];
+    Embedded[] embeddeds = new Embedded[0];
 
     /**
      * Defines whether to fail the build when an embedded artifact is not
@@ -398,7 +398,7 @@ public class GenerateMetadataMojo extends AbstractMetadataPackageMojo {
      * <i>The difference between {@link #embeddeds} and {@link #subPackages} is that for the former an explicit target is given while for the latter the target is being computed from the artifact's vault property file.</i>
      */
     @Parameter
-    private SubPackage[] subPackages = new SubPackage[0];
+    SubPackage[] subPackages = new SubPackage[0];
 
     /**
      * File from which to read the generated manifest snippet generated by goal "analyze-classes".
@@ -1254,10 +1254,12 @@ public class GenerateMetadataMojo extends AbstractMetadataPackageMojo {
         return absPath;
     }
 
-    private PackageType computePackageType() {
+    private static final Pattern OSGI_CONFIG_OR_BUNDLE_FILTER_ROOT_PATTERN = Pattern.compile("/apps/(.*/)?(config|install)(\\.[^/]*)?");
+    PackageType computePackageType() {
         final PackageType packageType;
         // auto detect...
         boolean hasApps = false;
+        boolean hasOsgiConfigsOrBundles = false;
         boolean hasOther = false;
         for (PathFilterSet p : filters.getFilterSets()) {
             if (PathFilterSet.TYPE_CLEANUP.equals(p.getType())) {
@@ -1265,8 +1267,14 @@ public class GenerateMetadataMojo extends AbstractMetadataPackageMojo {
             }
             String root = p.getRoot();
             if ("/apps".equals(root) || root.startsWith("/apps/") || "/libs".equals(root) || root.startsWith("/libs/")) {
-                hasApps = true;
-                getLog().debug("Detected /apps or /libs filter entry: " + p);
+                // is it OSGi config or bundles (just some heuristic)
+                if (OSGI_CONFIG_OR_BUNDLE_FILTER_ROOT_PATTERN.matcher(root).matches()) {
+                    getLog().debug("Detected probably OSGi config/bundle filter entry: " + p);
+                    hasOsgiConfigsOrBundles = true;
+                } else {
+                    hasApps = true;
+                    getLog().debug("Detected /apps or /libs filter entry: " + p);
+                }
             } else {
                 hasOther = true;
                 getLog().debug("Detected filter entry outside /apps and /libs: " + p);
@@ -1275,10 +1283,12 @@ public class GenerateMetadataMojo extends AbstractMetadataPackageMojo {
         // no embeds and subpackages?
         getLog().debug("Detected " + embeddeds.length + " bundle(s) and " + subPackages.length + " sub package(s).");
         if (embeddeds.length == 0 && subPackages.length == 0) {
-            if (hasApps && !hasOther) {
+            if (hasApps && !hasOther && !hasOsgiConfigsOrBundles) {
                 packageType = PackageType.APPLICATION;
-            } else if (hasOther && !hasApps) {
+            } else if (hasOther && !hasApps && !hasOsgiConfigsOrBundles) {
                 packageType = PackageType.CONTENT;
+            } else if (!hasOther && !hasApps && hasOsgiConfigsOrBundles) {
+                packageType = PackageType.CONTAINER;
             } else {
                 packageType = PackageType.MIXED;
             }
diff --git a/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/mojo/GenerateMetadataMojoTest.java b/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/mojo/GenerateMetadataMojoTest.java
index 095f3d2..bc0256f 100644
--- a/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/mojo/GenerateMetadataMojoTest.java
+++ b/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/mojo/GenerateMetadataMojoTest.java
@@ -34,7 +34,10 @@ import java.util.jar.Attributes;
 import java.util.jar.Manifest;
 import java.util.regex.Pattern;
 
+import org.apache.jackrabbit.filevault.maven.packaging.Embedded;
+import org.apache.jackrabbit.filevault.maven.packaging.Filters;
 import org.apache.jackrabbit.filevault.maven.packaging.MavenBasedPackageDependency;
+import org.apache.jackrabbit.filevault.maven.packaging.SubPackage;
 import org.apache.jackrabbit.vault.fs.api.PathFilterSet;
 import org.apache.jackrabbit.vault.fs.config.ConfigurationException;
 import org.apache.jackrabbit.vault.fs.filter.DefaultPathFilter;
@@ -105,7 +108,7 @@ class GenerateMetadataMojoTest {
         expectedAttributes.put("Build-Jdk-Spec", Pattern.compile(".*"));
         expectedAttributes.put("Content-Package-Type", Pattern.compile("application"));
         // this includes the version in case the pom.properties is already created which shouldn't be the case here
-        expectedAttributes.put("Created-By", Pattern.compile("Apache Jackrabbit FileVault - Package Maven Plugin"));
+        expectedAttributes.put("Created-By", Pattern.compile("Apache Jackrabbit FileVault - Package Maven Plugin .*"));
         expectedAttributes.put("Content-Package-Id", Pattern.compile("mygroup:mypackage:1\\.4"));
         expectedAttributes.put("Content-Package-Description", Pattern.compile("")); 
         try {
@@ -140,6 +143,57 @@ class GenerateMetadataMojoTest {
         assertEquals("day/cq60/product:cq-content:6.3.64,mygroup:mypackage:[1,2)", mojo.computeDependencies());
     }
 
+    @Test
+    void testComputePackageType() {
+        GenerateMetadataMojo mojo = new GenerateMetadataMojo();
+        // no filter, embeds (should not happen in reality)
+        assertEquals(PackageType.MIXED, mojo.computePackageType());
+        mojo.embeddeds = new Embedded[]{ new Embedded() };
+        assertEquals(PackageType.CONTAINER, mojo.computePackageType());
+        Filters filters = new Filters();
+        filters.add(new PathFilterSet("/apps/mycontext"));
+        mojo.filters = filters;
+        // embedded + /apps content
+        assertEquals(PackageType.MIXED, mojo.computePackageType());
+        // just "/apps" content
+        mojo.embeddeds = new Embedded[]{ };
+        assertEquals(PackageType.APPLICATION, mojo.computePackageType());
+        // mixed /apps and non-apps content
+        filters.add(new PathFilterSet("/content/mycontext"));
+        assertEquals(PackageType.MIXED, mojo.computePackageType());
+        // non-apps content
+        filters = new Filters();
+        mojo.filters = filters;
+        filters.add(new PathFilterSet("/content/mycontext"));
+        assertEquals(PackageType.CONTENT, mojo.computePackageType());
+        // subpackage + OSGi config/bundle file
+        mojo.subPackages = new SubPackage[] { new SubPackage() };
+        assertEquals(PackageType.MIXED, mojo.computePackageType());
+        filters = new Filters();
+        mojo.filters = filters;
+        filters.add(new PathFilterSet("/apps/mycontext/config"));
+        assertEquals(PackageType.CONTAINER, mojo.computePackageType());
+        filters.add(new PathFilterSet("/apps/mycontext/config.somerunmode.author"));
+        assertEquals(PackageType.CONTAINER, mojo.computePackageType());
+        filters.add(new PathFilterSet("/apps/mycontext/configsuffix"));
+        assertEquals(PackageType.MIXED, mojo.computePackageType());
+        // just OSGi config/bundle file
+        mojo.subPackages = new SubPackage[] {};
+        filters = new Filters();
+        mojo.filters = filters;
+        filters.add(new PathFilterSet("/apps/mycontext/config"));
+        assertEquals(PackageType.CONTAINER, mojo.computePackageType());
+        filters.add(new PathFilterSet("/apps/mycontext/config.somerunmode.author"));
+        assertEquals(PackageType.CONTAINER, mojo.computePackageType());
+        filters.add(new PathFilterSet("/apps/mycontext/configsuffix"));
+        assertEquals(PackageType.MIXED, mojo.computePackageType());
+        // some content with config filter
+        filters = new Filters();
+        mojo.filters = filters;
+        filters.add(new PathFilterSet("/content/mycontext/config"));
+        assertEquals(PackageType.CONTENT, mojo.computePackageType());
+    }
+
     private void assertEscapedValueWorksInManifest(String value) throws IOException {
         String escapedValue = GenerateMetadataMojo.escapeManifestValue(value);
         Manifest manifest = new Manifest();