You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by si...@apache.org on 2019/08/21 13:55:10 UTC

[sling-org-apache-sling-feature-cpconverter] 01/01: SLING-8649 - Missing dependencies when installing computed content-packages

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

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

commit 4ee0415a755d40aa1e79dc4a1b1fbe97a01f3a44
Author: Simo Tripodi <st...@adobe.com>
AuthorDate: Wed Aug 21 15:54:54 2019 +0200

    SLING-8649 - Missing dependencies when installing computed
    content-packages
    
    initial fix attempt
---
 .../ContentPackage2FeatureModelConverter.java      | 28 ++++++++++------
 .../cpconverter/vltpkg/VaultPackageAssembler.java  | 38 ++++++++++++++++++++--
 2 files changed, 53 insertions(+), 13 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 43a372a..53bf1a2 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java
@@ -16,8 +16,8 @@
  */
 package org.apache.sling.feature.cpconverter;
 
-import static org.apache.sling.feature.cpconverter.vltpkg.VaultPackageUtils.detectPackageType;
 import static java.util.Objects.requireNonNull;
+import static org.apache.sling.feature.cpconverter.vltpkg.VaultPackageUtils.detectPackageType;
 
 import java.io.File;
 import java.util.Collection;
@@ -65,6 +65,8 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
 
     private final List<VaultPackageAssembler> assemblers = new LinkedList<>();
 
+    private final Set<PackageId> mutableContentsIds = new HashSet<>();
+
     private EntryHandlersManager handlersManager;
 
     private AclManager aclManager;
@@ -191,9 +193,9 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
                 mainPackageAssembler = VaultPackageAssembler.create(vaultPackage);
                 assemblers.add(mainPackageAssembler);
 
-                ArtifactId packageId = toArtifactId(vaultPackage);
+                ArtifactId mvnPackageId = toArtifactId(vaultPackage);
 
-                featuresManager.init(packageId.getGroupId(), packageId.getArtifactId(), packageId.getVersion());
+                featuresManager.init(mvnPackageId.getGroupId(), mvnPackageId.getArtifactId(), mvnPackageId.getVersion());
 
                 logger.info("Converting content-package '{}'...", vaultPackage.getId());
 
@@ -205,7 +207,7 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
 
                 // deploy the new zip content-package to the local mvn bundles dir
 
-                processContentPackageArchive(contentPackageArchive, packageId);
+                processContentPackageArchive(contentPackageArchive, mvnPackageId, vaultPackage.getId());
 
                 // finally serialize the Feature Model(s) file(s)
 
@@ -227,6 +229,8 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
             }
         }
 
+        mutableContentsIds.clear();
+
         emitter.end();
     }
 
@@ -262,7 +266,8 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
 
         emitter.startSubPackage(path, vaultPackage);
 
-        ArtifactId packageId = toArtifactId(vaultPackage);
+        PackageId packageId = vaultPackage.getId();
+        ArtifactId mvnPackageId = toArtifactId(vaultPackage);
         VaultPackageAssembler clonedPackage = VaultPackageAssembler.create(vaultPackage);
 
         // Please note: THIS IS A HACK to meet the new requirement without drastically change the original design
@@ -277,7 +282,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, packageId);
+        processContentPackageArchive(contentPackageArchive, mvnPackageId, packageId);
 
         // restore the previous assembler
         mainPackageAssembler = handler;
@@ -285,16 +290,19 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
         emitter.endSubPackage();
     }
 
