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

svn commit: r779555 - in /jackrabbit/trunk: jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/ jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/ ...

Author: angela
Date: Thu May 28 10:45:05 2009
New Revision: 779555

URL: http://svn.apache.org/viewvc?rev=779555&view=rev
Log:
JCR-2003: JCR2SPI / SPI: Add support for JCR 2.0

- Node.getReferences(String)
- Node.getWeakReferences()
- Node.getWeakReferences(String)

JCR-1418: Redesign NodeInfo.getReferences()

- deprecated getReferences on NodeInfo
- added method to RepositoryService as suggested by marcel but including support for the variants in JCR 2.0
   > weakrefs vs refs
   > name-filter

Modified:
    jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/DefaultItemCollection.java
    jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/ItemResourceConstants.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/NodeImpl.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/RemoveActivity.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemStateFactory.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/NodeState.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientISFactory.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/WorkspaceItemStateFactory.java
    jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/logging/RepositoryServiceLogger.java
    jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/NodeInfo.java
    jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java
    jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java
    jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/RepositoryServiceImpl.java

Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/DefaultItemCollection.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/DefaultItemCollection.java?rev=779555&r1=779554&r2=779555&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/DefaultItemCollection.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/DefaultItemCollection.java Thu May 28 10:45:05 2009
@@ -898,6 +898,7 @@
                 properties.add(new NodeTypeProperty(JCR_MIXINNODETYPES, n.getMixinNodeTypes(), false));
                 properties.add(new DefaultDavProperty(JCR_INDEX, new Integer(n.getIndex()), true));
                 addHrefProperty(JCR_REFERENCES, n.getReferences(), true);
+                addHrefProperty(JCR_WEAK_REFERENCES, n.getWeakReferences(), true);
                 if (n.isNodeType(JcrConstants.MIX_REFERENCEABLE)) {
                     properties.add(new DefaultDavProperty(JCR_UUID, n.getUUID(), true));
                 }

Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/ItemResourceConstants.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/ItemResourceConstants.java?rev=779555&r1=779554&r2=779555&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/ItemResourceConstants.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/ItemResourceConstants.java Thu May 28 10:45:05 2009
@@ -128,6 +128,10 @@
     public static final DavPropertyName JCR_MIXINNODETYPES = DavPropertyName.create("mixinnodetypes", NAMESPACE);
     public static final DavPropertyName JCR_INDEX = DavPropertyName.create("index", NAMESPACE);
     public static final DavPropertyName JCR_REFERENCES = DavPropertyName.create("references", NAMESPACE);
