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