You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by tr...@apache.org on 2009/06/17 22:22:09 UTC

svn commit: r785777 [4/4] - in /jackrabbit/trunk: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/com...

Modified: jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/constraint/PathConstraint.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/constraint/PathConstraint.java?rev=785777&r1=785776&r2=785777&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/constraint/PathConstraint.java (original)
+++ jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/constraint/PathConstraint.java Wed Jun 17 20:21:54 2009
@@ -27,6 +27,7 @@
 import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver;
 import org.apache.jackrabbit.spi.commons.conversion.PathResolver;
 import org.apache.jackrabbit.spi.commons.name.PathFactoryImpl;
+import org.apache.jackrabbit.spi.commons.name.NameConstants;
 import org.apache.jackrabbit.spi.commons.nodetype.InvalidConstraintException;
 
 /**
@@ -39,11 +40,11 @@
 
     static PathConstraint create(String qualifiedDefinition) throws InvalidConstraintException {
         // constraint format: qualified absolute or relative path with optional trailing wildcard
-        boolean deep = qualifiedDefinition.endsWith("*");
+        boolean deep = qualifiedDefinition.endsWith("\t{}*");
         Path path;
         // TODO improve. don't rely on a specific factory impl
         if (deep) {
-            path = PathFactoryImpl.getInstance().create(qualifiedDefinition.substring(0, qualifiedDefinition.length() - 1));
+            path = PathFactoryImpl.getInstance().create(qualifiedDefinition.substring(0, qualifiedDefinition.length() - 4));
         } else {
             path = PathFactoryImpl.getInstance().create(qualifiedDefinition);
         }
@@ -53,7 +54,6 @@
     static PathConstraint create(String definition, PathResolver resolver)
             throws InvalidConstraintException {
         try {
-            StringBuffer qualifiedDefinition = new StringBuffer();
             // constraint format: absolute or relative path with optional
             // trailing wildcard
             boolean deep = definition.endsWith("/*");
@@ -61,15 +61,16 @@
                 // trim trailing wildcard before building path
                 if (definition.equals("/*")) {
                     definition = "/";
-                    qualifiedDefinition.append('*');
                 } else {
                     definition = definition.substring(0, definition.length() - 2);
-                    qualifiedDefinition.append("/*");
                 }
             }
             Path path = resolver.getQPath(definition);
-            qualifiedDefinition.insert(0, path.getString());
-
+            StringBuffer qualifiedDefinition = new StringBuffer(path.getString());
+            if (deep) {
+                qualifiedDefinition.append(Path.DELIMITER);
+                qualifiedDefinition.append(NameConstants.ANY_NAME);
+            }
             return new PathConstraint(qualifiedDefinition.toString(), path, deep);
         } catch (NameException e) {
             String msg = "Invalid path expression specified as value constraint: " + definition;
@@ -93,7 +94,7 @@
      * qualified <code>Path</code> into a JCR path.
      *
      * @see ValueConstraint#getDefinition(NamePathResolver)
-     * @param resolver
+     * @param resolver name-path resolver
      */
     public String getDefinition(NamePathResolver resolver) {
         try {
@@ -107,16 +108,16 @@
             }
         } catch (NamespaceException e) {
             // should never get here, return raw definition as fallback
-            return getQualifiedDefinition();
+            return getString();
         }
     }
 
     /**
      * @see ValueConstraint#check(QValue)
      */
-    void check(QValue value) throws ConstraintViolationException, RepositoryException {
+    public void check(QValue value) throws ConstraintViolationException, RepositoryException {
         if (value == null) {
-            throw new ConstraintViolationException("null value does not satisfy the constraint '" + getQualifiedDefinition() + "'");
+            throw new ConstraintViolationException("null value does not satisfy the constraint '" + getString() + "'");
         }
         switch (value.getType()) {
             case PropertyType.PATH:
@@ -134,20 +135,20 @@
                         if (!p0.isAncestorOf(p1)) {
                             throw new ConstraintViolationException(p
                                 + " does not satisfy the constraint '"
-                                + getQualifiedDefinition() + "'");
+                                + getString() + "'");
                         }
                     } catch (RepositoryException e) {
                         // can't compare relative with absolute path
                         throw new ConstraintViolationException(p
                             + " does not satisfy the constraint '"
-                            + getQualifiedDefinition() + "'");
+                            + getString() + "'");
                     }
                 } else {
                     // exact match required
                     if (!p0.equals(p1)) {
                         throw new ConstraintViolationException(p
                             + " does not satisfy the constraint '"
-                            + getQualifiedDefinition() + "'");
+                            + getString() + "'");
                     }
                 }
                 return;

