You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by mr...@apache.org on 2009/06/12 15:40:05 UTC

svn commit: r784117 - in /jackrabbit/trunk: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/constraint/LengthOperand.java jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/query/qom/LengthTest.java

Author: mreutegg
Date: Fri Jun 12 13:40:05 2009
New Revision: 784117

URL: http://svn.apache.org/viewvc?rev=784117&view=rev
Log:
JCR-2085: test case (TCK) maintenance for JCR 2.0
- length tests for DECIMAL, URI and WEAKREFERENCE

Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/constraint/LengthOperand.java
    jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/query/qom/LengthTest.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/constraint/LengthOperand.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/constraint/LengthOperand.java?rev=784117&r1=784116&r2=784117&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/constraint/LengthOperand.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/constraint/LengthOperand.java Fri Jun 12 13:40:05 2009
@@ -19,12 +19,15 @@
 import java.io.IOException;
 
 import javax.jcr.Value;
-import javax.jcr.ValueFactory;
+import javax.jcr.PropertyType;
+import javax.jcr.RepositoryException;
 
 import org.apache.jackrabbit.core.query.lucene.ScoreNode;
 import org.apache.jackrabbit.core.query.lucene.Util;
 import org.apache.jackrabbit.core.state.PropertyState;
 import org.apache.jackrabbit.core.value.InternalValue;
