SLING-7730 - Distribution package is lost if there is an installation
error on receiver side
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 c759c36..17fce95 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
@@ -81,10 +81,12 @@
private final boolean useBinaryReferences;
private final String name;
private final Map<String, String> exportPathMapping;
+ private final boolean strict;
public FileVaultContentSerializer(String name, Packaging packaging, ImportMode importMode, AccessControlHandling aclHandling, String[] packageRoots,
String[] nodeFilters, String[] propertyFilters, boolean useBinaryReferences, int autosaveThreshold,
- Map<String, String> exportPathMapping) {
+ Map<String, String> exportPathMapping,
+ boolean strict) {
this.name = name;
this.packaging = packaging;
this.importMode = importMode;
@@ -95,6 +97,7 @@
this.propertyFilters = VltUtils.parseFilters(propertyFilters);
this.useBinaryReferences = useBinaryReferences;
this.exportPathMapping = exportPathMapping;
+ this.strict = strict;
}
@Override
@@ -127,7 +130,7 @@
Archive archive = null;
try {
session = getSession(resourceResolver);
- ImportOptions importOptions = VltUtils.getImportOptions(aclHandling, importMode, autosaveThreshold);
+ ImportOptions importOptions = VltUtils.getImportOptions(aclHandling, importMode, autosaveThreshold, strict);
Importer importer = new Importer(importOptions);
archive = new ZipStreamArchive(inputStream);
archive.open(false);
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 220d987..f832883 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
@@ -208,6 +208,15 @@
"The format is {sourcePattern}={destinationPattern}, e.g. /etc/(.*)=/var/$1/some or simply /data=/bak")
private static final String PATHS_MAPPING = "pathsMapping";
+ private static final boolean DEFAULT_STRICT_IMPORT_SETTINGS = true;
+
+ @Property(
+ label = "Install a content package in a strict mode",
+ description = "Flag to mark an error response will be thrown, if a content package will incorrectly installed",
+ boolValue = DEFAULT_STRICT_IMPORT_SETTINGS
+ )
+ public static final String STRICT_IMPORT_SETTINGS = "strictImport";
+
@Reference
private Packaging packaging;
@@ -256,8 +265,10 @@
Map<String, String> pathsMapping = PropertiesUtil.toMap(config.get(PATHS_MAPPING), new String[0]);
pathsMapping = SettingsUtils.removeEmptyEntries(pathsMapping);
+ boolean strictImport = PropertiesUtil.toBoolean(config.get(STRICT_IMPORT_SETTINGS), DEFAULT_STRICT_IMPORT_SETTINGS);
+
DistributionContentSerializer contentSerializer = new FileVaultContentSerializer(name, packaging, importMode, aclHandling,
- packageRoots, packageNodeFilters, packagePropertyFilters, useBinaryReferences, autosaveThreshold, pathsMapping);
+ packageRoots, packageNodeFilters, packagePropertyFilters, useBinaryReferences, autosaveThreshold, pathsMapping, strictImport);
DistributionPackageBuilder wrapped;
if ("filevlt".equals(type)) {
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 4c0bc30..cc73cb1 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
@@ -226,7 +226,7 @@
return packageRoot;
}
- public static ImportOptions getImportOptions(AccessControlHandling aclHandling, ImportMode importMode, int autosaveThreshold) {
+ public static ImportOptions getImportOptions(AccessControlHandling aclHandling, ImportMode importMode, int autosaveThreshold, boolean strict) {
ImportOptions opts = new ImportOptions();
if (aclHandling != null) {
opts.setAccessControlHandling(aclHandling);
@@ -247,7 +247,7 @@
opts.setAutoSaveThreshold(autosaveThreshold);
}
- opts.setStrict(true);
+ opts.setStrict(strict);
return opts;
}
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 f1679b7..df3c73d 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
@@ -81,7 +81,8 @@
new String[0],
false,
-1,
- null
+ null,
+ false
);
DistributionPackageBuilder builder =
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 4f5cf98..69257ab 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
@@ -82,7 +82,7 @@
boolean useReferences = false;
int threshold = 1024;
FileVaultContentSerializer fileVaultContentSerializer = new FileVaultContentSerializer("vlt", packaging, importMode,
- aclHandling, packageRoots, nodeFilters, propertyFilters, useReferences, threshold, new HashMap<String, String>());
+ aclHandling, packageRoots, nodeFilters, propertyFilters, useReferences, threshold, new HashMap<String, String>(), false);
ResourceResolver sessionResolver = mock(ResourceResolver.class);
Session session = mock(Session.class);
@@ -124,7 +124,7 @@
boolean useReferences = false;
int thershold = 1024;
FileVaultContentSerializer fileVaultContentSerializer = new FileVaultContentSerializer("vlt", packaging, importMode,
- aclHandling, packageRoots, nodeFilters, propertyFilters, useReferences, thershold, new HashMap<String, String>());
+ aclHandling, packageRoots, nodeFilters, propertyFilters, useReferences, thershold, new HashMap<String, String>(), true);
File file = new File(getClass().getResource("/vlt/dp.vlt").getFile());