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