+    /**
+     * @since JCR 2.0
+     */
+    public static final DavPropertyName JCR_WEAK_REFERENCES = DavPropertyName.create("weakreferences", NAMESPACE);
     public static final DavPropertyName JCR_UUID = DavPropertyName.create("uuid", NAMESPACE);
     public static final DavPropertyName JCR_PRIMARYITEM = DavPropertyName.create("primaryitem", NAMESPACE);
 

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/NodeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/NodeImpl.java?rev=779555&r1=779554&r2=779555&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/NodeImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/NodeImpl.java Thu May 28 10:45:05 2009
@@ -585,23 +585,7 @@
      * @see javax.jcr.Node#getReferences(String)
      */
     public PropertyIterator getReferences(String name) throws RepositoryException {
-        checkStatus();
-        List refs = Arrays.asList(getNodeState().getNodeReferences());
-        if (name != null) {
-            // remove property ids that don't match the given name
-            Name qName = getQName(name);
-            refs = new ArrayList(refs);
-            for (Iterator iter = refs.iterator(); iter.hasNext();) {
-                PropertyId propId = (PropertyId) iter.next();
-                if (!propId.getName().equals(qName)) {
-                    refs.remove(propId);
-                }
-            }
-        } // else: name == null -> return all references
-
-        // create an property iterator for all or the matching property ids
-        // according to the specified name.
-        return new LazyItemIterator(getItemManager(), session.getHierarchyManager(), refs.iterator());
+        return getReferences(name, false);
     }
 
     /**
@@ -615,8 +599,7 @@
      * @see javax.jcr.Node#getWeakReferences()
      */
     public PropertyIterator getWeakReferences(String name) throws RepositoryException {
-        // TODO: implementation missing
-        throw new UnsupportedRepositoryOperationException("JCR-1104");
+        return getReferences(name, true);
     }
 
     /**
@@ -1605,6 +1588,34 @@
         return qName;
     }
 
+    /**
+     * @return the primary node type name.
+     */
+    private Name getPrimaryNodeTypeName() {
+        return getNodeState().getNodeTypeName();
+    }
+
+    /**
+     * 
+     * @param name
+     * @param weak
+     * @return
+     * @throws RepositoryException
+     */
+    private LazyItemIterator getReferences(String name, boolean weak) throws RepositoryException {
+        checkStatus();
+        Name propName = (name == null) ? null : getQName(name);
+        Iterator<PropertyId> itr = getNodeState().getNodeReferences(propName, weak);
+        return new LazyItemIterator(getItemManager(), session.getHierarchyManager(), itr);
+    }
+
+    /**
+     *
+     * @param mixinName
+     * @return
+     * @throws NoSuchNodeTypeException
+     * @throws ConstraintViolationException
+     */
     private boolean canAddMixin(Name mixinName) throws NoSuchNodeTypeException,
         ConstraintViolationException {
         NodeTypeManagerImpl ntMgr = session.getNodeTypeManager();
@@ -1814,11 +1825,4 @@
             throws ConstraintViolationException, RepositoryException {
         return session.getItemDefinitionProvider().getQPropertyDefinition(getNodeState().getAllNodeTypeNames(), propertyName, type, multiValued);
     }
-
-    /**
-     * @return the primary node type name.
-     */
-    private Name getPrimaryNodeTypeName() {
-        return getNodeState().getNodeTypeName();
-    }
 }

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/RemoveActivity.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/RemoveActivity.java?rev=779555&r1=779554&r2=779555&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/RemoveActivity.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/RemoveActivity.java Thu May 28 10:45:05 2009
@@ -28,6 +28,7 @@
 import javax.jcr.UnsupportedRepositoryOperationException;
 import javax.jcr.RepositoryException;
 import javax.jcr.version.VersionException;
+import java.util.Iterator;
 
 /**
  * <code>RemoveVersion</code>...
@@ -36,13 +37,13 @@
 
     private static Logger log = LoggerFactory.getLogger(RemoveActivity.class);
 
-    private final PropertyId[] refs;
+    private final Iterator<PropertyId> refs;
     private final HierarchyManager hMgr;
 
     private RemoveActivity(NodeState removeActivity, HierarchyManager hierarchyMgr)
             throws RepositoryException {
         super(removeActivity, removeActivity.getParent());
-        refs = removeActivity.getNodeReferences();
+        refs = removeActivity.getNodeReferences(null, false);
         hMgr = hierarchyMgr;
     }
 
@@ -66,8 +67,8 @@
         status = STATUS_PERSISTED;
         
         // invalidate all references to the removed activity
-        for (int i = 0; i < refs.length; i++) {
-            HierarchyEntry entry = hMgr.lookup(refs[i]);
+        while (refs.hasNext()) {
+            HierarchyEntry entry = hMgr.lookup(refs.next());
             if (entry != null) {
                 entry.invalidate(false);
             }

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemStateFactory.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemStateFactory.java?rev=779555&r1=779554&r2=779555&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemStateFactory.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemStateFactory.java Thu May 28 10:45:05 2009
@@ -18,6 +18,7 @@
 
 import org.apache.jackrabbit.spi.NodeId;
 import org.apache.jackrabbit.spi.PropertyId;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.jcr2spi.hierarchy.NodeEntry;
 import org.apache.jackrabbit.jcr2spi.hierarchy.PropertyEntry;
 
@@ -113,9 +114,12 @@
      * the given node.
      *
      * @param nodeState reference target
+     * @param propertyName
+     * @param weak Boolean flag indicating whether weak references should be
+     * returned or not.
      * @return reference property identifiers
      */
