You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ju...@apache.org on 2013/03/27 14:39:07 UTC

svn commit: r1461574 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak: namepath/NamePathMapperImpl.java plugins/value/ValueFactoryImpl.java query/ast/NodeNameImpl.java

Author: jukka
Date: Wed Mar 27 13:39:07 2013
New Revision: 1461574

URL: http://svn.apache.org/r1461574
Log:
OAK-108: Shortcut path conversions

Skip validation of paths in NamePathMapperImpl. Instead validate paths
in ValueFactoryImpl where the TCK (indirectly) expects names and paths
to be validated. Also the name tests in query code need updating.

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/NamePathMapperImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/value/ValueFactoryImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeNameImpl.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/NamePathMapperImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/NamePathMapperImpl.java?rev=1461574&r1=1461573&r2=1461574&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/NamePathMapperImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/NamePathMapperImpl.java Wed Mar 27 13:39:07 2013
@@ -190,16 +190,11 @@ public class NamePathMapperImpl implemen
         // try a shortcut
         if (!hasNameStartingWithDot && !hasClarkBrackets && !hasIndexBrackets) {
             if (!hasColon || !hasSessionLocalMappings()) {
-                if (JcrPathParser.validate(jcrPath)) {
-                    if(hasTrailingSlash){
-                        return jcrPath.substring(0, length - 1);
-                    }
+                if (hasTrailingSlash){
+                    return jcrPath.substring(0, length - 1);
+                } else {
                     return jcrPath;
                 }
-                else {
-                    log.debug("Invalid path: {}", jcrPath);
-                    return null;
-                }
             }
         }
 

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/value/ValueFactoryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/value/ValueFactoryImpl.java?rev=1461574&r1=1461573&r2=1461574&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/value/ValueFactoryImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/value/ValueFactoryImpl.java Wed Mar 27 13:39:07 2013
@@ -36,6 +36,8 @@ import org.apache.jackrabbit.oak.api.Blo
 import org.apache.jackrabbit.oak.api.BlobFactory;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.PropertyValue;
+import org.apache.jackrabbit.oak.namepath.JcrNameParser;
+import org.apache.jackrabbit.oak.namepath.JcrPathParser;
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
 import org.apache.jackrabbit.oak.core.IdentifierManager;
 import org.apache.jackrabbit.oak.plugins.memory.BinaryPropertyState;
@@ -214,7 +216,7 @@ public class ValueFactoryImpl implements
                     return createValue(Conversions.convert(value).toBoolean());
                 case PropertyType.NAME:
                     String oakName = namePathMapper.getOakNameOrNull(value);
-                    if (oakName == null) {
+                    if (oakName == null || !JcrNameParser.validate(oakName)) {
                         throw new ValueFormatException("Invalid name: " + value);
                     }
                     return new ValueImpl(GenericPropertyState.nameProperty("", oakName), namePathMapper);
@@ -224,9 +226,9 @@ public class ValueFactoryImpl implements
                         // identifier path; do no change
                     } else {
                         oakValue = namePathMapper.getOakPath(value);
-                    }
-                    if (oakValue == null) {
-                        throw new ValueFormatException("Invalid path: " + value);
+                        if (oakValue == null || !JcrPathParser.validate(oakValue)) {
+                            throw new ValueFormatException("Invalid path: " + value);
+                        }
                     }
                     return new ValueImpl(GenericPropertyState.pathProperty("", oakValue), namePathMapper);
                 case PropertyType.REFERENCE:

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeNameImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeNameImpl.java?rev=1461574&r1=1461573&r2=1461574&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeNameImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeNameImpl.java Wed Mar 27 13:39:07 2013
@@ -23,6 +23,7 @@ import javax.jcr.PropertyType;
 import org.apache.jackrabbit.oak.api.PropertyValue;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.commons.PathUtils;
+import org.apache.jackrabbit.oak.namepath.JcrNameParser;
 import org.apache.jackrabbit.oak.query.index.FilterImpl;
 import org.apache.jackrabbit.oak.spi.query.PropertyValues;
 import org.apache.jackrabbit.util.ISO9075;
@@ -71,18 +72,10 @@ public class NodeNameImpl extends Dynami
         if (v == null) {
             return;
         }
-        if (!isName(v)) {
+        String name = getName(v);
+        if (name == null) {
             throw new IllegalArgumentException("Invalid name value: " + v.toString());
         }
-        String path = v.getValue(Type.STRING);
-        // Name escaping (convert _x0020_ to space)
-        path = decodeName(path);
-        if (PathUtils.isAbsolute(path)) {
-            throw new IllegalArgumentException("NAME() comparison with absolute path are not allowed: " + path);
-        }
-        if (PathUtils.getDepth(path) > 1) {
-            throw new IllegalArgumentException("NAME() comparison with relative path are not allowed: " + path);
-        }
         // TODO support NAME(..) index conditions
     }
 
@@ -91,21 +84,14 @@ public class NodeNameImpl extends Dynami
         return s == selector;
     }
 
-    private String decodeName(String path) {
-        // Name escaping (convert _x0020_ to space)
-        path = ISO9075.decode(path);
-        // normalize paths (./name > name)
-        path = PropertyValues.getOakPath(path, query.getNamePathMapper());
-        return path;
-    }
-
     /**
-     * Validate that the given value can be converted to a JCR name.
+     * Validate that the given value can be converted to a JCR name, and
+     * return the name.
      *
      * @param v the value
-     * @return true if it can be converted
+     * @return name value, or {@code null} if the value can not be converted
      */
-    private static boolean isName(PropertyValue v) {
+    private String getName(PropertyValue v) {
         // TODO correctly validate JCR names - see JCR 2.0 spec 3.2.4 Naming Restrictions
         switch (v.getType().tag()) {
         case PropertyType.DATE:
@@ -113,13 +99,20 @@ public class NodeNameImpl extends Dynami
         case PropertyType.DOUBLE:
         case PropertyType.LONG:
         case PropertyType.BOOLEAN:
-            return false;
+            return null;
         }
-        String n = v.getValue(Type.STRING);
-        if (n.startsWith("[") && !n.endsWith("]")) {
-            return false;
+        String name = v.getValue(Type.NAME);
+        // Name escaping (convert _x0020_ to space)
+        name = ISO9075.decode(name);
+        // normalize paths (./name > name)
+        name = PropertyValues.getOakPath(name, query.getNamePathMapper());
+
+        if (name.startsWith("[") && !name.endsWith("]")) {
+            return null;
+        } else if (!JcrNameParser.validate(name)) {
+            return null;
         }
-        return true;
+        return name;
     }
     
     @Override