+import org.apache.jackrabbit.core.value.ValueFactoryImpl;
+import org.apache.jackrabbit.spi.QValueFactory;
 
 /**
  * <code>LengthOperand</code> implements a length operand.
@@ -55,11 +58,25 @@
         if (ps == null) {
             return EMPTY;
         } else {
-            ValueFactory vf = context.getSession().getValueFactory();
+            ValueFactoryImpl vf = (ValueFactoryImpl) context.getSession().getValueFactory();
+            QValueFactory qvf = vf.getQValueFactory();
             InternalValue[] values = ps.getValues();
             Value[] lengths = new Value[values.length];
             for (int i = 0; i < lengths.length; i++) {
-                lengths[i] = vf.createValue(Util.getLength(values[i]));
+                long len;
+                int type = values[i].getType();
+                try {
+                    if (type == PropertyType.NAME) {
+                        len = vf.createValue(qvf.create(values[i].getName())).getString().length();
+                    } else if (type == PropertyType.PATH) {
+                        len = vf.createValue(qvf.create(values[i].getPath())).getString().length();
+                    } else {
+                        len = Util.getLength(values[i]);
+                    }
+                } catch (RepositoryException e) {
+                    throw Util.createIOException(e);
+                }
+                lengths[i] = vf.createValue(len);
             }
             return lengths;
         }

Modified: jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/query/qom/LengthTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/query/qom/LengthTest.java?rev=784117&r1=784116&r2=784117&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/query/qom/LengthTest.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/query/qom/LengthTest.java Fri Jun 12 13:40:05 2009
@@ -23,13 +23,14 @@
 import javax.jcr.Value;
 import javax.jcr.ValueFactory;
 import javax.jcr.PropertyType;
+import javax.jcr.Binary;
 import javax.jcr.query.QueryResult;
 import javax.jcr.query.InvalidQueryException;
 import javax.jcr.query.qom.QueryObjectModelConstants;
 
 import java.io.ByteArrayInputStream;
-import java.io.InputStream;
 import java.util.Calendar;
+import java.math.BigDecimal;
 
 /**
  * <code>LengthTest</code> performs tests with the Query Object Model length
@@ -44,7 +45,7 @@
     protected void setUp() throws Exception {
         super.setUp();
         node = testRootNode.addNode(nodeName1, testNodeType);
-        testRootNode.save();
+        superuser.save();
         vf = superuser.getValueFactory();
     }
 
@@ -56,80 +57,104 @@
 
     public void testStringLength() throws RepositoryException {
         node.setProperty(propertyName1, "abc");
-        node.save();
+        superuser.save();
         checkOperators(propertyName1, node.getProperty(propertyName1).getLength());
     }
     
     public void testBinaryLength() throws RepositoryException {
         byte[] data = "abc".getBytes();
-        node.setProperty(propertyName1, new ByteArrayInputStream(data));
-        node.save();
+        Binary b = vf.createBinary(new ByteArrayInputStream(data));
+        try {
+            node.setProperty(propertyName1, b);
+        } finally {
+            b.dispose();
+        }
+        superuser.save();
         checkOperators(propertyName1, node.getProperty(propertyName1).getLength());
     }
 
     public void testLongLength() throws RepositoryException {
         node.setProperty(propertyName1, 123);
-        node.save();
+        superuser.save();
         checkOperators(propertyName1, node.getProperty(propertyName1).getLength());
     }
 
     public void testDoubleLength() throws RepositoryException {
         node.setProperty(propertyName1, Math.PI);
-        node.save();
+        superuser.save();
         checkOperators(propertyName1, node.getProperty(propertyName1).getLength());
     }
 
     public void testDateLength() throws RepositoryException {
         node.setProperty(propertyName1, Calendar.getInstance());
-        node.save();
+        superuser.save();
         checkOperators(propertyName1, node.getProperty(propertyName1).getLength());
     }
 
     public void testBooleanLength() throws RepositoryException {
         node.setProperty(propertyName1, false);
-        node.save();
+        superuser.save();
         checkOperators(propertyName1, node.getProperty(propertyName1).getLength());
     }
 
     public void testNameLength() throws RepositoryException {
-        // TODO
+        node.setProperty(propertyName1, vf.createValue(node.getName(), PropertyType.NAME));
+        superuser.save();
+        checkOperators(propertyName1, node.getProperty(propertyName1).getLength());
     }
 
     public void testPathLength() throws RepositoryException {
-        // TODO
+        node.setProperty(propertyName1, vf.createValue(node.getPath(), PropertyType.PATH));
+        superuser.save();
+        checkOperators(propertyName1, node.getProperty(propertyName1).getLength());
     }
 
     public void testReferenceLength() throws RepositoryException, NotExecutableException {
         try {
             if (!node.isNodeType(mixReferenceable)) {
                 node.addMixin(mixReferenceable);
-                node.save();
+                superuser.save();
             }
         } catch (RepositoryException e) {
             throw new NotExecutableException("Cannot add mix:referenceable to node");
         }
         node.setProperty(propertyName1, node);
-        node.save();
+        superuser.save();
         checkOperators(propertyName1, node.getProperty(propertyName1).getLength());
     }
 
-    public void testWeakReferenceLength() throws RepositoryException {
-        // TODO
+    public void testWeakReferenceLength()
+            throws RepositoryException, NotExecutableException {
+        try {
+            if (!node.isNodeType(mixReferenceable)) {
+                node.addMixin(mixReferenceable);
+                superuser.save();
+            }
+        } catch (RepositoryException e) {
+            throw new NotExecutableException("Cannot add mix:referenceable to node");
+        }
+        node.setProperty(propertyName1, vf.createValue(node, true));
+        superuser.save();
+        checkOperators(propertyName1, node.getProperty(propertyName1).getLength());
     }
 
     public void testURILength() throws RepositoryException {
-        // TODO
+        node.setProperty(propertyName1, vf.createValue("http://example.com", PropertyType.URI));
+        superuser.save();
+        checkOperators(propertyName1, node.getProperty(propertyName1).getLength());
     }
 
     public void testDecimalLength() throws RepositoryException {
-        // TODO
+        node.setProperty(propertyName1, new BigDecimal(123));
+        superuser.save();
+        checkOperators(propertyName1, node.getProperty(propertyName1).getLength());
     }
 
     //------------------------< conversion tests >------------------------------
 
     public void testLengthStringLiteral() throws RepositoryException {
         node.setProperty(propertyName1, "abc");
-        node.save();
+        superuser.save();
 
         String length = String.valueOf(node.getProperty(propertyName1).getLength());
         executeQuery(propertyName1, QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO, vf.createValue(length));
@@ -137,16 +162,21 @@
 
     public void testLengthBinaryLiteral() throws RepositoryException {
         node.setProperty(propertyName1, "abc");
-        node.save();
+        superuser.save();
 
         String length = String.valueOf(node.getProperty(propertyName1).getLength());
-        InputStream in = new ByteArrayInputStream(length.getBytes());
-        executeQuery(propertyName1, QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO, vf.createValue(in));
+        Binary b = vf.createBinary(new ByteArrayInputStream(length.getBytes()));
+        try {
+            executeQuery(propertyName1, QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO,
+                    vf.createValue(b));
+        } finally {
+            b.dispose();
+        }
     }
 
     public void testLengthDoubleLiteral() throws RepositoryException {
         node.setProperty(propertyName1, "abc");
-        node.save();
+        superuser.save();
 
         double length = node.getProperty(propertyName1).getLength();
         executeQuery(propertyName1, QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO, vf.createValue(length));
@@ -154,7 +184,7 @@
 
     public void testLengthDateLiteral() throws RepositoryException {
         node.setProperty(propertyName1, "abc");
-        node.save();
+        superuser.save();
 
         Calendar length = Calendar.getInstance();
         length.setTimeInMillis(node.getProperty(propertyName1).getLength());
@@ -194,7 +224,7 @@
         try {
             if (!node.isNodeType(mixReferenceable)) {
                 node.addMixin(mixReferenceable);
-                node.save();
+                superuser.save();
             }
         } catch (RepositoryException e) {
             throw new NotExecutableException("Cannot add mix:referenceable to node");
@@ -207,16 +237,39 @@
         }
     }
 
-    public void testLengthWeakReferenceLiteral() throws RepositoryException {
-        // TODO
+    public void testLengthWeakReferenceLiteral() throws RepositoryException, NotExecutableException {
+        try {
+            if (!node.isNodeType(mixReferenceable)) {
+                node.addMixin(mixReferenceable);
+                superuser.save();
+            }
+        } catch (RepositoryException e) {
+            throw new NotExecutableException("Cannot add mix:referenceable to node");
+        }
+        try {
+            executeQuery(propertyName1, QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO, vf.createValue(node, true));
+            fail("Reference literal cannot be converted to long");
+        } catch (InvalidQueryException e) {
+            // expected
+        }
     }
 
     public void testLengthURILiteral() throws RepositoryException {
-        // TODO
+        try {
+            executeQuery(propertyName1, QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO,
+                    vf.createValue(node.getPath(), PropertyType.URI));
+            fail("URI literal cannot be converted to long");
+        } catch (InvalidQueryException e) {
+            // expected
+        }
     }
 
     public void testLengthDecimalLiteral() throws RepositoryException {
-        // TODO
+        node.setProperty(propertyName1, "abc");
+        superuser.save();
+
+        BigDecimal length = new BigDecimal(node.getProperty(propertyName1).getLength());
+        executeQuery(propertyName1, QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO, vf.createValue(length));
     }
 
     //------------------------< internal helpers >------------------------------