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 2008/05/09 16:37:22 UTC

svn commit: r654826 - in /jackrabbit/trunk: jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/ jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/ jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2sp...

Author: angela
Date: Fri May  9 07:37:21 2008
New Revision: 654826

URL: http://svn.apache.org/viewvc?rev=654826&view=rev
Log:
JCR-1576  Remove RepositoryService exists()  
JCR-1577  Remove RepositoryService.getRootId()  
JCR-1405  SPI: Introduce NodeInfo.getChildInfos()  

Modified:
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/ChildNodeEntriesImpl.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/NodeEntry.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/NodeEntryImpl.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/ItemDefinitionProviderImpl.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/NodeInfoImpl.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-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/NodeInfoImpl.java
    jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/RepositoryServiceImpl.java

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/ChildNodeEntriesImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/ChildNodeEntriesImpl.java?rev=654826&r1=654825&r2=654826&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/ChildNodeEntriesImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/ChildNodeEntriesImpl.java Fri May  9 07:37:21 2008
@@ -62,7 +62,9 @@
     private final EntryFactory factory;
 
     /**
-     * Create a new <code>ChildNodeEntries</code> collection
+     * Create a new <code>ChildNodeEntries</code> collection and retrieve
+     * the entries from the persistent layer if the parent is neither
+     * NEW nor in a terminal status.
      */
     ChildNodeEntriesImpl(NodeEntry parent, EntryFactory factory) throws ItemNotFoundException, RepositoryException {
         entriesByName = new NameMap();
@@ -71,15 +73,38 @@
         this.parent = parent;
         this.factory = factory;
 
-        if (parent.getStatus() == Status.NEW || Status.isTerminal(parent.getStatus())) {
-            return; // cannot retrieve child-entries from persistent layer
-        }
+        if (parent.getStatus() != Status.NEW && !Status.isTerminal(parent.getStatus())) {
+            NodeId id = parent.getWorkspaceId();
+            Iterator childNodeInfos = factory.getItemStateFactory().getChildNodeInfos(id);
+            // simply add all child entries to the empty collection
+            while (childNodeInfos.hasNext()) {
+                ChildInfo ci = (ChildInfo) childNodeInfos.next();
+                NodeEntry entry = factory.createNodeEntry(parent, ci.getName(), ci.getUniqueID());
+                add(entry, ci.getIndex());
+            }
+        } /* else: cannot retrieve child-entries from persistent layer. the parent
+           * is NEW (transient only) or already removed from the persistent layer.
+           */
+    }
 
