You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by da...@apache.org on 2020/11/11 09:14:48 UTC

[sling-org-apache-sling-feature-cpconverter] branch master updated: SLING-9894 - setting explicit dependency from embedded to non-container parent to ensure same install order as in osgi installer (implicit ordering)

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

davidb 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 caca4a2  SLING-9894 - setting explicit dependency from embedded to non-container parent to ensure same install order as in osgi installer (implicit ordering)
     new 16b2599  Merge pull request #34 from DominikSuess/issue/SLING-9894
caca4a2 is described below

commit caca4a2127e5a0c4c5c12b992bc6ca4ad639ef21
Author: Dominik Suess <su...@adobe.com>
AuthorDate: Tue Nov 10 18:19:42 2020 +0100

    SLING-9894 - setting explicit dependency from embedded to non-container parent to ensure same install order as in osgi installer (implicit ordering)
---
 .../ContentPackage2FeatureModelConverter.java      |  13 +++++++++-
 .../handlers/AbstractContentPackageHandler.java    |  10 ++++++--
 .../handlers/ContentPackageEntryHandler.java       |   9 ++++---
 .../VersionResolverContentPackageEntryHandler.java |   2 +-
 .../cpconverter/vltpkg/VaultPackageAssembler.java  |  11 +++++++-
 .../ContentPackage2FeatureModelConverterTest.java  |  28 ++++++++++++++++++++-
 .../cpconverter/embedded.package.test-0.0.1.zip    | Bin 0 -> 10023 bytes
 7 files changed, 64 insertions(+), 9 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 8a0fc92..fb1e5be 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java
@@ -28,6 +28,7 @@ import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Properties;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.regex.Pattern;
@@ -267,7 +268,7 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
         idPackageMapping.remove(pack.getId());
     }
 
-    public void processSubPackage(String path, String runMode, VaultPackage vaultPackage) throws Exception {
+    public void processSubPackage(String path, String runMode, VaultPackage vaultPackage, boolean isEmbeddedPackage) throws Exception {
         requireNonNull(path, "Impossible to process a null vault package");
         requireNonNull(vaultPackage, "Impossible to process a null vault package");
 
@@ -286,12 +287,22 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
         // temporary swap the main handler to collect stuff
         VaultPackageAssembler handler = mainPackageAssembler;
         assemblers.add(handler);
+        Properties parentProps = handler.getPackageProperties();
+        boolean isContainerPackage = PackageType.CONTAINER.equals(parentProps.get(PackageProperties.NAME_PACKAGE_TYPE));
         mainPackageAssembler = clonedPackage;
 
         // 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) {
+            PackageId parentId = new PackageId((String)parentProps.get(PackageProperties.NAME_GROUP), 
+                                                (String)parentProps.get(PackageProperties.NAME_NAME),
+                                                (String)parentProps.get(PackageProperties.NAME_VERSION));
+            clonedPackage.addDependency(new Dependency(parentId));
+        }
 
         File contentPackageArchive = clonedPackage.createPackage();
 
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractContentPackageHandler.java b/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractContentPackageHandler.java
index 4853fd2..1b8056c 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractContentPackageHandler.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractContentPackageHandler.java
@@ -21,10 +21,13 @@ import java.io.FileOutputStream;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.jackrabbit.vault.fs.io.Archive;
 import org.apache.jackrabbit.vault.fs.io.Archive.Entry;
+import org.apache.jackrabbit.vault.packaging.Dependency;
+import org.apache.jackrabbit.vault.packaging.PackageId;
 import org.apache.jackrabbit.vault.packaging.VaultPackage;
 import org.apache.sling.feature.cpconverter.ContentPackage2FeatureModelConverter;
 import org.codehaus.plexus.util.StringUtils;
@@ -35,6 +38,8 @@ public abstract class AbstractContentPackageHandler extends AbstractRegexEntryHa
 
     private final File temporaryDir = new File(System.getProperty("java.io.tmpdir"), "sub-content-packages");
 
+    private final Pattern EMBEDDED_PACKAGE_PATTERN = Pattern.compile("/jcr_root/apps/.+/install(?:\\\\.([^/]+))?/.+.zip");
+    
     public AbstractContentPackageHandler() {
         super("/jcr_root/(?:etc/packages|apps/.+/install(?:\\.([^/]+))?)/.+.zip");
         temporaryDir.mkdirs();
@@ -85,13 +90,14 @@ public abstract class AbstractContentPackageHandler extends AbstractRegexEntryHa
             logger.debug("Runmode {} was extracted from path {}", runMode, path);
         }
 
+        boolean isEmbeddedPackage = EMBEDDED_PACKAGE_PATTERN.matcher(path).matches();
         try (VaultPackage vaultPackage = converter.open(temporaryContentPackage)) {
-            processSubPackage(path, runMode, vaultPackage, converter);
+            processSubPackage(path, runMode, vaultPackage, converter, isEmbeddedPackage);
         }
 
         logger.info("Sub-content package '{}' processing is over", entry.getName());
     }
 
