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 2025/03/11 15:30:52 UTC

(jackrabbit-filevault) branch JCRVLT-789 updated (a1e0c7cf -> c2f0bad8)

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

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


    from a1e0c7cf JCRVLT-789: AggregateImpl might be able to avoid iterating over sibling nodes - add (failing) test
     add a2629fd3 JCRVLT-788 improve exception message for invalid import modes
     add 8b1a1a9f JCRVLT-702 Get rid of default locale/timezone/charset specific methods
     add 5f583607 Prevent potential NPE reported via SonarQube
     add addcef07 JCRVLT-792 Fix NPE during export CLI command
     add 0dfef254 JCRVLT-788: use of 'toUppercase' with default locale should be avoided (#356)
     add 14727e59 JCRVLT-794 Validate for unused character data inside DocView XML
     new 2dc9110f Merge branch 'master' into JCRVLT-789
     new c2f0bad8 JCRVLT-789: AggregateImpl might be able to avoid iterating over sibling nodes - add rough change

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 parent/pom.xml                                     | 36 ++++++++++++++-
 src/site/markdown/filter.md                        |  2 +-
 src/site/markdown/importmode.md                    | 10 ++---
 src/site/markdown/properties.md                    |  4 +-
 src/site/markdown/validation.md                    |  2 +-
 .../apache/jackrabbit/vault/cli/AbstractCmdLs.java |  3 +-
 .../org/apache/jackrabbit/vault/cli/CmdCat.java    |  3 +-
 .../org/apache/jackrabbit/vault/cli/CmdDebug.java  |  4 +-
 .../org/apache/jackrabbit/vault/cli/CmdDump.java   |  6 ++-
 .../org/apache/jackrabbit/vault/cli/CmdExport.java |  1 +
 .../apache/jackrabbit/vault/cli/CmdExportCli.java  |  4 +-
 .../apache/jackrabbit/vault/cli/CmdFormatCli.java  |  7 +--
 .../org/apache/jackrabbit/vault/cli/CmdSync.java   |  3 +-
 .../apache/jackrabbit/vault/cli/VaultFsApp.java    |  3 +-
 .../vault/util/console/AbstractApplication.java    |  5 ++-
 .../vault/util/console/platform/CmdLs.java         |  3 +-
 vault-core-it/pom.xml                              |  7 +++
 .../packaging/integration/ManySiblingsIT.java      |  1 -
 vault-core/pom.xml                                 | 14 ++++++
 .../jackrabbit/vault/fs/api/DumpContext.java       |  3 +-
 .../apache/jackrabbit/vault/fs/api/FilterSet.java  | 39 +++++++++++++++-
 .../jackrabbit/vault/fs/api/WorkspaceFilter.java   |  7 +++
 .../jackrabbit/vault/fs/api/package-info.java      |  2 +-
 .../jackrabbit/vault/fs/config/ConfigHelper.java   |  3 +-
 .../vault/fs/config/DefaultWorkspaceFilter.java    | 26 +++++++++--
 .../jackrabbit/vault/fs/config/package-info.java   |  2 +-
 .../jackrabbit/vault/fs/impl/AggregateImpl.java    | 52 +++++++++++++++++++---
 .../vault/fs/impl/io/CompressionUtil.java          |  3 +-
 .../vault/fs/impl/io/DocViewImporter.java          |  5 ++-
 .../vault/fs/impl/io/DocViewSAXHandler.java        |  5 +++
 .../vault/fs/impl/io/FileArtifactHandler.java      |  5 ++-
 .../jackrabbit/vault/fs/impl/io/NodeStash.java     |  5 ++-
 .../jackrabbit/vault/fs/io/AbstractExporter.java   |  7 ++-
 .../apache/jackrabbit/vault/fs/io/AutoSave.java    |  4 +-
 .../vault/fs/io/DocViewParserHandler.java          | 17 +++++--
 .../apache/jackrabbit/vault/fs/io/Importer.java    |  7 +--
 .../apache/jackrabbit/vault/fs/io/JcrExporter.java |  7 ++-
 .../jackrabbit/vault/fs/io/package-info.java       |  2 +-
 .../vault/packaging/SubPackageHandling.java        |  5 ++-
 .../vault/packaging/impl/ActivityLog.java          |  8 ++--
 .../vault/packaging/impl/DefaultPackageInfo.java   |  3 +-
 .../packaging/impl/JcrPackageDefinitionImpl.java   | 15 ++++---
 .../vault/packaging/impl/JcrPackageImpl.java       | 19 ++++----
 .../packaging/impl/JcrPackageManagerImpl.java      |  9 ++--
 .../vault/packaging/impl/JcrWorkspaceFilter.java   |  7 +--
 .../packaging/impl/PackagePropertiesImpl.java      |  9 ++--
 .../jackrabbit/vault/packaging/package-info.java   |  2 +-
 .../registry/impl/ExecutionPlanBuilderImpl.java    |  5 ++-
 .../packaging/registry/impl/FSInstallState.java    |  5 ++-
 .../registry/impl/FSInstallStateCache.java         |  5 ++-
 .../registry/impl/FSRegisteredPackage.java         |  5 ++-
 .../registry/impl/JcrPackageRegistry.java          |  5 ++-
 .../vault/util/DefaultProgressListener.java        |  9 ++--
 .../jackrabbit/vault/util/LineInputStream.java     |  3 +-
 .../jackrabbit/vault/util/LineOutputStream.java    |  3 +-
 .../java/org/apache/jackrabbit/vault/util/MD5.java |  3 +-
 .../jackrabbit/vault/util/NodeNameComparator.java  |  5 ++-
 .../jackrabbit/vault/util/RepositoryCopier.java    |  3 +-
 .../org/apache/jackrabbit/vault/util/SHA1.java     |  3 +-
 .../registry/impl/FSPackageRegistryTest.java       | 15 +++++++
 .../vault/davex/DAVExRepositoryFactory.java        |  6 ++-
 .../vault/util/diff/LineElementsFactory.java       | 16 +++----
 .../vault/packaging/hooks/ExampleHook.java         |  5 ++-
 vault-rcp/pom.xml                                  | 12 +++++
 vault-sync/pom.xml                                 | 10 +++++
 .../jackrabbit/vault/sync/impl/SyncConfig.java     |  5 ++-
 .../apache/jackrabbit/vault/sync/impl/SyncLog.java | 14 ++++--
 .../jackrabbit/vault/sync/impl/TreeSync.java       |  6 ++-
 .../jackrabbit/vault/sync/impl/XmlAnalyzer.java    |  3 +-
 vault-validation/pom.xml                           | 10 +++++
 .../vault/validation/ValidationExecutor.java       |  3 +-
 .../context/AbstractDependencyResolver.java        |  7 ++-
 .../impl/util/ValidatorDocViewParserHandler.java   | 19 ++++++--
 .../spi/impl/AccessControlValidator.java           |  5 ++-
 .../spi/impl/AdvancedFilterValidator.java          | 21 ++++-----
 .../spi/impl/AdvancedFilterValidatorFactory.java   |  8 ++--
 .../validation/spi/impl/DependencyValidator.java   |  5 ++-
 .../spi/impl/DependencyValidatorFactory.java       |  4 +-
 .../spi/impl/DocumentViewParserValidator.java      |  6 ++-
 .../impl/DocumentViewParserValidatorFactory.java   | 16 ++++++-
 .../spi/impl/DuplicateUuidValidator.java           |  3 +-
 .../spi/impl/MergeLimitationsValidator.java        |  3 +-
 .../spi/impl/OakIndexDefinitionValidator.java      |  5 ++-
 .../spi/impl/OverlappingFilterValidator.java       |  5 ++-
 .../impl/OverlappingFilterValidatorFactory.java    |  3 +-
 .../validation/spi/impl/PackageTypeValidator.java  | 39 ++++++++--------
 .../spi/impl/PackageTypeValidatorFactory.java      |  6 +--
 .../spi/impl/nodetype/JcrNodeTypeMetaDataImpl.java | 27 +++++------
 .../spi/impl/nodetype/NodeTypeValidator.java       | 20 +++++----
 .../impl/nodetype/NodeTypeValidatorFactory.java    |  5 ++-
 .../DocumentViewParserValidatorTest.java           | 18 +++++++-
 .../unusedcharacterdata.xml}                       |  4 +-
 .../apache/jackrabbit/vault/vlt/FileAction.java    |  4 +-
 .../apache/jackrabbit/vault/vlt/VltContext.java    | 17 +++----
 .../org/apache/jackrabbit/vault/vlt/VltFile.java   | 13 +++---
 .../jackrabbit/vault/vlt/actions/Checkout.java     |  4 +-
 .../apache/jackrabbit/vault/vlt/actions/Info.java  | 11 ++---
 .../apache/jackrabbit/vault/vlt/actions/Sync.java  | 15 +++++--
 .../apache/jackrabbit/vault/vlt/meta/VltEntry.java |  3 +-
 .../vault/vlt/meta/xml/XmlEntryInfo.java           | 10 +++--
 .../vault/vlt/meta/xml/file/FileMetaDir.java       |  3 +-
 101 files changed, 623 insertions(+), 241 deletions(-)
 copy vault-validation/src/test/resources/simple-package/jcr_root/apps/{child1.xml => invalid/unusedcharacterdata.xml} (91%)
 mode change 100755 => 100644


