From 38cc62fc1a2dfacecb59ef521c192d35873e26cd Mon Sep 17 00:00:00 2001 From: balasoiu Date: Fri, 2 Sep 2022 14:43:21 +0200 Subject: [PATCH] SLING-11560 - Allow configuring the IdConflictPolicy and set the default to LEGACY --- pom.xml | 2 +- .../impl/vlt/FileVaultContentSerializer.java | 12 +++++++----- .../VaultDistributionPackageBuilderFactory.java | 11 ++++++++++- .../serialization/impl/vlt/VltUtils.java | 16 ++++++++++++---- .../LocalDistributionPackageImporterTest.java | 2 ++ .../impl/vlt/FileVaultContentSerializerTest.java | 13 ++++++++----- .../serialization/impl/vlt/VltUtilsTest.java | 5 +++-- 7 files changed, 43 insertions(+), 18 deletions(-) diff --git a/pom.xml b/pom.xml index 4ae89609..81ffc31f 100644 --- a/pom.xml +++ b/pom.xml @@ -324,7 +324,7 @@ org.apache.jackrabbit.vault org.apache.jackrabbit.vault - 3.4.0 + 3.6.1-T20220805092633-0b8a2641 diff --git a/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultContentSerializer.java b/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultContentSerializer.java index 71bded70..51c7c706 100644 --- a/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultContentSerializer.java +++ b/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultContentSerializer.java @@ -30,6 +30,7 @@ import javax.jcr.RepositoryException; import javax.jcr.Session; +import org.apache.jackrabbit.vault.fs.api.IdConflictPolicy; import org.apache.jackrabbit.vault.fs.api.ImportMode; import org.apache.jackrabbit.vault.fs.api.RegexpPathMapping; import org.apache.jackrabbit.vault.fs.api.WorkspaceFilter; @@ -74,6 +75,7 @@ public class FileVaultContentSerializer implements DistributionContentSerializer private final ImportMode importMode; private final AccessControlHandling aclHandling; private final AccessControlHandling cugHandling; + private final IdConflictPolicy idConflictPolicy; private final String[] packageRoots; private final int autosaveThreshold; private final TreeMap> nodeFilters; @@ -83,15 +85,15 @@ public class FileVaultContentSerializer implements DistributionContentSerializer private final Map exportPathMapping; private final boolean strict; - public FileVaultContentSerializer(String name, Packaging packaging, ImportMode importMode, AccessControlHandling aclHandling, AccessControlHandling cugHandling, String[] packageRoots, - String[] nodeFilters, String[] propertyFilters, boolean useBinaryReferences, int autosaveThreshold, - Map exportPathMapping, - boolean strict) { + public FileVaultContentSerializer(String name, Packaging packaging, ImportMode importMode, AccessControlHandling aclHandling, AccessControlHandling cugHandling, + IdConflictPolicy idConflictPolicy, String[] packageRoots, String[] nodeFilters, String[] propertyFilters, boolean useBinaryReferences, + int autosaveThreshold, Map exportPathMapping, boolean strict) { this.name = name; this.packaging = packaging; this.importMode = importMode; this.aclHandling = aclHandling; this.cugHandling = cugHandling; + this.idConflictPolicy = idConflictPolicy; this.packageRoots = packageRoots; this.autosaveThreshold = autosaveThreshold; this.nodeFilters = VltUtils.parseFilters(nodeFilters); @@ -131,7 +133,7 @@ public void importFromStream(ResourceResolver resourceResolver, InputStream inpu Archive archive = null; try { session = getSession(resourceResolver); - ImportOptions importOptions = VltUtils.getImportOptions(aclHandling, cugHandling, importMode, autosaveThreshold, strict); + ImportOptions importOptions = VltUtils.getImportOptions(aclHandling, cugHandling, importMode, idConflictPolicy, autosaveThreshold, strict); ErrorListener errorListener = new ErrorListener(); importOptions.setListener(errorListener); Importer importer = new Importer(importOptions); diff --git a/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VaultDistributionPackageBuilderFactory.java b/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VaultDistributionPackageBuilderFactory.java index 05c888f9..4fb6c721 100644 --- a/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VaultDistributionPackageBuilderFactory.java +++ b/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VaultDistributionPackageBuilderFactory.java @@ -18,6 +18,7 @@ */ package org.apache.sling.distribution.serialization.impl.vlt; +import org.apache.jackrabbit.vault.fs.api.IdConflictPolicy; import org.apache.jackrabbit.vault.fs.api.ImportMode; import org.apache.jackrabbit.vault.fs.io.AccessControlHandling; import org.apache.jackrabbit.vault.packaging.Packaging; @@ -85,6 +86,8 @@ public class VaultDistributionPackageBuilderFactory implements DistributionPacka String aclHandling(); @AttributeDefinition(name="Cug Handling", description = "The vlt cug handling mode for created packages.") String cugHandling(); + @AttributeDefinition(name="Id Conflict Policy", description = "The conflict policy for created packages.") + String conflictPolicy(); @AttributeDefinition(name="Package Roots", description = "The package roots to be used for created packages. " + "(this is useful for assembling packages with an user that cannot read above the package root)") String[] package_roots(); @@ -195,6 +198,7 @@ public void activate(BundleContext context, Config conf) { String importModeString = SettingsUtils.removeEmptyEntry(conf.importMode()); String aclHandlingString = SettingsUtils.removeEmptyEntry(conf.aclHandling()); String cugHandlingString = SettingsUtils.removeEmptyEntry(conf.cugHandling()); + String conflictPolicyString = SettingsUtils.removeEmptyEntry(conf.conflictPolicy()); String[] packageRoots = SettingsUtils.removeEmptyEntries(conf.package_roots()); String[] packageNodeFilters = SettingsUtils.removeEmptyEntries(conf.package_filters()); @@ -226,13 +230,18 @@ public void activate(BundleContext context, Config conf) { cugHandling = AccessControlHandling.valueOf(cugHandlingString.trim()); } + IdConflictPolicy conflictPolicy = null; + if (conflictPolicyString != null) { + conflictPolicy = IdConflictPolicy.valueOf(conflictPolicyString.trim()); + } + // check the mount path patterns, if any Map pathsMapping = toMap(conf.pathsMapping(), new String[0]); pathsMapping = SettingsUtils.removeEmptyEntries(pathsMapping); boolean strictImport = conf.strictImport(); - DistributionContentSerializer contentSerializer = new FileVaultContentSerializer(name, packaging, importMode, aclHandling, cugHandling, + DistributionContentSerializer contentSerializer = new FileVaultContentSerializer(name, packaging, importMode, aclHandling, cugHandling, conflictPolicy, packageRoots, packageNodeFilters, packagePropertyFilters, useBinaryReferences, autosaveThreshold, pathsMapping, strictImport); DistributionPackageBuilder wrapped; diff --git a/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VltUtils.java b/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VltUtils.java index dfc501fb..75cda9cd 100644 --- a/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VltUtils.java +++ b/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VltUtils.java @@ -41,9 +41,11 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; +import org.apache.jackrabbit.vault.fs.api.IdConflictPolicy; import org.apache.jackrabbit.vault.fs.api.ImportMode; import org.apache.jackrabbit.vault.fs.api.PathFilterSet; import org.apache.jackrabbit.vault.fs.api.WorkspaceFilter; +import org.apache.jackrabbit.vault.fs.config.ConfigurationException; import org.apache.jackrabbit.vault.fs.config.DefaultMetaInf; import org.apache.jackrabbit.vault.fs.config.DefaultWorkspaceFilter; import org.apache.jackrabbit.vault.fs.config.MetaInf; @@ -79,7 +81,7 @@ public class VltUtils { private static final String MAPPING_DELIMITER = ";"; public static WorkspaceFilter createFilter(DistributionRequest distributionRequest, NavigableMap> nodeFilters, - NavigableMap> propertyFilters) { + NavigableMap> propertyFilters) throws ConfigurationException { DefaultWorkspaceFilter filter = new DefaultWorkspaceFilter(); for (String path : distributionRequest.getPaths()) { @@ -122,7 +124,7 @@ public static String[] getPaths(MetaInf metaInf) { return paths; } - private static void initFilterSet(PathFilterSet filterSet, NavigableMap> globalFilters, List patterns) { + private static void initFilterSet(PathFilterSet filterSet, NavigableMap> globalFilters, List patterns) throws ConfigurationException { // add the most specific filter rules String root = filterSet.getRoot(); @@ -227,7 +229,7 @@ private static String getPackageRoot(List filterSets, String[] pa return packageRoot; } - public static ImportOptions getImportOptions(AccessControlHandling aclHandling, AccessControlHandling cugHandling, ImportMode importMode, int autosaveThreshold, boolean strict) { + public static ImportOptions getImportOptions(AccessControlHandling aclHandling, AccessControlHandling cugHandling, ImportMode importMode, IdConflictPolicy idConflictPolicy, int autosaveThreshold, boolean strict) { ImportOptions opts = new ImportOptions(); if (aclHandling != null) { opts.setAccessControlHandling(aclHandling); @@ -247,6 +249,12 @@ public static ImportOptions getImportOptions(AccessControlHandling aclHandling, // default to update opts.setImportMode(ImportMode.UPDATE); } + if (idConflictPolicy != null) { + opts.setIdConflictPolicy(idConflictPolicy); + } else { + // default to legacy + opts.setIdConflictPolicy(IdConflictPolicy.LEGACY); + } opts.setPatchKeepInRepo(false); @@ -435,7 +443,7 @@ public static DistributionRequest sanitizeRequest(DistributionRequest request) { return new SimpleDistributionRequest(requestType, paths.toArray(new String[paths.size()]), deepPaths, filters); } - private static PathFilterSet.Entry extractPathPattern(String pattern) { + private static PathFilterSet.Entry extractPathPattern(String pattern) throws ConfigurationException { PathFilterSet.Entry result; if (pattern.startsWith("+")) { result = new PathFilterSet.Entry(new DefaultPathFilter(pattern.substring(1)), true); diff --git a/src/test/java/org/apache/sling/distribution/packaging/impl/importer/LocalDistributionPackageImporterTest.java b/src/test/java/org/apache/sling/distribution/packaging/impl/importer/LocalDistributionPackageImporterTest.java index e66c3164..22342c8a 100644 --- a/src/test/java/org/apache/sling/distribution/packaging/impl/importer/LocalDistributionPackageImporterTest.java +++ b/src/test/java/org/apache/sling/distribution/packaging/impl/importer/LocalDistributionPackageImporterTest.java @@ -19,6 +19,7 @@ package org.apache.sling.distribution.packaging.impl.importer; import org.apache.commons.lang3.StringUtils; +import org.apache.jackrabbit.vault.fs.api.IdConflictPolicy; import org.apache.jackrabbit.vault.fs.api.ImportMode; import org.apache.jackrabbit.vault.fs.io.AccessControlHandling; import org.apache.jackrabbit.vault.packaging.impl.PackagingImpl; @@ -84,6 +85,7 @@ public void importPackageWithLargeHeader() throws Exception { ImportMode.UPDATE, AccessControlHandling.IGNORE, AccessControlHandling.IGNORE, + IdConflictPolicy.LEGACY, new String[0], new String[0], new String[0], diff --git a/src/test/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultContentSerializerTest.java b/src/test/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultContentSerializerTest.java index f74b0121..c8fab9e9 100644 --- a/src/test/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultContentSerializerTest.java +++ b/src/test/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultContentSerializerTest.java @@ -27,6 +27,7 @@ import java.io.OutputStream; import java.util.HashMap; +import org.apache.jackrabbit.vault.fs.api.IdConflictPolicy; import org.apache.jackrabbit.vault.fs.api.ImportMode; import org.apache.jackrabbit.vault.fs.io.AccessControlHandling; import org.apache.jackrabbit.vault.packaging.ExportOptions; @@ -76,14 +77,15 @@ public void testExportToStream() throws Exception { ImportMode importMode = ImportMode.REPLACE; AccessControlHandling aclHandling = AccessControlHandling.IGNORE; + IdConflictPolicy conflictPolicy = IdConflictPolicy.LEGACY; String[] packageRoots = new String[]{"/etc/packages"}; String[] nodeFilters = new String[0]; String[] propertyFilters = new String[0]; boolean useReferences = false; int threshold = 1024; - FileVaultContentSerializer fileVaultContentSerializer = new FileVaultContentSerializer("vlt", packaging, importMode, - aclHandling, aclHandling, packageRoots, nodeFilters, propertyFilters, useReferences, threshold, new HashMap(), false); + FileVaultContentSerializer fileVaultContentSerializer = new FileVaultContentSerializer("vlt", packaging, importMode, aclHandling, aclHandling, + conflictPolicy, packageRoots, nodeFilters, propertyFilters, useReferences, threshold, new HashMap(), false); ResourceResolver sessionResolver = mock(ResourceResolver.class); Session session = mock(Session.class); @@ -118,17 +120,18 @@ public void testImportFromStream() throws Exception { Packaging packaging = mock(Packaging.class); ImportMode importMode = ImportMode.REPLACE; AccessControlHandling aclHandling = AccessControlHandling.IGNORE; + IdConflictPolicy conflictPolicy = IdConflictPolicy.LEGACY; String[] packageRoots = new String[]{"/"}; String[] nodeFilters = new String[0]; String[] propertyFilters = new String[0]; boolean useReferences = false; int thershold = 1024; - FileVaultContentSerializer fileVaultContentSerializer = new FileVaultContentSerializer("vlt", packaging, importMode, - aclHandling, aclHandling, packageRoots, nodeFilters, propertyFilters, useReferences, thershold, new HashMap(), true); + FileVaultContentSerializer fileVaultContentSerializer = new FileVaultContentSerializer("vlt", packaging, importMode, aclHandling, aclHandling, + conflictPolicy, packageRoots, nodeFilters, propertyFilters, useReferences, thershold, new HashMap(), true); File file = new File(getClass().getResource("/vlt/dp.vlt").getFile()); fileVaultContentSerializer.importFromStream(context.resourceResolver(), new FileInputStream(file)); } -} \ No newline at end of file +} diff --git a/src/test/java/org/apache/sling/distribution/serialization/impl/vlt/VltUtilsTest.java b/src/test/java/org/apache/sling/distribution/serialization/impl/vlt/VltUtilsTest.java index 348db108..2b388682 100644 --- a/src/test/java/org/apache/sling/distribution/serialization/impl/vlt/VltUtilsTest.java +++ b/src/test/java/org/apache/sling/distribution/serialization/impl/vlt/VltUtilsTest.java @@ -27,6 +27,7 @@ import org.apache.jackrabbit.vault.fs.api.PathFilter; import org.apache.jackrabbit.vault.fs.api.PathFilterSet; import org.apache.jackrabbit.vault.fs.api.WorkspaceFilter; +import org.apache.jackrabbit.vault.fs.config.ConfigurationException; import org.apache.sling.distribution.DistributionRequest; import org.apache.sling.distribution.SimpleDistributionRequest; import org.junit.Test; @@ -119,7 +120,7 @@ public void testFilterParsingWithSamePath() throws Exception { } @Test - public void testCreateFilterWithParenthesis() { + public void testCreateFilterWithParenthesis() throws ConfigurationException { DistributionRequest request = new SimpleDistributionRequest(ADD, false, "/nodewith(shouldwork"); NavigableMap> nodeFilters = new TreeMap>(); NavigableMap> propFilters = new TreeMap>(); @@ -138,4 +139,4 @@ public void testSanitizeWithPolicyNodeIsConvertedToDeepPath() { assertThat(sanitizedRequest.isDeep(pathWithoutPolicy), equalTo(false)); } -} \ No newline at end of file +}