-    public PropertyId[] getNodeReferences(NodeState nodeState);
+    public Iterator<PropertyId> getNodeReferences(NodeState nodeState, Name propertyName, boolean weak);
 
     /**
      * Adds the given <code>ItemStateCreationListener</code>.

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/NodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/NodeState.java?rev=779555&r1=779554&r2=779555&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/NodeState.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/NodeState.java Thu May 28 10:45:05 2009
@@ -18,6 +18,7 @@
 
 import java.util.Arrays;
 import java.util.List;
+import java.util.Iterator;
 
 import javax.jcr.ItemNotFoundException;
 import javax.jcr.RepositoryException;
@@ -316,10 +317,14 @@
      * Returns the identifiers of all reference properties that point to
      * this node.
      *
+     * @param propertyName name filter of referring properties to be returned;
+     * if <code>null</code> then all references are returned.
+     * @param weak Boolean flag indicating whether weak references should be
+     * returned or not.
      * @return reference property identifiers
      */
-    public PropertyId[] getNodeReferences() {
-        return isf.getNodeReferences(this);
+    public Iterator<PropertyId> getNodeReferences(Name propertyName, boolean weak) {
+        return isf.getNodeReferences(this, propertyName, weak);
     }
 
     /**

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientISFactory.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientISFactory.java?rev=779555&r1=779554&r2=779555&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientISFactory.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientISFactory.java Thu May 28 10:45:05 2009
@@ -32,6 +32,7 @@
 import javax.jcr.ItemNotFoundException;
 
 import java.util.Iterator;
+import java.util.Collections;
 
 /**
  * <code>TransientISFactory</code>...
@@ -139,13 +140,13 @@
 
     /**
      * @inheritDoc
-     * @see ItemStateFactory#getNodeReferences(NodeState)
+     * @see ItemStateFactory#getNodeReferences(NodeState,org.apache.jackrabbit.spi.Name,boolean)
      */
-    public PropertyId[] getNodeReferences(NodeState nodeState) {
+    public Iterator<PropertyId> getNodeReferences(NodeState nodeState, Name propertyName, boolean weak) {
         if (nodeState.getStatus() == Status.NEW) {
-            return new PropertyId[0];
+            return Collections.EMPTY_SET.iterator();
         }
-        return workspaceStateFactory.getNodeReferences(nodeState);
+        return workspaceStateFactory.getNodeReferences(nodeState, propertyName, weak);
     }
 
     //------------------------------------------< ItemStateCreationListener >---

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/WorkspaceItemStateFactory.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/WorkspaceItemStateFactory.java?rev=779555&r1=779554&r2=779555&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/WorkspaceItemStateFactory.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/WorkspaceItemStateFactory.java Thu May 28 10:45:05 2009
@@ -22,6 +22,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.NoSuchElementException;
+import java.util.Collections;
 
 import javax.jcr.ItemExistsException;
 import javax.jcr.ItemNotFoundException;
@@ -158,26 +159,24 @@
 
     /**
      * @inheritDoc
-     * @see ItemStateFactory#getNodeReferences(NodeState)
-     * @param nodeState
+     * @see ItemStateFactory#getNodeReferences(NodeState,org.apache.jackrabbit.spi.Name,boolean)
      */
-    public PropertyId[] getNodeReferences(NodeState nodeState) {
+    public Iterator<PropertyId> getNodeReferences(NodeState nodeState, Name propertyName, boolean weak) {
         NodeEntry entry = nodeState.getNodeEntry();
         // shortcut
         if (entry.getUniqueID() == null
                 || !entry.hasPropertyEntry(NameConstants.JCR_UUID)) {
             // for sure not referenceable
-            return new PropertyId[0];
+            return Collections.EMPTY_SET.iterator();
         }
 
         // nodestate has a unique ID and is potentially mix:referenceable
         // => try to retrieve references
         try {
-            NodeInfo nInfo = service.getNodeInfo(sessionInfo, entry.getWorkspaceId());
-            return nInfo.getReferences();
+            return service.getReferences(sessionInfo, entry.getWorkspaceId(), propertyName, weak);
         } catch (RepositoryException e) {
             log.debug("Unable to determine references to {}", nodeState);
-            return new PropertyId[0];
+            return Collections.EMPTY_SET.iterator();
         }
     }
 

Modified: jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/logging/RepositoryServiceLogger.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/logging/RepositoryServiceLogger.java?rev=779555&r1=779554&r2=779555&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/logging/RepositoryServiceLogger.java (original)
+++ jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/logging/RepositoryServiceLogger.java Thu May 28 10:45:05 2009
@@ -222,6 +222,14 @@
         }, "getChildInfos(SessionInfo, NodeId)", new Object[]{unwrap(sessionInfo), parentId});
     }
 
