You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by pa...@apache.org on 2021/07/01 14:03:14 UTC

[sling-org-apache-sling-feature-cpconverter] 01/01: SLING-10578: Review initial content creation for content package output of converter

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

pauls pushed a commit to branch issues/SLING-10578
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature-cpconverter.git

commit b80fc88175af9fa715196b0b8698ac3536308fad
Author: Karl Pauls <ka...@gmail.com>
AuthorDate: Thu Jul 1 16:02:55 2021 +0200

    SLING-10578: Review initial content creation for content package output of converter
---
 .../ContentPackage2FeatureModelConverter.java      | 38 +++++++++------
 ...ntentPackage2FeatureModelConverterLauncher.java |  6 +--
 .../cpconverter/handlers/BundleEntryHandler.java   | 36 ++++++--------
 .../handlers/SlingInitialContentBundleHandler.java | 57 ++++++++++++++++++++++
 .../vltpkg/RecollectorVaultPackageScanner.java     | 11 ++++-
 .../artifacts/SimpleFolderArtifactsDeployer.java   |  0
 .../BundleEntryHandleSlingInitialContentTest.java  | 32 +++++++++++-
 7 files changed, 138 insertions(+), 42 deletions(-)

diff --git a/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java b/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java
index d6a02e0..9e35a88 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java
@@ -151,6 +151,11 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
         }
     }
 
+    public @NotNull ContentPackage2FeatureModelConverter setSlingInitalContentPolicy(@NotNull SlingInitialContentPolicy policy) {
+        this.recollectorVaultPackageScanner.setSlingInitialContentPolicy(policy);
+        return this;
+    }
+
     public @NotNull ContentPackage2FeatureModelConverter setEntryHandlersManager(@Nullable EntryHandlersManager handlersManager) {
         this.handlersManager = handlersManager;
         return this;
@@ -200,6 +205,11 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
         return mainPackageAssembler;
     }
 
+    public @NotNull ContentPackage2FeatureModelConverter setMainPackageAssembler(@Nullable VaultPackageAssembler assembler) {
+        this.mainPackageAssembler = assembler;
+        return this;
+    }
+
     public @NotNull ContentPackage2FeatureModelConverter setEmitter(@NotNull PackagesEventsEmitter emitter) {
         this.emitters.add(emitter);
         return this;
@@ -277,8 +287,8 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
         for (VaultPackage vaultPackage : orderedContentPackages) {
             try {
                 emitters.stream().forEach(e -> e.startPackage(vaultPackage));
-                mainPackageAssembler = VaultPackageAssembler.create(this.getTempDirectory(), vaultPackage, removeInstallHooks);
-                assemblers.add(mainPackageAssembler);
+                setMainPackageAssembler(VaultPackageAssembler.create(this.getTempDirectory(), vaultPackage, removeInstallHooks));
+                assemblers.add(getMainPackageAssembler());
 
                 ArtifactId mvnPackageId = toArtifactId(vaultPackage.getId(), vaultPackage.getFile());
 
@@ -289,11 +299,11 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
                 traverse(vaultPackage);
                 // attach all unmatched resources as new content-package
 
-                File contentPackageArchive = mainPackageAssembler.createPackage();
+                File contentPackageArchive = getMainPackageAssembler().createPackage();
 
                 // deploy the new zip content-package to the local mvn bundles dir
 
-                processContentPackageArchive(contentPackageArchive, mainPackageAssembler, null);
+                processContentPackageArchive(contentPackageArchive, getMainPackageAssembler(), null);
 
                 // finally serialize the Feature Model(s) file(s)
 
@@ -357,11 +367,11 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
 
         // Please note: THIS IS A HACK to meet the new requirement without drastically change the original design
         // temporary swap the main handler to collect stuff
-        VaultPackageAssembler handler = mainPackageAssembler;
+        VaultPackageAssembler handler = getMainPackageAssembler();
         assemblers.add(handler);
         Properties parentProps = handler.getPackageProperties();
         boolean isContainerPackage = PackageType.CONTAINER.equals(parentProps.get(PackageProperties.NAME_PACKAGE_TYPE));
-        mainPackageAssembler = clonedPackage;
+        setMainPackageAssembler(clonedPackage);
 
         // scan the detected package, first
         traverse(vaultPackage);
@@ -380,7 +390,7 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
         processContentPackageArchive(contentPackageArchive, clonedPackage, runMode);
 
         // restore the previous assembler
-        mainPackageAssembler = handler;
+        setMainPackageAssembler(handler);
 
         emitters.stream().forEach(PackagesEventsEmitter::endSubPackage);
     }
@@ -457,11 +467,11 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
         });
     }
 
