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();