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/27 18:18:21 UTC

svn commit: r779228 - in /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core: ./ nodetype/ query/lucene/ query/lucene/constraint/

Author: stefan
Date: Wed May 27 16:18:21 2009
New Revision: 779228

URL: http://svn.apache.org/viewvc?rev=779228&view=rev
Log:
JCR-1609:  new Property Types (WIP...)



Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/PropertyImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeDef.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/ValueConstraint.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/NodeIndexer.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/Util.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/constraint/ConstraintBuilder.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java?rev=779228&r1=779227&r2=779228&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java Wed May 27 16:18:21 2009
@@ -506,12 +506,18 @@
                          * be checked)
                          */
                         if (constraints.length > 0
-                                && propDef.getRequiredType() == PropertyType.REFERENCE) {
+                                && (propDef.getRequiredType() == PropertyType.REFERENCE
+                                    || propDef.getRequiredType() == PropertyType.WEAKREFERENCE)) {
                             for (int i = 0; i < values.length; i++) {
                                 boolean satisfied = false;
                                 String constraintViolationMsg = null;
                                 try {
                                     UUID targetUUID = values[i].getUUID();
+                                    if (propDef.getRequiredType() == PropertyType.WEAKREFERENCE
+                                        && !itemMgr.itemExists(new NodeId(targetUUID))) {
+                                        // target of weakref doesn;t exist, skip
+                                        continue;
+                                    }
                                     Node targetNode = session.getNodeByUUID(targetUUID);
                                     /**
                                      * constraints are OR-ed, i.e. at least one
@@ -519,7 +525,7 @@
                                      */
                                     for (int j = 0; j < constraints.length; j++) {
                                         /**
-                                         * a REFERENCE value constraint specifies
+                                         * a [WEAK]REFERENCE value constraint specifies
                                          * the name of the required node type of
                                          * the target node
                                          */
@@ -547,7 +553,9 @@
                                     }
                                 } catch (RepositoryException re) {
                                     String msg = itemMgr.safeGetJCRPath(propId)
-                                            + ": failed to check REFERENCE value constraint";
+                                            + ": failed to check "
+                                            + ((propDef.getRequiredType() == PropertyType.REFERENCE) ? "REFERENCE" : "WEAKREFERENCE")
+                                            + " value constraint";
                                     log.debug(msg);
                                     throw new ConstraintViolationException(msg, re);
                                 }

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=779228&r1=779227&r2=779228&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 27 16:18:21 2009
@@ -4594,6 +4594,7 @@
         try {
             Query q = session.getWorkspace().getQueryManager().createQuery(
                     "//*[jcr:contains(., '" + data.getId() + "')]",
+                    //"//*[@*='" + data.getId() + "']",
                     Query.XPATH);
             QueryResult result = q.execute();
             ArrayList l = new ArrayList<Property>();

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/PropertyImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/PropertyImpl.java?rev=779228&r1=779227&r2=779228&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/PropertyImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/PropertyImpl.java Wed May 27 16:18:21 2009
@@ -557,19 +557,19 @@
     }
 
     public BigDecimal getDecimal() throws RepositoryException {
-        throw new UnsupportedRepositoryOperationException("JCR-1609");
+        return getValue().getDecimal();
     }
 
     public void setValue(BigDecimal value) throws RepositoryException {
-        throw new UnsupportedRepositoryOperationException("JCR-1609");
+        setValue(session.getValueFactory().createValue(value));
     }
 
     public Binary getBinary() throws RepositoryException {
-        throw new UnsupportedRepositoryOperationException("JCR-2056");
+        return getValue().getBinary();
     }
 
     public void setValue(Binary value) throws RepositoryException {
-        throw new UnsupportedRepositoryOperationException("JCR-2056");
+        setValue(session.getValueFactory().createValue(value));
     }
 
     public void setValue(Calendar value) throws RepositoryException {

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeDef.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeDef.java?rev=779228&r1=779227&r2=779228&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeDef.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeDef.java Wed May 27 16:18:21 2009
@@ -104,8 +104,9 @@
             // property definitions
             for (Iterator iter = propDefs.iterator(); iter.hasNext();) {
                 PropDef pd = (PropDef) iter.next();
-                // REFERENCE value constraints
-                if (pd.getRequiredType() == PropertyType.REFERENCE) {
+                // [WEAK]REFERENCE value constraints
+                if (pd.getRequiredType() == PropertyType.REFERENCE
+                        || pd.getRequiredType() == PropertyType.WEAKREFERENCE) {
                     ValueConstraint[] ca = pd.getValueConstraints();
                     if (ca != null) {
                         for (int j = 0; j < ca.length; j++) {

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java?rev=779228&r1=779227&r2=779228&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java Wed May 27 16:18:21 2009
@@ -1576,13 +1576,16 @@
                  * the specified node type must be registered, with one notable
                  * exception: the node type just being registered
                  */
-                if (pd.getRequiredType() == PropertyType.REFERENCE) {
+                if (pd.getRequiredType() == PropertyType.REFERENCE
+                        || pd.getRequiredType() == PropertyType.WEAKREFERENCE) {
                     for (int j = 0; j < constraints.length; j++) {
                         ReferenceConstraint rc = (ReferenceConstraint) constraints[j];
                         Name ntName = rc.getNodeTypeName();
                         if (!name.equals(ntName) && !ntdCache.containsKey(ntName)) {
                             String msg = "[" + name + "#" + pd.getName()
-                                    + "] invalid REFERENCE value constraint '"
+                                    + "] invalid "
+                                    + (pd.getRequiredType() == PropertyType.REFERENCE ? "REFERENCE" : "WEAKREFERENCE") 
+                                    + " value constraint '"
                                     + ntName + "' (unknown node type)";
                             log.debug(msg);
                             throw new InvalidNodeTypeDefException(msg);

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/ValueConstraint.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/ValueConstraint.java?rev=779228&r1=779227&r2=779228&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/ValueConstraint.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/ValueConstraint.java Wed May 27 16:18:21 2009
@@ -698,20 +698,24 @@
         }
         switch (value.getType()) {
             case PropertyType.REFERENCE:
-                // @todo check REFERENCE value constraint (requires a session)
+            case PropertyType.WEAKREFERENCE:
+                // @todo check [WEAK]REFERENCE value constraint (requires a session)
 /*
                 UUID targetUUID = (UUID) value.internalValue();
+                if (value.getType() == PropertyType.WEAKREFERENCE && !session.itemExists(new NodeId(targetUUID))) {
+                    return;
+                }
                 NodeImpl targetNode = (NodeImpl) session.getNodeByUUID(targetUUID.toString());
                 if (!targetNode.isNodeType(ntName)) {
                     throw new ConstraintViolationException("the node with uuid "
                             + targetUUID + " does not satisfy the constraint '" + definition + "'");
                 }
 */
-                log.info("validation of REFERENCE constraint is not yet implemented");
+                log.info("validation of [WEAK]REFERENCE constraint is not yet implemented");
                 return;
 
             default:
-                String msg = "REFERENCE constraint can not be applied to value of type: "
+                String msg = "[WEAK]REFERENCE constraint can not be applied to value of type: "
                         + PropertyType.nameFromValue(value.getType());
                 log.debug(msg);
                 throw new RepositoryException(msg);

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/NodeIndexer.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/NodeIndexer.java?rev=779228&r1=779227&r2=779228&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/NodeIndexer.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/NodeIndexer.java Wed May 27 16:18:21 2009
@@ -50,6 +50,7 @@
 import java.util.List;
 import java.util.ArrayList;
 import java.util.Date;
+import java.net.URI;
 
 /**
  * Creates a lucene <code>Document</code> object from a {@link javax.jcr.Node}.
@@ -321,7 +322,12 @@
                 break;
             case PropertyType.REFERENCE:
                 if (isIndexed(name)) {
-                    addReferenceValue(doc, fieldName, value.getUUID());
+                    addReferenceValue(doc, fieldName, value.getUUID(), false);
+                }
+                break;
+            case PropertyType.WEAKREFERENCE:
+                if (isIndexed(name)) {
+                    addReferenceValue(doc, fieldName, value.getUUID(), true);
                 }
                 break;
             case PropertyType.PATH:
@@ -329,6 +335,11 @@
                     addPathValue(doc, fieldName, value.getPath());
                 }
                 break;
+            case PropertyType.URI:
+                if (isIndexed(name)) {
+                    addURIValue(doc, fieldName, value.getURI());
+                }
+                break;
             case PropertyType.STRING:
                 if (isIndexed(name)) {
                     // never fulltext index jcr:uuid String
@@ -351,8 +362,11 @@
                     addNameValue(doc, fieldName, value.getQName());
                 }
                 break;
+            // TODO support indexing of BigDecimal (JCR-1609: new Property Types)
+            case PropertyType.DECIMAL:
+
             default:
-                throw new IllegalArgumentException("illegal internal value type");
+                throw new IllegalArgumentException("illegal internal value type: " + value.getType());
         }
 
         // add length
@@ -549,12 +563,13 @@
      * @param doc           The document to which to add the field
      * @param fieldName     The name of the field to add
      * @param internalValue The value for the field to add to the document.
+     * @param weak          Flag indicating whether it's a WEAKREFERENCE (true) or a REFERENCE (flase)
      */
-    protected void addReferenceValue(Document doc, String fieldName, Object internalValue) {
+    protected void addReferenceValue(Document doc, String fieldName, Object internalValue, boolean weak) {
         UUID value = (UUID) internalValue;
         String uuid = value.toString();
         doc.add(createFieldWithoutNorms(fieldName, uuid,
-                PropertyType.REFERENCE));
+                weak ? PropertyType.WEAKREFERENCE : PropertyType.REFERENCE));
         doc.add(new Field(FieldNames.PROPERTIES,
                 FieldNames.createNamedValue(fieldName, uuid),
                 Field.Store.YES, Field.Index.NO, Field.TermVector.NO));
@@ -582,6 +597,19 @@
     }
 
     /**
+     * Adds the uri value to the document as the named field.
+     *
+     * @param doc           The document to which to add the field
+     * @param fieldName     The name of the field to add
+     * @param internalValue The value for the field to add to the document.
+     */
+    protected void addURIValue(Document doc, String fieldName, Object internalValue) {
+        URI uri = (URI) internalValue;
+        doc.add(createFieldWithoutNorms(fieldName, uri.toString(),
+                PropertyType.URI));
+    }
+
+    /**
      * Adds the string value to the document both as the named field and for
      * full text indexing.
      *

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/Util.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/Util.java?rev=779228&r1=779227&r2=779228&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/Util.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/Util.java Wed May 27 16:18:21 2009
@@ -28,6 +28,7 @@
 import java.util.Iterator;
 import java.util.regex.Pattern;
 import java.io.IOException;
+import java.math.BigDecimal;
 
 import javax.jcr.PropertyType;
 import javax.jcr.Value;
@@ -152,14 +153,17 @@
                 return new Double(value.getDouble());
             case PropertyType.LONG:
                 return new Long(value.getLong());
+            case PropertyType.DECIMAL:
+                return value.getDecimal();
             case PropertyType.NAME:
                 return value.getName().toString();
             case PropertyType.PATH:
                 return value.getPath().toString();
+            case PropertyType.URI:
+            case PropertyType.WEAKREFERENCE:
             case PropertyType.REFERENCE:
             case PropertyType.STRING:
                 return value.getString();
-            // TODO: JSR 283 adds new property types
             default:
                 return null;
         }
@@ -187,8 +191,12 @@
                 return new Double(value.getDouble());
             case PropertyType.LONG:
                 return new Long(value.getLong());
+            case PropertyType.DECIMAL:
+                return value.getDecimal();
             case PropertyType.NAME:
             case PropertyType.PATH:
+            case PropertyType.URI:
+            case PropertyType.WEAKREFERENCE:
             case PropertyType.REFERENCE:
             case PropertyType.STRING:
                 return value.getString();
@@ -263,13 +271,17 @@
             case PropertyType.LONG:
                 c2 = new Long(v2.getLong());
                 break;
+            case PropertyType.DECIMAL:
+                c2 = v2.getDecimal();
+                break;
             case PropertyType.NAME:
             case PropertyType.PATH:
             case PropertyType.REFERENCE:
+            case PropertyType.WEAKREFERENCE:
+            case PropertyType.URI:
             case PropertyType.STRING:
                 c2 = v2.getString();
                 break;
-                // TODO: JSR 283 now node types
             default:
                 throw new RepositoryException("Unsupported type: "
                         + PropertyType.nameFromValue(v2.getType()));

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/constraint/ConstraintBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/constraint/ConstraintBuilder.java?rev=779228&r1=779227&r2=779228&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/constraint/ConstraintBuilder.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/constraint/ConstraintBuilder.java Wed May 27 16:18:21 2009
@@ -259,12 +259,12 @@
                     break;
                 case PropertyType.DATE:
                 case PropertyType.DOUBLE:
-                    // TODO case PropertyType.DECIMAL:
+                    // TODO case PropertyType.DECIMAL: // JCR-1609
                 case PropertyType.LONG:
                 case PropertyType.BOOLEAN:
                 case PropertyType.REFERENCE:
-                // TODO case PropertyType.WEAKREFERENCE:
-                // TODO case PropertyType.URI
+                // TODO case PropertyType.WEAKREFERENCE: // JCR-1609
+                // TODO case PropertyType.URI // JCR-1609
                     throw new InvalidQueryException(staticValue.getString() +
                             " cannot be converted into a NAME value");
             }