You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by js...@apache.org on 2021/07/02 14:10:49 UTC

[jackrabbit-filevault] branch bugfix/JCRVLT-544-refactored-EffectiveNodeType updated: JCRVLT-544 never create intermediate nodes of type nt:base or nt:hierarchyNode

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

jsedding pushed a commit to branch bugfix/JCRVLT-544-refactored-EffectiveNodeType
in repository https://gitbox.apache.org/repos/asf/jackrabbit-filevault.git


The following commit(s) were added to refs/heads/bugfix/JCRVLT-544-refactored-EffectiveNodeType by this push:
     new 3734a33  JCRVLT-544 never create intermediate nodes of type nt:base or nt:hierarchyNode
3734a33 is described below

commit 3734a3384f734b27c93be6f059074d3543167813
Author: Julian Sedding <js...@apache.org>
AuthorDate: Fri Jul 2 16:10:37 2021 +0200

    JCRVLT-544 never create intermediate nodes of type nt:base or nt:hierarchyNode
    
    - address feedback
---
 .../vault/fs/impl/io/DocViewSAXImporter.java       |  2 +-
 .../vault/fs/impl/io/FolderArtifactHandler.java    |  3 +-
 .../jackrabbit/vault/util/EffectiveNodeType.java   | 43 ++++++++++------------
 3 files changed, 22 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 084f4d9..1cfa615 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
@@ -1114,7 +1114,7 @@ public class DocViewSAXImporter extends RejectingEntityDefaultHandler implements
      * @return {@code true} in case the property is protected, {@code false} otherwise
      */
     private static boolean isPropertyProtected(@NotNull EffectiveNodeType effectiveNodeType, @NotNull DocViewProperty docViewProperty) {
-        return effectiveNodeType.getPropertyDef(docViewProperty.name, docViewProperty.isMulti, docViewProperty.type)
+        return effectiveNodeType.getPropertyDefinition(docViewProperty.name, docViewProperty.isMulti, docViewProperty.type)
                 .map(PropertyDefinition::isProtected)
                 .orElse(false);
     }
diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/FolderArtifactHandler.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/FolderArtifactHandler.java
index b142c6a..85ecd2e 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/FolderArtifactHandler.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/FolderArtifactHandler.java
@@ -87,9 +87,10 @@ public class FolderArtifactHandler extends AbstractArtifactHandler {
 
     private @Nullable String getDefaultPrimaryChildNodeType(Node parent, String intermediateNodeName) throws RepositoryException {
         EffectiveNodeType effectiveNodeType = EffectiveNodeType.ofNode(parent);
-        return effectiveNodeType.getChildNodeDef(intermediateNodeName)
+        return effectiveNodeType.getChildNodeDefinitions(intermediateNodeName)
                 .filter(nd -> nd.getDefaultPrimaryType() != null)
                 .map(NodeDefinition::getDefaultPrimaryTypeName)
+                .findFirst()
                 .orElse(null);
     }
 
diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/util/EffectiveNodeType.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/util/EffectiveNodeType.java
index b75d14b..adb109e 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/util/EffectiveNodeType.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/util/EffectiveNodeType.java
@@ -29,6 +29,7 @@ import javax.jcr.nodetype.PropertyDefinition;
 import java.util.Comparator;
 import java.util.List;
 import java.util.Optional;
+import java.util.function.Function;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -65,46 +66,40 @@ public final class EffectiveNodeType {
      * 
      * This replicates the logic from https://github.com/apache/jackrabbit-oak/blob/274f92402a12978040939965e92ee4519f2ce1c3/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveNodeTypeImpl.java#L365
      */
-    public @NotNull Optional<PropertyDefinition> getPropertyDef(@NotNull String name, boolean isMultiple, int type) {
-        return getPropertyDef(name)
+    public @NotNull Optional<PropertyDefinition> getPropertyDefinition(@NotNull String name, boolean isMultiple, int type) {
+        return getPropertyDefinitions(name)
                 .filter(pd -> isMultiple == pd.isMultiple())
-                .filter(pd -> type == pd.getRequiredType() || UNDEFINED == type || UNDEFINED == pd.getRequiredType());
+                .filter(pd -> type == pd.getRequiredType() || UNDEFINED == type || UNDEFINED == pd.getRequiredType())
+                .findFirst();
     }
 
-    public @NotNull Optional<PropertyDefinition> getPropertyDef(@NotNull String name) {
-        return nodeTypes.stream()
-                .flatMap(nt -> Stream.of(nt.getPropertyDefinitions()))
-                .filter(byName(name))
-                .min(Comparator.comparing(ItemDefinition::getName, wildcardAwareNameComparator()));
+    public @NotNull Stream<PropertyDefinition> getPropertyDefinitions(@NotNull String name) {
+        return getItemDefinitions(name, NodeType::getPropertyDefinitions);
+    }
+
+    public @NotNull Stream<NodeDefinition> getChildNodeDefinitions(@NotNull String name) {
+        return getItemDefinitions(name, NodeType::getChildNodeDefinitions);
     }
 
-    public @NotNull Optional<NodeDefinition> getChildNodeDef(@NotNull String name) {
+    private <T extends ItemDefinition> Stream<T> getItemDefinitions(String name, Function<NodeType, T[]> itemDefinitionAccessor) {
         return nodeTypes.stream()
-                .flatMap(nt -> Stream.of(nt.getChildNodeDefinitions()))
+                .map(itemDefinitionAccessor)
+                .flatMap(Stream::of)
                 .filter(byName(name))
-                .min(Comparator.comparing(ItemDefinition::getName, wildcardAwareNameComparator()));
+                .sorted(Comparator.comparing(ItemDefinition::getName, wildcardAwareNameComparator()));
     }
 
     private static Predicate<? super ItemDefinition> byName(String name) {
-        final Predicate<? super ItemDefinition> namePredicate;
-        if (name != null) {
-            namePredicate = pd -> name.equals(pd.getName()) || "*".equals(pd.getName());
-        } else {
-            namePredicate = pd -> "*".equals(pd.getName());
-        }
-        return namePredicate;
+        return pd -> Optional.ofNullable(name).orElse("*").equals(pd.getName());
     }
 
     // always sort wildcard(s) last
     private static Comparator<String> wildcardAwareNameComparator() {
         return (a, b) -> {
-            if (a.equals("*")) {
-                return (b.equals("*")) ? 0 : 1;
-            } else if (b.equals("*")) {
-                return -1;
-            } else {
-                return a.compareTo(b);
+            if (a.equals("*") || b.equals("*")) {
+                return (a.equals("*")) ? 1 : -1;
             }
+            return 0;
         };
     }