You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by re...@apache.org on 2022/01/20 08:23:14 UTC

[jackrabbit-filevault] branch master updated: JCRVLT-596: add OSGi config for default IdConflictPolicy

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

reschke pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jackrabbit-filevault.git


The following commit(s) were added to refs/heads/master by this push:
     new 4062332  JCRVLT-596: add OSGi config for default IdConflictPolicy
4062332 is described below

commit 4062332786a31b38866be2ebd468eeb92e204150
Author: Julian Reschke <re...@apache.org>
AuthorDate: Thu Jan 20 09:23:09 2022 +0100

    JCRVLT-596: add OSGi config for default IdConflictPolicy
    
    * JCRVLT-596: add OSGi config for default IdConflictPolicy
    
    * JCRVLT-596: add OSGi config for default IdConflictPolicy - use actual enum as type in OSGi
    
    * JCRVLT-596: add OSGi config for default IdConflictPolicy - fix Javadoc
    
    * JCRVLT-596: try to detect whether a policy was set (test failing)
    
    * Revert "JCRVLT-596: try to detect whether a policy was set (test failing)"
    
    This reverts commit 06fcdf928b3dd72a8e239750f7289d483113a80f.
    
    * JCRVLT-596: try to detect whether a policy was set
    
    * Revert "JCRVLT-596: try to detect whether a policy was set"
    
    This reverts commit 7738308066418d735dbbe1c06c8b99a2026da31b.
    
    * Revert "Revert "JCRVLT-596: try to detect whether a policy was set (test failing)""
    
    This reverts commit 3b4c3388a1e2407e230cfb5c2a115afcc07b020e.
    
    * never persist default conflict policy
    
    * fix package version
    
    Co-authored-by: Konrad Windszus <kw...@apache.org>
---
 .../vault/fs/impl/io/DocViewSAXImporter.java           |  2 +-
 .../apache/jackrabbit/vault/fs/io/ImportOptions.java   | 18 ++++++++++++++----
 .../apache/jackrabbit/vault/fs/io/package-info.java    |  2 +-
 .../vault/packaging/impl/JcrPackageImpl.java           |  4 ++++
 .../vault/packaging/impl/JcrPackageManagerImpl.java    |  9 +++++----
 .../jackrabbit/vault/packaging/impl/PackagingImpl.java | 15 +++++++++++----
 .../registry/impl/AbstractPackageRegistry.java         | 11 ++++++++++-
 .../packaging/registry/impl/FSPackageRegistry.java     | 17 ++++++++++-------
 .../packaging/registry/impl/JcrPackageRegistry.java    |  8 +++++---
 .../registry/impl/PackageTaskOptionsSerializer.java    |  7 +++++++
 .../vault/packaging/integration/PackageInstallIT.java  |  3 ++-
 11 files changed, 70 insertions(+), 26 deletions(-)

diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/DocViewSAXImporter.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/DocViewSAXImporter.java
index 00221ff..4854642 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/DocViewSAXImporter.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/DocViewSAXImporter.java
@@ -271,7 +271,7 @@ public class DocViewSAXImporter extends RejectingEntityDefaultHandler implements
                 getDescriptorValue(Repository.NODE_TYPE_MANAGEMENT_SAME_NAME_SIBLINGS_SUPPORTED).getBoolean();
         this.nsHelper = new JcrNamespaceHelper(session, null);
         this.idConflictPolicy = idConflictPolicy;
