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/05/31 21:56:18 UTC
[sling-org-apache-sling-feature-cpconverter] branch master updated: SLING-10433: wait until we processed all packages with creating and d… (#85)
This is an automated email from the ASF dual-hosted git repository.
pauls pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature-cpconverter.git
The following commit(s) were added to refs/heads/master by this push:
new f5b40e0 SLING-10433: wait until we processed all packages with creating and d… (#85)
f5b40e0 is described below
commit f5b40e09f676849eeb901522a56a4706ee055c72
Author: Karl Pauls <pa...@apache.org>
AuthorDate: Mon May 31 23:56:14 2021 +0200
SLING-10433: wait until we processed all packages with creating and d… (#85)
---
.../ContentPackage2FeatureModelConverter.java | 53 ++++++++++++++-------
.../cpconverter/handlers/BundleEntryHandler.java | 3 +-
.../cpconverter/vltpkg/VaultPackageAssembler.java | 8 ++--
.../ContentPackage2FeatureModelConverterTest.java | 35 +++++++++++++-
.../BundleEntryHandleSlingInitialContentTest.java | 3 +-
.../sling/feature/cpconverter/test_dep_sub.zip | Bin 0 -> 16012 bytes
6 files changed, 79 insertions(+), 23 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 3c9f1a4..81ec0c3 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java
@@ -275,18 +275,13 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
logger.info("Converting content-package '{}'...", vaultPackage.getId());
traverse(vaultPackage);
-
- // make sure
-
- mainPackageAssembler.updateDependencies(mutableContentsIds);
-
// attach all unmatched resources as new content-package
File contentPackageArchive = mainPackageAssembler.createPackage();
// deploy the new zip content-package to the local mvn bundles dir
- processContentPackageArchive(contentPackageArchive, null);
+ processContentPackageArchive(contentPackageArchive, mainPackageAssembler,null);
// finally serialize the Feature Model(s) file(s)
@@ -308,6 +303,7 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
}
}
+ deployPackages();
mutableContentsIds.clear();
emitters.stream().forEach(e -> e.end());
@@ -357,8 +353,6 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
// scan the detected package, first
traverse(vaultPackage);
-
- clonedPackage.updateDependencies(mutableContentsIds);
//set dependency to parent package if the parent package is an application package & subpackage is embedded
if (isEmbeddedPackage && !isContainerPackage) {
@@ -371,7 +365,7 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
File contentPackageArchive = clonedPackage.createPackage();
// deploy the new content-package to the local mvn bundles dir and attach it to the feature
- processContentPackageArchive(contentPackageArchive, runMode);
+ processContentPackageArchive(contentPackageArchive, clonedPackage, runMode);
// restore the previous assembler
mainPackageAssembler = handler;
@@ -379,7 +373,7 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
emitters.stream().forEach(e -> e.endSubPackage());
}
- public void processContentPackageArchive(@NotNull File contentPackageArchive,
+ public void processContentPackageArchive(@NotNull File contentPackageArchive, @NotNull VaultPackageAssembler assembler,
@Nullable String runMode) throws Exception {
try (VaultPackage vaultPackage = open(contentPackageArchive)) {
PackageType packageType = detectPackageType(vaultPackage);
@@ -413,15 +407,42 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
mvnPackageId.getArtifactId(), vaultPackage.getId(), unreferencedArtifactsDeployer.getBaseDirectory());
break;
case REFERENCE:
- artifactsDeployer.deploy(new FileArtifactWriter(contentPackageArchive), mvnPackageId);
- featuresManager.addArtifact(runMode, mvnPackageId);
+ deploy(assembler, mvnPackageId, runMode);
}
} else {
- // deploy the new content-package to the local mvn bundles dir
- getArtifactsDeployer().deploy(new FileArtifactWriter(contentPackageArchive), mvnPackageId);
- getFeaturesManager().addArtifact(runMode, mvnPackageId);
+ deploy(assembler, mvnPackageId, runMode);
+ }
+ }
+ }
+ public void deployPackages() throws Exception {
+ try {
+ mutableContentsIds.values().forEach(
+ value -> value.removeIf(dep -> mutableContentsIds.keySet().stream().anyMatch(dep::matches)));
+
+ deployTasks.forEach(Runnable::run);
+ } catch (RuntimeException ex) {
+ if (ex.getCause() instanceof Exception) {
+ throw (Exception) ex;
}
+ throw ex;
}
+ deployTasks.clear();
+ }
+
+ private List<Runnable> deployTasks = new ArrayList<>();
+
+ private void deploy(VaultPackageAssembler assembler, ArtifactId mvnPackageId, String runMode) {
+ getFeaturesManager().addArtifact(runMode, mvnPackageId);
+ deployTasks.add(() -> {
+ assembler.updateDependencies(mutableContentsIds);
+ try {
+ File finalContentPackageArchive = assembler.createPackage();
+ // deploy the new content-package to the local mvn bundles dir
+ getArtifactsDeployer().deploy(new FileArtifactWriter(finalContentPackageArchive), mvnPackageId);
+ } catch (Exception ex) {
+ throw new RuntimeException(ex);
+ }
+ });
}
protected boolean isSubContentPackageIncluded(@NotNull String path) {
@@ -483,7 +504,7 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
if (version.endsWith(VaultPackageAssembler.VERSION_SUFFIX)) {
version = version.substring(0, version.length() - VaultPackageAssembler.VERSION_SUFFIX.length());
}
- if (version == null || version.isEmpty()) {
+ if (version.isEmpty()) {
version = DEFAULT_VERSION;
}
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 0075671..f0601b7 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
@@ -417,8 +417,7 @@ public final class BundleEntryHandler extends AbstractRegexEntryHandler {
void finalizePackageAssembly(@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, runMode);
- Files.delete(packageFile.toPath());
+ converter.processContentPackageArchive(packageFile, entry.getValue(), runMode);
}
}
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/VaultPackageAssembler.java b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/VaultPackageAssembler.java
index 065f10b..6023bec 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/VaultPackageAssembler.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/VaultPackageAssembler.java
@@ -123,9 +123,11 @@ public class VaultPackageAssembler implements EntryHandler {
originalPackageProperties = originalPackageProperties.entrySet().stream().filter(new RemoveInstallHooksPredicate()).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
}
properties.putAll(originalPackageProperties);
- properties.setProperty(PackageProperties.NAME_VERSION,
- vaultPackage.getId().getVersion().toString()
- + VERSION_SUFFIX);
+ String version = vaultPackage.getId().getVersion().toString();
+ if (!version.endsWith(VERSION_SUFFIX)) {
+ version += VERSION_SUFFIX;
+ }
+ properties.setProperty(PackageProperties.NAME_VERSION, version);
Set<Dependency> dependencies = getDependencies(vaultPackage);
diff --git a/src/test/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverterTest.java b/src/test/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverterTest.java
index c990750..0dbab64 100644
--- a/src/test/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverterTest.java
+++ b/src/test/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverterTest.java
@@ -898,7 +898,7 @@ public class ContentPackage2FeatureModelConverterTest {
}
}
- // see SLING-8649
+ // see SLING-10433
@Test
public void filteredOutContentPackagesAreExcludedDependencies() throws Exception {
File[] contentPackages = load("test_dep_a-1.0.zip", "test_dep_b-1.0.zip");
@@ -933,6 +933,39 @@ public class ContentPackage2FeatureModelConverterTest {
}
}
+ // see SLING-8649
+ @Test
+ public void filteredOutSubContentPackagesAreExcludedDependencies() throws Exception {
+ File[] contentPackages = load("test_dep_sub.zip");
+
+ // input: c <- a <- b
+ // expected output: c <- a
+
+ File outputDirectory = new File(System.getProperty("java.io.tmpdir"), getClass().getName() + '_' + System.currentTimeMillis());
+ try {
+ converter.setFeaturesManager(new DefaultFeaturesManager(true, 5, outputDirectory, null, null, null, new DefaultAclManager()))
+ .setContentTypePackagePolicy(PackagePolicy.DROP)
+ .setBundlesDeployer(new LocalMavenRepositoryArtifactsDeployer(outputDirectory))
+ .setEmitter(DefaultPackagesEventsEmitter.open(outputDirectory))
+ .convert(contentPackages);
+
+ Feature sub = getFeature(outputDirectory, "test_sub.json");
+
+ assertNotNull(sub.getExtensions().getByName("content-packages"));
+ Artifacts artifacts = sub.getExtensions().getByName("content-packages").getArtifacts();
+ assertEquals(2, artifacts.size());
+ assertTrue(artifacts.containsExact(ArtifactId.fromMvnId("my_packages:test_b:zip:cp2fm-converted:1.0")));
+
+ File contentPackage = new File(outputDirectory, "my_packages/test_b/1.0/test_b-1.0-cp2fm-converted.zip");
+ VaultPackage vaultPackage = new PackageManagerImpl().open(contentPackage);
+ String dependencies = vaultPackage.getProperties().getProperty(PackageProperties.NAME_DEPENDENCIES);
+ assertEquals("my_packages:test_sub:[1.0-cp2fm-converted,1.0-cp2fm-converted]", dependencies);
+ }
+ finally {
+ deleteDirTree(outputDirectory);
+ }
+ }
+
private File[] load(String...resources) {
File[] loadedResources = new File[resources.length];
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 77aaa70..dab710a 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
@@ -65,6 +65,7 @@ public class BundleEntryHandleSlingInitialContentTest extends AbstractBundleEntr
handler.setSlingInitialContentPolicy(SlingInitialContentPolicy.EXTRACT_AND_REMOVE);
handler.handle("/jcr_root/apps/gav/install/io.wcm.handler.media-1.11.6.jar", archive, entry, converter);
+ converter.deployPackages();
// verify generated bundle
try (JarFile jarFile = new JarFile(new File(targetFolder, "io.wcm.handler.media-1.11.6-cp2fm-converted.jar"))) {
String bundleVersion = jarFile.getManifest().getMainAttributes().getValue(Constants.BUNDLE_VERSION);
@@ -97,7 +98,7 @@ public class BundleEntryHandleSlingInitialContentTest extends AbstractBundleEntr
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.isNull());
+ 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
diff --git a/src/test/resources/org/apache/sling/feature/cpconverter/test_dep_sub.zip b/src/test/resources/org/apache/sling/feature/cpconverter/test_dep_sub.zip
new file mode 100644
index 0000000..3351fb5
Binary files /dev/null and b/src/test/resources/org/apache/sling/feature/cpconverter/test_dep_sub.zip differ