You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by st...@apache.org on 2005/04/06 12:54:18 UTC

svn commit: r160284 - in incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype: EffectiveNodeType.java NodeTypeImpl.java

Author: stefan
Date: Wed Apr  6 03:54:15 2005
New Revision: 160284

URL: http://svn.apache.org/viewcvs?view=rev&rev=160284
Log:
fixed JCR-59: NodeType.canSetProperty() does not allow for type conversion

Modified:
    incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/EffectiveNodeType.java
    incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeImpl.java

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/EffectiveNodeType.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/EffectiveNodeType.java?view=diff&r1=160283&r2=160284
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/EffectiveNodeType.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/EffectiveNodeType.java Wed Apr  6 03:54:15 2005
@@ -423,13 +423,16 @@
      * Tests if the value constraints defined in the property definition
      * <code>pd</code> are satisfied by the the specified <code>values</code>.
      * <p/>
-     * Note that the <i>protected</i> flag is not checked.
+     * Note that the <i>protected</i> flag is not checked. Also note that no
+     * type conversions are attempted if the type of the given values does not
+     * match the required type as specified in the given definition.
      *
      * @param pd
      * @param values
      * @throws ConstraintViolationException
      */
-    public static void checkSetPropertyValueConstraints(PropDef pd, InternalValue[] values)
+    public static void checkSetPropertyValueConstraints(PropDef pd,
+                                                        InternalValue[] values)
             throws ConstraintViolationException, RepositoryException {
         // check multi-value flag
         if (!pd.isMultiple() && values != null && values.length > 1) {

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeImpl.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeImpl.java?view=diff&r1=160283&r2=160284
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeImpl.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeImpl.java Wed Apr  6 03:54:15 2005
@@ -228,7 +228,9 @@
      * Tests if the value constraints defined in the property definition
      * <code>def</code> are satisfied by the the specified <code>values</code>.
      * <p/>
-     * Note that the <i>protected</i> flag is not checked.
+     * Note that the <i>protected</i> flag is not checked. Also note that no
+     * type conversions are attempted if the type of the given values does not
+     * match the required type as specified in the given definition.
      *
      * @param def    The definiton of the property
      * @param values An array of <code>InternalValue</code> objects.
@@ -429,15 +431,33 @@
         }
         try {
             QName name = QName.fromJCRName(propertyName, nsResolver);
-            PropertyDefImpl def =
-                    getApplicablePropertyDef(name, value.getType(), false);
+            PropertyDefImpl def;
+            try {
+                // try to get definition that matches the given value type
+                def = getApplicablePropertyDef(name, value.getType(), false);
+            } catch (ConstraintViolationException cve) {
+                // fallback: ignore type
+                def = getApplicablePropertyDef(name, PropertyType.UNDEFINED, false);
+            }
             if (def.isProtected()) {
                 return false;
             }
             if (def.isMultiple()) {
                 return false;
             }
-            InternalValue internalValue = InternalValue.create(value, nsResolver);
+            int targetType;
+            if (def.getRequiredType() != PropertyType.UNDEFINED &&
+                    def.getRequiredType() != value.getType()) {
+                // type conversion required
+                targetType = def.getRequiredType();
+            } else {
+                // no type conversion required
+                targetType = value.getType();
+            }
+            // create InternalValue from Value and perform
+            // type conversion as necessary
+            InternalValue internalValue = InternalValue.create(value, targetType,
+                    nsResolver);
             checkSetPropertyValueConstraints(def, new InternalValue[]{internalValue});
             return true;
         } catch (BaseException be) {
@@ -458,23 +478,56 @@
         }
         try {
             QName name = QName.fromJCRName(propertyName, nsResolver);
-            int type = (values.length == 0) ? PropertyType.UNDEFINED : values[0].getType();
-            PropertyDefImpl def = getApplicablePropertyDef(name, type, true);
+            // determine type of values
+            int type = PropertyType.UNDEFINED;
+            for (int i = 0; i < values.length; i++) {
+                if (type == PropertyType.UNDEFINED) {
+                    type = values[i].getType();
+                } else if (type != values[i].getType()) {
+                    // inhomogeneous types
+                    return false;
+                }
+            }
+            PropertyDefImpl def;
+            try {
+                // try to get definition that matches the given value type
+                def = getApplicablePropertyDef(name, type, true);
+            } catch (ConstraintViolationException cve) {
+                // fallback: ignore type
+                def = getApplicablePropertyDef(name, PropertyType.UNDEFINED, true);
+            }
+
             if (def.isProtected()) {
                 return false;
             }
             if (!def.isMultiple()) {
                 return false;
             }
+            // determine target type
+            int targetType;
+            if (def.getRequiredType() != PropertyType.UNDEFINED &&
+                    def.getRequiredType() != type) {
+                // type conversion required
+                targetType = def.getRequiredType();
+            } else {
+                // no type conversion required
+                targetType = type;
+            }
+
             ArrayList list = new ArrayList();
             // convert values and compact array (purge null entries)
             for (int i = 0; i < values.length; i++) {
                 if (values[i] != null) {
-                    InternalValue internalValue = InternalValue.create(values[i], nsResolver);
+                    // create InternalValue from Value and perform
+                    // type conversion as necessary
+                    InternalValue internalValue =
+                            InternalValue.create(values[i], targetType,
+                                    nsResolver);
                     list.add(internalValue);
                 }
             }
-            InternalValue[] internalValues = (InternalValue[]) list.toArray(new InternalValue[list.size()]);
+            InternalValue[] internalValues =
+                    (InternalValue[]) list.toArray(new InternalValue[list.size()]);
             checkSetPropertyValueConstraints(def, internalValues);
             return true;
         } catch (BaseException be) {