-    protected abstract void processSubPackage(String path, String runMode, VaultPackage contentPackage, ContentPackage2FeatureModelConverter converter) throws Exception;
+    protected abstract void processSubPackage(String path, String runMode, VaultPackage contentPackage, ContentPackage2FeatureModelConverter converter, boolean isEmbeddedPackage) throws Exception;
 
 }
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/handlers/ContentPackageEntryHandler.java b/src/main/java/org/apache/sling/feature/cpconverter/handlers/ContentPackageEntryHandler.java
index 573d01b..c1d4c2d 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/handlers/ContentPackageEntryHandler.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/handlers/ContentPackageEntryHandler.java
@@ -22,9 +22,12 @@ import org.apache.sling.feature.cpconverter.ContentPackage2FeatureModelConverter
 public final class ContentPackageEntryHandler extends AbstractContentPackageHandler {
 
     @Override
-    protected void processSubPackage(String path, String runMode, VaultPackage contentPackage, ContentPackage2FeatureModelConverter converter)
-            throws Exception {
-        converter.processSubPackage(path, runMode, contentPackage);
+    protected void processSubPackage(String path, String runMode,
+            VaultPackage contentPackage,
+            ContentPackage2FeatureModelConverter converter,
+            boolean isEmbeddedPackage) throws Exception {
+                converter.processSubPackage(path, runMode, contentPackage, isEmbeddedPackage);
+        
     }
 
 }
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/handlers/VersionResolverContentPackageEntryHandler.java b/src/main/java/org/apache/sling/feature/cpconverter/handlers/VersionResolverContentPackageEntryHandler.java
index e4e9a8e..ac143cb 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/handlers/VersionResolverContentPackageEntryHandler.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/handlers/VersionResolverContentPackageEntryHandler.java
@@ -39,7 +39,7 @@ public final class VersionResolverContentPackageEntryHandler extends AbstractCon
     }
 
     @Override
