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)) {