Modified: jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/constraint/ReferenceConstraint.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/constraint/ReferenceConstraint.java?rev=785777&r1=785776&r2=785777&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/constraint/ReferenceConstraint.java (original)
+++ jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/constraint/ReferenceConstraint.java Wed Jun 17 20:21:54 2009
@@ -67,23 +67,23 @@
      * qualified <code>Name</code> into a JCR name.
      *
      * @see ValueConstraint#getDefinition(NamePathResolver)
-     * @param resolver
+     * @param resolver name-path resolver
      */
     public String getDefinition(NamePathResolver resolver) {
         try {
             return resolver.getJCRName(ntName);
         } catch (NamespaceException e) {
             // should never get here, return raw definition as fallback
-            return getQualifiedDefinition();
+            return getString();
         }
     }
 
     /**
      * @see ValueConstraint#check(QValue)
      */
-    void check(QValue value) throws ConstraintViolationException, RepositoryException {
+    public void check(QValue value) throws ConstraintViolationException, RepositoryException {
         if (value == null) {
-            throw new ConstraintViolationException("Null value does not satisfy the constraint '" + getQualifiedDefinition() + "'");
+            throw new ConstraintViolationException("Null value does not satisfy the constraint '" + getString() + "'");
         }
         switch (value.getType()) {
             case PropertyType.REFERENCE:

Modified: jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/constraint/StringConstraint.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/constraint/StringConstraint.java?rev=785777&r1=785776&r2=785777&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/constraint/StringConstraint.java (original)
+++ jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/constraint/StringConstraint.java Wed Jun 17 20:21:54 2009
@@ -50,9 +50,9 @@
     /**
      * @see ValueConstraint#check(QValue)
      */
-    void check(QValue value) throws ConstraintViolationException, RepositoryException {
+    public void check(QValue value) throws ConstraintViolationException, RepositoryException {
         if (value == null) {
-            throw new ConstraintViolationException("null value does not satisfy the constraint '" + getQualifiedDefinition() + "'");
+            throw new ConstraintViolationException("null value does not satisfy the constraint '" + getString() + "'");
         }
         switch (value.getType()) {
             case PropertyType.STRING:
@@ -60,7 +60,7 @@
                 String text = value.getString();
                 Matcher matcher = pattern.matcher(text);
                 if (!matcher.matches()) {
-                    throw new ConstraintViolationException("'" + text  + "' does not satisfy the constraint '" + getQualifiedDefinition() + "'");
+                    throw new ConstraintViolationException("'" + text  + "' does not satisfy the constraint '" + getString() + "'");
                 }
                 return;
 

Modified: jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/constraint/ValueConstraint.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/constraint/ValueConstraint.java?rev=785777&r1=785776&r2=785777&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/constraint/ValueConstraint.java (original)
+++ jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/constraint/ValueConstraint.java Wed Jun 17 20:21:54 2009
@@ -24,6 +24,7 @@
 import org.apache.jackrabbit.spi.NameFactory;
 import org.apache.jackrabbit.spi.QPropertyDefinition;
 import org.apache.jackrabbit.spi.QValue;
+import org.apache.jackrabbit.spi.QValueConstraint;
 import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver;
 import org.apache.jackrabbit.spi.commons.name.NameFactoryImpl;
 import org.apache.jackrabbit.spi.commons.nodetype.InvalidConstraintException;
@@ -35,7 +36,7 @@
  * syntax of a value constraint and to test if a specific value satisfies
  * it.
  */
-public abstract class ValueConstraint {
+public abstract class ValueConstraint implements QValueConstraint {
 
     protected static Logger log = LoggerFactory.getLogger(ValueConstraint.class);
 
@@ -52,7 +53,7 @@
 
     /**
      * For constraints that are not namespace prefix mapping sensitive this
-     * method returns the same result as <code>{@link #getQualifiedDefinition()}</code>.
+     * method returns the same result as <code>{@link #getString()}</code>.
      * <p/>
      * Those that are namespace prefix mapping sensitive (e.g.
      * <code>NameConstraint</code>, <code>PathConstraint</code> and
@@ -63,8 +64,8 @@
      * and path elements resolved.
      *
      * @return the definition of this constraint.
-     * @see #getQualifiedDefinition()
-     * @param resolver
+     * @see #getString ()
+     * @param resolver name-path resolver
      */
     public String getDefinition(NamePathResolver resolver) {
         return qualifiedDefinition;
@@ -73,14 +74,21 @@
     /**
      * By default the qualified definition is the same as the JCR definition.
      *
-     * @return the qualified definition String
-     * @see #getDefinition(NamePathResolver)
+     * @return the internal definition String
      */
-    public String getQualifiedDefinition() {
+    public String getString() {
         return qualifiedDefinition;
     }
 
     /**
+     * Same as {@link #getString()}
+     * @return the internal definition String
+     */
+    public String toString() {
+        return getString();
+    }
+
+    /**
      * Check if the specified value matches the this constraint.
      *
      * @param value The value to be tested.
@@ -88,17 +96,13 @@
      * <code>null</code> or does not matches the constraint.
      * @throws RepositoryException If another error occurs.
      */
-    abstract void check(QValue value) throws ConstraintViolationException, RepositoryException;
+    public abstract void check(QValue value) throws ConstraintViolationException, RepositoryException;
 
     //---------------------------------------------------< java.lang.Object >---
     public boolean equals(Object other) {
-        if (other == this) {
-            return true;
-        } else if (other instanceof ValueConstraint) {
-            return qualifiedDefinition.equals(((ValueConstraint) other).qualifiedDefinition);
-        } else {
-            return false;
-        }
+        return other == this
+                || other instanceof ValueConstraint
+                && qualifiedDefinition.equals(((ValueConstraint) other).qualifiedDefinition);
     }
 
     /**
@@ -117,10 +121,10 @@
      * Note, that the definition must be in the qualified format in case the type
      * indicates {@link PropertyType#NAME}, {@link PropertyType#PATH} or {@link PropertyType#REFERENCE}
      *
-     * @param type
-     * @param qualifiedDefinition
-     * @return
-     * @throws InvalidConstraintException
+     * @param type required type
+     * @param qualifiedDefinition internal definition string
+     * @return a new value constraint
+     * @throws InvalidConstraintException if the constraint is not valid
      */
     public static ValueConstraint create(int type, String qualifiedDefinition)
         throws InvalidConstraintException {
@@ -128,7 +132,7 @@
             throw new IllegalArgumentException("illegal definition (null)");
         }
         switch (type) {
-            // constraints which are not qName senstive
+            // constraints which are not qName sensitive
             case PropertyType.STRING:
             case PropertyType.URI:
                 return new StringConstraint(qualifiedDefinition);
@@ -165,12 +169,55 @@
     }
 
     /**
+     * Create a new <code>ValueConstraint</code> array from the String representation.
+     * Note, that the definition must be in the qualified format in case the type
+     * indicates {@link PropertyType#NAME}, {@link PropertyType#PATH} or {@link PropertyType#REFERENCE}
+     *
+     * @param type the required type
+     * @param qualifiedDefinition internal definition strings
+     * @return the array of constraints
+     * @throws InvalidConstraintException if one of the constraints is invalid
+     */
+    public static ValueConstraint[] create(int type, String[] qualifiedDefinition)
+            throws InvalidConstraintException {
+        if (qualifiedDefinition == null || qualifiedDefinition.length == 0) {
+            return ValueConstraint.EMPTY_ARRAY;
+        }
+        ValueConstraint[] ret = new ValueConstraint[qualifiedDefinition.length];
+        for (int i=0; i<ret.length; i++) {
+            ret[i] = ValueConstraint.create(type, qualifiedDefinition[i]);
+        }
+        return ret;
+    }
+
+    /**
+     * Create a new <code>ValueConstraint</code> array from the JCR representation.
+     *
+     * @param type the required type
+     * @param definition definition strings
+     * @param resolver name-path resolver
+     * @return the array of constraints
+     * @throws InvalidConstraintException if one of the constraints is invalid
+     */
+    public static ValueConstraint[] create(int type, String definition[], NamePathResolver resolver)
+            throws InvalidConstraintException {
+        if (definition == null || definition.length == 0) {
+            return ValueConstraint.EMPTY_ARRAY;
+        }
+        ValueConstraint[] ret = new ValueConstraint[definition.length];
+        for (int i=0; i<ret.length; i++) {
+            ret[i] = ValueConstraint.create(type, definition[i], resolver);
+        }
+        return ret;
+    }
+
+    /**
      *
-     * @param type
-     * @param definition
-     * @param resolver
-     * @return
-     * @throws InvalidConstraintException
+     * @param type required type
+     * @param definition JCR definition
+     * @param resolver name-path resolver
+     * @return a new value constraint
+     * @throws InvalidConstraintException if the constraint is invalid
      */
     public static ValueConstraint create(int type, String definition,
                                          NamePathResolver resolver)
@@ -220,9 +267,9 @@
      * 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
+     * @param pd propert definition
+     * @param values values to check
+     * @throws ConstraintViolationException if the constraints are violated
      */
     public static void checkValueConstraints(QPropertyDefinition pd, QValue[] values)
             throws ConstraintViolationException, RepositoryException {
@@ -231,21 +278,20 @@
             throw new ConstraintViolationException("the property is not multi-valued");
         }
 
-        String[] constraints = pd.getValueConstraints();
+        QValueConstraint[] constraints = pd.getValueConstraints();
         if (constraints == null || constraints.length == 0) {
             // no constraints to check
             return;
         }
         if (values != null && values.length > 0) {
             // check value constraints on every value
-            for (int i = 0; i < values.length; i++) {
+            for (QValue value : values) {
                 // constraints are OR-ed together
                 boolean satisfied = false;
                 ConstraintViolationException cve = null;
                 for (int j = 0; j < constraints.length && !satisfied; j++) {
                     try {
-                        ValueConstraint cnstr = ValueConstraint.create(pd.getRequiredType(), constraints[j]);
-                        cnstr.check(values[i]);
+                        constraints[j].check(value);
                         satisfied = true;
                     } catch (ConstraintViolationException e) {
                         cve = e;

Modified: jackrabbit/trunk/jackrabbit-spi-commons/src/test/java/org/apache/jackrabbit/spi/commons/nodetype/compact/CompactNodeTypeDefTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi-commons/src/test/java/org/apache/jackrabbit/spi/commons/nodetype/compact/CompactNodeTypeDefTest.java?rev=785777&r1=785776&r2=785777&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi-commons/src/test/java/org/apache/jackrabbit/spi/commons/nodetype/compact/CompactNodeTypeDefTest.java (original)
+++ jackrabbit/trunk/jackrabbit-spi-commons/src/test/java/org/apache/jackrabbit/spi/commons/nodetype/compact/CompactNodeTypeDefTest.java Wed Jun 17 20:21:54 2009
@@ -23,17 +23,13 @@
 import java.io.StringWriter;
 import java.util.List;
 
-import junit.framework.TestCase;
-
 import org.apache.jackrabbit.spi.QNodeTypeDefinition;
 import org.apache.jackrabbit.spi.commons.conversion.DefaultNamePathResolver;
 import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver;
 import org.apache.jackrabbit.spi.commons.namespace.NamespaceMapping;
 import org.apache.jackrabbit.spi.commons.nodetype.NodeTypeDefDiff;
-import org.apache.jackrabbit.spi.commons.value.ValueFactoryQImpl;
-import org.apache.jackrabbit.spi.commons.value.QValueFactoryImpl;
 
-import javax.jcr.ValueFactory;
+import junit.framework.TestCase;
 
 public class CompactNodeTypeDefTest extends TestCase {
 
@@ -43,30 +39,27 @@
 
         // Read in node type def from test file
         Reader reader = new InputStreamReader(getClass().getClassLoader().getResourceAsStream(TEST_FILE));
-        CompactNodeTypeDefReader cndReader = new CompactNodeTypeDefReader(reader, TEST_FILE,
-                new QNodeTypeDefinitionsBuilderImpl());
+        CompactNodeTypeDefReader cndReader = new CompactNodeTypeDefReader(reader, TEST_FILE);
 
-        List ntdList1 = cndReader.getNodeTypeDefs();
+        List<QNodeTypeDefinition> ntdList1 = cndReader.getNodeTypeDefinitions();
         NamespaceMapping nsm = cndReader.getNamespaceMapping();
         NamePathResolver resolver = new DefaultNamePathResolver(nsm);
 
         // Put imported node type def back into CND form with CND writer
         StringWriter sw = new StringWriter();
-        ValueFactory vf = new ValueFactoryQImpl(QValueFactoryImpl.getInstance(), resolver);
-        CompactNodeTypeDefWriter.write(ntdList1, nsm, resolver, vf, sw);
+        CompactNodeTypeDefWriter.write(ntdList1, nsm, resolver, sw);
 
         // Rerun the reader on the product of the writer
-        cndReader = new CompactNodeTypeDefReader(new StringReader(sw.toString()), TEST_FILE,
-                new QNodeTypeDefinitionsBuilderImpl());
+        cndReader = new CompactNodeTypeDefReader(new StringReader(sw.toString()), TEST_FILE);
 
-        List ntdList2 = cndReader.getNodeTypeDefs();
+        List<QNodeTypeDefinition> ntdList2 = cndReader.getNodeTypeDefinitions();
 
         if (ntdList1.size() == 0 || ntdList1.size() != ntdList2.size()) {
             fail("Exported node type definition was not successfully read back in");
         } else {
             for(int k = 0; k < ntdList1.size(); k++) {
-                QNodeTypeDefinition ntd1 = (QNodeTypeDefinition) ntdList1.get(k);
-                QNodeTypeDefinition ntd2 = (QNodeTypeDefinition) ntdList2.get(k);
+                QNodeTypeDefinition ntd1 = ntdList1.get(k);
+                QNodeTypeDefinition ntd2 = ntdList2.get(k);
 
                 NodeTypeDefDiff diff = NodeTypeDefDiff.create(ntd1, ntd2);
                 if (diff.isModified() && !diff.isTrivial()){

Modified: jackrabbit/trunk/jackrabbit-spi-commons/src/test/java/org/apache/jackrabbit/spi/commons/nodetype/constraint/ValueConstraintTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi-commons/src/test/java/org/apache/jackrabbit/spi/commons/nodetype/constraint/ValueConstraintTest.java?rev=785777&r1=785776&r2=785777&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi-commons/src/test/java/org/apache/jackrabbit/spi/commons/nodetype/constraint/ValueConstraintTest.java (original)
+++ jackrabbit/trunk/jackrabbit-spi-commons/src/test/java/org/apache/jackrabbit/spi/commons/nodetype/constraint/ValueConstraintTest.java Wed Jun 17 20:21:54 2009
@@ -98,7 +98,7 @@
         String[] qDefs = getQualifiedDefinitions();
         for (int i = 0; i < qDefs.length; i++) {
             ValueConstraint vc = createValueConstraint(qDefs[i]);
-            assertEquals(qDefs[i], vc.getQualifiedDefinition());
+            assertEquals(qDefs[i], vc.getString());
         }
     }
 
@@ -128,7 +128,7 @@
         String[] qDefs = getQualifiedDefinitions();
         for (int i = 0; i < qDefs.length; i++) {
             ValueConstraint vc = createValueConstraint(qDefs[i]);
-            assertNotNull(vc.getQualifiedDefinition());
+            assertNotNull(vc.getString());
         }
     }
 
@@ -185,7 +185,7 @@
             ValueConstraint vc2 = createValueConstraint(qDefs[i]);
             assertEquals(vc, vc2);
 
-            vc2 = createValueConstraint(vc.getQualifiedDefinition());
+            vc2 = createValueConstraint(vc.getString());
             assertEquals(vc, vc2);
         }
     }

Modified: jackrabbit/trunk/jackrabbit-spi-commons/src/test/resources/cnd-reader-test-input.cnd
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi-commons/src/test/resources/cnd-reader-test-input.cnd?rev=785777&r1=785776&r2=785777&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi-commons/src/test/resources/cnd-reader-test-input.cnd (original)
+++ jackrabbit/trunk/jackrabbit-spi-commons/src/test/resources/cnd-reader-test-input.cnd Wed Jun 17 20:21:54 2009
@@ -44,6 +44,32 @@
 [ex:Path]
   - ex:path (path) < 'ex:a/ex:b'  
 
+[ex:Full] > ex:NodeType
+  orderable mixin abstract primaryitem ex:p1 noquery
+  - ex:p1 (STRING) mandatory protected autocreated multiple
+  - ex:p2 (BINARY) queryops '=, <>, <, <=, >, >=, LIKE'
+  - ex:p3 (LONG) nofulltext noqueryorder
+  - ex:p4 (DOUBLE)
+  - ex:p5 (BOOLEAN)
+  - ex:p6 (NAME)
+  - ex:p8 (PATH)
+  - ex:p9 (REFERENCE)
+  - ex:pa (WEAKREFERENCE)
+  - ex:pb (DECIMAL)
+  - ex:pc (URI)
+  - ex:pd (UNDEFINED)
+  - ex:pf (*)
+  + ex:n1 (ex:NodeType) COPY
+  + ex:n2 (ex:NodeType) VERSION
+  + ex:n3 (ex:NodeType) INITIALIZE
+  + ex:n4 (ex:NodeType) COMPUTE
+  + ex:n5 (ex:NodeType) IGNORE
+  + ex:n6 (ex:NodeType) ABORT
+
+[ex:Full1] > ex:NodeType
+  orderable mixin abstract primaryitem ex:p1 query
+  - ex:p1
+
 //------------------------------------------------------------------------------
 // B A S E  T Y P E S
 //------------------------------------------------------------------------------

Modified: jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/QPropertyDefinition.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/QPropertyDefinition.java?rev=785777&r1=785776&r2=785777&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/QPropertyDefinition.java (original)
+++ jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/QPropertyDefinition.java Wed Jun 17 20:21:54 2009
@@ -45,7 +45,7 @@
      *
      * @return the array of value constraints.
      */
-    public String[] getValueConstraints();
+    public QValueConstraint[] getValueConstraints();
 
     /**
      * Returns the array of default values or <code>null</code> if no default
@@ -68,7 +68,7 @@
      * @return the availabe query operators.
      * @since JCR 2.0
      */
-    public Name[] getAvailableQueryOperators();
+    public String[] getAvailableQueryOperators();
 
     /**
      * Reports whether this property definition is full text searchable.

Added: jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/QValueConstraint.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/QValueConstraint.java?rev=785777&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/QValueConstraint.java (added)
+++ jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/QValueConstraint.java Wed Jun 17 20:21:54 2009
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.spi;
+
+import javax.jcr.nodetype.ConstraintViolationException;
+import javax.jcr.nodetype.PropertyDefinition;
+import javax.jcr.RepositoryException;
+
+/**
+ * <code>QValueConstraint</code> is used to check the syntax of a value
+ * constraint and to test if a specific value satisfies it.
+ *
+ * @see PropertyDefinition#getValueConstraints()
+ */
+public interface QValueConstraint {
+
+    /**
+     * Empty array of <code>QValueConstraint</code>.
+     */
+    public static final QValueConstraint[] EMPTY_ARRAY = new QValueConstraint[0];
+
+    /**
+     * Check if the specified value matches this constraint.
+     *
+     * @param value The value to be tested.
+     * @throws ConstraintViolationException If the specified value is
+     * <code>null</code> or does not matches the constraint.
+     * @throws RepositoryException If another error occurs.
+     */
+    void check(QValue value) throws ConstraintViolationException, RepositoryException;
+
+    /**
+     * For constraints that are not namespace prefix mapping sensitive this
+     * method returns the same defined in
+     * <code>{@link PropertyDefinition#getValueConstraints()}</code>.
+     * <p/>
+     * Those that are namespace prefix mapping sensitive (e.g.
+     * <code>NameConstraint</code>, <code>PathConstraint</code> and
+     * <code>ReferenceConstraint</code>) return an internal string.
+     *
+     * @return the internal definition String
+     */
+    String getString();
+
+}
\ No newline at end of file

Propchange: jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/QValueConstraint.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/QValueConstraint.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev Url

Modified: jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/QNodeTypeDefinitionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/QNodeTypeDefinitionImpl.java?rev=785777&r1=785776&r2=785777&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/QNodeTypeDefinitionImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/QNodeTypeDefinitionImpl.java Wed Jun 17 20:21:54 2009
@@ -29,6 +29,7 @@
 import org.apache.jackrabbit.spi.QNodeDefinition;
 import org.apache.jackrabbit.spi.QValueFactory;
 import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.QValueConstraint;
 import org.slf4j.LoggerFactory;
 import org.slf4j.Logger;
 
@@ -243,11 +244,11 @@
                 // [WEAK]REFERENCE value constraints
                 if (propDefs[i].getRequiredType() == PropertyType.REFERENCE
                         || propDefs[i].getRequiredType() == PropertyType.WEAKREFERENCE) {
-                    String[] ca = propDefs[i].getValueConstraints();
+                    QValueConstraint[] ca = propDefs[i].getValueConstraints();
                     if (ca != null) {
                         for (int j = 0; j < ca.length; j++) {
                             // TODO: don't rely on a specific factory
-                            Name ntName = NameFactoryImpl.getInstance().create(ca[j]);
+                            Name ntName = NameFactoryImpl.getInstance().create(ca[j].getString());
                             if (!name.equals(ntName)) {
                                 dependencies.add(ntName);
                             }

Modified: jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/QPropertyDefinitionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/QPropertyDefinitionImpl.java?rev=785777&r1=785776&r2=785777&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/QPropertyDefinitionImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/QPropertyDefinitionImpl.java Wed Jun 17 20:21:54 2009
@@ -21,8 +21,10 @@
 import org.apache.jackrabbit.spi.QPropertyDefinition;
 import org.apache.jackrabbit.spi.QValue;
 import org.apache.jackrabbit.spi.QValueFactory;
+import org.apache.jackrabbit.spi.QValueConstraint;
 import org.apache.jackrabbit.spi.commons.value.ValueFactoryQImpl;
 import org.apache.jackrabbit.spi.commons.value.ValueFormat;
+import org.apache.jackrabbit.spi.commons.nodetype.constraint.ValueConstraint;
 import org.apache.jackrabbit.webdav.xml.DomUtil;
 import org.apache.jackrabbit.webdav.xml.ElementIterator;
 import org.w3c.dom.Element;
@@ -50,7 +52,7 @@
     /**
      * The value constraints.
      */
-    private final String[] valueConstraints;
+    private final QValueConstraint[] valueConstraints;
 
     /**
      * The default values.
@@ -62,7 +64,7 @@
      */
     private final boolean multiple;
 
-    private final Name[] availableQueryOperators;
+    private final String[] availableQueryOperators;
     private final boolean fullTextSearcheable;
     private final boolean queryOrderable;
 
@@ -126,37 +128,31 @@
 
         child = DomUtil.getChildElement(pdefElement, VALUECONSTRAINTS_ELEMENT, null);
         if (child == null) {
-            valueConstraints = new String[0];
+            valueConstraints = QValueConstraint.EMPTY_ARRAY;
         } else {
-            List vc = new ArrayList();
+            List<QValueConstraint> vc = new ArrayList<QValueConstraint>();
             ElementIterator it = DomUtil.getChildren(child, VALUECONSTRAINT_ELEMENT, null);
             while (it.hasNext()) {
-                int constType = (requiredType == PropertyType.REFERENCE
-                        || requiredType == PropertyType.WEAKREFERENCE) ?  PropertyType.NAME : requiredType;
                 String qValue = DomUtil.getText(it.nextElement());
                 // in case of name and path constraint, the value must be
                 // converted to SPI values
                 // TODO: tobefixed. path-constraint may contain trailing *
-                if (constType == PropertyType.NAME || constType == PropertyType.PATH) {
-                   qValue = ValueFormat.getQValue(qValue, constType, resolver, qValueFactory).getString();
-                }
-                vc.add(qValue);
+                vc.add(ValueConstraint.create(requiredType, qValue));
             }
-            valueConstraints = (String[]) vc.toArray(new String[vc.size()]);
+            valueConstraints = vc.toArray(new QValueConstraint[vc.size()]);
         }
 
         child = DomUtil.getChildElement(pdefElement, AVAILABLE_QUERY_OPERATORS_ELEMENT, null);
         if (child == null) {
-            availableQueryOperators = new Name[0];
+            availableQueryOperators = new String[0];
         } else {
-            List names = new ArrayList();
+            List<String> names = new ArrayList<String>();
             ElementIterator it = DomUtil.getChildren(child, AVAILABLE_QUERY_OPERATOR_ELEMENT, null);
             while (it.hasNext()) {
                 String str = DomUtil.getText(it.nextElement());
-                Name n = resolver.getQName(str);
-                names.add(n);
+                names.add(str);
             }
-            availableQueryOperators = (Name[]) names.toArray(new Name[names.size()]);
+            availableQueryOperators = names.toArray(new String[names.size()]);
         }
     }
     
@@ -171,7 +167,7 @@
     /**
      * {@inheritDoc}
      */
-    public String[] getValueConstraints() {
+    public QValueConstraint[] getValueConstraints() {
         return valueConstraints;
     }
 
@@ -192,7 +188,7 @@
     /**
      * {@inheritDoc}
      */
-    public Name[] getAvailableQueryOperators() {
+    public String[] getAvailableQueryOperators() {
         return availableQueryOperators;
     }
 

Modified: jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/QPropertyDefinitionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/QPropertyDefinitionImpl.java?rev=785777&r1=785776&r2=785777&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/QPropertyDefinitionImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/QPropertyDefinitionImpl.java Wed Jun 17 20:21:54 2009
@@ -19,10 +19,12 @@
 import org.apache.jackrabbit.spi.QValue;
 import org.apache.jackrabbit.spi.QValueFactory;
 import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.QValueConstraint;
 import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver;
 import org.apache.jackrabbit.spi.commons.conversion.NameException;
 import org.apache.jackrabbit.spi.commons.conversion.IllegalNameException;
 import org.apache.jackrabbit.spi.commons.value.ValueFormat;
+import org.apache.jackrabbit.spi.commons.nodetype.constraint.ValueConstraint;
 
 import javax.jcr.nodetype.PropertyDefinition;
 import javax.jcr.RepositoryException;
@@ -53,13 +55,17 @@
             throws RepositoryException, NameException {
         super(propDef.getName().equals(ANY_NAME.getLocalName()) ? ANY_NAME : resolver.getQName(propDef.getName()),
                 resolver.getQName(propDef.getDeclaringNodeType().getName()),
-                propDef.isAutoCreated(), propDef.isMandatory(),
-                propDef.getOnParentVersion(), propDef.isProtected(),
+                propDef.isAutoCreated(),
+                propDef.isMandatory(),
+                propDef.getOnParentVersion(),
+                propDef.isProtected(),
                 convertValues(propDef.getDefaultValues(), resolver, qValueFactory),
-                propDef.isMultiple(), propDef.getRequiredType(),
-                convertConstraints(propDef.getValueConstraints(), resolver, qValueFactory, propDef.getRequiredType()),
-                convertQueryOperators(propDef.getAvailableQueryOperators(), resolver),
-                propDef.isFullTextSearchable(), propDef.isQueryOrderable());
+                propDef.isMultiple(),
+                propDef.getRequiredType(),
+                ValueConstraint.create(propDef.getRequiredType(), propDef.getValueConstraints(), resolver),
+                propDef.getAvailableQueryOperators(),
+                propDef.isFullTextSearchable(),
+                propDef.isQueryOrderable());
     }
 
     /**
@@ -87,37 +93,6 @@
     }
 
     /**
-     * Makes sure name and path constraints are parsed correctly using the
-     * namespace resolver.
-     *
-     * @param constraints  the constraint strings from the JCR property
-     *                     definition.
-     * @param resolver
-     * @param factory      the QValueFactory.
-     * @param requiredType the required type of the property definition.
-     * @return SPI formatted constraint strings.
-     * @throws RepositoryException if an error occurs while converting the
-     *                             constraint strings.
-     */
-    private static String[] convertConstraints(String[] constraints,
-                                               NamePathResolver resolver,
-                                               QValueFactory factory,
-                                               int requiredType)
-            throws RepositoryException {
-        if (requiredType == PropertyType.REFERENCE
-                || requiredType == PropertyType.WEAKREFERENCE
-                || requiredType == PropertyType.NAME
-                || requiredType == PropertyType.PATH) {
-            int type = ((requiredType == PropertyType.REFERENCE || requiredType == PropertyType.WEAKREFERENCE) ? PropertyType.NAME : requiredType);
-            for (int i = 0; i < constraints.length; i++) {
-                constraints[i] = ValueFormat.getQValue(
-                        constraints[i], type, resolver, factory).getString();
-            }
-        }
-        return constraints;
-    }
-
-    /**
      * Convert String jcr names to Name objects.
      *
      * @param aqos