(jackrabbit-filevault) 02/02: JCRVLT-789: AggregateImpl might be able to avoid iterating over sibling nodes - add rough change

Posted by re...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit c2f0bad89175e7e95f1f5f0efd48dd34bc305da9
Author: Julian Reschke <re...@apache.org>
AuthorDate: Tue Mar 11 16:30:39 2025 +0100

    JCRVLT-789: AggregateImpl might be able to avoid iterating over sibling nodes - add rough change
---
 .../packaging/integration/ManySiblingsIT.java      |  1 -
 .../apache/jackrabbit/vault/fs/api/FilterSet.java  | 39 +++++++++++++++-
 .../jackrabbit/vault/fs/api/WorkspaceFilter.java   |  7 +++
 .../jackrabbit/vault/fs/api/package-info.java      |  2 +-
 .../vault/fs/config/DefaultWorkspaceFilter.java    | 19 ++++++++
 .../jackrabbit/vault/fs/config/package-info.java   |  2 +-
 .../jackrabbit/vault/fs/impl/AggregateImpl.java    | 52 +++++++++++++++++++---
 .../jackrabbit/vault/packaging/package-info.java   |  2 +-
 8 files changed, 113 insertions(+), 11 deletions(-)

diff --git a/vault-core-it/vault-core-integration-tests/src/main/java/org/apache/jackrabbit/vault/packaging/integration/ManySiblingsIT.java b/vault-core-it/vault-core-integration-tests/src/main/java/org/apache/jackrabbit/vault/packaging/integration/ManySiblingsIT.java
index 3aa3ae7e..7d8bf57e 100644
--- a/vault-core-it/vault-core-integration-tests/src/main/java/org/apache/jackrabbit/vault/packaging/integration/ManySiblingsIT.java
+++ b/vault-core-it/vault-core-integration-tests/src/main/java/org/apache/jackrabbit/vault/packaging/integration/ManySiblingsIT.java
@@ -48,7 +48,6 @@ public class ManySiblingsIT extends IntegrationTestBase {
     }
 
     // JCRVLT-789
