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:55 UTC

[jackrabbit-filevault-package-maven-plugin] branch feature/improve-package-type-detection created (now 5635869)

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

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


      at 5635869  JCRVLT-431 Consider OSGi configurations/bundles for package type calculation

This branch includes the following new commits:

     new 5635869  JCRVLT-431 Consider OSGi configurations/bundles for package type calculation

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



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

Posted by kw...@apache.org.
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();