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 2020/08/19 15:17:54 UTC

[jackrabbit-filevault] 01/01: JCRVLT-462 no validation error for uncontained root node

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

kwin pushed a commit to branch feature/nodetype-validator-improvements
in repository https://gitbox.apache.org/repos/asf/jackrabbit-filevault.git

commit fdc2628d4528f3bc7be436ce450731a3b2917e40
Author: Konrad Windszus <kw...@apache.org>
AuthorDate: Wed Aug 19 17:17:39 2020 +0200

    JCRVLT-462 no validation error for uncontained root node
---
 .../validation/spi/impl/nodetype/NodeTypeValidator.java | 10 +++++++---
 .../spi/impl/nodetype/NodeTypeValidatorTest.java        | 17 +++++++++++++++++
 2 files changed, 24 insertions(+), 3 deletions(-)

diff --git a/vault-validation/src/main/java/org/apache/jackrabbit/vault/validation/spi/impl/nodetype/NodeTypeValidator.java b/vault-validation/src/main/java/org/apache/jackrabbit/vault/validation/spi/impl/nodetype/NodeTypeValidator.java
index f3af76c..dffa19b 100644
--- a/vault-validation/src/main/java/org/apache/jackrabbit/vault/validation/spi/impl/nodetype/NodeTypeValidator.java
+++ b/vault-validation/src/main/java/org/apache/jackrabbit/vault/validation/spi/impl/nodetype/NodeTypeValidator.java
@@ -164,7 +164,11 @@ public class NodeTypeValidator implements DocumentViewXmlValidator, JcrPathValid
                 final EffectiveNodeType parentNodeType;
                 final boolean useDefaultNodeType;
 
-                if (parentNodeNameAndType == null || !filter.contains(parentNodePath)) {
+                // is this the root node?
+                if (parentNodeNameAndType == null && nodeContext.getNodePath().equals("/")) {
+                    parentNodeType = null;
+                    useDefaultNodeType = false;
+                } else if (parentNodeNameAndType == null || !filter.contains(parentNodePath)) {
                     parentNodeType = defaultType;
                     useDefaultNodeType = true;
                 } else if (!parentNodeNameAndType.isUnknown()) {
@@ -254,9 +258,9 @@ public class NodeTypeValidator implements DocumentViewXmlValidator, JcrPathValid
             protectedNodeContext = null;
         }
 
-        // validate mandatory child nodes
+        // validate mandatory child nodes (only in case this is a covered path)
         NodeNameAndType currentNodeNameAndType = nodeTypePerPath.get(nodeContext.getNodePath());
-        if (currentNodeNameAndType != null && !currentNodeNameAndType.isUnknown()) {
+        if (currentNodeNameAndType != null && !currentNodeNameAndType.isUnknown() && filter.contains(nodeContext.getNodePath())) {
             Collection<ValidationMessage> messages = new LinkedList<>();
             for (QNodeDefinition mandatoryNodeType : currentNodeNameAndType.getEffectiveNodeType().getMandatoryQNodeDefinitions()) {
                 NodeNameAndType childNodeType;
diff --git a/vault-validation/src/test/java/org/apache/jackrabbit/vault/validation/spi/impl/nodetype/NodeTypeValidatorTest.java b/vault-validation/src/test/java/org/apache/jackrabbit/vault/validation/spi/impl/nodetype/NodeTypeValidatorTest.java
index fb5af86..164a041 100644
--- a/vault-validation/src/test/java/org/apache/jackrabbit/vault/validation/spi/impl/nodetype/NodeTypeValidatorTest.java
+++ b/vault-validation/src/test/java/org/apache/jackrabbit/vault/validation/spi/impl/nodetype/NodeTypeValidatorTest.java
@@ -96,6 +96,23 @@ public class NodeTypeValidatorTest {
     }
 
     @Test
+    public void testUncontainedRootNode() {
+        NodeContext nodeContext = new NodeContextImpl("/", Paths.get("jcr_root"), Paths.get(""));
+
+        Map<String, DocViewProperty> props = new HashMap<>();
+        props.put(NameConstants.JCR_PRIMARYTYPE.toString(), 
+                new DocViewProperty(NameConstants.JCR_PRIMARYTYPE.toString(),
+                new String[] { "rep:root" }, false, PropertyType.STRING));
+        props.put(NameConstants.JCR_MIXINTYPES.toString(),
+                new DocViewProperty(NameConstants.JCR_MIXINTYPES.toString(),
+                new String[] { "rep:AccessControllable", "rep:RepoAccessControllable" }, true, PropertyType.STRING));
+        DocViewNode node = new DocViewNode("jcr:root", "jcr:root", null, props, null, "rep:root");
+        
+        Assert.assertThat(validator.validate(node, nodeContext, true), AnyValidationMessageMatcher.noValidationInCollection());
+        Assert.assertThat(validator.validateEnd(node, nodeContext, true), AnyValidationMessageMatcher.noValidationInCollection());
+    }
+
+    @Test
     public void testInvalidChildNodeTypeBelowDefault() {
         NodeContext nodeContext = new NodeContextImpl("/apps/test/node4", Paths.get("node4"), Paths.get(""));