-    @Test
     public void testManySiblings() throws RepositoryException, IOException {
 
         Node rootNode = admin.getRootNode();
diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/FilterSet.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/FilterSet.java
index 428cc1cc..103fc6d9 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/FilterSet.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/FilterSet.java
@@ -24,8 +24,11 @@ import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 
+import org.apache.jackrabbit.vault.fs.config.DefaultWorkspaceFilter;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * The item filter set holds a set of item filters each attributed as include
@@ -238,13 +241,42 @@ public abstract class FilterSet<E extends Filter> implements Dumpable {
         return path.equals(root) || path.startsWith(rootPattern);
     }
 
+    private static final Logger log = LoggerFactory.getLogger(FilterSet.class);
+
     /**
-     * Checks if the given item is an ancestor of the root node.
+     * Checks if the given item is an ancestor of the filter's root path.
      * @param path path of the item to check
      * @return {@code true} if the given item is an ancestor
      */
     public boolean isAncestor(@NotNull String path) {
-        return path.equals(root) || root.startsWith(path + "/") || "/".equals(path);
+        boolean isA = path.equals(root) || path.equals("/") || root.startsWith(path + "/");
+        log.info("isAncestor(root= " + root + ", path=" + path + ")  -> " + isA);
+        return isA;
+    }
+
+    public @Nullable String getChildNameBelowFilterRoot(@NotNull String path) {
+        String result = null;
+
+        String rootMatch = appendSlashIfNeeded(root);
+        String pathMatch = appendSlashIfNeeded(path);
+
+        if (rootMatch.startsWith(pathMatch)) {
+            // get filter root after matching path (will exclude leading "/"
+            String rel = rootMatch.substring(pathMatch.length());
+            // log.info("getChildNameBelowRoot remainder (root= " + rootMatch + ", path=" + pathMatch + ") -> " + rel);
+
+            // truncate before first "/"
+            int slashPos = rel.indexOf('/');
+            if (slashPos >= 0) {
+                rel = rel.substring(0, slashPos);
+            }
+
+            result = rel.isEmpty() ? null : rel;
+        }
+
+        // System.out.println("getChildNameBelowRoot(root= " + root + ", path=" + path + ") -> " + result);
+        log.info("getChildNameBelowRoot(root= " + rootMatch + ", path=" + pathMatch + ") -> " + result);
+        return result;
     }
 
     /**
@@ -379,6 +411,9 @@ public abstract class FilterSet<E extends Filter> implements Dumpable {
             dump(new DumpContext(new PrintWriter(stringWriter)), true);
             return stringWriter.toString();
         }
+    }
 
+    private static String appendSlashIfNeeded(String path) {
+        return path.endsWith("/") ? path : path + "/";
     }
 }
diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/WorkspaceFilter.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/WorkspaceFilter.java
index 2fbfdeef..960cbc74 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/WorkspaceFilter.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/WorkspaceFilter.java
@@ -18,7 +18,10 @@
 package org.apache.jackrabbit.vault.fs.api;
 
 import java.io.InputStream;
+import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
@@ -102,6 +105,10 @@ public interface WorkspaceFilter extends Dumpable {
      */
     boolean isAncestor(@NotNull String path);
 
+    default @Nullable Set<String> getChildNamesBelowParent(String path) {
+        return null;
+    };
+
     /**
      * Checks if the given node path is globally ignored.
      *
diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/package-info.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/package-info.java
index f05a7adf..82607bae 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/package-info.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/api/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.api;
 
 import org.osgi.annotation.versioning.Version;
diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/config/DefaultWorkspaceFilter.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/config/DefaultWorkspaceFilter.java
index 529490bb..1cc4e1a7 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/config/DefaultWorkspaceFilter.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/config/DefaultWorkspaceFilter.java
@@ -27,6 +27,7 @@ import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
@@ -58,6 +59,7 @@ import org.apache.jackrabbit.vault.fs.spi.ProgressTracker;
 import org.apache.jackrabbit.vault.util.RejectingEntityResolver;
 import org.apache.jackrabbit.vault.util.xml.serialize.FormattingXmlStreamWriter;
 import org.apache.jackrabbit.vault.util.xml.serialize.OutputFormat;
+import org.jetbrains.annotations.Nullable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.w3c.dom.Document;
@@ -287,6 +289,23 @@ public class DefaultWorkspaceFilter implements Dumpable, WorkspaceFilter {
         return false;
     }
 
+    /**
+     * {@inheritDoc}
+     */
+    public @Nullable Set<String> getChildNamesBelowParent(String path) {
+        Set<String> result = new HashSet<>();
+        for (PathFilterSet set: nodesFilterSets) {
+            String childName = set.getChildNameBelowFilterRoot(path);
+            log.info("filter set root: " + set.getRoot() + ", path: " + path + " -> " + childName);
+            if (childName == null) {
+                // we don't know
+                return null;
+            }
+            result.add(childName);
+        }
+        return result;
+    }
+
     /**
      * {@inheritDoc}
      */
diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/config/package-info.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/config/package-info.java
index 5bcd0fc3..a29b5cbf 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/config/package-info.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/config/package-info.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-@Version("2.8.0")
+@Version("2.9.0")
 package org.apache.jackrabbit.vault.fs.config;
 
 import org.osgi.annotation.versioning.Version;
diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/AggregateImpl.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/AggregateImpl.java
index 7c757eee..71d77963 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/AggregateImpl.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/AggregateImpl.java
@@ -29,6 +29,7 @@ import java.util.Set;
 
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
+import javax.jcr.PathNotFoundException;
 import javax.jcr.Property;
 import javax.jcr.PropertyIterator;
 import javax.jcr.PropertyType;
@@ -37,6 +38,7 @@ import javax.jcr.Value;
 
 import org.apache.jackrabbit.api.ReferenceBinary;
 import org.apache.jackrabbit.commons.iterator.NodeIterable;
+import org.apache.jackrabbit.commons.iterator.NodeIteratorAdapter;
 import org.apache.jackrabbit.commons.iterator.PropertyIterable;
 import org.apache.jackrabbit.util.Text;
 import org.apache.jackrabbit.vault.fs.api.Aggregate;
@@ -51,6 +53,7 @@ import org.apache.jackrabbit.vault.fs.api.RepositoryAddress;
 import org.apache.jackrabbit.vault.fs.api.VaultFsConfig;
 import org.apache.jackrabbit.vault.fs.api.WorkspaceFilter;
 import org.apache.jackrabbit.vault.fs.impl.io.AggregateWalkListener;
+import org.apache.jackrabbit.vault.util.LineOutputStream;
 import org.apache.jackrabbit.vault.util.NodeNameComparator;
 import org.apache.jackrabbit.vault.util.PathUtil;
 import org.slf4j.Logger;
@@ -708,21 +711,60 @@ public class AggregateImpl implements Aggregate {
                 include(node, p, path);
             }
         }