+    public Iterator<PropertyId> getReferences(final SessionInfo sessionInfo, final NodeId nodeId, final Name propertyName, final boolean weakReferences) throws RepositoryException {
+        return (Iterator) execute(new Callable() {
+            public Object call() throws RepositoryException {
+                return service.getReferences(unwrap(sessionInfo), nodeId, propertyName, weakReferences);
+            }
+        }, "getReferences(SessionInfo, NodeId, Name, boolean)", new Object[]{unwrap(sessionInfo), nodeId, propertyName, weakReferences});
+    }
+
     public PropertyInfo getPropertyInfo(final SessionInfo sessionInfo, final PropertyId propertyId)
             throws RepositoryException {
 

Modified: jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/NodeInfo.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/NodeInfo.java?rev=779555&r1=779554&r2=779555&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/NodeInfo.java (original)
+++ jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/NodeInfo.java Thu May 28 10:45:05 2009
@@ -61,10 +61,14 @@
     public Name[] getMixins();
 
     /**
+     * Return the {@link PropertyId Id}s of the properties that are referencing the
+     * node based on this info object.
+     * 
      * @return {@link PropertyId Id}s of the properties that are referencing the
      * node based on this info object or an empty array if the node is not
      * referenceable or no references exist.
      * @see PropertyInfo#getId()
+     * @deprecated Use {@link RepositoryService#getReferences(SessionInfo, NodeId, boolean)} instead.
      */
     public PropertyId[] getReferences();
 

Modified: jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java?rev=779555&r1=779554&r2=779555&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java (original)
+++ jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java Thu May 28 10:45:05 2009
@@ -305,6 +305,30 @@
     public Iterator getChildInfos(SessionInfo sessionInfo, NodeId parentId) throws ItemNotFoundException, RepositoryException;
 
     /**
+     * Returns the {@link PropertyId Id}s of the properties that are referencing
+     * the node identified by the given <code>nodeId</code>. If
+     * <code>weakReferences</code> is <code>true</code> the ids of
+     * {@link javax.jcr.PropertyType#WEAKREFERENCE WEAKREFERENCE} properties are
+     * returned, otherwise the property must be of type {@link javax.jcr.PropertyType#REFERENCE REFERENCE}.
+     *
+     * @param sessionInfo
+     * @param nodeId
+     * @param propertyName name filter of referring properties to be returned;
+     * if <code>null</code> then all references are returned.
+     * @param weakReferences If <code>true</code> the properties must be of type
+     * {@link javax.jcr.PropertyType#WEAKREFERENCE}, otherwise of type
+     * {@link javax.jcr.PropertyType#REFERENCE}.
+     * @return An Iterator of {@link PropertyId Id}s of the properties that are
+     * referencing the node identified by the given <code>nodeId</code> or an
+     * empty iterator if the node is not eferenceable or no references exist.
+     * @throws ItemNotFoundException
+     * @throws RepositoryException
+     * @see PropertyInfo#getId()
+     * @since JCR 2.0
+     */
+    public Iterator<PropertyId> getReferences(SessionInfo sessionInfo, NodeId nodeId, Name propertyName, boolean weakReferences) throws ItemNotFoundException, RepositoryException;
+
+    /**
      * Returns the <code>PropertyInfo</code> for the <code>Property</code>
      * identified by the given id.
      *

Modified: jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java?rev=779555&r1=779554&r2=779555&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java Thu May 28 10:45:05 2009
@@ -985,6 +985,68 @@
     }
 
     /**
+     * @see RepositoryService#getReferences(SessionInfo, NodeId, Name, boolean)
+     */
+    public Iterator<PropertyId> getReferences(SessionInfo sessionInfo, NodeId nodeId, Name propertyName, boolean weakReferences) throws ItemNotFoundException, RepositoryException {
+        // set of properties to be retrieved
+        DavPropertyNameSet nameSet = new DavPropertyNameSet();
+        if (weakReferences) {
+            nameSet.add(ItemResourceConstants.JCR_WEAK_REFERENCES);
+        } else {
+            nameSet.add(ItemResourceConstants.JCR_REFERENCES);
+        }
+
+        DavMethodBase method = null;
+        try {
+            String uri = getItemUri(nodeId, sessionInfo);
+            method = new PropFindMethod(uri, nameSet, DEPTH_0);
+            getClient(sessionInfo).executeMethod(method);
+            method.checkSuccess();
+
+            MultiStatusResponse[] responses = method.getResponseBodyAsMultiStatus().getResponses();
+            if (responses.length < 1) {
+                throw new ItemNotFoundException("Unable to retrieve the node with id " + saveGetIdString(nodeId, sessionInfo));
+            }
+
+            List<PropertyId> refIds = new ArrayList<PropertyId>();
+            for (int i = 0; i < responses.length; i++) {
+                if (isSameResource(uri, responses[i])) {
+                    MultiStatusResponse resp = responses[i];
+                    DavPropertySet props = resp.getProperties(DavServletResponse.SC_OK);
+                    DavProperty p;
+                    if (weakReferences) {
+                        p = props.get(ItemResourceConstants.JCR_WEAK_REFERENCES);
+                    } else {
+                        p = props.get(ItemResourceConstants.JCR_REFERENCES);
+                    }
+
+                    if (p == null) {
+                        return Collections.EMPTY_LIST.iterator();
+                    } else {
+                        HrefProperty hp = new HrefProperty(p);
+                        for (Iterator it = hp.getHrefs().iterator(); it.hasNext();) {
+                            String propHref = it.next().toString();
+                            PropertyId propId = uriResolver.getPropertyId(propHref, sessionInfo);
+                            if (propertyName == null || propertyName.equals(propId.getName())) {
+                                refIds.add(propId);
+                            }
+                        }
+                    }
+                }
+            }
+            return refIds.iterator();
+        } catch (IOException e) {
+            throw new RepositoryException(e);
+        } catch (DavException e) {
+            throw ExceptionConverter.generate(e);
+        } finally {
+            if (method != null) {
+                method.releaseConnection();
+            }
+        }
+    }
+
+    /**
      * @see RepositoryService#getPropertyInfo(SessionInfo, PropertyId)
      */
     public PropertyInfo getPropertyInfo(SessionInfo sessionInfo, PropertyId propertyId) throws RepositoryException {

Modified: jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/RepositoryServiceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/RepositoryServiceImpl.java?rev=779555&r1=779554&r2=779555&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/RepositoryServiceImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/RepositoryServiceImpl.java Thu May 28 10:45:05 2009
@@ -79,6 +79,7 @@
 import javax.jcr.ItemVisitor;
 import javax.jcr.ValueFactory;
 import javax.jcr.GuestCredentials;
+import javax.jcr.PropertyIterator;
 import javax.jcr.util.TraversingItemVisitor;
 import javax.jcr.observation.ObservationManager;
 import javax.jcr.observation.EventListener;
@@ -412,6 +413,27 @@
     /**
      * {@inheritDoc}
      */
+    public Iterator<PropertyId> getReferences(SessionInfo sessionInfo, NodeId nodeId, Name propertyName, boolean weakReferences) throws ItemNotFoundException, RepositoryException {
+        SessionInfoImpl sInfo = getSessionInfoImpl(sessionInfo);
+        Node node = getNode(nodeId, sInfo);
+        String jcrName = (propertyName == null) ? null : sInfo.getNamePathResolver().getJCRName(propertyName);
+
+        List<PropertyId> ids = new ArrayList<PropertyId>();
+        PropertyIterator it;
+        if (weakReferences) {
+            it = node.getWeakReferences(jcrName);
+        } else {
+            it = node.getReferences(jcrName);
+        }
+        while (it.hasNext()) {
+            ids.add(idFactory.createPropertyId(it.nextProperty(), sInfo.getNamePathResolver()));
+        }
+        return ids.iterator();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
     public PropertyInfo getPropertyInfo(SessionInfo sessionInfo,
                                         PropertyId propertyId)
             throws ItemNotFoundException, RepositoryException {