You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by kw...@apache.org on 2022/09/12 07:39:52 UTC
[jackrabbit-filevault] branch master updated: JCRVLT-650: apply default id conflict policy as late as possible (#244)
This is an automated email from the ASF dual-hosted git repository.
kwin 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 c9c9dffa JCRVLT-650: apply default id conflict policy as late as possible (#244)
c9c9dffa is described below
commit c9c9dffab67740e4829b891ab594195f64fa6277
Author: Konrad Windszus <kw...@apache.org>
AuthorDate: Mon Sep 12 09:39:47 2022 +0200
JCRVLT-650: apply default id conflict policy as late as possible (#244)
fix incorrect overwrite of explicit policy
apply default also for FSPackages
---
.../apache/jackrabbit/vault/fs/io/Importer.java | 37 +++++++++++++++++++++-
.../vault/packaging/impl/JcrPackageImpl.java | 13 +++-----
.../vault/packaging/impl/ZipVaultPackage.java | 15 ++++++---
.../packaging/registry/impl/FSPackageRegistry.java | 2 +-
4 files changed, 52 insertions(+), 15 deletions(-)
diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/Importer.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/Importer.java
index 1d066e23..a5d0afdd 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/Importer.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/Importer.java
@@ -49,6 +49,7 @@ import org.apache.jackrabbit.spi.commons.namespace.SessionNamespaceResolver;
import org.apache.jackrabbit.util.Text;
import org.apache.jackrabbit.vault.fs.api.Artifact;
import org.apache.jackrabbit.vault.fs.api.ArtifactType;
+import org.apache.jackrabbit.vault.fs.api.IdConflictPolicy;
import org.apache.jackrabbit.vault.fs.api.ImportInfo;
import org.apache.jackrabbit.vault.fs.api.ImportMode;
import org.apache.jackrabbit.vault.fs.api.NodeNameList;
@@ -273,29 +274,63 @@ public class Importer {
/**
* list of intermediate infos that were removed since the last auto save
*/
- private Map<String, TxInfo> removedIntermediates = new LinkedHashMap<String, TxInfo>();
+ private Map<String, TxInfo> removedIntermediates = new LinkedHashMap<>();
private final boolean isStrict;
private final boolean isStrictByDefault;
private final boolean overwritePrimaryTypesOfFoldersByDefault;
+ /**
+ * Default constructor neither setting specific import options nor defaults.
+ */
public Importer() {
this(new ImportOptions(), false, true);
}
+ /**
+ * Constructor which is not setting default options.
+ * @param opts
+ * @see #Importer(ImportOptions, boolean, boolean, IdConflictPolicy)
+ */
public Importer(ImportOptions opts) {
this(opts, false);
}
+ /**
+ * Shortcut for {@link Importer#Importer(ImportOptions, boolean, boolean, IdConflictPolicy)} with no default id conflict policy.
+ * Also primary types of existing nodes are always overwritten.
+ * @param opts the import options to use during {@link #run(Archive, Node)} or {@link #run(Archive, Session, String)}
+ * @param isStrictByDefault is true if packages should be installed in strict mode by default (if not set otherwise in {@code opts})
+ */
public Importer(ImportOptions opts, boolean isStrictByDefault) {
this(opts, isStrictByDefault, true);
}
+ /**
+ * Shortcut for {@link Importer#Importer(ImportOptions, boolean, boolean, IdConflictPolicy)} with no default id conflict policy.
+ * @param opts the import options to use during {@link #run(Archive, Node)} or {@link #run(Archive, Session, String)}
+ * @param isStrictByDefault is true if packages should be installed in strict mode by default (if not set otherwise in {@code opts})
+ * @param overwritePrimaryTypesOfFoldersByDefault if folder aggregates' JCR primary type should be changed if the node is already existing or not
+ */
public Importer(ImportOptions opts, boolean isStrictByDefault, boolean overwritePrimaryTypesOfFoldersByDefault) {
+ this(opts, isStrictByDefault, overwritePrimaryTypesOfFoldersByDefault, null);
+ }
+
+ /**
+ * Constructor setting both specific import options as well as some defaults for options not set.
+ * @param opts the import options to use during {@link #run(Archive, Node)} or {@link #run(Archive, Session, String)}
+ * @param isStrictByDefault is true if packages should be installed in strict mode by default (if not set otherwise in {@code opts})
+ * @param overwritePrimaryTypesOfFoldersByDefault if folder aggregates' JCR primary type should be changed if the node is already existing or not
+ * @param defaultIdConflictPolicy the default {@link IdConflictPolicy} to use if no policy is set in {@code opts}. May be {@code null}.
+ */
+ public Importer(ImportOptions opts, boolean isStrictByDefault, boolean overwritePrimaryTypesOfFoldersByDefault, IdConflictPolicy defaultIdConflictPolicy) {
this.opts = opts;
this.isStrict = opts.isStrict(isStrictByDefault);
this.isStrictByDefault = isStrictByDefault;
this.overwritePrimaryTypesOfFoldersByDefault = overwritePrimaryTypesOfFoldersByDefault;
+ if (!this.opts.hasIdConflictPolicyBeenSet()) {
+ this.opts.setIdConflictPolicy(defaultIdConflictPolicy);
+ }
}
public ImportOptions getOptions() {
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 e4fbfd47..99bb8242 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
@@ -353,7 +353,7 @@ public class JcrPackageImpl implements JcrPackage {
private void extract(ImportOptions options, boolean createSnapshot, boolean replaceSnapshot)
throws RepositoryException, PackageException, IOException {
- extract(new HashSet<PackageId>(), options, createSnapshot, replaceSnapshot);
+ extract(new HashSet<>(), options, createSnapshot, replaceSnapshot);
}
/**
@@ -386,19 +386,15 @@ 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());
+ mgr.overwritePrimaryTypesOfFoldersByDefault(), mgr.getDefaultIdConflictPolicy());
JcrPackage snap = null;
if (!opts.isDryRun() && createSnapshot) {
ExportOptions eOpts = new ExportOptions();
eOpts.setListener(opts.getListener());
snap = snapshot(eOpts, replaceSnapshot, opts.getAccessControlHandling());
}
- List<String> subPackages = new ArrayList<String>();
+ List<String> subPackages = new ArrayList<>();
pack.extract(ctx, subPackages);
if (def != null && !opts.isDryRun()) {
def.touchLastUnpacked();
@@ -417,7 +413,8 @@ public class JcrPackageImpl implements JcrPackage {
try {
p.tryUnwrap();
} catch (Exception e) {
- log.info("Sub package {} not valid: " + e, path);
+ log.info("Sub package {} not valid: {}", path, e.getMessage());
+ log.debug("Sub package {} not valid", path, e);
}
}
if (p.isValid()) {
diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/ZipVaultPackage.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/ZipVaultPackage.java
index a608625a..8dc48965 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/ZipVaultPackage.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/ZipVaultPackage.java
@@ -28,6 +28,7 @@ import java.util.regex.PatternSyntaxException;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
+import org.apache.jackrabbit.vault.fs.api.IdConflictPolicy;
import org.apache.jackrabbit.vault.fs.config.MetaInf;
import org.apache.jackrabbit.vault.fs.io.AccessControlHandling;
import org.apache.jackrabbit.vault.fs.io.Archive;
@@ -163,15 +164,15 @@ public class ZipVaultPackage extends PackagePropertiesImpl implements VaultPacka
* @throws RepositoryException if a repository error during installation occurs.
*/
public void extract(Session session, ImportOptions opts, @NotNull AbstractPackageRegistry.SecurityConfig securityConfig,
- boolean isStrict, boolean isOverwritePrimaryTypesOfFolders) throws PackageException, RepositoryException {
- extract(prepareExtract(session, opts, securityConfig, isStrict, isOverwritePrimaryTypesOfFolders), null);
+ boolean isStrict, boolean isOverwritePrimaryTypesOfFolders, IdConflictPolicy defaultIdConflictPolicy) throws PackageException, RepositoryException {
+ extract(prepareExtract(session, opts, securityConfig, isStrict, isOverwritePrimaryTypesOfFolders,defaultIdConflictPolicy), null);
}
/**
* {@inheritDoc}
*/
public void extract(Session session, ImportOptions opts) throws RepositoryException, PackageException {
- extract(session, opts, new AbstractPackageRegistry.SecurityConfig(null, null), false, true);
+ extract(session, opts, new AbstractPackageRegistry.SecurityConfig(null, null), false, true, null);
}
/**
@@ -186,6 +187,10 @@ public class ZipVaultPackage extends PackagePropertiesImpl implements VaultPacka
*
* @param session repository session
* @param opts import options
+ * @param securityConfig the security configuration determining e.g. the install hook limitations
+ * @param isStrictByDefault is true if packages should be installed in strict mode by default (if not set otherwise in {@code opts})
+ * @param overwritePrimaryTypesOfFoldersByDefault if folder aggregates' JCR primary type should be changed if the node is already existing or not
+ * @param defaultIdConflictPolicy the default {@link IdConflictPolicy} to use if no policy is set in {@code opts}. May be {@code null}.
*
* @throws javax.jcr.RepositoryException if a repository error during installation occurs.
* @throws org.apache.jackrabbit.vault.packaging.PackageException if an error during packaging occurs
@@ -194,7 +199,7 @@ public class ZipVaultPackage extends PackagePropertiesImpl implements VaultPacka
*/
protected InstallContextImpl prepareExtract(Session session, ImportOptions opts,
@NotNull AbstractPackageRegistry.SecurityConfig securityConfig, boolean isStrictByDefault,
- boolean overwritePrimaryTypesOfFoldersByDefault) throws PackageException, RepositoryException {
+ boolean overwritePrimaryTypesOfFoldersByDefault, IdConflictPolicy defaultIdConflictPolicy) throws PackageException, RepositoryException {
if (!isValid()) {
throw new IllegalStateException("Package not valid.");
}
@@ -214,7 +219,7 @@ public class ZipVaultPackage extends PackagePropertiesImpl implements VaultPacka
opts.setAutoSaveThreshold(Integer.MAX_VALUE - 1);
}
- Importer importer = new Importer(opts, isStrictByDefault, overwritePrimaryTypesOfFoldersByDefault);
+ Importer importer = new Importer(opts, isStrictByDefault, overwritePrimaryTypesOfFoldersByDefault, defaultIdConflictPolicy);
AccessControlHandling ac = getACHandling();
if (opts.getAccessControlHandling() == null) {
opts.setAccessControlHandling(ac);
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 ab24db10..dc68f067 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
@@ -631,7 +631,7 @@ public class FSPackageRegistry extends AbstractPackageRegistry {
}
if (vltPkg instanceof ZipVaultPackage) {
- ((ZipVaultPackage)vltPkg).extract(session, opts, getSecurityConfig(), isStrictByDefault(), overwritePrimaryTypesOfFoldersByDefault());
+ ((ZipVaultPackage)vltPkg).extract(session, opts, getSecurityConfig(), isStrictByDefault(), overwritePrimaryTypesOfFoldersByDefault(), getDefaultIdConflictPolicy());
dispatch(PackageEvent.Type.EXTRACT, pkg.getId(), null);
stateCache.updatePackageStatus(vltPkg.getId(), FSPackageStatus.EXTRACTED);
} else {