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 2009/05/20 18:32:35 UTC

svn commit: r776757 - in /jackrabbit/trunk: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/value/ValueHelper.java

Author: stefan
Date: Wed May 20 16:32:35 2009
New Revision: 776757

URL: http://svn.apache.org/viewvc?rev=776757&view=rev
Log:
JCR-1609:  new Property Types (WIP...)
JCR-2061: References and Dereferencing of Property Values (WIP...)


Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java
    jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/value/ValueHelper.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java?rev=776757&r1=776756&r2=776757&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java Wed May 20 16:32:35 2009
@@ -4590,9 +4590,10 @@
         // check state of this instance
         sanityCheck();
 
+        // TODO tweak query implemention in order to support WEAKREFERENCE reverse lookup 
         try {
             Query q = session.getWorkspace().getQueryManager().createQuery(
-                    "//*[jcr:contains[., '" + data.getId() + "']",
+                    "//*[jcr:contains(., '" + data.getId() + "')]",
                     Query.XPATH);
             QueryResult result = q.execute();
             ArrayList l = new ArrayList<Property>();

Modified: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/value/ValueHelper.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/value/ValueHelper.java?rev=776757&r1=776756&r2=776757&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/value/ValueHelper.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/value/ValueHelper.java Wed May 20 16:32:35 2009
@@ -37,6 +37,7 @@
 import java.io.FilterInputStream;
 import java.io.OutputStream;
 import java.io.BufferedOutputStream;
+import java.net.URI;
 
 /**
  * The <code>ValueHelper</code> class provides several <code>Value</code>
@@ -245,7 +246,7 @@
     /**
      * Converts the given value to a value of the specified target type.
      * The conversion is performed according to the rules described in
-     * "6.2.6 Property Type Conversion" in the JSR 170 specification.
+     * "3.6.4 Property Type Conversion" in the JSR 283 specification.
      *
      * @param srcValue
      * @param targetType
@@ -336,6 +337,17 @@
                 }
                 break;
 
+            case PropertyType.DECIMAL:
+                // convert to DECIMAL
+                try {
+                    val = factory.createValue(srcValue.getDecimal());
+                } catch (RepositoryException re) {
+                    throw new ValueFormatException("conversion failed: "
+                            + PropertyType.nameFromValue(srcType) + " to "
+                            + PropertyType.nameFromValue(targetType), re);
+                }
+                break;
+
             case PropertyType.PATH:
                 // convert to PATH
                 switch (srcType) {
@@ -360,11 +372,35 @@
                         val = factory.createValue(path, targetType);
                         break;
 
+                    case PropertyType.URI:
+                        URI uri;
+                        try {
+                            uri = URI.create(srcValue.getString());
+                        } catch (RepositoryException re) {
+                            // should never happen
+                            throw new ValueFormatException("failed to convert source value to PATH value",
+                                    re);
+                        }
+                        if (uri.isAbsolute()) {
+                            // uri contains scheme...
+                            throw new ValueFormatException("failed to convert URI value to PATH value");
+                        }
+                        String p = uri.getPath();
+
+                        if (p.startsWith("./")) {
+                            p = p.substring(2);
+                        }
+
+                        val = factory.createValue(p, targetType);
+                        break;
+
                     case PropertyType.BOOLEAN:
                     case PropertyType.DATE:
                     case PropertyType.DOUBLE:
+                    case PropertyType.DECIMAL:
                     case PropertyType.LONG:
                     case PropertyType.REFERENCE:
+                    case PropertyType.WEAKREFERENCE:
                         throw new ValueFormatException("conversion failed: "
                                 + PropertyType.nameFromValue(srcType) + " to "
                                 + PropertyType.nameFromValue(targetType));
@@ -401,8 +437,10 @@
                     case PropertyType.BOOLEAN:
                     case PropertyType.DATE:
                     case PropertyType.DOUBLE:
+                    case PropertyType.DECIMAL:
                     case PropertyType.LONG:
                     case PropertyType.REFERENCE:
+                    case PropertyType.WEAKREFERENCE:
                         throw new ValueFormatException("conversion failed: "
                                 + PropertyType.nameFromValue(srcType) + " to "
                                 + PropertyType.nameFromValue(targetType));
@@ -422,6 +460,7 @@
 
                     case PropertyType.BINARY:
                     case PropertyType.STRING:
+                    case PropertyType.WEAKREFERENCE:
                         // try conversion via string
                         String uuid;
                         try {
@@ -438,6 +477,46 @@
                     case PropertyType.DATE:
                     case PropertyType.DOUBLE:
                     case PropertyType.LONG:
+                    case PropertyType.DECIMAL:
+                    case PropertyType.PATH:
+                    case PropertyType.NAME:
+                        throw new ValueFormatException("conversion failed: "
+                                + PropertyType.nameFromValue(srcType) + " to "
+                                + PropertyType.nameFromValue(targetType));
+
+                    default:
+                        throw new IllegalArgumentException("not a valid type constant: " + srcType);
+                }
+                break;
+
+            case PropertyType.WEAKREFERENCE:
+                // convert to WEAKREFERENCE
+                switch (srcType) {
+                    case PropertyType.WEAKREFERENCE:
+                        // no conversion needed, return original value
+                        // (redundant code, just here for the sake of clarity)
+                        return srcValue;
+
+                    case PropertyType.BINARY:
+                    case PropertyType.STRING:
+                    case PropertyType.REFERENCE:
+                        // try conversion via string
+                        String uuid;
+                        try {
+                            // get string value
+                            uuid = srcValue.getString();
+                        } catch (RepositoryException re) {
+                            // should never happen
+                            throw new ValueFormatException("failed to convert source value to WEAKREFERENCE value", re);
+                        }
+                        val = factory.createValue(uuid, targetType);
+                        break;
+
+                    case PropertyType.BOOLEAN:
+                    case PropertyType.DATE:
+                    case PropertyType.DOUBLE:
+                    case PropertyType.LONG:
+                    case PropertyType.DECIMAL:
                     case PropertyType.PATH:
                     case PropertyType.NAME:
                         throw new ValueFormatException("conversion failed: "
@@ -449,6 +528,73 @@
                 }
                 break;
 
+            case PropertyType.URI:
+                // convert to URI
+                switch (srcType) {
+                    case PropertyType.URI:
+                        // no conversion needed, return original value
+                        // (redundant code, just here for the sake of clarity)
+                        return srcValue;
+
+                    case PropertyType.BINARY:
+                    case PropertyType.STRING:
+                        // try conversion via string
+                        String uuid;
+                        try {
+                            // get string value
+                            uuid = srcValue.getString();
+                        } catch (RepositoryException re) {
+                            // should never happen
+                            throw new ValueFormatException("failed to convert source value to URI value", re);
+                        }
+                        val = factory.createValue(uuid, targetType);
+                        break;
+
+                    case PropertyType.NAME:
+                        String name;
+                        try {
+                            // get string value
+                            name = srcValue.getString();
+                        } catch (RepositoryException re) {
+                            // should never happen
+                            throw new ValueFormatException("failed to convert source value to URI value", re);
+                        }
+                        // prefix name with "./" (jsr 283 spec 3.6.4.8)
+                        val = factory.createValue("./" + name, targetType);
+                        break;
+
+                    case PropertyType.PATH:
+                        String path;
+                        try {
+                            // get string value
+                            path = srcValue.getString();
+                        } catch (RepositoryException re) {
+                            // should never happen
+                            throw new ValueFormatException("failed to convert source value to URI value", re);
+                        }
+                        if (!path.startsWith("/")) {
+                            // prefix non-absolute path with "./" (jsr 283 spec 3.6.4.9)
+                            path = "./" + path;
+                        }
+                        val = factory.createValue(path, targetType);
+                        break;
+
+                    case PropertyType.BOOLEAN:
+                    case PropertyType.DATE:
+                    case PropertyType.DOUBLE:
+                    case PropertyType.LONG:
+                    case PropertyType.DECIMAL:
+                    case PropertyType.REFERENCE:
+                    case PropertyType.WEAKREFERENCE:
+                        throw new ValueFormatException("conversion failed: "
+                                + PropertyType.nameFromValue(srcType) + " to "
+                                + PropertyType.nameFromValue(targetType));
+
+                    default:
+                        throw new IllegalArgumentException("not a valid type constant: " + srcType);
+                }
+                break;
+
             default:
                 throw new IllegalArgumentException("not a valid type constant: " + targetType);
         }