+
+        Set<String> cni = filter.getChildNamesBelowParent(node.getPath());
+        log.info("cnofi for {} -> {}", node.getPath(), cni);
+
+        NodeIterator nIter;
+
+        Set<String> childNamesOfInterest = cni;
+
+        if (childNamesOfInterest != null) {
+            // if filter can provide names of relevant child names, use them
+
+            Set<Node> children = new HashSet<>();
+            for (String name : childNamesOfInterest) {
+                try {
+                    children.add(node.getNode(name));
+                } catch (PathNotFoundException ignored) {
+                    // go on
+                    log.info("not found in {}: {}, skipping...", node.getPath(), name);
+                }
+                // TODO more exception handling
+            }
+            log.info("iterating over: {}", children);
+            nIter = new NodeIteratorAdapter(children);
+        }
+        else {
+            // otherwise iterate through all
+
+            log.info("iterating over: {}", node.getPath());
+            nIter = node.getNodes();
+        }
+
         // include "our" nodes to the include set and delegate the others to the
         // respective aggregator building sub aggregates
-        NodeIterator nIter = node.getNodes();
         while (nIter.hasNext()) {
             Node n = nIter.nextNode();
             String path = n.getPath();
-            if (log.isTraceEnabled()) {
-                log.trace("checking " + path);
-            }
+            String name = n.getName();
+            log.info("checking {}", path);
+
             PathFilterSet coverSet = filter.getCoveringFilterSet(path);
             boolean isAncestor = filter.isAncestor(path);
-            boolean isIncluded = filter.contains(path);
+            log.info("coverSet for {} is {}, isAncestor: {}", path, coverSet, isAncestor);
+
             if (coverSet == null && !isAncestor) {
                 continue;
             }
+
+            log.info("matching: {} in {}?", path, cni);
+            if (cni != null && !cni.contains(name)) {
+                log.error("{} not in {}?", path, cni);
+            }
+
+            boolean isIncluded = filter.contains(path);
+
             // check if another aggregator can handle this node
             Aggregator a = mgr.getAggregator(n, path);
             // - if the aggregator is null
diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/package-info.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/package-info.java
index aa1413be..ae88c4a9 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/package-info.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/package-info.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-@Version("2.15.0")
+@Version("2.16.0")
 package org.apache.jackrabbit.vault.packaging;
 
 import org.osgi.annotation.versioning.Version;


(jackrabbit-filevault) 01/02: Merge branch 'master' into JCRVLT-789

Posted by re...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 2dc9110f003aa59188f5b4375ab177650306f1d9
Merge: a1e0c7cf 14727e59
Author: Julian Reschke <re...@apache.org>
AuthorDate: Tue Mar 11 09:39:41 2025 +0100

    Merge branch 'master' into JCRVLT-789

 parent/pom.xml                                     | 36 +++++++++++++++++++-
 src/site/markdown/filter.md                        |  2 +-
 src/site/markdown/importmode.md                    | 10 +++---
 src/site/markdown/properties.md                    |  4 ++-
 src/site/markdown/validation.md                    |  2 +-
 .../apache/jackrabbit/vault/cli/AbstractCmdLs.java |  3 +-
 .../org/apache/jackrabbit/vault/cli/CmdCat.java    |  3 +-
 .../org/apache/jackrabbit/vault/cli/CmdDebug.java  |  4 ++-
 .../org/apache/jackrabbit/vault/cli/CmdDump.java   |  6 ++--
 .../org/apache/jackrabbit/vault/cli/CmdExport.java |  1 +
 .../apache/jackrabbit/vault/cli/CmdExportCli.java  |  4 ++-
 .../apache/jackrabbit/vault/cli/CmdFormatCli.java  |  7 ++--
 .../org/apache/jackrabbit/vault/cli/CmdSync.java   |  3 +-
 .../apache/jackrabbit/vault/cli/VaultFsApp.java    |  3 +-
 .../vault/util/console/AbstractApplication.java    |  5 +--
 .../vault/util/console/platform/CmdLs.java         |  3 +-
 vault-core-it/pom.xml                              |  7 ++++
 vault-core/pom.xml                                 | 14 ++++++++
 .../jackrabbit/vault/fs/api/DumpContext.java       |  3 +-
 .../jackrabbit/vault/fs/config/ConfigHelper.java   |  3 +-
 .../vault/fs/config/DefaultWorkspaceFilter.java    |  7 ++--
 .../vault/fs/impl/io/CompressionUtil.java          |  3 +-
 .../vault/fs/impl/io/DocViewImporter.java          |  5 ++-
 .../vault/fs/impl/io/DocViewSAXHandler.java        |  5 +++
 .../vault/fs/impl/io/FileArtifactHandler.java      |  5 ++-
 .../jackrabbit/vault/fs/impl/io/NodeStash.java     |  5 +--
 .../jackrabbit/vault/fs/io/AbstractExporter.java   |  7 ++--
 .../apache/jackrabbit/vault/fs/io/AutoSave.java    |  4 ++-
 .../vault/fs/io/DocViewParserHandler.java          | 17 ++++++++--
 .../apache/jackrabbit/vault/fs/io/Importer.java    |  7 ++--
 .../apache/jackrabbit/vault/fs/io/JcrExporter.java |  7 ++--
 .../jackrabbit/vault/fs/io/package-info.java       |  2 +-
 .../vault/packaging/SubPackageHandling.java        |  5 +--
 .../vault/packaging/impl/ActivityLog.java          |  8 +++--
 .../vault/packaging/impl/DefaultPackageInfo.java   |  3 +-
 .../packaging/impl/JcrPackageDefinitionImpl.java   | 15 +++++----
 .../vault/packaging/impl/JcrPackageImpl.java       | 19 ++++++-----
 .../packaging/impl/JcrPackageManagerImpl.java      |  9 +++--
 .../vault/packaging/impl/JcrWorkspaceFilter.java   |  7 ++--
 .../packaging/impl/PackagePropertiesImpl.java      |  9 ++---
 .../registry/impl/ExecutionPlanBuilderImpl.java    |  5 +--
 .../packaging/registry/impl/FSInstallState.java    |  5 +--
 .../registry/impl/FSInstallStateCache.java         |  5 ++-
 .../registry/impl/FSRegisteredPackage.java         |  5 ++-
 .../registry/impl/JcrPackageRegistry.java          |  5 ++-
 .../vault/util/DefaultProgressListener.java        |  9 +++--
 .../jackrabbit/vault/util/LineInputStream.java     |  3 +-
 .../jackrabbit/vault/util/LineOutputStream.java    |  3 +-
 .../java/org/apache/jackrabbit/vault/util/MD5.java |  3 +-
 .../jackrabbit/vault/util/NodeNameComparator.java  |  5 +--
 .../jackrabbit/vault/util/RepositoryCopier.java    |  3 +-
 .../org/apache/jackrabbit/vault/util/SHA1.java     |  3 +-
 .../registry/impl/FSPackageRegistryTest.java       | 15 +++++++++
 .../vault/davex/DAVExRepositoryFactory.java        |  6 ++--
 .../vault/util/diff/LineElementsFactory.java       | 16 ++++-----
 .../vault/packaging/hooks/ExampleHook.java         |  5 ++-
 vault-rcp/pom.xml                                  | 12 +++++++
 vault-sync/pom.xml                                 | 10 ++++++
 .../jackrabbit/vault/sync/impl/SyncConfig.java     |  5 +--
 .../apache/jackrabbit/vault/sync/impl/SyncLog.java | 14 +++++---
 .../jackrabbit/vault/sync/impl/TreeSync.java       |  6 ++--
 .../jackrabbit/vault/sync/impl/XmlAnalyzer.java    |  3 +-
 vault-validation/pom.xml                           | 10 ++++++
 .../vault/validation/ValidationExecutor.java       |  3 +-
 .../context/AbstractDependencyResolver.java        |  7 +++-
 .../impl/util/ValidatorDocViewParserHandler.java   | 19 ++++++++---
 .../spi/impl/AccessControlValidator.java           |  5 +--
 .../spi/impl/AdvancedFilterValidator.java          | 21 ++++++------
 .../spi/impl/AdvancedFilterValidatorFactory.java   |  8 ++---
 .../validation/spi/impl/DependencyValidator.java   |  5 +--
 .../spi/impl/DependencyValidatorFactory.java       |  4 ++-
 .../spi/impl/DocumentViewParserValidator.java      |  6 ++--
 .../impl/DocumentViewParserValidatorFactory.java   | 16 ++++++++-
 .../spi/impl/DuplicateUuidValidator.java           |  3 +-
 .../spi/impl/MergeLimitationsValidator.java        |  3 +-
 .../spi/impl/OakIndexDefinitionValidator.java      |  5 +--
 .../spi/impl/OverlappingFilterValidator.java       |  5 +--
 .../impl/OverlappingFilterValidatorFactory.java    |  3 +-
 .../validation/spi/impl/PackageTypeValidator.java  | 39 +++++++++++-----------
 .../spi/impl/PackageTypeValidatorFactory.java      |  6 ++--
 .../spi/impl/nodetype/JcrNodeTypeMetaDataImpl.java | 27 +++++++--------
 .../spi/impl/nodetype/NodeTypeValidator.java       | 20 ++++++-----
 .../impl/nodetype/NodeTypeValidatorFactory.java    |  5 +--
 .../DocumentViewParserValidatorTest.java           | 18 ++++++++--
 .../jcr_root/apps/invalid/unusedcharacterdata.xml  | 22 ++++++++++++
 .../apache/jackrabbit/vault/vlt/FileAction.java    |  4 ++-
 .../apache/jackrabbit/vault/vlt/VltContext.java    | 17 +++++-----
 .../org/apache/jackrabbit/vault/vlt/VltFile.java   | 13 +++++---
 .../jackrabbit/vault/vlt/actions/Checkout.java     |  4 ++-
 .../apache/jackrabbit/vault/vlt/actions/Info.java  | 11 +++---
 .../apache/jackrabbit/vault/vlt/actions/Sync.java  | 15 ++++++---
 .../apache/jackrabbit/vault/vlt/meta/VltEntry.java |  3 +-
 .../vault/vlt/meta/xml/XmlEntryInfo.java           | 10 +++---
 .../vault/vlt/meta/xml/file/FileMetaDir.java       |  3 +-
 94 files changed, 531 insertions(+), 227 deletions(-)