-        NodeId id = parent.getWorkspaceId();
-        Iterator it = factory.getItemStateFactory().getChildNodeInfos(id);
-        // simply add all child entries to the empty collection
-        while (it.hasNext()) {
-            ChildInfo ci = (ChildInfo) it.next();
+    /**
+     * Create a new <code>ChildNodeEntries</code> collection from the given
+     * <code>childNodeInfos</code> instead of retrieving them from the
+     * persistent layer.
+     *
+     * @param parent
+     * @param factory
+     * @param childNodeInfos
+     */
+    ChildNodeEntriesImpl(NodeEntry parent, EntryFactory factory, Iterator childNodeInfos) {
+        entriesByName = new NameMap();
+        entries = new LinkedEntries();
+
+        this.parent = parent;
+        this.factory = factory;
+
+        while (childNodeInfos.hasNext()) {
+            ChildInfo ci = (ChildInfo) childNodeInfos.next();
             NodeEntry entry = factory.createNodeEntry(parent, ci.getName(), ci.getUniqueID());
             add(entry, ci.getIndex());
         }
@@ -117,15 +142,20 @@
         }
 
         NodeId id = parent.getWorkspaceId();
-        Iterator it = factory.getItemStateFactory().getChildNodeInfos(id);
+        Iterator childNodeInfos = factory.getItemStateFactory().getChildNodeInfos(id);
+        reload(childNodeInfos);
+    }
+
+    void reload(Iterator childNodeInfos) {
+        // TODO: should existing (not-new) entries that are not present in the childInfos be removed?
         // create list from all ChildInfos (for multiple loop)
         List cInfos = new ArrayList();
-        while (it.hasNext()) {
-            cInfos.add(it.next());
+        while (childNodeInfos.hasNext()) {
+            cInfos.add(childNodeInfos.next());
         }
         // first make sure the ordering of all existing entries is ok
         NodeEntry entry = null;
-        for (it = cInfos.iterator(); it.hasNext();) {
+        for (Iterator it = cInfos.iterator(); it.hasNext();) {
             ChildInfo ci = (ChildInfo) it.next();
             NodeEntry nextEntry = get(ci);
             if (nextEntry != null) {
@@ -137,7 +167,7 @@
         }
         // then insert the 'new' entries
         List newEntries = new ArrayList();
-        for (it = cInfos.iterator(); it.hasNext();) {
+        for (Iterator it = cInfos.iterator(); it.hasNext();) {
             ChildInfo ci = (ChildInfo) it.next();
             NodeEntry beforeEntry = get(ci);
             if (beforeEntry == null) {
@@ -325,8 +355,8 @@
      * <code>null</code> <code>insertNode</code> is moved to the end of the
      * child node entries.
      *
-     * @param insertNode the NodeEntry to move.
-     * @param beforeNode the NodeEntry where <code>insertNode</code> is
+     * @param insertEntry the NodeEntry to move.
+     * @param beforeEntry the NodeEntry where <code>insertNode</code> is
      * reordered to.
      * @return the NodeEntry that followed the 'insertNode' before the reordering.
      * @throws NoSuchElementException if <code>insertNode</code> or
@@ -355,11 +385,12 @@
 
     /**
      *
-     * @param insertObj
+     * @param insertName
      * @param insertLN
      * @param beforeLN
      */
-    private void reorder(Name insertName, LinkedEntries.LinkNode insertLN, LinkedEntries.LinkNode beforeLN) {
+    private void reorder(Name insertName, LinkedEntries.LinkNode insertLN,
+                         LinkedEntries.LinkNode beforeLN) {
         // reorder named map
         if (entriesByName.containsSiblings(insertName)) {
             int position;
@@ -731,7 +762,6 @@
          *
          * @param siblings
          * @param index
-         * @param checkValidity
          * @return
          */
         private static NodeEntry findMatchingEntry(List siblings, int index) {

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/NodeEntry.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/NodeEntry.java?rev=654826&r1=654825&r2=654826&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/NodeEntry.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/NodeEntry.java Fri May  9 07:37:21 2008
@@ -177,6 +177,14 @@
     public List getNodeEntries(Name nodeName) throws RepositoryException;
 
     /**
+     * Creates or updates the <code>ChildNodeEntries</code> of this node.
+     *
+     * @param childInfos
+     * @throws RepositoryException
+     */
+    public void setNodeEntries(Iterator childInfos) throws RepositoryException;
+
+    /**
      * Adds a new child NodeEntry to this entry.
      *
      * @param nodeName

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/NodeEntryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/NodeEntryImpl.java?rev=654826&r1=654825&r2=654826&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/NodeEntryImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/NodeEntryImpl.java Fri May  9 07:37:21 2008
@@ -590,6 +590,19 @@
     }
 
     /**
+     *
+     * @param childInfos
+     * @throws RepositoryException
+     */
+    public void setNodeEntries(Iterator childInfos) throws RepositoryException {
+        if (childNodeEntries == null) {
+            childNodeEntries = new ChildNodeEntriesImpl(this, factory, childInfos);
+        } else {
+            ((ChildNodeEntriesImpl) childNodeEntries).reload(childInfos);
+        }
+    }
+
+    /**
      * @inheritDoc
      * @see NodeEntry#addNodeEntry(Name, String, int)
      */

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/ItemDefinitionProviderImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/ItemDefinitionProviderImpl.java?rev=654826&r1=654825&r2=654826&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/ItemDefinitionProviderImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/ItemDefinitionProviderImpl.java Fri May  9 07:37:21 2008
@@ -16,21 +16,23 @@
  */
 package org.apache.jackrabbit.jcr2spi.nodetype;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import javax.jcr.PropertyType;
+import javax.jcr.RepositoryException;
+import javax.jcr.nodetype.ConstraintViolationException;
+import javax.jcr.nodetype.NoSuchNodeTypeException;
+
+import org.apache.jackrabbit.spi.IdFactory;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.NodeId;
+import org.apache.jackrabbit.spi.PathFactory;
+import org.apache.jackrabbit.spi.PropertyId;
+import org.apache.jackrabbit.spi.QItemDefinition;
 import org.apache.jackrabbit.spi.QNodeDefinition;
 import org.apache.jackrabbit.spi.QPropertyDefinition;
 import org.apache.jackrabbit.spi.RepositoryService;
 import org.apache.jackrabbit.spi.SessionInfo;
-import org.apache.jackrabbit.spi.QItemDefinition;
-import org.apache.jackrabbit.spi.Name;
-import org.apache.jackrabbit.spi.PropertyId;
-import org.apache.jackrabbit.spi.NodeId;
-
-import javax.jcr.RepositoryException;
-import javax.jcr.PropertyType;
-import javax.jcr.nodetype.NoSuchNodeTypeException;
-import javax.jcr.nodetype.ConstraintViolationException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * <code>ItemDefinitionManagerImpl</code>...
@@ -57,8 +59,11 @@
      */
     public QNodeDefinition getRootNodeDefinition() throws RepositoryException {
         if (rootNodeDefinition == null) {
+            IdFactory idFactory = service.getIdFactory();
+            PathFactory pf = service.getPathFactory();
+
             rootNodeDefinition = service.getNodeDefinition(
-                    sessionInfo, service.getRootId(sessionInfo));
+                    sessionInfo, idFactory.createNodeId((String) null, pf.getRootPath()));
         }
         return rootNodeDefinition;
     }

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=654826&r1=654825&r2=654826&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 Fri May  9 07:37:21 2008
@@ -16,31 +16,34 @@
  */
 package org.apache.jackrabbit.jcr2spi.state;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.apache.jackrabbit.jcr2spi.nodetype.ItemDefinitionProvider;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.jcr.ItemExistsException;
+import javax.jcr.ItemNotFoundException;
+import javax.jcr.PathNotFoundException;
+import javax.jcr.RepositoryException;
+
+import org.apache.jackrabbit.jcr2spi.hierarchy.HierarchyEntry;
 import org.apache.jackrabbit.jcr2spi.hierarchy.NodeEntry;
 import org.apache.jackrabbit.jcr2spi.hierarchy.PropertyEntry;
-import org.apache.jackrabbit.jcr2spi.hierarchy.HierarchyEntry;
-import org.apache.jackrabbit.spi.commons.name.NameConstants;
+import org.apache.jackrabbit.jcr2spi.nodetype.ItemDefinitionProvider;
+import org.apache.jackrabbit.spi.IdFactory;
+import org.apache.jackrabbit.spi.ItemInfo;
+import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.spi.NodeId;
-import org.apache.jackrabbit.spi.PropertyId;
 import org.apache.jackrabbit.spi.NodeInfo;
+import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.spi.PathFactory;
+import org.apache.jackrabbit.spi.PropertyId;
 import org.apache.jackrabbit.spi.PropertyInfo;
-import org.apache.jackrabbit.spi.SessionInfo;
 import org.apache.jackrabbit.spi.RepositoryService;
-import org.apache.jackrabbit.spi.ItemInfo;
-import org.apache.jackrabbit.spi.Name;
-import org.apache.jackrabbit.spi.Path;
-
-import javax.jcr.PathNotFoundException;
-import javax.jcr.RepositoryException;
-import javax.jcr.ItemExistsException;
-import javax.jcr.ItemNotFoundException;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ArrayList;
+import org.apache.jackrabbit.spi.SessionInfo;
+import org.apache.jackrabbit.spi.commons.name.NameConstants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * <code>WorkspaceItemStateFactory</code>...
@@ -65,7 +68,10 @@
      * @see ItemStateFactory#createRootState(NodeEntry)
      */
     public NodeState createRootState(NodeEntry entry) throws ItemNotFoundException, RepositoryException {
-        return createNodeState(service.getRootId(sessionInfo), entry);
+        IdFactory idFactory = service.getIdFactory();
+        PathFactory pf = service.getPathFactory();
+
+        return createNodeState(idFactory.createNodeId((String) null, pf.getRootPath()), entry);
     }
 
     /**
@@ -270,6 +276,13 @@
             log.warn("Internal error", e);
         }
 
+        // unless the child-info are omitted by the SPI impl -> make sure
+        // the childentries the nodeentry are initialized or updated.
+        Iterator childInfos = info.getChildInfos();
+        if (childInfos != null) {
+            entry.setNodeEntries(childInfos);
+        }
+
         notifyCreated(state);
         return state;
     }

Modified: jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/NodeInfoImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/NodeInfoImpl.java?rev=654826&r1=654825&r2=654826&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/NodeInfoImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/NodeInfoImpl.java Fri May  9 07:37:21 2008
@@ -16,17 +16,18 @@
  */
 package org.apache.jackrabbit.spi.commons;
 
-import org.apache.jackrabbit.spi.NodeInfo;
-import org.apache.jackrabbit.spi.NodeId;
-import org.apache.jackrabbit.spi.PropertyId;
+import org.apache.jackrabbit.spi.ChildInfo;
 import org.apache.jackrabbit.spi.IdFactory;
 import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.NodeId;
+import org.apache.jackrabbit.spi.NodeInfo;
 import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.spi.PropertyId;
 
-import java.util.List;
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Iterator;
-import java.io.Serializable;
+import java.util.List;
 
 /**
  * <code>NodeInfoImpl</code> implements a serializable <code>NodeInfo</code>
@@ -65,6 +66,11 @@
     private final List propertyIds;
 
     /**
+     * The list of {@link ChildInfo}s of this node info.
+     */
+    private final List childInfos;
+
+    /**
      * Creates a new serializable <code>NodeInfo</code> for the given
      * <code>NodeInfo</code>.
      *
@@ -86,6 +92,7 @@
             NodeId nodeId = nodeInfo.getId();
             nodeId = idFactory.createNodeId(nodeId.getUniqueID(), nodeId.getPath());
             final Iterator propIds = nodeInfo.getPropertyIds();
+            final Iterator childInfos = nodeInfo.getChildInfos();
             return new NodeInfoImpl(nodeInfo.getPath(), nodeId,
                     nodeInfo.getIndex(), nodeInfo.getNodetype(),
                     nodeInfo.getMixins(), serRefs.iterator(),
@@ -104,7 +111,25 @@
                         public void remove() {
                             throw new UnsupportedOperationException();
                         }
-                    });
+                    },
+                    ((childInfos == null) ? null :
+                    new Iterator() {
+                        public boolean hasNext() {
+                            return childInfos.hasNext();
+                        }
+                        public Object next() {
+                            ChildInfo cInfo = (ChildInfo) childInfos.next();
+                            if (cInfo instanceof Serializable) {
+                                return cInfo;
+                            } else {
+                                return new ChildInfoImpl(cInfo.getName(), cInfo.getUniqueID(), cInfo.getIndex());
+                            }
+                        }
+                        public void remove() {
+                            throw new UnsupportedOperationException();
+                        }
+                    })
+            );
         }
     }
 
@@ -120,13 +145,15 @@
      * @param mixinNames      the names of the assigned mixins.
      * @param references      the references to this node.
      * @param propertyIds     the properties of this node.
+     * @param childInfos      the child infos of this node or <code>null</code>.
      * @deprecated Use {@link #NodeInfoImpl(Name, Path, NodeId, int, Name, Name[], Iterator, Iterator)}
      * instead. The parentId is not used any more.
      */
     public NodeInfoImpl(NodeId parentId, Name name, Path path, NodeId id,
                         int index, Name primaryTypeName, Name[] mixinNames,
-                        Iterator references, Iterator propertyIds) {
-         this(path, id, index, primaryTypeName, mixinNames, references, propertyIds);
+                        Iterator references, Iterator propertyIds,
+                        Iterator childInfos) {
+         this(path, id, index, primaryTypeName, mixinNames, references, propertyIds, childInfos);
     }
 
     /**
@@ -141,7 +168,8 @@
      * @param propertyIds     the properties of this node.
      */
     public NodeInfoImpl(Path path, NodeId id, int index, Name primaryTypeName,
-                        Name[] mixinNames, Iterator references, Iterator propertyIds) {
+                        Name[] mixinNames, Iterator references, Iterator propertyIds,
+                        Iterator childInfos) {
         super(path, true);
         this.id = id;
         this.index = index;
@@ -155,6 +183,14 @@
         while (propertyIds.hasNext()) {
             this.propertyIds.add(propertyIds.next());
         }
+        if (childInfos == null) {
+            this.childInfos = null;
+        } else {
+            this.childInfos = new ArrayList();
+            while (childInfos.hasNext()) {
+                this.childInfos.add(childInfos.next());
+            }
+        }
     }
 
     //-------------------------------< NodeInfo >-------------------------------
@@ -202,4 +238,11 @@
     public Iterator getPropertyIds() {
         return propertyIds.iterator();
     }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Iterator getChildInfos() {
+        return (childInfos == null) ? null : childInfos.iterator();
+    }
 }

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=654826&r1=654825&r2=654826&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 Fri May  9 07:37:21 2008
@@ -73,4 +73,22 @@
      * @see PropertyInfo#getId()
      */
     public Iterator getPropertyIds();
+
+    /**
+     * Return the all <code>ChildInfo</code>s of the node represent by
+     * this info, an empty iterator if that node doesn't have any child nodes
+     * or <code>null</code> if the implementation is not able or for some
+     * internal reasons not willing to compute the <code>ChildInfo</code>
+     * iterator. In the latter case the user of this API must call
+     * {@link RepositoryService#getChildInfos(SessionInfo, NodeId)} in order
+     * to determine the existence and identity of the child nodes.
+     *
+     * @return An iterator of <code>ChildInfo</code>s or <code>null</code> if
+     * the implementation is not able or willing to compute the set of
+     * <code>ChildInfo</code>s (e.g. an implementation may choose to return
+     * <code>null</code> if there is a huge amount of child nodes). In this
+     * case {@link RepositoryService#getChildInfos(SessionInfo, NodeId)} will
+     * be used to load the <code>ChildInfo</code>s.
+     */
+    public Iterator getChildInfos();
 }

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=654826&r1=654825&r2=654826&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 Fri May  9 07:37:21 2008
@@ -16,30 +16,31 @@
  */
 package org.apache.jackrabbit.spi;
 
-import javax.jcr.lock.LockException;
-import javax.jcr.version.VersionException;
-import javax.jcr.version.Version;
-import javax.jcr.nodetype.NoSuchNodeTypeException;
-import javax.jcr.nodetype.ConstraintViolationException;
-import javax.jcr.RepositoryException;
-import javax.jcr.Credentials;
-import javax.jcr.UnsupportedRepositoryOperationException;
+import java.io.InputStream;
+import java.util.Iterator;
+import java.util.Map;
+
 import javax.jcr.AccessDeniedException;
+import javax.jcr.Credentials;
 import javax.jcr.InvalidItemStateException;
-import javax.jcr.PathNotFoundException;
 import javax.jcr.ItemExistsException;
-import javax.jcr.NoSuchWorkspaceException;
+import javax.jcr.ItemNotFoundException;
+import javax.jcr.LoginException;
 import javax.jcr.MergeException;
 import javax.jcr.NamespaceException;
-import javax.jcr.ItemNotFoundException;
-import javax.jcr.ValueFormatException;
+import javax.jcr.NoSuchWorkspaceException;
 import javax.jcr.Node;
-import javax.jcr.LoginException;
+import javax.jcr.PathNotFoundException;
 import javax.jcr.ReferentialIntegrityException;
+import javax.jcr.RepositoryException;
+import javax.jcr.UnsupportedRepositoryOperationException;
+import javax.jcr.ValueFormatException;
+import javax.jcr.lock.LockException;
+import javax.jcr.nodetype.ConstraintViolationException;
+import javax.jcr.nodetype.NoSuchNodeTypeException;
 import javax.jcr.query.InvalidQueryException;
-import java.util.Map;
-import java.util.Iterator;
-import java.io.InputStream;
+import javax.jcr.version.Version;
+import javax.jcr.version.VersionException;
 
 /**
  * The <code>RepositoryService</code> interface defines methods used to
@@ -206,20 +207,6 @@
 
     //------------------------------------------------------< Reading items >---
     /**
-     * The <code>NodeId</code> of the root node may basically have two
-     * characteristics. If the root node can be identified with a unique ID the
-     * returned <code>NodeId</code> simply has a uniqueID part and the path
-     * part is <code>null</code>. If the root node cannot be identified with a
-     * unique ID the uniqueID part is <code>null</code> and the path part will be set
-     * to "/".
-     *
-     * @param sessionInfo
-     * @return The <code>NodeId</code> of the root <code>Node</code>.
-     * @throws javax.jcr.RepositoryException
-     */
-    public NodeId getRootId(SessionInfo sessionInfo) throws RepositoryException;
-
-    /**
      * Returns the <code>QNodeDefinition</code> for the <code>Node</code>
      * identified by the given id. This method should only be used if the
      * caller is not able to unambiguously determine the applicable definition
@@ -249,20 +236,6 @@
     public QPropertyDefinition getPropertyDefinition(SessionInfo sessionInfo, PropertyId propertyId) throws RepositoryException;
 
     /**
-     * Returns <code>true</code> if an <code>Item</code> with the given
-     * <code>ItemId</code> exists. Note, that the implementation must be able to
-     * deal with the various formats of an <code>ItemId</code>. The caller might
-     * not be aware of the uniqueID part the ItemId may have.
-     *
-     * @param sessionInfo
-     * @param itemId
-     * @return true if the item with the given id exists.
-     * @throws javax.jcr.RepositoryException
-     * @see javax.jcr.Session#itemExists(String)
-     */
-    public boolean exists(SessionInfo sessionInfo, ItemId itemId) throws RepositoryException;
-
-    /**
      * Retrieve the <code>NodeInfo</code> for the node identified by the given
      * <code>NodeId</code>. See {@link #getItemInfos(SessionInfo, NodeId)} for
      * a similar method that in addition may return <code>ItemInfo</code>s of

Modified: jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/NodeInfoImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/NodeInfoImpl.java?rev=654826&r1=654825&r2=654826&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/NodeInfoImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/NodeInfoImpl.java Fri May  9 07:37:21 2008
@@ -16,18 +16,19 @@
  */
 package org.apache.jackrabbit.spi2jcr;
 
-import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver;
-import org.apache.jackrabbit.spi.commons.conversion.NameException;
 import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.commons.conversion.NameException;
+import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver;
 
-import javax.jcr.RepositoryException;
+import javax.jcr.NamespaceException;
 import javax.jcr.Node;
+import javax.jcr.NodeIterator;
 import javax.jcr.PropertyIterator;
-import javax.jcr.NamespaceException;
+import javax.jcr.RepositoryException;
 import javax.jcr.nodetype.NodeType;
-import java.util.List;
 import java.util.ArrayList;
 import java.util.Iterator;
+import java.util.List;
 
 /**
  * <code>NodeInfoImpl</code> implements a <code>NodeInfo</code> on top of a JCR
@@ -53,7 +54,8 @@
                 resolver.getQName(node.getPrimaryNodeType().getName()),
                 getNodeTypeNames(node.getMixinNodeTypes(), resolver),
                 getPropertyIds(node.getReferences(), resolver, idFactory),
-                getPropertyIds(node.getProperties(), resolver, idFactory));
+                getPropertyIds(node.getProperties(), resolver, idFactory),
+                getChildInfos(node.getNodes(), resolver));
     }
 
     /**
@@ -98,4 +100,13 @@
         }
         return references.iterator();
     }
+
+    private static Iterator getChildInfos(NodeIterator childNodes,
+                                          NamePathResolver resolver) throws RepositoryException {
+        List childInfos = new ArrayList();
+        while (childNodes.hasNext()) {
+            childInfos.add(new ChildInfoImpl(childNodes.nextNode(), resolver));
+        }
+        return childInfos.iterator();
+    }
 }

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=654826&r1=654825&r2=654826&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 Fri May  9 07:37:21 2008
@@ -272,17 +272,6 @@
     /**
      * {@inheritDoc}
      */
-    public NodeId getRootId(SessionInfo sessionInfo)
-            throws RepositoryException {
-
-        SessionInfoImpl sInfo = getSessionInfoImpl(sessionInfo);
-        return idFactory.createNodeId(sInfo.getSession().getRootNode(),
-                sInfo.getNamePathResolver());
-    }
-
-    /**
-     * {@inheritDoc}
-     */
     public QNodeDefinition getNodeDefinition(SessionInfo sessionInfo,
                                              NodeId nodeId)
             throws RepositoryException {
@@ -315,26 +304,6 @@
     /**
      * {@inheritDoc}
      */
-    public boolean exists(SessionInfo sessionInfo, ItemId itemId)
-            throws RepositoryException {
-        SessionInfoImpl sInfo = getSessionInfoImpl(sessionInfo);
-        try {
-            if (itemId.denotesNode()) {
-                getNode((NodeId) itemId, sInfo);
-            } else {
-                getProperty((PropertyId) itemId, sInfo);
-            }
-        } catch (ItemNotFoundException e) {
-            return false;
-        } catch (PathNotFoundException e) {
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
     public NodeInfo getNodeInfo(SessionInfo sessionInfo, NodeId nodeId)
             throws ItemNotFoundException, RepositoryException {
         SessionInfoImpl sInfo = getSessionInfoImpl(sessionInfo);
@@ -684,7 +653,7 @@
         executeWithLocalEvents(new Callable() {
             public Object run() throws RepositoryException {
                 Version v = (Version) getNode(versionId, sInfo);
-                if (exists(sessionInfo, nodeId)) {
+                if (hasNode(sessionInfo, nodeId)) {
                     Node n = getNode(nodeId, sInfo);
                     n.restore(v, removeExisting);
                 } else {
@@ -700,7 +669,7 @@
                         while (degree < path.getLength()) {
                             Path ancestorPath = path.getAncestor(degree);
                             NodeId parentId = idFactory.createNodeId(nodeId.getUniqueID(), ancestorPath);
-                            if (exists(sessionInfo, parentId)) {
+                            if (hasNode(sessionInfo, parentId)) {
                                 n = getNode(parentId, sInfo);
                                 relPath = ancestorPath.computeRelativePath(path);
                             }
@@ -718,6 +687,18 @@
         }, sInfo);
     }
 
+    private boolean hasNode(SessionInfo sessionInfo, NodeId nodeId) throws RepositoryException {
+        SessionInfoImpl sInfo = getSessionInfoImpl(sessionInfo);
+        try {
+            getNode(nodeId, sInfo);
+        } catch (ItemNotFoundException e) {
+            return false;
+        } catch (PathNotFoundException e) {
+            return false;
+        }
+        return true;
+    }
+
     /**
      * {@inheritDoc}
      */