-    private void processContentPackageArchive(File contentPackageArchive, ArtifactId packageId) throws Exception {
+    private void processContentPackageArchive(File contentPackageArchive,
+                                              ArtifactId mvnPackageId,
+                                              PackageId packageId) throws Exception {
         try (VaultPackage vaultPackage = open(contentPackageArchive)) {
             PackageType packageType = detectPackageType(vaultPackage);
             // don't deploy & add content-packages of type content to featuremodel if dropContent is set
             if (PackageType.CONTENT != packageType || !dropContent) {
                 // deploy the new content-package to the local mvn bundles dir and attach it to the feature
-                artifactsDeployer.deploy(new FileArtifactWriter(contentPackageArchive), packageId);
-                featuresManager.addArtifact(null, packageId);
+                artifactsDeployer.deploy(new FileArtifactWriter(contentPackageArchive), mvnPackageId);
+                featuresManager.addArtifact(null, mvnPackageId);
             } else {
-                logger.info("Dropping package of PackageType.CONTENT {}", packageId.getArtifactId());
+                mutableContentsIds.add(packageId);
+                logger.info("Dropping package of PackageType.CONTENT {} (content-package id: {})", mvnPackageId.getArtifactId(), packageId);
             }
         }
     }
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 7ec08de..763a4b8 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
@@ -31,8 +31,12 @@ import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.util.HashSet;
 import java.util.Properties;
+import java.util.Set;
+import java.util.StringTokenizer;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.jackrabbit.vault.fs.api.ImportMode;
@@ -41,6 +45,7 @@ import org.apache.jackrabbit.vault.fs.api.WorkspaceFilter;
 import org.apache.jackrabbit.vault.fs.config.DefaultWorkspaceFilter;
 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.sling.feature.cpconverter.ContentPackage2FeatureModelConverter;
@@ -51,6 +56,8 @@ import org.codehaus.plexus.archiver.zip.ZipArchiver;
 
 public class VaultPackageAssembler implements EntryHandler {
 
+    private static final String DEPENDENCIES_DELIMITER = ",";
+
     private static final String NAME_PATH = "path";
 
     private static final String[] INCLUDE_RESOURCES = { PACKAGE_DEFINITION_XML, CONFIG_XML, SETTINGS_XML };
@@ -90,7 +97,6 @@ public class VaultPackageAssembler implements EntryHandler {
         for (String key : new String[] {
                 PackageProperties.NAME_GROUP,
                 PackageProperties.NAME_NAME,
-                PackageProperties.NAME_DEPENDENCIES,
                 PackageProperties.NAME_CREATED_BY,
                 PackageProperties.NAME_CREATED,
                 PackageProperties.NAME_REQUIRES_ROOT,
@@ -104,13 +110,29 @@ public class VaultPackageAssembler implements EntryHandler {
             }
         }
 
-        VaultPackageAssembler assembler = new VaultPackageAssembler(storingDirectory, properties);
+        Set<PackageId> dependencies = new HashSet<>();
+        String dependenciesString = properties.getProperty(PackageProperties.NAME_DEPENDENCIES);
+
+        if (dependenciesString != null && !dependenciesString.isEmpty()) {
+         // from https://jackrabbit.apache.org/filevault/properties.html
+            // Comma-separated list of dependencies
+            StringTokenizer tokenizer = new StringTokenizer(dependenciesString, DEPENDENCIES_DELIMITER);
+            while (tokenizer.hasMoreTokens()) {
+                String dependencyString = tokenizer.nextToken();
+                PackageId dependency = PackageId.fromString(dependencyString);
+                dependencies.add(dependency);
+            }
+        }
+
+        VaultPackageAssembler assembler = new VaultPackageAssembler(storingDirectory, properties, dependencies);
         assembler.mergeFilters(filter);
         return assembler;
     }
 
     private final DefaultWorkspaceFilter filter = new DefaultWorkspaceFilter();
 
+    private final Set<PackageId> dependencies;
+
     private final File storingDirectory;
 
     private final Properties properties;
@@ -129,9 +151,10 @@ public class VaultPackageAssembler implements EntryHandler {
     /**
      * This class can not be instantiated from outside
      */
-    private VaultPackageAssembler(File storingDirectory, Properties properties) {
+    private VaultPackageAssembler(File storingDirectory, Properties properties, Set<PackageId> dependencies) {
         this.storingDirectory = storingDirectory;
         this.properties = properties;
+        this.dependencies = dependencies;
     }
 
     public void mergeFilters(WorkspaceFilter filter) {
@@ -174,6 +197,10 @@ public class VaultPackageAssembler implements EntryHandler {
         return new File(storingDirectory, path);
     }
 
+    public void removeDependencies(Set<PackageId> mutableContentsIds) {
+        dependencies.removeAll(mutableContentsIds);
+    }
+
     public File createPackage() throws IOException {
         return createPackage(TMP_DIR);
     }
@@ -186,6 +213,11 @@ public class VaultPackageAssembler implements EntryHandler {
             metaDir.mkdirs();
         }
 
+        if (!dependencies.isEmpty()) {
+            String dependenciesString = dependencies.stream().map(id -> id.toString()).collect(Collectors.joining(DEPENDENCIES_DELIMITER));
+            properties.setProperty(PackageProperties.NAME_DEPENDENCIES, dependenciesString);
+        }
+
         File xmlProperties = new File(metaDir, PROPERTIES_XML);
 
         try (FileOutputStream fos = new FileOutputStream(xmlProperties)) {