-    protected void processSubPackage(String path, String runMode, VaultPackage contentPackage, ContentPackage2FeatureModelConverter converter)
+    protected void processSubPackage(String path, String runMode, VaultPackage contentPackage, ContentPackage2FeatureModelConverter converter, boolean isEmbeddedPackage)
             throws Exception {
 
         boolean addPackage = false;
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 ce24227..eaff712 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
@@ -70,7 +70,7 @@ public class VaultPackageAssembler implements EntryHandler, FileFilter {
     private static final File TMP_DIR = new File(System.getProperty("java.io.tmpdir"), "synthetic-content-packages");
 
     private static final Pattern OSGI_BUNDLE_PATTERN = Pattern.compile("(jcr_root)?/apps/[^/]+/install(\\.([^/]+))?/.+\\.jar");
-
+    
     public static VaultPackageAssembler create(VaultPackage vaultPackage) {
         return create(vaultPackage, vaultPackage.getMetaInf().getFilter());
     }
@@ -158,6 +158,10 @@ public class VaultPackageAssembler implements EntryHandler, FileFilter {
         this.properties = properties;
         this.dependencies = dependencies;
     }
+    
+    public Properties getPackageProperties() {
+        return this.properties;
+    }
 
     public void mergeFilters(WorkspaceFilter filter) {
         for (PathFilterSet pathFilterSet : filter.getFilterSets()) {
@@ -213,6 +217,11 @@ public class VaultPackageAssembler implements EntryHandler, FileFilter {
             dependencies.addAll(match.getValue());
         }
     }
+    
+
+    public void addDependency(Dependency dependency) {
+        dependencies.add(dependency);
+    }
 
     public File createPackage() throws IOException {
         return createPackage(TMP_DIR);
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 3b6693a..d98540a 100644
--- a/src/test/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverterTest.java
+++ b/src/test/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverterTest.java
@@ -49,9 +49,11 @@ import javax.json.JsonObject;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.jackrabbit.vault.packaging.CyclicDependencyException;
+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.maven.model.Dependency;
 import org.apache.sling.feature.ArtifactId;
 import org.apache.sling.feature.Artifacts;
 import org.apache.sling.feature.Extension;
@@ -121,7 +123,7 @@ public class ContentPackage2FeatureModelConverterTest {
 
     @Test(expected = NullPointerException.class)
     public void processRequiresNotNullPackage() throws Exception {
-        converter.processSubPackage("", null, null);
+        converter.processSubPackage("", null, null, false);
     }
 
     @Test
@@ -422,6 +424,30 @@ public class ContentPackage2FeatureModelConverterTest {
                  .setEmitter(DefaultPackagesEventsEmitter.open(outputDirectory))
                  .convert(packageFile);
     }
+    
+    /** app package containing another app package must lead to an explicit dependency from  
+     *  embedded to embedding package to reflect the implicit installation order via osgi Installer
+    **/
+    
+    @Test
+    public void verifyEmbeddedDependency() throws Exception {
+        URL packageUrl = getClass().getResource("embedded.package.test-0.0.1.zip");
+        File packageFile = FileUtils.toFile(packageUrl);
+
+        File outputDirectory = new File(System.getProperty("java.io.tmpdir"), getClass().getName() + '_' + System.currentTimeMillis());
+
+        converter.setFeaturesManager(new DefaultFeaturesManager(true, 5, outputDirectory, null, null, null))
+                 .setBundlesDeployer(new DefaultArtifactsDeployer(outputDirectory))
+                 .setEmitter(DefaultPackagesEventsEmitter.open(outputDirectory))
+                 .convert(packageFile);
+        
+        File contentPackage = new File(outputDirectory, "asd/sample/embedded.test.app/0.0.0/embedded.test.app-0.0.0-cp2fm-converted.zip");
+        VaultPackage vaultPackage = new PackageManagerImpl().open(contentPackage);
+        String dependencies = vaultPackage.getProperties().getProperty(PackageProperties.NAME_DEPENDENCIES);
+        org.apache.jackrabbit.vault.packaging.Dependency dep = org.apache.jackrabbit.vault.packaging.Dependency.fromString(dependencies);
+        PackageId targetId = PackageId.fromString("asd/sample:embedded.package.test:0.0.1-cp2fm-converted");
+        assertTrue(dep.matches(targetId));
+    }
 
     @Test(expected = IllegalStateException.class)
     public void doesNotAllowSameConfigurationPidForSameRunmode() throws Exception {
diff --git a/src/test/resources/org/apache/sling/feature/cpconverter/embedded.package.test-0.0.1.zip b/src/test/resources/org/apache/sling/feature/cpconverter/embedded.package.test-0.0.1.zip
new file mode 100644
index 0000000..2f4c929
Binary files /dev/null and b/src/test/resources/org/apache/sling/feature/cpconverter/embedded.package.test-0.0.1.zip differ