-    protected boolean isSubContentPackageIncluded(@NotNull String path) {
+    public boolean isSubContentPackageIncluded(@NotNull String path) {
         return subContentPackages.containsValue(path);
     }
 
-    public boolean process(@NotNull String entryPath, @NotNull Archive archive, @Nullable Entry entry, boolean useMainPackageAssembler) throws Exception {
+    private boolean process(@NotNull String entryPath, @NotNull Archive archive, @Nullable Entry entry) throws Exception {
         if (resourceFilter != null && resourceFilter.isFilteredOut(entryPath)) {
             throw new IllegalArgumentException("Path '"
                     + entryPath
@@ -472,11 +482,7 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
 
         EntryHandler entryHandler = handlersManager.getEntryHandlerByEntryPath(entryPath);
         if (entryHandler == null) {
-            if (useMainPackageAssembler) {
-                entryHandler = mainPackageAssembler;
-            } else {
-                return false;
-            }
+            entryHandler = getMainPackageAssembler();
         }
 
         if (entry == null) {
@@ -486,7 +492,7 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
             }
         }
         entryHandler.handle(entryPath, archive, entry, this);
-        if (useMainPackageAssembler && !mainPackageAssembler.recordEntryPath(entryPath)) {
+        if (!getMainPackageAssembler().recordEntryPath(entryPath)) {
             logger.warn("Duplicate entry path {}", entryPath);
         }
         return true;
@@ -494,7 +500,7 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
 
     @Override
     protected void onFile(@NotNull String entryPath, @NotNull Archive archive, @NotNull Entry entry) throws Exception {
-        process(entryPath, archive, entry, true);
+        process(entryPath, archive, entry);
     }
 
     public static @NotNull ArtifactId toArtifactId(@NotNull PackageId packageId, @NotNull File file) {
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/cli/ContentPackage2FeatureModelConverterLauncher.java b/src/main/java/org/apache/sling/feature/cpconverter/cli/ContentPackage2FeatureModelConverterLauncher.java
index 3cff3fc..0df8106 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/cli/ContentPackage2FeatureModelConverterLauncher.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/cli/ContentPackage2FeatureModelConverterLauncher.java
@@ -33,7 +33,6 @@ import org.apache.sling.feature.cpconverter.ContentPackage2FeatureModelConverter
 import org.apache.sling.feature.cpconverter.accesscontrol.AclManager;
 import org.apache.sling.feature.cpconverter.accesscontrol.DefaultAclManager;
 import org.apache.sling.feature.cpconverter.artifacts.LocalMavenRepositoryArtifactsDeployer;
-import org.apache.sling.feature.cpconverter.artifacts.SimpleFolderArtifactsDeployer;
 import org.apache.sling.feature.cpconverter.features.DefaultFeaturesManager;
 import org.apache.sling.feature.cpconverter.filtering.RegexBasedResourceFilter;
 import org.apache.sling.feature.cpconverter.handlers.DefaultEntryHandlersManager;
@@ -213,9 +212,10 @@ public final class ContentPackage2FeatureModelConverterLauncher implements Runna
                              .setAclManager(aclManager)
                              .setEmitter(DefaultPackagesEventsEmitter.open(featureModelsOutputDirectory))
                              .setFailOnMixedPackages(failOnMixedPackages)
-                             .setContentTypePackagePolicy(contentTypePackagePolicy);
+                             .setContentTypePackagePolicy(contentTypePackagePolicy)
+                             .setSlingInitalContentPolicy(slingInitialContentPolicy);
                     if (unreferencedArtifactsOutputDirectory != null) {
-                        converter.setUnreferencedArtifactsDeployer(new SimpleFolderArtifactsDeployer(unreferencedArtifactsOutputDirectory));
+                        converter.setUnreferencedArtifactsDeployer(new LocalMavenRepositoryArtifactsDeployer(unreferencedArtifactsOutputDirectory));
                     } else if (contentTypePackagePolicy == ContentPackage2FeatureModelConverter.PackagePolicy.PUT_IN_DEDICATED_FOLDER) {
                         throw new IllegalStateException("Argument '--content-type-package-policy PUT_IN_DEDICATED_FOLDER' requires argument '--unreferenced-artifacts-output-directory' as well!");
                     }
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/handlers/BundleEntryHandler.java b/src/main/java/org/apache/sling/feature/cpconverter/handlers/BundleEntryHandler.java
index f0601b7..7616604 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/handlers/BundleEntryHandler.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/handlers/BundleEntryHandler.java
@@ -87,7 +87,7 @@ import org.jetbrains.annotations.Nullable;
 import org.osgi.framework.Constants;
 import org.osgi.framework.Version;
 
-public final class BundleEntryHandler extends AbstractRegexEntryHandler {
+public class BundleEntryHandler extends AbstractRegexEntryHandler {
 
     private static final String NAME_GROUP_ID = "groupId";
 
@@ -105,7 +105,7 @@ public final class BundleEntryHandler extends AbstractRegexEntryHandler {
 
     private boolean enforceBundlesBelowInstallFolder;
 
-    private SlingInitialContentPolicy slingInitialContentPolicy;
+    protected SlingInitialContentPolicy slingInitialContentPolicy;
 
     public BundleEntryHandler() {
         super("/jcr_root/(?:apps|libs)/.+/(?<foldername>install|config)(?:\\.(?<runmode>[^/]+))?/(?:(?<startlevel>[0-9]+)/)?.+\\.jar");
@@ -115,7 +115,7 @@ public final class BundleEntryHandler extends AbstractRegexEntryHandler {
         this.enforceBundlesBelowInstallFolder = enforceBundlesBelowInstallFolder;
     }
 
-    void setSlingInitialContentPolicy(SlingInitialContentPolicy slingInitialContentPolicy) {
+    public void setSlingInitialContentPolicy(SlingInitialContentPolicy slingInitialContentPolicy) {
         this.slingInitialContentPolicy = slingInitialContentPolicy;
     }
 
@@ -172,18 +172,18 @@ public final class BundleEntryHandler extends AbstractRegexEntryHandler {
             IOUtils.copy(input, output);
         }
         try {
-            processBundleInputStream(tmpBundleJar, bundleName, runMode, startLevel, converter);
+            processBundleInputStream(path, tmpBundleJar, bundleName, runMode, startLevel, converter);
         } finally {
             Files.delete(tmpBundleJar);
         }
     }
 
-    void processBundleInputStream(@NotNull Path originalBundleFile, @NotNull String bundleName, @Nullable String runMode, @Nullable Integer startLevel, @NotNull ContentPackage2FeatureModelConverter converter) throws Exception {
+    void processBundleInputStream(@NotNull String path, @NotNull Path originalBundleFile, @NotNull String bundleName, @Nullable String runMode, @Nullable Integer startLevel, @NotNull ContentPackage2FeatureModelConverter converter) throws Exception {
         try (JarFile jarFile = new JarFile(originalBundleFile.toFile())) {
             // first extract bundle metadata from JAR input stream
             ArtifactId id = extractArtifactId(bundleName, jarFile);
 
-            try (InputStream strippedBundleInput = extractSlingInitialContent(id, jarFile, converter, runMode)) {
+            try (InputStream strippedBundleInput = extractSlingInitialContent(path, originalBundleFile, id, jarFile, converter, runMode)) {
                 if (strippedBundleInput != null && slingInitialContentPolicy == SlingInitialContentPolicy.EXTRACT_AND_REMOVE) {
                     id = id.changeVersion(id.getVersion() + "-" + ContentPackage2FeatureModelConverter.PACKAGE_CLASSIFIER);
                     Objects.requireNonNull(converter.getArtifactsDeployer()).deploy(new InputStreamArtifactWriter(strippedBundleInput), id);
@@ -207,7 +207,7 @@ public final class BundleEntryHandler extends AbstractRegexEntryHandler {
         return new Version(originalVersion.getMajor(), originalVersion.getMinor(), originalVersion.getMicro(), originalVersion.getQualifier() + "_" + ContentPackage2FeatureModelConverter.PACKAGE_CLASSIFIER);
     }
 
-    @Nullable InputStream extractSlingInitialContent(@NotNull ArtifactId bundleArtifactId, @NotNull JarFile jarFile, @NotNull ContentPackage2FeatureModelConverter converter, @Nullable String runMode) throws Exception {
+    @Nullable InputStream extractSlingInitialContent(@NotNull String path, @NotNull Path bundlePath, @NotNull ArtifactId bundleArtifactId, @NotNull JarFile jarFile, @NotNull ContentPackage2FeatureModelConverter converter, @Nullable String runMode) throws Exception {
         if (slingInitialContentPolicy == SlingInitialContentPolicy.KEEP) {
             return null;
         }
@@ -254,7 +254,7 @@ public final class BundleEntryHandler extends AbstractRegexEntryHandler {
             }
         }
         // add additional content packages to feature model
-        finalizePackageAssembly(packageAssemblers, converter, runMode);
+        finalizePackageAssembly(path, packageAssemblers, converter, runMode);
         
         // return stripped bundle's inputstream which must be deleted on close
         return Files.newInputStream(newBundleFile, StandardOpenOption.READ, StandardOpenOption.DELETE_ON_CLOSE);
@@ -306,16 +306,12 @@ public final class BundleEntryHandler extends AbstractRegexEntryHandler {
             }
             try (Archive virtualArchive = SingleFileArchive.fromPathOrInputStream(tmpDocViewInputFile, bundleFileInputStream, 
                     () -> Files.createTempFile(converter.getTempDirectory().toPath(), "initial-content", Text.getName(jarEntry.getName())), contentPackageEntryPath)) {
-                // does entry in initial content need to be extracted into feature model (e.g. for OSGi configurations)?
-                if (!converter.process(contentPackageEntryPath, virtualArchive, null, false)) {
-                    // ... otherwise add it to the content package
-                    // in which content package should this end up?
-                    VaultPackageAssembler packageAssembler = initPackageAssemblerForPath(bundleArtifactId, repositoryPath, pathEntry.get(), packageAssemblers, converter);
-                    if (tmpDocViewInputFile != null) {
-                        packageAssembler.addEntry(contentPackageEntryPath, tmpDocViewInputFile.toFile());
-                    } else {
-                        packageAssembler.addEntry(contentPackageEntryPath, bundleFileInputStream);
-                    }
+                // in which content package should this end up?
+                VaultPackageAssembler packageAssembler = initPackageAssemblerForPath(bundleArtifactId, repositoryPath, pathEntry.get(), packageAssemblers, converter);
+                if (tmpDocViewInputFile != null) {
+                    packageAssembler.addEntry(contentPackageEntryPath, tmpDocViewInputFile.toFile());
+                } else {
+                    packageAssembler.addEntry(contentPackageEntryPath, bundleFileInputStream);
                 }
             }
         } finally {
@@ -414,10 +410,10 @@ public final class BundleEntryHandler extends AbstractRegexEntryHandler {
         return assembler;
     }
 
-    void finalizePackageAssembly(@NotNull Map<PackageType, VaultPackageAssembler> packageAssemblers, @NotNull ContentPackage2FeatureModelConverter converter, @Nullable String runMode) throws Exception {
+    void finalizePackageAssembly(@NotNull String path, @NotNull Map<PackageType, VaultPackageAssembler> packageAssemblers, @NotNull ContentPackage2FeatureModelConverter converter, @Nullable String runMode) throws Exception {
         for (java.util.Map.Entry<PackageType, VaultPackageAssembler> entry : packageAssemblers.entrySet()) {
             File packageFile = entry.getValue().createPackage(false);
-            converter.processContentPackageArchive(packageFile, entry.getValue(), runMode);
+            converter.processSubPackage(path + "-" + entry.getKey(), runMode, converter.open(packageFile), true);
         }
     }
 
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/handlers/SlingInitialContentBundleHandler.java b/src/main/java/org/apache/sling/feature/cpconverter/handlers/SlingInitialContentBundleHandler.java
new file mode 100644
index 0000000..af646d3
--- /dev/null
+++ b/src/main/java/org/apache/sling/feature/cpconverter/handlers/SlingInitialContentBundleHandler.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.apache.sling.feature.cpconverter.handlers;
+
+import org.apache.jackrabbit.vault.packaging.PackageType;
+import org.apache.sling.feature.ArtifactId;
+import org.apache.sling.feature.cpconverter.ContentPackage2FeatureModelConverter;
+import org.apache.sling.feature.cpconverter.vltpkg.VaultPackageAssembler;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.io.File;
+import java.io.InputStream;
+import java.nio.file.Path;
+import java.util.Map;
+import java.util.jar.JarFile;
+
+public class SlingInitialContentBundleHandler extends BundleEntryHandler {
+    private final @NotNull AbstractContentPackageHandler handler;
+
+    public SlingInitialContentBundleHandler(@NotNull AbstractContentPackageHandler handler) {
+        this.handler = handler;
+        setSlingInitialContentPolicy(ContentPackage2FeatureModelConverter.SlingInitialContentPolicy.KEEP);
+    }
+
+    @Override
+    void processBundleInputStream(@NotNull String path, @NotNull Path originalBundleFile, @NotNull String bundleName, @Nullable String runMode, @Nullable Integer startLevel, @NotNull ContentPackage2FeatureModelConverter converter) throws Exception {
+        try (JarFile jarFile = new JarFile(originalBundleFile.toFile())) {
+            // first extract bundle metadata from JAR input stream
+            ArtifactId id = extractArtifactId(bundleName, jarFile);
+
+            try (InputStream ignored = extractSlingInitialContent(path, originalBundleFile, id, jarFile, converter, runMode)) {}
+        }
+    }
+
+    @Override
+    void finalizePackageAssembly(@NotNull String path, @NotNull Map<PackageType, VaultPackageAssembler> packageAssemblers, @NotNull ContentPackage2FeatureModelConverter converter, @Nullable String runMode) throws Exception {
+        for (java.util.Map.Entry<PackageType, VaultPackageAssembler> entry : packageAssemblers.entrySet()) {
+            File packageFile = entry.getValue().createPackage(false);
+            handler.processSubPackage(path + "-" + entry.getKey(), runMode, converter.open(packageFile), converter, true);
+        }
+    }
+}
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/RecollectorVaultPackageScanner.java b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/RecollectorVaultPackageScanner.java
index ac7fe0f..7af14b1 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/RecollectorVaultPackageScanner.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/RecollectorVaultPackageScanner.java
@@ -25,6 +25,7 @@ import org.apache.jackrabbit.vault.packaging.PackageManager;
 import org.apache.sling.feature.cpconverter.ContentPackage2FeatureModelConverter;
 import org.apache.sling.feature.cpconverter.handlers.EntryHandler;
 import org.apache.sling.feature.cpconverter.handlers.GroupEntryHandler;
+import org.apache.sling.feature.cpconverter.handlers.SlingInitialContentBundleHandler;
 import org.apache.sling.feature.cpconverter.handlers.UsersEntryHandler;
 import org.apache.sling.feature.cpconverter.handlers.VersionResolverContentPackageEntryHandler;
 import org.jetbrains.annotations.NotNull;
@@ -34,6 +35,7 @@ public final class RecollectorVaultPackageScanner extends BaseVaultPackageScanne
     private final ContentPackage2FeatureModelConverter converter;
 
     private final EntryHandler[] handlers;
+    private final SlingInitialContentBundleHandler slingInitialContentBundleHandler;
 
     public RecollectorVaultPackageScanner(@NotNull ContentPackage2FeatureModelConverter converter,
                                           @NotNull PackageManager packageManager,
@@ -41,13 +43,20 @@ public final class RecollectorVaultPackageScanner extends BaseVaultPackageScanne
                                           @NotNull Map<PackageId, String> subContentPackages) {
         super(packageManager, strictValidation);
         this.converter = converter;
+        VersionResolverContentPackageEntryHandler versionResolverContentPackageEntryHandler = new VersionResolverContentPackageEntryHandler(this, subContentPackages);
+        slingInitialContentBundleHandler = new SlingInitialContentBundleHandler(versionResolverContentPackageEntryHandler);
         handlers = new EntryHandler[] {
                 new UsersEntryHandler(),
                 new GroupEntryHandler(),
-                new VersionResolverContentPackageEntryHandler(this, subContentPackages)
+                versionResolverContentPackageEntryHandler,
+                slingInitialContentBundleHandler
         };
     }
 
+    public void setSlingInitialContentPolicy(ContentPackage2FeatureModelConverter.SlingInitialContentPolicy policy) {
+        this.slingInitialContentBundleHandler.setSlingInitialContentPolicy(policy);
+    }
+
     @Override
     protected void onFile(@NotNull String path, @NotNull Archive archive, @NotNull Entry entry) throws Exception {
         for (EntryHandler handler : handlers) {
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/artifacts/SimpleFolderArtifactsDeployer.java b/src/test/java/org/apache/sling/feature/cpconverter/artifacts/SimpleFolderArtifactsDeployer.java
similarity index 100%
rename from src/main/java/org/apache/sling/feature/cpconverter/artifacts/SimpleFolderArtifactsDeployer.java
rename to src/test/java/org/apache/sling/feature/cpconverter/artifacts/SimpleFolderArtifactsDeployer.java
diff --git a/src/test/java/org/apache/sling/feature/cpconverter/handlers/BundleEntryHandleSlingInitialContentTest.java b/src/test/java/org/apache/sling/feature/cpconverter/handlers/BundleEntryHandleSlingInitialContentTest.java
index dab710a..657d643 100644
--- a/src/test/java/org/apache/sling/feature/cpconverter/handlers/BundleEntryHandleSlingInitialContentTest.java
+++ b/src/test/java/org/apache/sling/feature/cpconverter/handlers/BundleEntryHandleSlingInitialContentTest.java
@@ -20,22 +20,26 @@ import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.when;
 
 import java.io.File;
 import java.util.Collections;
 import java.util.Dictionary;
 import java.util.Map;
+import java.util.Properties;
 import java.util.jar.JarFile;
 
 import org.apache.jackrabbit.vault.fs.io.Archive;
 import org.apache.jackrabbit.vault.fs.io.Archive.Entry;
 import org.apache.jackrabbit.vault.packaging.PackageId;
+import org.apache.jackrabbit.vault.packaging.PackageProperties;
 import org.apache.jackrabbit.vault.packaging.VaultPackage;
 import org.apache.jackrabbit.vault.packaging.impl.PackageManagerImpl;
 import org.apache.sling.feature.ArtifactId;
 import org.apache.sling.feature.cpconverter.ContentPackage2FeatureModelConverter.SlingInitialContentPolicy;
 import org.apache.sling.feature.cpconverter.artifacts.SimpleFolderArtifactsDeployer;
+import org.apache.sling.feature.cpconverter.vltpkg.VaultPackageAssembler;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
@@ -62,6 +66,16 @@ public class BundleEntryHandleSlingInitialContentTest extends AbstractBundleEntr
 
         File targetFolder = tmpFolder.newFolder();
         when(converter.getArtifactsDeployer()).thenReturn(new SimpleFolderArtifactsDeployer(targetFolder));
+        when(converter.isSubContentPackageIncluded("/jcr_root/apps/gav/install/io.wcm.handler.media-1.11.6.jar-APPLICATION")).thenReturn(true);
+
+        VaultPackageAssembler assembler = Mockito.mock(VaultPackageAssembler.class);
+        Properties props = new Properties();
+        props.setProperty(PackageProperties.NAME_GROUP, "io.wcm");
+        props.setProperty(PackageProperties.NAME_NAME, "handler.media");
+        props.setProperty(PackageProperties.NAME_VERSION, "1.11.6");
+        when(assembler.getPackageProperties()).thenReturn(props);
+        converter.setMainPackageAssembler(assembler);
+
         handler.setSlingInitialContentPolicy(SlingInitialContentPolicy.EXTRACT_AND_REMOVE);
         handler.handle("/jcr_root/apps/gav/install/io.wcm.handler.media-1.11.6.jar", archive, entry, converter);
 
@@ -95,10 +109,16 @@ public class BundleEntryHandleSlingInitialContentTest extends AbstractBundleEntr
         setUpArchive("/jcr_root/apps/gav/install/composum-nodes-config-2.5.3.jar", "composum-nodes-config-2.5.3.jar");
         DefaultEntryHandlersManager handlersManager = new DefaultEntryHandlersManager();
         converter.setEntryHandlersManager(handlersManager);
+        when(converter.isSubContentPackageIncluded("/jcr_root/apps/gav/install/composum-nodes-config-2.5.3.jar-APPLICATION")).thenReturn(true);
+        VaultPackageAssembler assembler = Mockito.mock(VaultPackageAssembler.class);
+        Properties props = new Properties();
+        props.setProperty(PackageProperties.NAME_GROUP, "io.wcm");
+        props.setProperty(PackageProperties.NAME_NAME, "handler.media");
+        props.setProperty(PackageProperties.NAME_VERSION, "1.11.6");
+        when(assembler.getPackageProperties()).thenReturn(props);
+        converter.setMainPackageAssembler(assembler);
         handler.setSlingInitialContentPolicy(SlingInitialContentPolicy.EXTRACT_AND_REMOVE);
         handler.handle("/jcr_root/apps/gav/install/composum-nodes-config-2.5.3.jar", archive, entry, converter);
-        // verify no additional content package created (as it only contains the configuration which should end up in the feature model only)
-        Mockito.verify(converter, Mockito.never()).processContentPackageArchive(Mockito.any(), Mockito.any(), Mockito.isNull());
         // modified bundle
         Mockito.verify(featuresManager).addArtifact(null, ArtifactId.fromMvnId("com.composum.nodes:composum-nodes-config:2.5.3-cp2fm-converted"), null);
         // need to use ArgumentCaptur to properly compare string arrays
@@ -115,6 +135,14 @@ public class BundleEntryHandleSlingInitialContentTest extends AbstractBundleEntr
         setUpArchive("/jcr_root/apps/gav/install/composum-nodes-config-2.5.3.jar", "composum-nodes-config-2.5.3.jar");
         DefaultEntryHandlersManager handlersManager = new DefaultEntryHandlersManager();
         converter.setEntryHandlersManager(handlersManager);
+        when(converter.isSubContentPackageIncluded("/jcr_root/apps/gav/install/composum-nodes-config-2.5.3.jar-APPLICATION")).thenReturn(true);
+        VaultPackageAssembler assembler = Mockito.mock(VaultPackageAssembler.class);
+        Properties props = new Properties();
+        props.setProperty(PackageProperties.NAME_GROUP, "io.wcm");
+        props.setProperty(PackageProperties.NAME_NAME, "handler.media");
+        props.setProperty(PackageProperties.NAME_VERSION, "1.11.6");
+        when(assembler.getPackageProperties()).thenReturn(props);
+        converter.setMainPackageAssembler(assembler);
         handler.setSlingInitialContentPolicy(SlingInitialContentPolicy.EXTRACT_AND_KEEP);
         handler.handle("/jcr_root/apps/gav/install/composum-nodes-config-2.5.3.jar", archive, entry, converter);
         // original bundle