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/04/26 14:22:54 UTC

svn commit: r1476167 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak: api/Type.java plugins/nodetype/EffectiveType.java plugins/nodetype/PropertyDefinitionImpl.java

Author: jukka
Date: Fri Apr 26 12:22:53 2013
New Revision: 1476167

URL: http://svn.apache.org/r1476167
Log:
OAK-66: JCR Node Type Management

Unify handling of property type names by making the Type<?> constants carry also the all-uppercase versions of the type names used in nt:propertyDefinition

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Type.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveType.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/PropertyDefinitionImpl.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Type.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Type.java?rev=1476167&r1=1476166&r2=1476167&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Type.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Type.java Fri Apr 26 12:22:53 2013
@@ -19,6 +19,7 @@
 package org.apache.jackrabbit.oak.api;
 
 import java.math.BigDecimal;
+import java.util.Map;
 
 import javax.jcr.PropertyType;
 
@@ -26,6 +27,7 @@ import com.google.common.base.Objects;
 import com.google.common.collect.ComparisonChain;
 
 import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.collect.Maps.newHashMap;
 
 /**
  * Instances of this class map Java types to {@link PropertyType property types}.
@@ -35,88 +37,128 @@ import static com.google.common.base.Pre
  */
 public final class Type<T> implements Comparable<Type<?>> {
 
+    private static final Map<String, Type<?>> TYPES = newHashMap();
+
+    private static <T> Type<T> create(int tag, boolean array, String string) {
+        Type<T> type = new Type<T>(tag, array, string);
+        TYPES.put(string, type);
+        return type;
+    }
+
     /** Map {@code String} to {@link PropertyType#STRING} */
-    public static final Type<String> STRING = create(PropertyType.STRING, false);
+    public static final Type<String> STRING =
+            create(PropertyType.STRING, false, "STRING");
 
     /** Map {@code Blob} to {@link PropertyType#BINARY} */
-    public static final Type<Blob> BINARY = create(PropertyType.BINARY, false);
+    public static final Type<Blob> BINARY =
+            create(PropertyType.BINARY, false, "BINARY");
 
     /** Map {@code Long} to {@link PropertyType#LONG} */
-    public static final Type<Long> LONG = create(PropertyType.LONG, false);
+    public static final Type<Long> LONG =
+            create(PropertyType.LONG, false, "LONG");
 
     /** Map {@code Double} to {@link PropertyType#DOUBLE} */
-    public static final Type<Double> DOUBLE = create(PropertyType.DOUBLE, false);
+    public static final Type<Double> DOUBLE =
+            create(PropertyType.DOUBLE, false, "DOUBLE");
 
     /** Map {@code Long} to {@link PropertyType#DATE} */
-    public static final Type<Long> DATE = create(PropertyType.DATE, false);
+    public static final Type<Long> DATE =
+            create(PropertyType.DATE, false, "DATE");
 
     /** Map {@code Boolean} to {@link PropertyType#BOOLEAN} */
-    public static final Type<Boolean> BOOLEAN = create(PropertyType.BOOLEAN, false);
+    public static final Type<Boolean> BOOLEAN =
+            create(PropertyType.BOOLEAN, false, "BOOLEAN");
 
     /** Map {@code String} to {@link PropertyType#STRING} */
-    public static final Type<String> NAME = create(PropertyType.NAME, false);
+    public static final Type<String> NAME =
+            create(PropertyType.NAME, false, "NAME");
 
     /** Map {@code String} to {@link PropertyType#PATH} */
-    public static final Type<String> PATH = create(PropertyType.PATH, false);
+    public static final Type<String> PATH =
+            create(PropertyType.PATH, false, "PATH");
 
     /** Map {@code String} to {@link PropertyType#REFERENCE} */
-    public static final Type<String> REFERENCE = create(PropertyType.REFERENCE, false);
+    public static final Type<String> REFERENCE =
+            create(PropertyType.REFERENCE, false, "REFERENCE");
 
     /** Map {@code String} to {@link PropertyType#WEAKREFERENCE} */
-    public static final Type<String> WEAKREFERENCE = create(PropertyType.WEAKREFERENCE, false);
+    public static final Type<String> WEAKREFERENCE =
+            create(PropertyType.WEAKREFERENCE, false, "WEAKREFERENCE");
 
     /** Map {@code String} to {@link PropertyType#URI} */
-    public static final Type<String> URI = create(PropertyType.URI, false);
+    public static final Type<String> URI =
+            create(PropertyType.URI, false, "URI");
 
     /** Map {@code BigDecimal} to {@link PropertyType#DECIMAL} */
-    public static final Type<BigDecimal> DECIMAL = create(PropertyType.DECIMAL, false);
+    public static final Type<BigDecimal> DECIMAL =
+            create(PropertyType.DECIMAL, false, "DECIMAL");
 
     /** Map {@code Iterable<String>} to array of {@link PropertyType#STRING} */
-    public static final Type<Iterable<String>> STRINGS = create(PropertyType.STRING, true);
+    public static final Type<Iterable<String>> STRINGS =
+            create(PropertyType.STRING, true, "STRINGS");
 
     /** Map {@code Iterable<Blob>} to array of {@link PropertyType#BINARY} */
-    public static final Type<Iterable<Blob>> BINARIES = create(PropertyType.BINARY, true);
+    public static final Type<Iterable<Blob>> BINARIES =
+            create(PropertyType.BINARY, true, "BINARIES");
 
     /** Map {@code Iterable<Long>} to array of {@link PropertyType#LONG} */
-    public static final Type<Iterable<Long>> LONGS = create(PropertyType.LONG, true);
+    public static final Type<Iterable<Long>> LONGS =
+            create(PropertyType.LONG, true, "LONGS");
 
     /** Map {@code Iterable<Double>} to array of {@link PropertyType#DOUBLE} */
-    public static final Type<Iterable<Double>> DOUBLES = create(PropertyType.DOUBLE, true);
+    public static final Type<Iterable<Double>> DOUBLES =
+            create(PropertyType.DOUBLE, true, "DOUBLES");
 
     /** Map {@code Iterable<Long>} to array of {@link PropertyType#DATE} */
-    public static final Type<Iterable<Long>> DATES = create(PropertyType.DATE, true);
+    public static final Type<Iterable<Long>> DATES =
+            create(PropertyType.DATE, true, "DATES");
 
     /** Map {@code Iterable<Boolean>} to array of {@link PropertyType#BOOLEAN} */
-    public static final Type<Iterable<Boolean>> BOOLEANS = create(PropertyType.BOOLEAN, true);
+    public static final Type<Iterable<Boolean>> BOOLEANS =
+            create(PropertyType.BOOLEAN, true, "BOOLEANS");
 
     /** Map {@code Iterable<String>} to array of {@link PropertyType#NAME} */
-    public static final Type<Iterable<String>> NAMES = create(PropertyType.NAME, true);
+    public static final Type<Iterable<String>> NAMES =
+            create(PropertyType.NAME, true, "NAMES");
 
     /** Map {@code Iterable<String>} to array of {@link PropertyType#PATH} */
-    public static final Type<Iterable<String>> PATHS = create(PropertyType.PATH, true);
+    public static final Type<Iterable<String>> PATHS =
+            create(PropertyType.PATH, true, "PATHS");
 
     /** Map {@code Iterable<String>} to array of {@link PropertyType#REFERENCE} */
-    public static final Type<Iterable<String>> REFERENCES = create(PropertyType.REFERENCE, true);
+    public static final Type<Iterable<String>> REFERENCES =
+            create(PropertyType.REFERENCE, true, "REFERENCES");
 
     /** Map {@code Iterable<String>} to array of {@link PropertyType#WEAKREFERENCE} */
-    public static final Type<Iterable<String>> WEAKREFERENCES = create(PropertyType.WEAKREFERENCE, true);
+    public static final Type<Iterable<String>> WEAKREFERENCES =
+            create(PropertyType.WEAKREFERENCE, true, "WEAKREFERENCES");
 
     /** Map {@code Iterable<String>} to array of {@link PropertyType#URI} */
-    public static final Type<Iterable<String>> URIS = create(PropertyType.URI, true);
+    public static final Type<Iterable<String>> URIS =
+            create(PropertyType.URI, true, "URIS");
 
     /** Map {@code Iterable<BigDecimal>} to array of {@link PropertyType#DECIMAL} */
-    public static final Type<Iterable<BigDecimal>> DECIMALS = create(PropertyType.DECIMAL, true);
+    public static final Type<Iterable<BigDecimal>> DECIMALS =
+            create(PropertyType.DECIMAL, true, "DECIMALS");
+
+    /** The special "undefined" type, never encountered in normal values */
+    public static final Type<Void> UNDEFINED =
+            create(PropertyType.UNDEFINED, false, "UNDEFINED");
+
+    /** Multi-valued "undefined" type, never encountered in normal values */
+    public static final Type<Iterable<Void>> UNDEFINEDS =
+            create(PropertyType.UNDEFINED, true, "UNDEFINEDS");
 
     private final int tag;
+
     private final boolean array;
 
-    private Type(int tag, boolean array){
+    private final String string;
+
+    private Type(int tag, boolean array, String string) {
         this.tag = tag;
         this.array = array;
-    }
-
-    private static <T> Type<T> create(int tag, boolean array) {
-        return new Type<T>(tag, array);
+        this.string = string;
     }
 
     /**
@@ -156,11 +198,26 @@ public final class Type<T> implements Co
             case PropertyType.WEAKREFERENCE: return array ? WEAKREFERENCES : WEAKREFERENCE;
             case PropertyType.URI: return array ? URIS: URI;
             case PropertyType.DECIMAL: return array ? DECIMALS : DECIMAL;
+            case PropertyType.UNDEFINED: return array ? UNDEFINEDS : UNDEFINED;
             default: throw new IllegalArgumentException("Invalid type tag: " + tag);
         }
     }
 
     /**
+     * Returns the {@code Type} with the given string representation.
+     *
+     * @param string type string
+     * @return matching type
+     */
+    public static Type<?> fromString(String string) {
+        Type<?> type = TYPES.get(string);
+        if (type == null) {
+            throw new IllegalArgumentException("Invalid type name: " + string);
+        }
+        return type;
+    }
+
+    /**
      * Determine the base type of array types
      * @return  base type
      * @throws IllegalStateException if {@code isArray} is false.
@@ -194,9 +251,7 @@ public final class Type<T> implements Co
 
     @Override
     public String toString() {
-        return isArray()
-            ? "[]" + PropertyType.nameFromValue(getBaseType().tag)
-            : PropertyType.nameFromValue(tag);
+        return string;
     }
 
     @Override

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveType.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveType.java?rev=1476167&r1=1476166&r2=1476167&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveType.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveType.java Fri Apr 26 12:22:53 2013
@@ -24,6 +24,8 @@ import static org.apache.jackrabbit.JcrC
 import static org.apache.jackrabbit.JcrConstants.JCR_UUID;
 import static org.apache.jackrabbit.oak.api.Type.NAME;
 import static org.apache.jackrabbit.oak.api.Type.NAMES;
+import static org.apache.jackrabbit.oak.api.Type.UNDEFINED;
+import static org.apache.jackrabbit.oak.api.Type.UNDEFINEDS;
 
 import java.util.List;
 import java.util.Set;
@@ -93,12 +95,12 @@ class EffectiveType {
             escapedName = propertyName;
         }
 
-        String definedType = getTypeKey(propertyType);
+        String definedType = propertyType.toString();
         String undefinedType;
         if (propertyType.isArray()) {
-            undefinedType = "UNDEFINEDS";
+            undefinedType = UNDEFINEDS.toString();
         } else {
-            undefinedType = "UNDEFINED";
+            undefinedType = UNDEFINED.toString();
         }
 
         // Find matching named property definition
@@ -200,60 +202,4 @@ class EffectiveType {
         return names;
     }
 
-    //-----------------------------------------------------------< private >--
-
-    private String getTypeKey(Type<?> type) {
-        if (type == Type.BINARIES) {
-            return "BINARIES";
-        } else if (type == Type.BINARY) {
-            return "BINARY";
-        } else if (type == Type.BOOLEAN) {
-            return "BOOLEAN";
-        } else if (type == Type.BOOLEANS) {
-            return "BOOLEANS";
-        } else if (type == Type.DATE) {
-            return "DATE";
-        } else if (type == Type.DATES) {
-            return "DATES";
-        } else if (type == Type.DECIMAL) {
-            return "DECIMAL";
-        } else if (type == Type.DECIMALS) {
-            return "DECIMALS";
-        } else if (type == Type.DOUBLE) {
-            return "DOUBLE";
-        } else if (type == Type.DOUBLES) {
-            return "DOUBLES";
-        } else if (type == Type.LONG) {
-            return "LONG";
-        } else if (type == Type.LONGS) {
-            return "LONGS";
-        } else if (type == Type.NAME) {
-            return "NAME";
-        } else if (type == Type.NAMES) {
-            return "NAMES";
-        } else if (type == Type.PATH) {
-            return "PATH";
-        } else if (type == Type.PATHS) {
-            return "PATHS";
-        } else if (type == Type.REFERENCE) {
-            return "REFERENCE";
-        } else if (type == Type.REFERENCES) {
-            return "REFERENCES";
-        } else if (type == Type.STRING) {
-            return "STRING";
-        } else if (type == Type.STRINGS) {
-            return "STRINGS";
-        } else if (type == Type.URI) {
-            return "URI";
-        } else if (type == Type.URIS) {
-            return "URIS";
-        } else if (type == Type.WEAKREFERENCE) {
-            return "WEAKREFERENCE";
-        } else if (type == Type.WEAKREFERENCES) {
-            return "WEAKREFERENCES";
-        } else {
-            return "unknown";
-        }
-    }
-
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/PropertyDefinitionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/PropertyDefinitionImpl.java?rev=1476167&r1=1476166&r2=1476167&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/PropertyDefinitionImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/PropertyDefinitionImpl.java Fri Apr 26 12:22:53 2013
@@ -16,6 +16,8 @@
  */
 package org.apache.jackrabbit.oak.plugins.nodetype;
 
+import static javax.jcr.PropertyType.UNDEFINED;
+
 import java.util.List;
 
 import javax.jcr.Value;
@@ -26,23 +28,10 @@ import javax.jcr.query.qom.QueryObjectMo
 import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Tree;
+import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
 import org.apache.jackrabbit.oak.plugins.value.ValueFactoryImpl;
 
-import static javax.jcr.PropertyType.BINARY;
-import static javax.jcr.PropertyType.BOOLEAN;
-import static javax.jcr.PropertyType.DATE;
-import static javax.jcr.PropertyType.DECIMAL;
-import static javax.jcr.PropertyType.DOUBLE;
-import static javax.jcr.PropertyType.LONG;
-import static javax.jcr.PropertyType.NAME;
-import static javax.jcr.PropertyType.PATH;
-import static javax.jcr.PropertyType.REFERENCE;
-import static javax.jcr.PropertyType.STRING;
-import static javax.jcr.PropertyType.UNDEFINED;
-import static javax.jcr.PropertyType.URI;
-import static javax.jcr.PropertyType.WEAKREFERENCE;
-
 /**
  * <pre>
  * [nt:propertyDefinition]
@@ -79,35 +68,11 @@ class PropertyDefinitionImpl extends Ite
      * @throws IllegalStateException if {@code name} is not a valid property type name.
      */
     public static int valueFromName(String name) {
-        if ("STRING".equals(name)) {
-            return STRING;
-        } else if ("BINARY".equals(name)) {
-            return BINARY;
-        } else if ("BOOLEAN".equals(name)) {
-            return BOOLEAN;
-        } else if ("LONG".equals(name)) {
-            return LONG;
-        } else if ("DOUBLE".equals(name)) {
-            return DOUBLE;
-        } else if ("DECIMAL".equals(name)) {
-            return DECIMAL;
-        } else if ("DATE".equals(name)) {
-            return DATE;
-        } else if ("NAME".equals(name)) {
-            return NAME;
-        } else if ("PATH".equals(name)) {
-            return PATH;
-        } else if ("REFERENCE".equals(name)) {
-            return REFERENCE;
-        } else if ("WEAKREFERENCE".equals(name)) {
-            return WEAKREFERENCE;
-        } else if ("URI".equals(name)) {
-            return URI;
-        } else if ("UNDEFINED".equals(name)) {
-            return UNDEFINED;
-        } else {
+        Type<?> type = Type.fromString(name);
+        if (type.isArray()) {
             throw new IllegalStateException("unknown property type: " + name);
         }
+        return type.tag();
     }
 
     //-------------------------------------------------< PropertyDefinition >---