-
+        log.debug("idConflictPolicy: {}", idConflictPolicy);
         String rootPath = parentNode.getPath();
         if (!rootPath.equals("/")) {
             rootPath += "/";
diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/ImportOptions.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/ImportOptions.java
index 2fa7f53..7372b95 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/ImportOptions.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/ImportOptions.java
@@ -67,7 +67,7 @@ public class ImportOptions {
 
     private DependencyHandling dependencyHandling = null;
 
-    private @NotNull IdConflictPolicy idConflictPolicy = IdConflictPolicy.FAIL;
+    private IdConflictPolicy idConflictPolicy = null;
 
     private Boolean overwritePrimaryTypesOfFolders = null;
 
@@ -456,7 +456,14 @@ public class ImportOptions {
      * @since 3.5.1
      */
     public @NotNull IdConflictPolicy getIdConflictPolicy() {
-        return idConflictPolicy;
+        return idConflictPolicy != null ? idConflictPolicy : IdConflictPolicy.FAIL;
+    }
+
+    /**
+     * @since 3.5.10
+     */
+    public boolean hasIdConflictPolicyBeenSet() {
+        return idConflictPolicy != null;
     }
 
     /**
@@ -558,7 +565,10 @@ public class ImportOptions {
             return false;
         if (overwritePrimaryTypesOfFolders != other.overwritePrimaryTypesOfFolders)
             return false;
-        if (!idConflictPolicy.equals(other.idConflictPolicy))
+        if (idConflictPolicy == null) {
+            if (other.idConflictPolicy != null)
+                return false;
+        } else if (!idConflictPolicy.equals(other.idConflictPolicy))
             return false;
         return true;
     }
@@ -577,6 +587,6 @@ public class ImportOptions {
                 + (pathMapping != null ? "pathMapping=" + pathMapping + ", " : "")
                 + (dependencyHandling != null ? "dependencyHandling=" + dependencyHandling + ", " : "")
                 + "overwritePrimaryTypesOfFolders=" + overwritePrimaryTypesOfFolders + ", "
-                + "idConflictPolicy=" + idConflictPolicy + "]";
+                + "idConflictPolicy=" + (idConflictPolicy != null ? idConflictPolicy : IdConflictPolicy.FAIL) + "]";
     }
 }
\ No newline at end of file
diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/package-info.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/package-info.java
index 2be7b2f..4989948 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/package-info.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/package-info.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-@Version("2.12.0")
+@Version("2.13.0")
 package org.apache.jackrabbit.vault.fs.io;
 
 import org.osgi.annotation.versioning.Version;
diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageImpl.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageImpl.java
index aecdaac..af74a2b 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageImpl.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageImpl.java
@@ -386,6 +386,10 @@ public class JcrPackageImpl implements JcrPackage {
             // MAX_VALUE disables saving completely, therefore we have to use a lower value!
             opts.setAutoSaveThreshold(Integer.MAX_VALUE - 1);
         }
+        if (!opts.hasIdConflictPolicyBeenSet()) {
+            opts.setIdConflictPolicy(mgr.getDefaultIdConflictPolicy());
+        }
+        opts.setIdConflictPolicy(mgr.getDefaultIdConflictPolicy());
         InstallContextImpl ctx = pack.prepareExtract(node.getSession(), opts, mgr.getSecurityConfig(), mgr.isStrictByDefault(),
                 mgr.overwritePrimaryTypesOfFoldersByDefault());
         JcrPackage snap = null;
diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageManagerImpl.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageManagerImpl.java
index 4e5d477..61deeca 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageManagerImpl.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageManagerImpl.java
@@ -38,6 +38,7 @@ import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 
 import org.apache.commons.io.FileUtils;
+import org.apache.jackrabbit.vault.fs.api.IdConflictPolicy;
 import org.apache.jackrabbit.vault.fs.api.ProgressTrackerListener;
 import org.apache.jackrabbit.vault.fs.api.WorkspaceFilter;
 import org.apache.jackrabbit.vault.fs.config.DefaultMetaInf;
@@ -88,7 +89,7 @@ public class JcrPackageManagerImpl extends PackageManagerImpl implements JcrPack
      *
      * @param session repository session
      * @param roots the root paths to store the packages.
-     * @deprecated Use {@link #JcrPackageManagerImpl(Session, String[], String[], String[], boolean, boolean)} instead.
+     * @deprecated Use {@link #JcrPackageManagerImpl(Session, String[], String[], String[], boolean, boolean, IdConflictPolicy)} instead.
      */
     @Deprecated
     public JcrPackageManagerImpl(@NotNull Session session, @Nullable String[] roots) {
@@ -96,10 +97,10 @@ public class JcrPackageManagerImpl extends PackageManagerImpl implements JcrPack
     }
 
     public JcrPackageManagerImpl(@NotNull Session session, @Nullable String[] roots, @Nullable String[] authIdsForHookExecution,
-            @Nullable String[] authIdsForRootInstallation, boolean isStrict, boolean overwritePrimaryTypesOfFoldersByDefault) {
+            @Nullable String[] authIdsForRootInstallation, boolean isStrict, boolean overwritePrimaryTypesOfFoldersByDefault, IdConflictPolicy idConflictPolicy) {
         this(new JcrPackageRegistry(session,
                 new AbstractPackageRegistry.SecurityConfig(authIdsForHookExecution, authIdsForRootInstallation), isStrict,
-                overwritePrimaryTypesOfFoldersByDefault, roots));
+                overwritePrimaryTypesOfFoldersByDefault, idConflictPolicy, roots));
     }
 
     protected JcrPackageManagerImpl(JcrPackageRegistry registry) {
@@ -116,7 +117,7 @@ public class JcrPackageManagerImpl extends PackageManagerImpl implements JcrPack
     public PackageRegistry getRegistry() {
         return registry;
     }
-    
+
     public JcrPackageRegistry getInternalRegistry() {
         return registry;
     }
diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/PackagingImpl.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/PackagingImpl.java
index cc1d50e..9fdd298 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/PackagingImpl.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/PackagingImpl.java
@@ -24,6 +24,7 @@ import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 
+import org.apache.jackrabbit.vault.fs.api.IdConflictPolicy;
 import org.apache.jackrabbit.vault.packaging.JcrPackage;
 import org.apache.jackrabbit.vault.packaging.JcrPackageDefinition;
 import org.apache.jackrabbit.vault.packaging.JcrPackageManager;
@@ -81,7 +82,6 @@ public class PackagingImpl implements Packaging {
     Config config;
 
     public PackagingImpl() {
-        
     }
 
     @ObjectClassDefinition(
@@ -106,6 +106,9 @@ public class PackagingImpl implements Packaging {
 
         @AttributeDefinition(description = "Whether to overwrite the primary type of folders")
         boolean overwritePrimaryTypesOfFolders() default true;
+
+        @AttributeDefinition(description = "Default IdConflictPolicy")
+        IdConflictPolicy defaultIdConflictPolicy() default IdConflictPolicy.FAIL;
     }
 
     @Activate
@@ -126,7 +129,9 @@ public class PackagingImpl implements Packaging {
      * {@inheritDoc}
      */
     public JcrPackageManager getPackageManager(Session session) {
-        JcrPackageManagerImpl mgr = new JcrPackageManagerImpl(session, config.packageRoots(), config.authIdsForHookExecution(), config.authIdsForRootInstallation(), config.isStrict(), config.overwritePrimaryTypesOfFolders());
+        JcrPackageManagerImpl mgr = new JcrPackageManagerImpl(session, config.packageRoots(), config.authIdsForHookExecution(),
+                config.authIdsForRootInstallation(), config.isStrict(), config.overwritePrimaryTypesOfFolders(),
+                config.defaultIdConflictPolicy());
         mgr.setDispatcher(eventDispatcher);
         setBaseRegistry(mgr.getInternalRegistry(), registries);
         return mgr;
@@ -173,14 +178,16 @@ public class PackagingImpl implements Packaging {
         return getJcrPackageRegistry(session, true);
     }
 
-    
     @Override
     public PackageRegistry getJcrBasedPackageRegistry(Session session) {
         return getJcrPackageRegistry(session);
     }
 
     private JcrPackageRegistry getJcrPackageRegistry(Session session, boolean useBaseRegistry) {
-        JcrPackageRegistry registry = new JcrPackageRegistry(session, new AbstractPackageRegistry.SecurityConfig(config.authIdsForHookExecution(), config.authIdsForRootInstallation()), config.isStrict(), config.overwritePrimaryTypesOfFolders(), config.packageRoots());
+        JcrPackageRegistry registry = new JcrPackageRegistry(session,
+                new AbstractPackageRegistry.SecurityConfig(config.authIdsForHookExecution(), config.authIdsForRootInstallation()),
+                config.isStrict(), config.overwritePrimaryTypesOfFolders(), config.defaultIdConflictPolicy(),
+                config.packageRoots());
         registry.setDispatcher(eventDispatcher);
         if (useBaseRegistry) {
             setBaseRegistry(registry, registries);
diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/impl/AbstractPackageRegistry.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/impl/AbstractPackageRegistry.java
index fcc2492..5453dc7 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/impl/AbstractPackageRegistry.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/impl/AbstractPackageRegistry.java
@@ -27,6 +27,7 @@ import java.util.UUID;
 
 import javax.jcr.Session;
 
+import org.apache.jackrabbit.vault.fs.api.IdConflictPolicy;
 import org.apache.jackrabbit.vault.fs.io.ImportOptions;
 import org.apache.jackrabbit.vault.packaging.Dependency;
 import org.apache.jackrabbit.vault.packaging.NoSuchPackageException;
@@ -85,7 +86,10 @@ public abstract class AbstractPackageRegistry implements PackageRegistry, Intern
 
     private final boolean overwritePrimaryTypesOfFoldersByDefault;
 
-    public AbstractPackageRegistry(SecurityConfig securityConfig, boolean isStrictByDefault, boolean overwritePrimaryTypesOfFoldersByDefault) {
+    private final IdConflictPolicy defaultIdConflictPolicy;
+
+    public AbstractPackageRegistry(SecurityConfig securityConfig, boolean isStrictByDefault,
+            boolean overwritePrimaryTypesOfFoldersByDefault, IdConflictPolicy defaultIdConflictPolicy) {
         if (securityConfig != null) {
             this.securityConfig = securityConfig;
         } else {
@@ -93,6 +97,7 @@ public abstract class AbstractPackageRegistry implements PackageRegistry, Intern
         }
         this.isStrictByDefault = isStrictByDefault;
         this.overwritePrimaryTypesOfFoldersByDefault = overwritePrimaryTypesOfFoldersByDefault;
+        this.defaultIdConflictPolicy = defaultIdConflictPolicy;
     }
 
     public boolean isStrictByDefault() {
@@ -103,6 +108,10 @@ public abstract class AbstractPackageRegistry implements PackageRegistry, Intern
         return overwritePrimaryTypesOfFoldersByDefault;
     }
 
+    public IdConflictPolicy getDefaultIdConflictPolicy() {
+        return defaultIdConflictPolicy;
+    }
+
     /**
      * {@inheritDoc}
      */
diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/impl/FSPackageRegistry.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/impl/FSPackageRegistry.java
index 27f1e34..ab24db1 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/impl/FSPackageRegistry.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/impl/FSPackageRegistry.java
@@ -36,6 +36,7 @@ import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 
 import org.apache.jackrabbit.util.Text;
+import org.apache.jackrabbit.vault.fs.api.IdConflictPolicy;
 import org.apache.jackrabbit.vault.fs.api.PathFilterSet;
 import org.apache.jackrabbit.vault.fs.api.WorkspaceFilter;
 import org.apache.jackrabbit.vault.fs.config.DefaultWorkspaceFilter;
@@ -107,7 +108,7 @@ public class FSPackageRegistry extends AbstractPackageRegistry {
      *
      * @param homeDir the directory in which packages and their metadata is stored
      * @throws IOException If an I/O error occurs.
-     * @deprecated Use {@link #FSPackageRegistry(File, InstallationScope, SecurityConfig, boolean, boolean)} instead
+     * @deprecated Use {@link #FSPackageRegistry(File, InstallationScope, SecurityConfig, boolean, boolean, IdConflictPolicy)} instead
      */
     @Deprecated
     public FSPackageRegistry(@NotNull File homeDir) throws IOException {
@@ -120,7 +121,7 @@ public class FSPackageRegistry extends AbstractPackageRegistry {
      * @param homeDir the directory in which packages and their metadata is stored
      * @param scope to set a corresponding workspacefilter
      * @throws IOException If an I/O error occurs.
-     * @deprecated Use {@link #FSPackageRegistry(File, InstallationScope, SecurityConfig, boolean, boolean)} instead
+     * @deprecated Use {@link #FSPackageRegistry(File, InstallationScope, SecurityConfig, boolean, boolean, IdConflictPolicy)} instead
      */
     @Deprecated
     public FSPackageRegistry(@NotNull File homeDir, InstallationScope scope) throws IOException {
@@ -133,15 +134,17 @@ public class FSPackageRegistry extends AbstractPackageRegistry {
      * @param scope
      * @param securityConfig
      * @throws IOException
-     * @deprecated Use {@link #FSPackageRegistry(File, InstallationScope, SecurityConfig, boolean, boolean)} instead
+     * @deprecated Use {@link #FSPackageRegistry(File, InstallationScope, SecurityConfig, boolean, boolean, IdConflictPolicy)} instead
      */
     @Deprecated
     public FSPackageRegistry(@NotNull File homeDir, InstallationScope scope, @Nullable AbstractPackageRegistry.SecurityConfig securityConfig) throws IOException {
-        this(homeDir, scope, securityConfig, false, true);
+        this(homeDir, scope, securityConfig, false, true, IdConflictPolicy.FAIL);
     }
 
-    public FSPackageRegistry(@NotNull File homeDir, InstallationScope scope, @Nullable AbstractPackageRegistry.SecurityConfig securityConfig, boolean isStrict, boolean overwritePrimaryTypesOfFolders) throws IOException {
-        super(securityConfig, isStrict, overwritePrimaryTypesOfFolders);
+    public FSPackageRegistry(@NotNull File homeDir, InstallationScope scope,
+            @Nullable AbstractPackageRegistry.SecurityConfig securityConfig, boolean isStrict,
+            boolean overwritePrimaryTypesOfFolders, IdConflictPolicy defaultIdConflictPolicy) throws IOException {
+        super(securityConfig, isStrict, overwritePrimaryTypesOfFolders, defaultIdConflictPolicy);
         log.info("Jackrabbit Filevault FS Package Registry initialized with home location {}", homeDir.getPath());
         this.scope = scope;
         this.stateCache = new FSInstallStateCache(homeDir.toPath());
@@ -152,7 +155,7 @@ public class FSPackageRegistry extends AbstractPackageRegistry {
      * @throws IOException 
      */
     public FSPackageRegistry() throws IOException {
-        super(null, false, true); // set security config delayed (i.e. only after activate())
+        super(null, false, true, IdConflictPolicy.FAIL); // set security config delayed (i.e. only after activate())
     }
 
     @Activate
diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/impl/JcrPackageRegistry.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/impl/JcrPackageRegistry.java
index 1a2a080..e33c014 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/impl/JcrPackageRegistry.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/impl/JcrPackageRegistry.java
@@ -37,6 +37,7 @@ import javax.jcr.nodetype.NodeType;
 import org.apache.commons.io.input.NullInputStream;
 import org.apache.jackrabbit.commons.JcrUtils;
 import org.apache.jackrabbit.util.Text;
+import org.apache.jackrabbit.vault.fs.api.IdConflictPolicy;
 import org.apache.jackrabbit.vault.fs.config.MetaInf;
 import org.apache.jackrabbit.vault.fs.io.Archive;
 import org.apache.jackrabbit.vault.fs.io.ImportOptions;
@@ -117,12 +118,13 @@ public class JcrPackageRegistry extends AbstractPackageRegistry {
      * @param roots the root paths to store the packages.
      */
     public JcrPackageRegistry(@NotNull Session session, @Nullable String ... roots) {
-        this(session, null, false, true, roots);
+        this(session, null, false, true, IdConflictPolicy.FAIL, roots);
     }
 
     public JcrPackageRegistry(@NotNull Session session, @Nullable AbstractPackageRegistry.SecurityConfig securityConfig,
-            boolean isStrict, boolean overwritePrimaryTypesOfFoldersByDefault, @Nullable String... roots) {
-        super(securityConfig, isStrict, overwritePrimaryTypesOfFoldersByDefault);
+            boolean isStrict, boolean overwritePrimaryTypesOfFoldersByDefault, IdConflictPolicy defaultIdConflictPolicy,
+            @Nullable String... roots) {
+        super(securityConfig, isStrict, overwritePrimaryTypesOfFoldersByDefault, defaultIdConflictPolicy);
         this.session = session;
         if (roots == null || roots.length == 0) {
             packRootPaths = new String[]{DEFAULT_PACKAGE_ROOT_PATH};
diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/impl/PackageTaskOptionsSerializer.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/impl/PackageTaskOptionsSerializer.java
index a5653ef..57f3722 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/impl/PackageTaskOptionsSerializer.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/impl/PackageTaskOptionsSerializer.java
@@ -21,6 +21,7 @@ import java.util.function.Consumer;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
 
+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.fs.io.ImportOptions;
@@ -43,6 +44,7 @@ public class PackageTaskOptionsSerializer {
     private static final String TAG_DRY_RUN = "dryRun";
     private static final String TAG_IMPORT_MODE = "importMode";
     private static final String TAG_OVERWRITE_PRIMARY_TYPES_OF_FOLDERS = "overwritePrimaryTypesOfFolders";
+    private static final String TAG_ID_CONFLICT_POLICY = "idConflictPolicy";
 
     enum Type {
         ImportOptions;
@@ -98,6 +100,10 @@ public class PackageTaskOptionsSerializer {
         writeOption(writer, TAG_DRY_RUN, Boolean.class, importOptions.isDryRun());
         writeOption(writer, TAG_IMPORT_MODE, ImportMode.class, importOptions.getImportMode());
         writeOption(writer, TAG_OVERWRITE_PRIMARY_TYPES_OF_FOLDERS, Boolean.class, importOptions.overwritePrimaryTypesOfFolders());
+        // don't persist default conflict policy
+        if (importOptions.hasIdConflictPolicyBeenSet()) {
+            writeOption(writer, TAG_ID_CONFLICT_POLICY, IdConflictPolicy.class, importOptions.getIdConflictPolicy());
+        }
     }
 
     public ImportOptionsPackageTaskOption loadImportOptions(Element element) {
@@ -111,6 +117,7 @@ public class PackageTaskOptionsSerializer {
         readOption(element, TAG_DRY_RUN, Boolean.class,  options::setDryRun);
         readOption(element, TAG_IMPORT_MODE, ImportMode.class,  options::setImportMode);
         readOption(element, TAG_OVERWRITE_PRIMARY_TYPES_OF_FOLDERS, Boolean.class,  options::setOverwritePrimaryTypesOfFolders);
+        readOption(element, TAG_ID_CONFLICT_POLICY, IdConflictPolicy.class, options::setIdConflictPolicy);
         return new ImportOptionsPackageTaskOption(options);
     }
 
diff --git a/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/PackageInstallIT.java b/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/PackageInstallIT.java
index 676e35d..089488b 100644
--- a/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/PackageInstallIT.java
+++ b/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/PackageInstallIT.java
@@ -42,6 +42,7 @@ import org.apache.jackrabbit.api.JackrabbitSession;
 import org.apache.jackrabbit.api.security.user.User;
 import org.apache.jackrabbit.api.security.user.UserManager;
 import org.apache.jackrabbit.commons.jackrabbit.authorization.AccessControlUtils;
+import org.apache.jackrabbit.vault.fs.api.IdConflictPolicy;
 import org.apache.jackrabbit.vault.fs.config.ConfigurationException;
 import org.apache.jackrabbit.vault.fs.io.ImportOptions;
 import org.apache.jackrabbit.vault.packaging.Dependency;
@@ -289,7 +290,7 @@ public class PackageInstallIT extends IntegrationTestBase {
         
         Session userSession = repository.login(new SimpleCredentials(userId, userPwd.toCharArray()));
         try {
-            packMgr = new JcrPackageManagerImpl(userSession, new String[0], new String[] {"user1"}, null, false, true);
+            packMgr = new JcrPackageManagerImpl(userSession, new String[0], new String[] {"user1"}, null, false, true, IdConflictPolicy.FAIL);
     
             PackageEventDispatcherImpl dispatcher = new PackageEventDispatcherImpl();
             dispatcher.bindPackageEventListener(new ActivityLog(), Collections.singletonMap("component.id", (Object) "1234"));