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 2006/08/08 15:39:27 UTC

svn commit: r429652 [1/2] - in /jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi: ./ lock/ operation/ query/ state/ util/ version/ xml/

Author: angela
Date: Tue Aug  8 06:39:25 2006
New Revision: 429652

URL: http://svn.apache.org/viewvc?rev=429652&view=rev
Log:
work in progress

- HierarchyManager: changes methods to take ItemState instead of ItemId
- HierarchyManager: remove log-utility methods (saveGetJCRPath)
- HierarchyManager: remove CachingHierachyManager. not used
- ItemManager: changes methods to take ItemState instead of ItemId
- ItemStateValidator: remove utility methods not related to validation
- new class LogUtil that provides static saveGetJCRPath methods previously
  present on HierarchyManager, ItemStateValidator
- NodeState: add method 'getPropertyEntries()'
- create interface ChildPropertyEntry
- let PropertyReference implement ChildPropertyEntry

TODO: query/NodeIteratorImpl needs to be fixed. 

Added:
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ChildPropertyEntry.java   (with props)
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/util/LogUtil.java   (with props)
Removed:
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/CachingHierarchyManager.java
Modified:
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/HierarchyManager.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/HierarchyManagerImpl.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ItemImpl.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ItemManager.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ItemManagerImpl.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/LazyItemIterator.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/NodeImpl.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/PropertyImpl.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceImpl.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ZombieHierarchyManager.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/DefaultLockManager.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/LockManager.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/LockManagerImpl.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/AbstractCopy.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/AbstractOperation.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/Clone.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/Copy.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/Move.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/NodeIteratorImpl.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemStateValidator.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/NodeState.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/PropertyReference.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/SessionItemStateManager.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionHistoryImpl.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/xml/ImporterImpl.java

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/HierarchyManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/HierarchyManager.java?rev=429652&r1=429651&r2=429652&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/HierarchyManager.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/HierarchyManager.java Tue Aug  8 06:39:25 2006
@@ -20,11 +20,11 @@
 import org.apache.jackrabbit.name.QName;
 import org.apache.jackrabbit.spi.ItemId;
 import org.apache.jackrabbit.spi.NodeId;
+import org.apache.jackrabbit.jcr2spi.state.ItemState;
 
 import javax.jcr.ItemNotFoundException;
 import javax.jcr.PathNotFoundException;
 import javax.jcr.RepositoryException;
-import javax.jcr.Item;
 
 /**
  * The <code>HierarchyManager</code> interface ...
@@ -32,58 +32,45 @@
 public interface HierarchyManager {
 
     /**
-     * Returns the id of the given <code>Item</code>.
-     *
-     * @param item
-     * @return
-     * @throws PathNotFoundException
-     * @throws RepositoryException
-     */
-    ItemId getItemId(Item item) throws PathNotFoundException, RepositoryException;
-
-    // DIFF JR: renamed from 'resolveQPath'
-    /**
-     * Resolves a path into an item id.
+     * Resolves a path into an item state.
      *
      * @param qPath
      * @return
      * @throws PathNotFoundException
      * @throws RepositoryException
      */
-    ItemId getItemId(Path qPath) throws PathNotFoundException, RepositoryException;
+    ItemState getItemState(Path qPath) throws PathNotFoundException, RepositoryException;
 
     /**
-     * Returns the path to the given item.
+     * Returns the path to the item represented by the given state object.
      *
-     * @param id
+     * @param itemState
      * @return
      * @throws ItemNotFoundException
      * @throws RepositoryException
      */
-    Path getQPath(ItemId id) throws ItemNotFoundException, RepositoryException;
+    Path getQPath(ItemState itemState) throws ItemNotFoundException, RepositoryException;
 
     /**
-     * Returns the name of the specified item.
+     * Returns the qualified name of the specified item state.
      *
-     * @param id id of item whose name should be returned
+     * @param itemState state of item whose name should be returned
      * @return
      * @throws ItemNotFoundException
      * @throws RepositoryException
      */
-    QName getQName(ItemId id) throws ItemNotFoundException, RepositoryException;
+    QName getQName(ItemState itemState) throws ItemNotFoundException, RepositoryException;
 
     /**
      * Returns the depth of the specified item which is equivalent to
      * <code>getQPath(id).getAncestorCount()</code>. The depth reflects the
      * absolute hierarchy level.
      *
-     * @param id item id
+     * @param itemState item state
      * @return the depth of the specified item
-     * @throws ItemNotFoundException if the specified <code>id</code> does not
-     *                               denote an existing item.
-     * @throws RepositoryException   if another error occurs
+     * @throws RepositoryException if another error occurs
      */
-    int getDepth(ItemId id) throws ItemNotFoundException, RepositoryException;
+    int getDepth(ItemState itemState) throws ItemNotFoundException, RepositoryException;
 
     /**
      * Returns the depth of the specified descendant relative to the given
@@ -102,22 +89,4 @@
      */
     int getRelativeDepth(NodeId ancestorId, ItemId descendantId)
             throws ItemNotFoundException, RepositoryException;
-
-     /**
-     * Failsafe conversion of an <code>ItemId</code> to JCR path for use in
-     * error messages etc.
-     *
-     * @param itemId id to convert
-     * @return JCR path
-     */
-    String safeGetJCRPath(ItemId itemId);
-
-     /**
-     * Failsafe conversion of internal <code>Path</code> to JCR path for use in
-     * error messages etc.
-     *
-     * @param qPath path to convert
-     * @return JCR path
-     */
-    String safeGetJCRPath(Path qPath);
 }

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/HierarchyManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/HierarchyManagerImpl.java?rev=429652&r1=429651&r2=429652&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/HierarchyManagerImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/HierarchyManagerImpl.java Tue Aug  8 06:39:25 2006
@@ -23,11 +23,11 @@
 import org.apache.jackrabbit.jcr2spi.state.NodeState;
 import org.apache.jackrabbit.jcr2spi.state.PropertyState;
 import org.apache.jackrabbit.jcr2spi.state.ChildNodeEntry;
+import org.apache.jackrabbit.jcr2spi.util.LogUtil;
 import org.apache.jackrabbit.name.NamespaceResolver;
 import org.apache.jackrabbit.name.NoPrefixDeclaredException;
 import org.apache.jackrabbit.spi.NodeId;
 import org.apache.jackrabbit.spi.ItemId;
-import org.apache.jackrabbit.spi.PropertyId;
 import org.apache.jackrabbit.name.QName;
 import org.apache.jackrabbit.name.Path;
 import org.apache.jackrabbit.name.MalformedPathException;
@@ -38,7 +38,6 @@
 import javax.jcr.ItemNotFoundException;
 import javax.jcr.PathNotFoundException;
 import javax.jcr.RepositoryException;
-import javax.jcr.Item;
 
 /**
  * <code>HierarchyManagerImpl</code> ...
@@ -47,9 +46,7 @@
 
     private static Logger log = LoggerFactory.getLogger(HierarchyManagerImpl.class);
 
-    // DIFF JR: QName.ROOT replaces the EMPTY_NAME QName defined in JR....
-
-    // TODO: TO-BE-FIXED. With SPI_ItemId rootId must not be stored separately    
+    // TODO: TO-BE-FIXED. With SPI_ItemId rootId must not be stored separately
     protected final NodeId rootNodeId;
     protected final ItemStateManager itemStateManager;
     // used for outputting user-friendly paths and names
@@ -67,10 +64,6 @@
         return rootNodeId;
     }
 
-    public NamespaceResolver getNamespaceResolver() {
-        return nsResolver;
-    }
-
     //---------------------------------------------------------< overridables >
     /**
      * Return an item state, given its item id.
@@ -116,6 +109,15 @@
     }
 
     /**
+     *
+     * @param state
+     * @return
+     */
+    protected NodeState getParentState(ItemState state) {
+        return state.getParent();
+    }
+
+    /**
      * Returns the <code>ChildNodeEntry</code> of <code>parent</code> with the
      * specified <code>uuid</code> or <code>null</code> if there's no such entry.
      * <p/>
@@ -155,47 +157,21 @@
     }
 
     /**
-     * Resolve a path into an item id. Recursively invoked method that may be
-     * overridden by some subclass to either return cached responses or add
-     * response to cache.
-     *
-     * @param path full path of item to resolve
-     * @param id   intermediate item id
-     * @param next next path element index to resolve
-     * @return the id of the item denoted by <code>path</code>
-     */
-    protected ItemId resolvePath(Path path, ItemId id, int next)
-            throws RepositoryException {
-
-        try {
-            return resolvePath(path, getItemState(id), next);
-        } catch (NoSuchItemStateException e) {
-            String msg = "failed to retrieve state of intermediary node";
-            log.debug(msg);
-            throw new RepositoryException(msg, e);
-        } catch (ItemStateException e) {
-            String msg = "failed to retrieve state of intermediary node";
-            log.debug(msg);
-            throw new RepositoryException(msg, e);
-        }
-    }
-
-    /**
-     * Resolve a path into an item id. Recursively invoked method that may be
+     * Resolve a path into an item state. Recursively invoked method that may be
      * overridden by some subclass to either return cached responses or add
      * response to cache.
      *
      * @param path  full path of item to resolve
      * @param state intermediate state
      * @param next  next path element index to resolve
-     * @return the id of the item denoted by <code>path</code>
+     * @return the state of the item denoted by <code>path</code>
      */
-    protected ItemId resolvePath(Path path, ItemState state, int next)
-            throws PathNotFoundException, ItemStateException {
+    protected ItemState resolvePath(Path path, ItemState state, int next)
+        throws PathNotFoundException, RepositoryException {
 
         Path.PathElement[] elements = path.getElements();
         if (elements.length == next) {
-            return state.getId();
+            return state;
         }
         Path.PathElement elem = elements[next];
 
@@ -203,27 +179,37 @@
         int index = elem.getNormalizedIndex();
 
         NodeState parentState = (NodeState) state;
-        ItemId childId;
+        ItemState childState;
 
         if (parentState.hasChildNodeEntry(name, index)) {
             // child node
             ChildNodeEntry nodeEntry = getChildNodeEntry(parentState, name, index);
-            childId = nodeEntry.getId();
+            try {
+                childState = nodeEntry.getNodeState();
+            } catch (ItemStateException e) {
+                // should never occur
+                throw new RepositoryException(e);
+            }
         } else if (parentState.hasPropertyName(name)) {
             // property
-            if (index > org.apache.jackrabbit.name.Path.INDEX_DEFAULT) {
+            if (index > Path.INDEX_DEFAULT) {
                 // properties can't have same name siblings
-                throw new PathNotFoundException(safeGetJCRPath(path));
+                throw new PathNotFoundException(LogUtil.safeGetJCRPath(path, nsResolver));
             } else if (next < elements.length - 1) {
                 // property is not the last element in the path
-                throw new PathNotFoundException(safeGetJCRPath(path));
+                throw new PathNotFoundException(LogUtil.safeGetJCRPath(path, nsResolver));
+            }
+            try {
+                childState = parentState.getPropertyState(name);
+            } catch (ItemStateException e) {
+                // should never occur
+                throw new RepositoryException(e);
             }
-            childId = parentState.getPropertyState(name).getId();
         } else {
             // no such item
-            throw new PathNotFoundException(safeGetJCRPath(path));
+            throw new PathNotFoundException(LogUtil.safeGetJCRPath(path, nsResolver));
         }
-        return resolvePath(path, getItemState(childId), next + 1);
+        return resolvePath(path, childState, next + 1);
     }
 
     /**
@@ -280,99 +266,68 @@
         }
     }
 
-    //-----------------------------------------------------< HierarchyManager >
+    //---------------------------------------------------< HierarchyManager >---
     /**
-     * {@inheritDoc}
+     * @see HierarchyManager#getItemState(Path)
      */
-    public ItemId getItemId(Item item) throws PathNotFoundException, RepositoryException {
-        if (item instanceof ItemImpl) {
-            return ((ItemImpl)item).getId();
-        } else {
-            try {
-                return getItemId(PathFormat.parse(item.getPath(), nsResolver));
-            } catch (MalformedPathException e) {
-                // should not occur.
-                throw new RepositoryException(e);
+    public ItemState getItemState(Path qPath) throws PathNotFoundException, RepositoryException {
+        try {
+            ItemState rootState = itemStateManager.getItemState(rootNodeId);
+            // shortcut
+            if (qPath.denotesRoot()) {
+                return rootState;
             }
-        }
-    }
 
-    /**
-     * {@inheritDoc}
-     */
-    public ItemId getItemId(Path qPath)
-            throws PathNotFoundException, RepositoryException {
-        // shortcut
-        if (qPath.denotesRoot()) {
-            return rootNodeId;
-        }
+            if (!qPath.isCanonical()) {
+                String msg = "path is not canonical";
+                log.debug(msg);
+                throw new RepositoryException(msg);
+            }
 
-        if (!qPath.isCanonical()) {
-            String msg = "path is not canonical";
-            log.debug(msg);
-            throw new RepositoryException(msg);
+            return resolvePath(qPath, rootState, 1);
+        } catch (ItemStateException e) {
+            // should never occur
+            throw new RepositoryException(e);
         }
-
-        return resolvePath(qPath, rootNodeId, 1);
     }
 
     /**
-     * {@inheritDoc}
+     * @see HierarchyManager#getQPath(ItemState)
      */
-    public Path getQPath(ItemId id)
-            throws ItemNotFoundException, RepositoryException {
-        // shortcut
-        if (id.equals(rootNodeId)) {
-            return Path.ROOT;
-        }
+    public Path getQPath(ItemState itemState) throws ItemNotFoundException, RepositoryException {
 
         Path.PathBuilder builder = new Path.PathBuilder();
-
         try {
-            buildPath(builder, getItemState(id));
+            buildPath(builder, itemState);
             return builder.getPath();
-        } catch (NoSuchItemStateException nsise) {
-            String msg = "failed to build path of " + id;
+        } catch (NoSuchItemStateException e) {
+            String msg = "failed to build path of " + itemState.getId();
             log.debug(msg);
-            throw new ItemNotFoundException(msg, nsise);
-        } catch (ItemStateException ise) {
-            String msg = "failed to build path of " + id;
+            throw new ItemNotFoundException(msg, e);
+        } catch (ItemStateException e) {
+            String msg = "failed to build path of " + itemState.getId();
             log.debug(msg);
-            throw new RepositoryException(msg, ise);
+            throw new RepositoryException(msg, e);
         } catch (MalformedPathException e) {
-            String msg = "failed to build path of " + id;
+            String msg = "failed to build path of " + itemState.getId();
             throw new RepositoryException(msg, e);
         }
     }
 
     /**
-     * {@inheritDoc}
+     * @see HierarchyManager#getQName(ItemState)
      */
-    public QName getQName(ItemId itemId)
+    public QName getQName(ItemState itemState)
             throws ItemNotFoundException, RepositoryException {
-        if (itemId.denotesNode()) {
-            NodeId nodeId = (NodeId) itemId;
-            NodeState parentState;
-            try {
-                NodeState nodeState = (NodeState) getItemState(nodeId);
-                NodeId parentId= getParentId(nodeState);
-                if (parentId == null) {
-                    // this is the root or an orphaned node
-                    return QName.ROOT;
-                }
-                parentState = (NodeState) getItemState(parentId);
-            } catch (NoSuchItemStateException nsis) {
-                String msg = "failed to resolve name of " + nodeId;
-                log.debug(msg);
-                throw new ItemNotFoundException(nodeId.toString());
-            } catch (ItemStateException ise) {
-                String msg = "failed to resolve name of " + nodeId;
-                log.debug(msg);
-                throw new RepositoryException(msg, ise);
+        if (itemState.isNode()) {
+            NodeState parentState = itemState.getParent();
+            if (parentState == null) {
+                // shortcut. the given state represents the root or an orphaned node
+                return QName.ROOT;
             }
 
-            ChildNodeEntry entry =
-                    getChildNodeEntry(parentState, nodeId);
+            NodeId nodeId = ((NodeState)itemState).getNodeId();
+            ChildNodeEntry entry = getChildNodeEntry(parentState, nodeId);
             if (entry == null) {
                 String msg = "failed to resolve name of " + nodeId;
                 log.debug(msg);
@@ -380,38 +335,22 @@
             }
             return entry.getName();
         } else {
-            return ((PropertyId) itemId).getQName();
+            return ((PropertyState)itemState).getQName();
         }
     }
 
     /**
-     * {@inheritDoc}
+     * @see HierarchyManager#getDepth(ItemState)
      */
-    public int getDepth(ItemId id)
-            throws ItemNotFoundException, RepositoryException {
-        int depth = org.apache.jackrabbit.name.Path.ROOT_DEPTH;
-        // shortcut
-        if (id.equals(rootNodeId)) {
-            return depth;
-        }
-        try {
-            ItemState state = getItemState(id);
-            NodeId parentId = getParentId(state);
-            while (parentId != null) {
-                depth++;
-                state = getItemState(parentId);
-                parentId = getParentId(state);
-            }
-            return depth;
-        } catch (NoSuchItemStateException nsise) {
-            String msg = "failed to determine depth of " + id;
-            log.debug(msg);
-            throw new ItemNotFoundException(msg, nsise);
-        } catch (ItemStateException ise) {
-            String msg = "failed to determine depth of " + id;
-            log.debug(msg);
-            throw new RepositoryException(msg, ise);
+    public int getDepth(ItemState itemState) throws ItemNotFoundException, RepositoryException {
+        int depth = Path.ROOT_DEPTH;
+        NodeState parentState = getParentState(itemState);
+        while (parentState != null) {
+            depth++;
+            itemState = parentState;
+            parentState = getParentState(itemState);
         }
+        return depth;
     }
 
     /**
@@ -446,31 +385,6 @@
                     + " relative to " + ancestorId;
             log.debug(msg);
             throw new RepositoryException(msg, ise);
-        }
-    }
-
-    /**
-     * @see HierarchyManager#safeGetJCRPath(ItemId)
-     */
-    public String safeGetJCRPath(ItemId itemId) {
-        try {
-            return safeGetJCRPath(getQPath(itemId));
-        } catch (RepositoryException e) {
-            log.error("failed to convert " + itemId + " to JCR path.");
-            return itemId.toString();
-        }
-    }
-
-    /**
-     * @see HierarchyManager#safeGetJCRPath(Path)
-     */
-    public String safeGetJCRPath(Path qPath) {
-        try {
-            return PathFormat.format(qPath, nsResolver);
-        } catch (NoPrefixDeclaredException npde) {
-            log.error("failed to convert " + qPath + " to JCR path.");
-            // return string representation of internal path as a fallback
-            return qPath.toString();
         }
     }
 }

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ItemImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ItemImpl.java?rev=429652&r1=429651&r2=429652&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ItemImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ItemImpl.java Tue Aug  8 06:39:25 2006
@@ -27,6 +27,7 @@
 import org.apache.jackrabbit.jcr2spi.state.PropertyState;
 import org.apache.jackrabbit.jcr2spi.operation.Remove;
 import org.apache.jackrabbit.jcr2spi.operation.Operation;
+import org.apache.jackrabbit.jcr2spi.util.LogUtil;
 import org.apache.jackrabbit.name.NoPrefixDeclaredException;
 import org.apache.jackrabbit.name.Path;
 import org.apache.jackrabbit.spi.QPropertyDefinition;
@@ -162,7 +163,7 @@
             // shortcut
             return Path.ROOT_DEPTH;
         }
-        return session.getHierarchyManager().getDepth(state.getParent().getId());
+        return session.getHierarchyManager().getDepth(state);
     }
 
     /**
@@ -602,7 +603,7 @@
      * @return the primary path to this <code>Item</code>
      */
     Path getQPath() throws RepositoryException {
-        return session.getHierarchyManager().getQPath(id);
+        return session.getHierarchyManager().getQPath(state);
     }
 
     /**
@@ -631,6 +632,6 @@
      * @return JCR path
      */
     String safeGetJCRPath() {
-        return session.getHierarchyManager().safeGetJCRPath(getId());
+        return LogUtil.safeGetJCRPath(getItemState(), session.getNamespaceResolver(), session.getHierarchyManager());
     }
 }

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ItemManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ItemManager.java?rev=429652&r1=429651&r2=429652&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ItemManager.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ItemManager.java Tue Aug  8 06:39:25 2006
@@ -18,7 +18,8 @@
 
 import org.apache.jackrabbit.name.Path;
 import org.apache.jackrabbit.spi.ItemId;
-import org.apache.jackrabbit.spi.NodeId;
+import org.apache.jackrabbit.jcr2spi.state.ItemState;
+import org.apache.jackrabbit.jcr2spi.state.NodeState;
 
 import javax.jcr.PathNotFoundException;
 import javax.jcr.AccessDeniedException;
@@ -50,10 +51,11 @@
     /**
      * Checks if the item with the given id exists.
      *
-     * @param id id of the item to be checked
+     * @param itemState state of the item to be checked
      * @return true if the specified item exists
      */
-    public boolean itemExists(ItemId id);
+    public boolean itemExists(ItemState itemState);
+
 
     /**
      * @param path
@@ -63,57 +65,60 @@
      * @throws javax.jcr.RepositoryException
      */
     public ItemImpl getItem(Path path)
-            throws PathNotFoundException, AccessDeniedException, RepositoryException;
+        throws PathNotFoundException, AccessDeniedException, RepositoryException;
 
     /**
-     * @param id
+     *
+     * @param itemState
      * @return
-     * @throws javax.jcr.RepositoryException
+     * @throws ItemNotFoundException
+     * @throws AccessDeniedException
+     * @throws RepositoryException
      */
-    public ItemImpl getItem(ItemId id)
-            throws ItemNotFoundException, AccessDeniedException, RepositoryException;
+    public ItemImpl getItem(ItemState itemState)
+        throws ItemNotFoundException, AccessDeniedException, RepositoryException;
 
     /**
      *
-     * @param parentId
+     * @param parentState
      * @return
      * @throws ItemNotFoundException
      * @throws AccessDeniedException
      * @throws RepositoryException
      */
-    public boolean hasChildNodes(NodeId parentId) throws ItemNotFoundException,
-        AccessDeniedException, RepositoryException;
+    public boolean hasChildNodes(NodeState parentState)
+        throws ItemNotFoundException, AccessDeniedException, RepositoryException;
 
     /**
      *
-     * @param parentId
+     * @param parentState
      * @return
      * @throws ItemNotFoundException
      * @throws AccessDeniedException
      * @throws RepositoryException
      */
-    public NodeIterator getChildNodes(NodeId parentId)
-            throws ItemNotFoundException, AccessDeniedException, RepositoryException;
+    public NodeIterator getChildNodes(NodeState parentState)
+        throws ItemNotFoundException, AccessDeniedException, RepositoryException;
 
     /**
      *
-     * @param parentId
+     * @param parentState
      * @return
      * @throws ItemNotFoundException
      * @throws AccessDeniedException
      * @throws RepositoryException
      */
-    public boolean hasChildProperties(NodeId parentId)
+    public boolean hasChildProperties(NodeState parentState)
             throws ItemNotFoundException, AccessDeniedException, RepositoryException;
 
     /**
      *
-     * @param parentId
+     * @param parentState
      * @return
      * @throws ItemNotFoundException
      * @throws AccessDeniedException
      * @throws RepositoryException
      */
-    public PropertyIterator getChildProperties(NodeId parentId)
+    public PropertyIterator getChildProperties(NodeState parentState)
             throws ItemNotFoundException, AccessDeniedException, RepositoryException;
 }

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ItemManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ItemManagerImpl.java?rev=429652&r1=429651&r2=429652&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ItemManagerImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ItemManagerImpl.java Tue Aug  8 06:39:25 2006
@@ -17,13 +17,12 @@
 package org.apache.jackrabbit.jcr2spi;
 
 import org.apache.jackrabbit.jcr2spi.state.ItemState;
-import org.apache.jackrabbit.jcr2spi.state.ItemStateException;
-import org.apache.jackrabbit.jcr2spi.state.ItemStateManager;
-import org.apache.jackrabbit.jcr2spi.state.NoSuchItemStateException;
 import org.apache.jackrabbit.jcr2spi.state.NodeState;
 import org.apache.jackrabbit.jcr2spi.state.PropertyState;
 import org.apache.jackrabbit.jcr2spi.state.ChildNodeEntry;
+import org.apache.jackrabbit.jcr2spi.state.ChildPropertyEntry;
 import org.apache.jackrabbit.jcr2spi.util.Dumpable;
+import org.apache.jackrabbit.jcr2spi.util.LogUtil;
 import org.apache.jackrabbit.jcr2spi.version.VersionHistoryImpl;
 import org.apache.jackrabbit.jcr2spi.version.VersionImpl;
 import org.apache.jackrabbit.name.QName;
@@ -43,7 +42,6 @@
 import javax.jcr.nodetype.NodeDefinition;
 import javax.jcr.nodetype.PropertyDefinition;
 import java.io.PrintStream;
-import java.util.ArrayList;
 import java.util.Iterator;
 
 /**
@@ -75,7 +73,7 @@
 
     private final SessionImpl session;
 
-    private final ItemStateManager itemStateMgr;
+    //private final ItemStateManager itemStateMgr;
     private final HierarchyManager hierMgr;
 
     /**
@@ -87,185 +85,16 @@
     /**
      * Creates a new per-session instance <code>ItemManagerImpl</code> instance.
      *
-     * @param itemStateMgr the item state itemStateManager associated with
-     * the new instance
+     * @param hierMgr HierarchyManager associated with the new instance
      * @param session the session associated with the new instance
      */
-    ItemManagerImpl(ItemStateManager itemStateMgr, HierarchyManager hierMgr,
-                    SessionImpl session) {
-        this.itemStateMgr = itemStateMgr;
+    ItemManagerImpl(HierarchyManager hierMgr, SessionImpl session) {
         this.hierMgr = hierMgr;
         this.session = session;
         // setup item cache with weak references to items
         itemCache = new DefaultIdKeyMap(); // TODO, JR: new ReferenceMap(ReferenceMap.HARD, ReferenceMap.WEAK);
     }
 
-    private NodeDefinition getDefinition(NodeState state)
-            throws RepositoryException {
-        NodeState parentState = state.getParent();
-        NodeDefinition def = session.getItemDefinitionManager().getNodeDefinition(state, parentState);
-        return def;
-    }
-
-    private PropertyDefinition getDefinition(PropertyState state)
-        throws RepositoryException {
-        // fallback: try finding applicable definition
-        NodeState parentState = state.getParent();
-        PropertyDefinition def = session.getItemDefinitionManager().getPropertyDefinition(state, parentState);
-        return def;
-    }
-
-    /**
-     * Retrieves state of item with given <code>id</code>. If the specified item
-     * doesn't exist an <code>ItemNotFoundException</code> will be thrown.
-     * If the item exists but the current session is not granted read access an
-     * <code>AccessDeniedException</code> will be thrown.
-     *
-     * @param id id of item to be retrieved
-     * @return state state of said item
-     * @throws ItemNotFoundException if no item with given <code>id</code> exists
-     * @throws AccessDeniedException if the current session is not allowed to
-     *                               read the said item
-     * @throws RepositoryException   if another error occurs
-     */
-    private ItemState getItemState(ItemId id)
-            throws ItemNotFoundException, AccessDeniedException,
-            RepositoryException {
-        // check privileges
-        if (!session.getAccessManager().canRead(id)) {
-            // clear cache
-            ItemImpl item = retrieveItem(id);
-            if (item != null) {
-                evictItem(id);
-            }
-            throw new AccessDeniedException("cannot read item " + id);
-        }
-
-        try {
-            return itemStateMgr.getItemState(id);
-        } catch (NoSuchItemStateException nsise) {
-            String msg = "no such item: " + id;
-            log.debug(msg);
-            throw new ItemNotFoundException(msg);
-        } catch (ItemStateException ise) {
-            String msg = "failed to retrieve item state of " + id;
-            log.error(msg);
-            throw new RepositoryException(msg, ise);
-        }
-    }
-
-    //-------------------------------------------------< item factory methods >
-    private ItemImpl createItemInstance(ItemId id)
-            throws ItemNotFoundException, RepositoryException {
-        // create instance of item using its state object
-        ItemImpl item;
-        ItemState state;
-        try {
-            state = itemStateMgr.getItemState(id);
-        } catch (NoSuchItemStateException nsise) {
-            throw new ItemNotFoundException(id.toString());
-        } catch (ItemStateException ise) {
-            String msg = "failed to retrieve item state of item " + id;
-            log.error(msg, ise);
-            throw new RepositoryException(msg, ise);
-        }
-
-        if (state.isNode()) {
-            item = createNodeInstance((NodeState) state);
-        } else {
-            item = createPropertyInstance((PropertyState) state);
-        }
-        return item;
-    }
-
-    private NodeImpl createNodeInstance(NodeState state, NodeDefinition def)
-            throws RepositoryException {
-        // DIFF JR: no need to build NodeId from state
-        // we want to be informed on life cycle changes of the new node object
-        // in order to maintain item cache consistency
-        ItemLifeCycleListener[] listeners = new ItemLifeCycleListener[]{this};
-
-        // check special nodes
-        if (state.getNodeTypeName().equals(QName.NT_VERSION)) {
-            // version
-            return new VersionImpl(this, session, state, def, listeners);
-        } else if (state.getNodeTypeName().equals(QName.NT_VERSIONHISTORY)) {
-            // version-history
-            return new VersionHistoryImpl(this, session, state, def, listeners);
-        } else {
-            // create common node object
-            return new NodeImpl(this, session, state, def, listeners);
-        }
-
-    }
-
-    private NodeImpl createNodeInstance(NodeState state) throws RepositoryException {
-        // 1. get definition of the specified node
-        NodeDefinition def = getDefinition(state);
-        // 2. create instance
-        return createNodeInstance(state, def);
-    }
-
-    private PropertyImpl createPropertyInstance(PropertyState state,
-                                                PropertyDefinition def) {
-        // we want to be informed on life cycle changes of the new property object
-        // in order to maintain item cache consistency
-        ItemLifeCycleListener[] listeners = new ItemLifeCycleListener[]{this};
-        // create property object
-        PropertyImpl prop = new PropertyImpl(this, session, state, def, listeners);
-        return prop;
-    }
-
-    private PropertyImpl createPropertyInstance(PropertyState state)
-            throws RepositoryException {
-        // 1. get definition for the specified property
-        PropertyDefinition def = getDefinition(state);
-        // 2. create instance
-        return createPropertyInstance(state, def);
-    }
-
-    //---------------------------------------------------< item cache methods >
-
-    /**
-     * Returns an item reference from the cache.
-     *
-     * @param id id of the item that should be retrieved.
-     * @return the item reference stored in the corresponding cache entry
-     *         or <code>null</code> if there's no corresponding cache entry.
-     */
-    private ItemImpl retrieveItem(ItemId id) {
-        return (ItemImpl) itemCache.get(id);
-    }
-
-    /**
-     * Puts the reference of an item in the cache with
-     * the item's path as the key.
-     *
-     * @param item the item to cache
-     */
-    private void cacheItem(ItemImpl item) {
-        ItemId id = item.getId();
-        if (itemCache.containsKey(id)) {
-            log.warn("overwriting cached item " + id);
-        }
-        if (log.isDebugEnabled()) {
-            log.debug("caching item " + id);
-        }
-        itemCache.put(id, item);
-    }
-
-    /**
-     * Removes a cache entry for a specific item.
-     *
-     * @param id id of the item to remove from the cache
-     */
-    private void evictItem(ItemId id) {
-        if (log.isDebugEnabled()) {
-            log.debug("removing item " + id + " from cache");
-        }
-        itemCache.remove(id);
-    }
-
     //--------------------------------------------------------< ItemManager >---
     /**
      * @inheritDoc
@@ -281,22 +110,10 @@
         try {
             // check sanity of session
             session.checkIsAlive();
+            // permissions are checked upon itemExists(ItemState)
 
-            ItemId id = hierMgr.getItemId(path);
-
-            // check if state exists for the given item
-            if (!itemStateMgr.hasItemState(id)) {
-                return false;
-            }
-
-            // check privileges
-            if (!session.getAccessManager().canRead(id)) {
-                // clear cache
-                evictItem(id);
-                // item exists but the session has not been granted read access
-                return false;
-            }
-            return true;
+            ItemState itemState = hierMgr.getItemState(path);
+            return itemExists(itemState);
         } catch (PathNotFoundException pnfe) {
             return false;
         } catch (ItemNotFoundException infe) {
@@ -309,23 +126,15 @@
     /**
      * @inheritDoc
      */
-    public boolean itemExists(ItemId id) {
+    public boolean itemExists(ItemState itemState) {
         try {
             // check sanity of session
             session.checkIsAlive();
-
-            // check if state exists for the given item
-            if (!itemStateMgr.hasItemState(id)) {
-                return false;
-            }
-
             // check privileges
-            if (!session.getAccessManager().canRead(id)) {
-                // clear cache
-                evictItem(id);
-                // item exists but the session has not been granted read access
-                return false;
-            }
+            checkAccess(itemState, true);
+
+            // always return true if access rights are granted, existence
+            // of the state has been asserted before
             return true;
         } catch (ItemNotFoundException infe) {
             return false;
@@ -339,32 +148,31 @@
      */
     public synchronized ItemImpl getItem(Path path)
             throws PathNotFoundException, AccessDeniedException, RepositoryException {
-        ItemId id = hierMgr.getItemId(path);
+        ItemState itemState = hierMgr.getItemState(path);
         try {
-            return getItem(id);
+            return getItem(itemState);
         } catch (ItemNotFoundException infe) {
-            throw new PathNotFoundException(hierMgr.safeGetJCRPath(path));
+            throw new PathNotFoundException(LogUtil.safeGetJCRPath(path, session.getNamespaceResolver()));
         }
     }
 
     /**
      * @inheritDoc
      */
-    public synchronized ItemImpl getItem(ItemId id)
-            throws ItemNotFoundException, AccessDeniedException, RepositoryException {
-        // check sanity of session
-        session.checkIsAlive();
-
-        // check cache
+    public ItemImpl getItem(ItemState itemState) throws ItemNotFoundException, AccessDeniedException, RepositoryException {
+        ItemId id = itemState.getId();
+        // first try to access item from cache
         ItemImpl item = retrieveItem(id);
+        // not yet in cache, need to create instance
         if (item == null) {
-            // not yet in cache, need to create instance:
             // check privileges
-            if (!session.getAccessManager().canRead(id)) {
-                throw new AccessDeniedException("cannot read item " + id);
-            }
+            checkAccess(itemState, false);
             // create instance of item
-            item = createItemInstance(id);
+            if (itemState.isNode()) {
+                item = createNodeInstance((NodeState) itemState);
+            } else {
+                item = createPropertyInstance((PropertyState) itemState);
+            }
         }
         return item;
     }
@@ -372,20 +180,13 @@
     /**
      * @inheritDoc
      */
-    public synchronized boolean hasChildNodes(NodeId parentId)
+    public synchronized boolean hasChildNodes(NodeState parentState)
             throws ItemNotFoundException, AccessDeniedException, RepositoryException {
         // check sanity of session
         session.checkIsAlive();
+        checkAccess(parentState, true);
 
-        ItemState state = getItemState(parentId);
-        if (!state.isNode()) {
-            String msg = "can't list child nodes of property " + parentId;
-            log.debug(msg);
-            throw new RepositoryException(msg);
-        }
-        NodeState nodeState = (NodeState) state;
-        Iterator iter = nodeState.getChildNodeEntries().iterator();
-
+        Iterator iter = parentState.getChildNodeEntries().iterator();
         while (iter.hasNext()) {
             ChildNodeEntry entry = (ChildNodeEntry) iter.next();
             NodeId id = entry.getId();
@@ -400,20 +201,16 @@
     /**
      * @inheritDoc
      */
-    public synchronized NodeIterator getChildNodes(NodeId parentId)
+    public synchronized NodeIterator getChildNodes(NodeState parentState)
             throws ItemNotFoundException, AccessDeniedException, RepositoryException {
         // check sanity of session
         session.checkIsAlive();
+        checkAccess(parentState, true);
 
-        ItemState state = getItemState(parentId);
-        if (!state.isNode()) {
-            String msg = "can't list child nodes of property " + parentId;
-            log.debug(msg);
-            throw new RepositoryException(msg);
-        }
-        NodeState nodeState = (NodeState) state;
+        /*
+        // REMOVED. left check for access to Iterator (getSize() returns -1)
         ArrayList childIds = new ArrayList();
-        Iterator iter = nodeState.getChildNodeEntries().iterator();
+        Iterator iter = parentState.getChildNodeEntries().iterator();
 
         while (iter.hasNext()) {
             ChildNodeEntry entry = (ChildNodeEntry) iter.next();
@@ -423,38 +220,26 @@
                 childIds.add(id);
             }
         }
-
-        return new LazyItemIterator(this, childIds);
+        */
+        return new LazyItemIterator(this, parentState.getChildNodeEntries());
     }
 
     /**
      * @inheritDoc
      */
-    public synchronized boolean hasChildProperties(NodeId parentId)
+    public synchronized boolean hasChildProperties(NodeState parentState)
             throws ItemNotFoundException, AccessDeniedException, RepositoryException {
         // check sanity of session
         session.checkIsAlive();
+        checkAccess(parentState, true);
 
-        ItemState state = getItemState(parentId);
-        if (!state.isNode()) {
-            String msg = "can't list child properties of property " + parentId;
-            log.debug(msg);
-            throw new RepositoryException(msg);
-        }
-        NodeState nodeState = (NodeState) state;
-        Iterator iter = nodeState.getPropertyNames().iterator();
-
+        Iterator iter = parentState.getPropertyEntries().iterator();
         while (iter.hasNext()) {
-            QName propName = (QName) iter.next();
-            try {
-                PropertyId id = nodeState.getPropertyState(propName).getPropertyId();
-                // check read access
-                if (session.getAccessManager().canRead(id)) {
-                    return true;
-                }
-            } catch (ItemStateException e) {
-                // should not occur.
-                throw new RepositoryException(e);
+            ChildPropertyEntry entry = (ChildPropertyEntry) iter.next();
+            PropertyId id = entry.getId();
+            // check read access
+            if (session.getAccessManager().canRead(id)) {
+                return true;
             }
         }
 
@@ -464,25 +249,21 @@
     /**
      * @inheritDoc
      */
-    public synchronized PropertyIterator getChildProperties(NodeId parentId)
+    public synchronized PropertyIterator getChildProperties(NodeState parentState)
             throws ItemNotFoundException, AccessDeniedException, RepositoryException {
         // check sanity of session
         session.checkIsAlive();
+        checkAccess(parentState, true);
 
-        ItemState state = getItemState(parentId);
-        if (!state.isNode()) {
-            String msg = "can't list child properties of property " + parentId;
-            log.debug(msg);
-            throw new RepositoryException(msg);
-        }
-        NodeState nodeState = (NodeState) state;
+        /*
+        // REMOVED. left check for access to Iterator (getSize() returns -1)
         ArrayList childIds = new ArrayList();
-        Iterator iter = nodeState.getPropertyNames().iterator();
+        Iterator iter = parentState.getPropertyNames().iterator();
 
         while (iter.hasNext()) {
             QName propName = (QName) iter.next();
             try {
-                PropertyId id = nodeState.getPropertyState(propName).getPropertyId();
+                PropertyId id = parentState.getPropertyState(propName).getPropertyId();
                 // check read access
                 if (session.getAccessManager().canRead(id)) {
                     childIds.add(id);
@@ -492,11 +273,11 @@
                 throw new RepositoryException(e);
             }
         }
-
-        return new LazyItemIterator(this, childIds);
+        */
+        return new LazyItemIterator(this, parentState.getPropertyEntries());
     }
 
-    //------------------------------------------------< ItemLifeCycleListener >
+    //----------------------------------------------< ItemLifeCycleListener >---
     /**
      * {@inheritDoc}
      */
@@ -532,7 +313,7 @@
         evictItem(id);
     }
 
-    //-------------------------------------------------------------< Dumpable >
+    //-----------------------------------------------------------< Dumpable >---
     /**
      * {@inheritDoc}
      */
@@ -555,7 +336,113 @@
             } else {
                 ps.print("          ");
             }
-            ps.println(id + "\t" + hierMgr.safeGetJCRPath(id) + " (" + item + ")");
+            ps.println(id + "\t" + LogUtil.safeGetJCRPath(item.getItemState(), session.getNamespaceResolver(), hierMgr) + " (" + item + ")");
+        }
+    }
+
+    //----------------------------------------------------< private methods >---
+    private void checkAccess(ItemState state, boolean removeFromCache) throws RepositoryException {
+        // check privileges
+        ItemId id = state.getId();
+        if (!session.getAccessManager().canRead(id)) {
+            if (removeFromCache) {
+                // clear cache
+                ItemImpl item = retrieveItem(id);
+                if (item != null) {
+                    evictItem(id);
+                }
+            }
+            throw new AccessDeniedException("cannot read item " + id);
+        }
+    }
+
+    private NodeImpl createNodeInstance(NodeState state, NodeDefinition def)
+            throws RepositoryException {
+        // we want to be informed on life cycle changes of the new node object
+        // in order to maintain item cache consistency
+        ItemLifeCycleListener[] listeners = new ItemLifeCycleListener[]{this};
+
+        // check special nodes
+        if (state.getNodeTypeName().equals(QName.NT_VERSION)) {
+            // version
+            return new VersionImpl(this, session, state, def, listeners);
+        } else if (state.getNodeTypeName().equals(QName.NT_VERSIONHISTORY)) {
+            // version-history
+            return new VersionHistoryImpl(this, session, state, def, listeners);
+        } else {
+            // create common node object
+            return new NodeImpl(this, session, state, def, listeners);
+        }
+
+    }
+
+    private NodeImpl createNodeInstance(NodeState state) throws RepositoryException {
+        // 1. get definition of the specified node
+        NodeState parentState = state.getParent();
+        NodeDefinition def = session.getItemDefinitionManager().getNodeDefinition(state, parentState);
+        // 2. create instance
+        return createNodeInstance(state, def);
+    }
+
+    private PropertyImpl createPropertyInstance(PropertyState state,
+                                                PropertyDefinition def) {
+        // we want to be informed on life cycle changes of the new property object
+        // in order to maintain item cache consistency
+        ItemLifeCycleListener[] listeners = new ItemLifeCycleListener[]{this};
+        // create property object
+        PropertyImpl prop = new PropertyImpl(this, session, state, def, listeners);
+        return prop;
+    }
+
+    private PropertyImpl createPropertyInstance(PropertyState state)
+            throws RepositoryException {
+        // 1. get definition for the specified property
+        NodeState parentState = state.getParent();
+        PropertyDefinition def = session.getItemDefinitionManager().getPropertyDefinition(state, parentState);
+
+        // 2. create instance
+        return createPropertyInstance(state, def);
+    }
+
+    //---------------------------------------------------< item cache methods >
+
+    /**
+     * Returns an item reference from the cache.
+     *
+     * @param id id of the item that should be retrieved.
+     * @return the item reference stored in the corresponding cache entry
+     *         or <code>null</code> if there's no corresponding cache entry.
+     */
+    private ItemImpl retrieveItem(ItemId id) {
+        return (ItemImpl) itemCache.get(id);
+    }
+
+    /**
+     * Puts the reference of an item in the cache with
+     * the item's path as the key.
+     *
+     * @param item the item to cache
+     */
+    private void cacheItem(ItemImpl item) {
+        ItemId id = item.getId();
+        if (itemCache.containsKey(id)) {
+            log.warn("overwriting cached item " + id);
         }
+        if (log.isDebugEnabled()) {
+            log.debug("caching item " + id);
+        }
+        itemCache.put(id, item);
+    }
+
+    /**
+     * Removes a cache entry for a specific item.
+     *
+     * @param id id of the item to remove from the cache
+     */
+    private void evictItem(ItemId id) {
+        if (log.isDebugEnabled()) {
+            log.debug("removing item " + id + " from cache");
+        }
+        itemCache.remove(id);
     }
 }

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/LazyItemIterator.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/LazyItemIterator.java?rev=429652&r1=429651&r2=429652&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/LazyItemIterator.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/LazyItemIterator.java Tue Aug  8 06:39:25 2006
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.jcr2spi;
 
-import org.apache.jackrabbit.spi.ItemId;
+import org.apache.jackrabbit.jcr2spi.state.ItemState;
 import org.slf4j.LoggerFactory;
 import org.slf4j.Logger;
 
@@ -42,22 +42,20 @@
  * for some reason (e.g. because of insufficient access rights or because they
  * have been removed since the iterator has been retrieved) are silently
  * skipped. As a result the size of the iterator as reported by
- * {@link #getSize()} might appear to be shrinking while iterating over the
- * items.
- * todo should getSize() better always return -1?
- *
- * @see #getSize()
+ * {@link #getSize()} always returns -1.
  */
 public class LazyItemIterator implements NodeIterator, PropertyIterator, VersionIterator {
 
     /** Logger instance for this class */
     private static Logger log = LoggerFactory.getLogger(LazyItemIterator.class);
 
+    private static final long UNDEFINED_SIZE = -1;
+
     /** the item manager that is used to lazily fetch the items */
     private final ItemManager itemMgr;
 
-    /** the list of item ids */
-    private final List idList;
+    /** the list of item states */
+    private final List stateList;
 
     /** the position of the next item */
     private int pos;
@@ -69,11 +67,11 @@
      * Creates a new <code>LazyItemIterator</code> instance.
      *
      * @param itemMgr item manager
-     * @param ids Collection of item id's
+     * @param stateList Collection of item states
      */
-    public LazyItemIterator(ItemManager itemMgr, Collection ids) {
+    public LazyItemIterator(ItemManager itemMgr, Collection stateList) {
         this.itemMgr = itemMgr;
-        this.idList = new ArrayList(ids);
+        this.stateList = new ArrayList(stateList);
         // prefetch first item
         pos = 0;
         prefetchNext();
@@ -88,19 +86,19 @@
     private void prefetchNext() {
         // reset
         next = null;
-        while (next == null && pos < idList.size()) {
-            ItemId id = (ItemId) idList.get(pos);
+        while (next == null && pos < stateList.size()) {
+            ItemState state = (ItemState) stateList.get(pos);
             try {
-                next = itemMgr.getItem(id);
+                next = itemMgr.getItem(state);
             } catch (ItemNotFoundException e) {
-                log.debug("ignoring nonexistent item " + id);
+                log.debug("ignoring nonexistent item " + state);
                 // remove invalid id
-                idList.remove(pos);
+                stateList.remove(pos);
                 // try next
             } catch (RepositoryException e) {
-                log.error("failed to fetch item " + id + ", skipping...", e);
+                log.error("failed to fetch item " + state + ", skipping...", e);
                 // remove invalid id
-                idList.remove(pos);
+                stateList.remove(pos);
                 // try next
             }
         }
@@ -141,15 +139,12 @@
     /**
      * {@inheritDoc}
      * <p/>
-     * Note that the size of the iterator as reported by {@link #getSize()}
-     * might appear to be shrinking while iterating because items that for
-     * some reason cannot be retrieved through this iterator are silently
-     * skipped, thus reducing the size of this iterator.
-     *
-     * todo better to always return -1?
+     * Always returns -1
      */
     public long getSize() {
-        return idList.size();
+        // DIFF JR always return -1, since original list may contains items that
+        // are not accessible due to access constraints
+        return UNDEFINED_SIZE;
     }
 
     /**
@@ -171,21 +166,21 @@
         // skip the first (skipNum - 1) items without actually retrieving them
         while (--skipNum > 0) {
             pos++;
-            if (pos >= idList.size()) {
+            if (pos >= stateList.size()) {
                 // skipped past last item
                 throw new NoSuchElementException();
             }
-            ItemId id = (ItemId) idList.get(pos);
+            ItemState state = (ItemState) stateList.get(pos);
             // eliminate invalid items from this iterator
-            while (!itemMgr.itemExists(id)) {
-                log.debug("ignoring nonexistent item " + id);
+            while (!itemMgr.itemExists(state)) {
+                log.debug("ignoring nonexistent item " + state);
                 // remove invalid id
-                idList.remove(pos);
-                if (pos >= idList.size()) {
+                stateList.remove(pos);
+                if (pos >= stateList.size()) {
                     // skipped past last item
                     throw new NoSuchElementException();
                 }
-                id = (ItemId) idList.get(pos);
+                state = (ItemState) stateList.get(pos);
                 // try next
                 continue;
             }

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/NodeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/NodeImpl.java?rev=429652&r1=429651&r2=429652&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/NodeImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/NodeImpl.java Tue Aug  8 06:39:25 2006
@@ -37,6 +37,7 @@
 import org.apache.jackrabbit.jcr2spi.state.ChildNodeEntry;
 import org.apache.jackrabbit.jcr2spi.state.PropertyState;
 import org.apache.jackrabbit.jcr2spi.state.NoSuchItemStateException;
+import org.apache.jackrabbit.jcr2spi.state.ItemState;
 import org.apache.jackrabbit.jcr2spi.nodetype.NodeTypeManagerImpl;
 import org.apache.jackrabbit.jcr2spi.nodetype.EffectiveNodeType;
 import org.apache.jackrabbit.jcr2spi.nodetype.NodeTypeConflictException;
@@ -48,11 +49,11 @@
 import org.apache.jackrabbit.jcr2spi.operation.Operation;
 import org.apache.jackrabbit.jcr2spi.operation.Update;
 import org.apache.jackrabbit.jcr2spi.lock.LockManager;
+import org.apache.jackrabbit.jcr2spi.version.VersionImpl;
 import org.apache.jackrabbit.spi.QPropertyDefinition;
 import org.apache.jackrabbit.spi.QNodeDefinition;
 import org.apache.jackrabbit.spi.NodeId;
 import org.apache.jackrabbit.spi.PropertyId;
-import org.apache.jackrabbit.spi.ItemId;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -151,7 +152,7 @@
             throw new ItemNotFoundException(msg);
         }
 
-        return (Node) itemMgr.getItem(parentState.getNodeId());
+        return (Node) itemMgr.getItem(parentState);
     }
 
     /**
@@ -419,11 +420,11 @@
      */
     public Node getNode(String relPath) throws PathNotFoundException, RepositoryException {
         checkStatus();
-        NodeId id = resolveRelativeNodePath(relPath);
-        if (id == null) {
+        NodeState state = resolveRelativeNodePath(relPath);
+        if (state == null) {
             throw new PathNotFoundException(relPath);
         }
-        return (Node) itemMgr.getItem(id);
+        return (Node) itemMgr.getItem(state);
     }
 
     /**
@@ -439,7 +440,7 @@
          * recursion!
          */
         try {
-            return itemMgr.getChildNodes(getNodeId());
+            return itemMgr.getChildNodes(getNodeState());
         } catch (ItemNotFoundException infe) {
             String msg = "failed to list the child nodes of " + safeGetJCRPath();
             log.debug(msg);
@@ -467,11 +468,11 @@
      */
     public Property getProperty(String relPath) throws PathNotFoundException, RepositoryException {
         checkStatus();
-        PropertyId id = resolveRelativePropertyPath(relPath);
-        if (id == null) {
+        PropertyState state = resolveRelativePropertyPath(relPath);
+        if (state == null) {
             throw new PathNotFoundException(relPath);
         }
-        return (Property) itemMgr.getItem(id);
+        return (Property) itemMgr.getItem(state);
     }
 
     /**
@@ -480,7 +481,7 @@
     public PropertyIterator getProperties() throws RepositoryException {
         checkStatus();
         try {
-            return itemMgr.getChildProperties(getNodeId());
+            return itemMgr.getChildProperties(getNodeState());
         } catch (ItemNotFoundException infe) {
             String msg = "Failed to list the child properties of " + getPath();
             log.debug(msg);
@@ -574,8 +575,8 @@
      */
     public boolean hasNode(String relPath) throws RepositoryException {
         checkStatus();
-        NodeId id = resolveRelativeNodePath(relPath);
-        return (id != null) ? itemMgr.itemExists(id) : false;
+        NodeState childState = resolveRelativeNodePath(relPath);
+        return (childState != null) ? itemMgr.itemExists(childState) : false;
     }
 
     /**
@@ -583,8 +584,8 @@
      */
     public boolean hasProperty(String relPath) throws RepositoryException {
         checkStatus();
-        PropertyId pId = resolveRelativePropertyPath(relPath);
-        return (pId != null) ? itemMgr.itemExists(pId) : false;
+        PropertyState childState = resolveRelativePropertyPath(relPath);
+        return (childState != null) ? itemMgr.itemExists(childState) : false;
     }
 
     /**
@@ -603,7 +604,7 @@
      */
     public boolean hasNodes() throws RepositoryException {
         checkStatus();
-        return itemMgr.hasChildNodes(getNodeId());
+        return itemMgr.hasChildNodes(getNodeState());
     }
 
     /**
@@ -611,7 +612,7 @@
      */
     public boolean hasProperties() throws RepositoryException {
         checkStatus();
-        return itemMgr.hasChildProperties(getNodeId());
+        return itemMgr.hasChildProperties(getNodeState());
     }
 
     /**
@@ -825,9 +826,8 @@
             throw new VersionException(msg);
         }
 
-        ItemId versionId = session.getHierarchyManager().getItemId(version);
-        if (versionId.denotesNode()) {
-            session.getVersionManager().resolveMergeConflict(getNodeId(), (NodeId) versionId, done);
+        if (version instanceof VersionImpl) {
+            session.getVersionManager().resolveMergeConflict(getNodeId(), (NodeId) ((VersionImpl)version).getId(), done);
         } else {
             throw new RepositoryException("Unexpected error: Failed to retrieve a valid ID for version " + version.getPath());
         }
@@ -1026,9 +1026,8 @@
      * @throws RepositoryException
      */
     private void restore(NodeId nodeId, Version version, boolean removeExisting) throws PathNotFoundException, ItemExistsException, VersionException, ConstraintViolationException, UnsupportedRepositoryOperationException, LockException, InvalidItemStateException, RepositoryException {
-        ItemId versionId = session.getHierarchyManager().getItemId(version);
-        if (versionId.denotesNode()) {
-            session.getVersionManager().restore(nodeId, (NodeId) versionId, removeExisting);
+        if (version instanceof VersionImpl) {
+            session.getVersionManager().restore(nodeId, (NodeId) ((VersionImpl)version).getId(), removeExisting);
         } else {
             throw new RepositoryException("Unexpected error: Failed to retrieve a valid ID for the given version " + version.getPath());
         }
@@ -1071,7 +1070,7 @@
         checkIsLockable();
         checkHasPendingChanges();
 
-        return session.getLockManager().lock(getNodeId(), isDeep, isSessionScoped);
+        return session.getLockManager().lock(getNodeId(), this, isDeep, isSessionScoped);
     }
 
     /**
@@ -1154,7 +1153,7 @@
      * @see ItemImpl#getQName()
      */
     QName getQName() throws RepositoryException {
-        return session.getHierarchyManager().getQName(getId());
+        return session.getHierarchyManager().getQName(getNodeState());
     }
 
 
@@ -1270,16 +1269,21 @@
         itemStateMgr.execute(an);
 
         // retrieve id of state that has been created during execution of AddNode
-        NodeId childId;
-        List cne = getNodeState().getChildNodeEntries(nodeName);
-        if (definition.allowsSameNameSiblings()) {
-            // TODO: find proper solution. problem with same-name-siblings
-            childId = ((ChildNodeEntry)cne.get(cne.size()-1)).getId();
-        } else {
-            childId = ((ChildNodeEntry)cne.get(0)).getId();
+        NodeState childState;
+        try {
+            List cne = getNodeState().getChildNodeEntries(nodeName);
+            if (definition.allowsSameNameSiblings()) {
+                // TODO: find proper solution. problem with same-name-siblings
+                childState = ((ChildNodeEntry)cne.get(cne.size()-1)).getNodeState();
+            } else {
+                childState = ((ChildNodeEntry)cne.get(0)).getNodeState();
+            }
+        } catch (ItemStateException e) {
+            // should not occur
+            throw new RepositoryException(e);
         }
         // finally retrieve the new node
-        return (Node) itemMgr.getItem(childId);
+        return (Node) itemMgr.getItem(childState);
     }
 
     /**
@@ -1294,7 +1298,7 @@
         checkStatus();
         try {
             PropertyState pState = getNodeState().getPropertyState(qName);
-            return (Property) itemMgr.getItem(pState.getId());
+            return (Property) itemMgr.getItem(pState);
         } catch (AccessDeniedException ade) {
             throw new ItemNotFoundException(qName.toString());
         } catch (NoSuchItemStateException e) {
@@ -1500,13 +1504,13 @@
      * Note that access rights are not checked.
      *
      * @param relPath relative path of a (possible) node.
-     * @return the id of the node at <code>relPath</code> or <code>null</code>
+     * @return the state of the node at <code>relPath</code> or <code>null</code>
      * if no node exists at <code>relPath</code>.
      * @throws RepositoryException if <code>relPath</code> is not a valid
      * relative path.
      */
-    private NodeId resolveRelativeNodePath(String relPath) throws RepositoryException {
-        NodeId targetId = null;
+    private NodeState resolveRelativeNodePath(String relPath) throws RepositoryException {
+        NodeState targetState = null;
         try {
             Path p = getQPath(relPath);
             // if relative path is just the last path element -> simply retrieve
@@ -1518,13 +1522,13 @@
                     int index = pe.getNormalizedIndex();
                     ChildNodeEntry cne = getNodeState().getChildNodeEntry(pe.getName(), index);
                     if (cne != null) {
-                        targetId = cne.getId();
+                        targetState = cne.getNodeState();
                     } // else: there's no child node with that name
                 }
             } else {
-                ItemId id = session.getHierarchyManager().getItemId(p.getCanonicalPath());
-                if (id.denotesNode()) {
-                    targetId = (NodeId) id;
+                ItemState itemState = session.getHierarchyManager().getItemState(p.getCanonicalPath());
+                if (itemState.isNode()) {
+                    targetState = (NodeState) itemState;
                 } // else:  not a node
             }
         } catch (PathNotFoundException e) {
@@ -1533,8 +1537,13 @@
             String msg = "Invalid relative path: " + relPath;
             log.debug(msg);
             throw new RepositoryException(msg, e);
+        } catch (ItemStateException e) {
+            // should not occure
+            String msg = "Invalid relative path: " + relPath;
+            log.debug(msg);
+            throw new RepositoryException(msg, e);
         }
-        return targetId;
+        return targetState;
     }
 
     /**
@@ -1544,12 +1553,12 @@
      * Note that access rights are not checked.
      *
      * @param relPath relative path of a (possible) property
-     * @return the id of the property at <code>relPath</code> or
+     * @return the state of the property at <code>relPath</code> or
      *         <code>null</code> if no property exists at <code>relPath</code>
      * @throws RepositoryException if <code>relPath</code> is not a valid
      *                             relative path
      */
-    private PropertyId resolveRelativePropertyPath(String relPath) throws RepositoryException {
+    private PropertyState resolveRelativePropertyPath(String relPath) throws RepositoryException {
         try {
             /**
              * first check if relPath is just a name (in which case we don't
@@ -1560,7 +1569,7 @@
                 // check if property entry exists
                 if (getNodeState().hasPropertyName(propName)) {
                     try {
-                        return getNodeState().getPropertyState(propName).getPropertyId();
+                        return getNodeState().getPropertyState(propName);
                     } catch (ItemStateException e) {
                         // should not occur due, since existance has been checked
                         throw new RepositoryException(e);
@@ -1575,9 +1584,9 @@
              */
             Path p = getQPath(relPath).getCanonicalPath();
             try {
-                ItemId id = session.getHierarchyManager().getItemId(p);
-                if (!id.denotesNode()) {
-                    return (PropertyId) id;
+                ItemState itemState = session.getHierarchyManager().getItemState(p);
+                if (!itemState.isNode()) {
+                    return (PropertyState) itemState;
                 } else {
                     // not a property
                     return null;

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/PropertyImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/PropertyImpl.java?rev=429652&r1=429651&r2=429652&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/PropertyImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/PropertyImpl.java Tue Aug  8 06:39:25 2006
@@ -86,7 +86,7 @@
      */
     public Node getParent() throws ItemNotFoundException, AccessDeniedException, RepositoryException {
         checkStatus();
-        return (Node) itemMgr.getItem(getItemState().getParent().getId());
+        return (Node) itemMgr.getItem(getItemState().getParent());
     }
 
     /**

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java?rev=429652&r1=429651&r2=429652&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java Tue Aug  8 06:39:25 2006
@@ -24,6 +24,9 @@
 import org.apache.jackrabbit.jcr2spi.state.ItemStateManager;
 import org.apache.jackrabbit.jcr2spi.state.UpdatableItemStateManager;
 import org.apache.jackrabbit.jcr2spi.state.ItemStateValidator;
+import org.apache.jackrabbit.jcr2spi.state.ItemState;
+import org.apache.jackrabbit.jcr2spi.state.NoSuchItemStateException;
+import org.apache.jackrabbit.jcr2spi.state.ItemStateException;
 import org.apache.jackrabbit.jcr2spi.xml.DocViewSAXEventGenerator;
 import org.apache.jackrabbit.jcr2spi.xml.SysViewSAXEventGenerator;
 import org.apache.jackrabbit.jcr2spi.xml.ImportHandler;
@@ -161,7 +164,7 @@
         itemStateManager = createSessionItemStateManager(workspace.getRootNodeId(), workspace.getUpdatableItemStateManager(), nsMappings);
 
         // DIFF JACKRABBIT: itemManager = createItemManager(itemStateMgr, hierMgr);
-        itemManager = createItemManager(itemStateManager, getHierarchyManager());
+        itemManager = createItemManager(getHierarchyManager());
     }
 
     //--------------------------------------------------< Session interface >---
@@ -236,7 +239,16 @@
      */
     public Node getRootNode() throws RepositoryException {
         checkIsAlive();
-        return (Node) itemManager.getItem(workspace.getRootNodeId());
+        try {
+            ItemState state = getItemStateManager().getItemState(workspace.getRootNodeId());
+            return (Node) itemManager.getItem(state);
+        } catch (NoSuchItemStateException e) {
+            throw new ItemNotFoundException();
+        } catch (ItemStateException e) {
+            String msg = "Failed to retrieve root node.";
+            log.error(msg, e);
+            throw new RepositoryException(msg, e);
+        }
     }
 
     /**
@@ -266,9 +278,16 @@
         // check sanity of this session
         checkIsAlive();
         try {
-            return (NodeImpl) getItemManager().getItem(id);
+            ItemState state = getItemStateManager().getItemState(id);
+            return (NodeImpl) getItemManager().getItem(state);
         } catch (AccessDeniedException ade) {
             throw new ItemNotFoundException(id.toString());
+        } catch (NoSuchItemStateException e) {
+            throw new ItemNotFoundException(id.toString());
+        } catch (ItemStateException e) {
+            String msg = "failed to retrieve item state of item " + id;
+            log.error(msg, e);
+            throw new RepositoryException(msg, e);
         }
     }
 
@@ -312,7 +331,7 @@
         Path destPath = getQPath(destAbsPath);
 
         // all validation is performed by Move Operation and state-manager
-        Operation op = Move.create(srcPath, destPath, validator);
+        Operation op = Move.create(srcPath, destPath, getHierarchyManager(), getNamespaceResolver());
         itemStateManager.execute(op);
     }
 
@@ -363,8 +382,8 @@
         Path targetPath = getQPath(absPath);
         boolean isGranted;
         if (itemExists(absPath)) {
-            ItemId id = getHierarchyManager().getItemId(targetPath);
-            isGranted = getAccessManager().isGranted(id, actionsArr);
+            ItemState itemState = getHierarchyManager().getItemState(targetPath);
+            isGranted = getAccessManager().isGranted(itemState.getId(), actionsArr);
         } else {
             // TODO: if spi-ids are used, its possible to build an id for a non-existing item (see also Node.restore)
             // The given abs-path may point to a non-existing item
@@ -373,7 +392,7 @@
             while (parentId == null) {
                 parentPath = parentPath.getAncestor(1);
                 if (itemManager.itemExists(parentPath)) {
-                    ItemId id = getHierarchyManager().getItemId(parentPath);
+                    ItemId id = getHierarchyManager().getItemState(parentPath).getId();
                     if (id.denotesNode()) {
                         parentId = (NodeId) id;
                     }
@@ -673,8 +692,8 @@
         return new SessionItemStateManager(rootId, workspaceStateManager, getIdFactory(), valueFactory, getValidator(), nsResolver);
     }
 
-    protected ItemManager createItemManager(ItemStateManager itemStateMgr, HierarchyManager hierarchyMgr) {
-        return new ItemManagerImpl(itemStateMgr, hierarchyMgr, this);
+    protected ItemManager createItemManager(HierarchyManager hierarchyMgr) {
+        return new ItemManagerImpl(hierarchyMgr, this);
     }
 
     //---------------------------------------------------< ManagerProvider > ---

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceImpl.java?rev=429652&r1=429651&r2=429652&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceImpl.java Tue Aug  8 06:39:25 2006
@@ -20,6 +20,7 @@
 import org.apache.jackrabbit.jcr2spi.state.UpdatableItemStateManager;
 import org.apache.jackrabbit.jcr2spi.state.ItemStateValidator;
 import org.apache.jackrabbit.jcr2spi.state.ItemStateManager;
+import org.apache.jackrabbit.jcr2spi.state.ItemState;
 import org.apache.jackrabbit.jcr2spi.nodetype.NodeTypeRegistry;
 import org.apache.jackrabbit.jcr2spi.query.QueryManagerImpl;
 import org.apache.jackrabbit.jcr2spi.operation.Move;
@@ -33,6 +34,7 @@
 import org.apache.jackrabbit.jcr2spi.version.VersionManager;
 import org.apache.jackrabbit.jcr2spi.version.VersionManagerImpl;
 import org.apache.jackrabbit.jcr2spi.version.DefaultVersionManager;
+import org.apache.jackrabbit.jcr2spi.version.VersionImpl;
 import org.apache.jackrabbit.jcr2spi.name.NamespaceRegistryImpl;
 import org.apache.jackrabbit.jcr2spi.observation.ObservationManagerImpl;
 import org.apache.jackrabbit.jcr2spi.xml.WorkspaceContentHandler;
@@ -41,7 +43,6 @@
 import org.apache.jackrabbit.spi.SessionInfo;
 import org.apache.jackrabbit.name.Path;
 import org.apache.jackrabbit.spi.NodeId;
-import org.apache.jackrabbit.spi.ItemId;
 import org.slf4j.LoggerFactory;
 import org.slf4j.Logger;
 import org.xml.sax.ContentHandler;
@@ -128,7 +129,7 @@
         Path srcPath = session.getQPath(srcAbsPath);
         Path destPath = session.getQPath(destAbsPath);
 
-        Operation op = Copy.create(srcPath, destPath, this, validator);
+        Operation op = Copy.create(srcPath, destPath, this, this);
         getUpdatableItemStateManager().execute(op);
     }
 
@@ -164,7 +165,7 @@
             WorkspaceImpl srcWsp = (WorkspaceImpl) srcSession.getWorkspace();
 
             // do cross-workspace copy
-            Operation op = Copy.create(srcPath, destPath, srcWsp.getName(), srcWsp, validator);
+            Operation op = Copy.create(srcPath, destPath, srcWsp.getName(), srcWsp, this);
             getUpdatableItemStateManager().execute(op);
         } finally {
             if (srcSession != null) {
@@ -207,7 +208,7 @@
             WorkspaceImpl srcWsp = (WorkspaceImpl) srcSession.getWorkspace();
 
             // do clone
-            Operation op = Clone.create(srcPath, destPath, srcWsp.getName(), removeExisting, srcWsp, validator);
+            Operation op = Clone.create(srcPath, destPath, srcWsp.getName(), removeExisting, srcWsp, this);
             getUpdatableItemStateManager().execute(op);
         } finally {
             if (srcSession != null) {
@@ -227,7 +228,7 @@
         Path srcPath = session.getQPath(srcAbsPath);
         Path destPath = session.getQPath(destAbsPath);
 
-        Operation op = Move.create(srcPath, destPath, validator);
+        Operation op = Move.create(srcPath, destPath, getHierarchyManager(), getNamespaceResolver());
         getUpdatableItemStateManager().execute(op);
     }
 
@@ -240,9 +241,8 @@
 
         NodeId[] versionIds = new NodeId[versions.length];
         for (int i = 0; i < versions.length; i++) {
-            ItemId versionId = session.getHierarchyManager().getItemId(versions[i]);
-            if (versionId.denotesNode()) {
-                versionIds[i] = (NodeId) versionId;
+            if (versions[i] instanceof VersionImpl) {
+                versionIds[i] = (NodeId) ((VersionImpl)versions[i]).getId();
             } else {
                 throw new RepositoryException("Unexpected error: Failed to retrieve a valid ID for the given version " + versions[i].getPath());
             }
@@ -307,8 +307,8 @@
         session.checkIsAlive();
 
         Path parentPath = session.getQPath(parentAbsPath);
-        ItemId parentId = getHierarchyManager().getItemId(parentPath);
-        if (parentId.denotesNode()) {
+        ItemState parentState = getHierarchyManager().getItemState(parentPath);
+        if (parentState.isNode()) {
             return new WorkspaceContentHandler(this, parentAbsPath, uuidBehavior);
         } else {
             throw new PathNotFoundException("No node at path " + parentAbsPath);
@@ -325,9 +325,9 @@
         LockException, RepositoryException {
 
         Path parentPath = session.getQPath(parentAbsPath);
-        ItemId parentId = getHierarchyManager().getItemId(parentPath);
-        if (parentId.denotesNode()) {
-            wspManager.importXml((NodeId) parentId, in, uuidBehavior);
+        ItemState parentState = getHierarchyManager().getItemState(parentPath);
+        if (parentState.isNode()) {
+            wspManager.importXml((NodeId) parentState.getId(), in, uuidBehavior);
         } else {
             throw new PathNotFoundException("No node at path " + parentAbsPath);
         }
@@ -346,7 +346,7 @@
      */
     public HierarchyManager getHierarchyManager() {
         if (hierManager == null) {
-            hierManager = new CachingHierarchyManager(getRootNodeId(),
+            hierManager = new HierarchyManagerImpl(getRootNodeId(),
                 getItemStateManager(), getNamespaceResolver());
         }
         return hierManager;

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ZombieHierarchyManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ZombieHierarchyManager.java?rev=429652&r1=429651&r2=429652&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ZombieHierarchyManager.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ZombieHierarchyManager.java Tue Aug  8 06:39:25 2006
@@ -96,6 +96,20 @@
     /**
      * {@inheritDoc}
      * <p/>
+     * Also allows for removed items.
+     */
+    protected NodeState getParentState(ItemState state) {
+        if (state.hasOverlayedState()) {
+            // use 'old' parent in case item has been removed
+            return state.getOverlayedState().getParent();
+        }
+        // delegate to base class
+        return super.getParentState(state);
+    }
+
+    /**
+     * {@inheritDoc}
+     * <p/>
      * Also allows for removed/renamed child node entries.
      */
     protected ChildNodeEntry getChildNodeEntry(NodeState parent,

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/DefaultLockManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/DefaultLockManager.java?rev=429652&r1=429651&r2=429652&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/DefaultLockManager.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/DefaultLockManager.java Tue Aug  8 06:39:25 2006
@@ -24,6 +24,7 @@
 import javax.jcr.lock.LockException;
 import javax.jcr.RepositoryException;
 import javax.jcr.UnsupportedRepositoryOperationException;
+import javax.jcr.Node;
 
 /**
  * <code>DefaultLockManager</code>...
@@ -32,7 +33,7 @@
 
     private static Logger log = LoggerFactory.getLogger(DefaultLockManager.class);
 
-    public Lock lock(NodeId nodeId, boolean isDeep, boolean isSessionScoped) throws LockException, RepositoryException {
+    public Lock lock(NodeId nodeId, Node node, boolean isDeep, boolean isSessionScoped) throws LockException, RepositoryException {
         throw new UnsupportedRepositoryOperationException("Locking ist not supported by this repository.");
     }
 

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/LockManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/LockManager.java?rev=429652&r1=429651&r2=429652&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/LockManager.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/LockManager.java Tue Aug  8 06:39:25 2006
@@ -17,6 +17,8 @@
 package org.apache.jackrabbit.jcr2spi.lock;
 
 import javax.jcr.RepositoryException;
+import javax.jcr.Node;
+
 import org.apache.jackrabbit.spi.NodeId;
 import javax.jcr.lock.Lock;
 import javax.jcr.lock.LockException;
@@ -25,12 +27,15 @@
  * Defines the functionality needed for locking and unlocking nodes.
  */
 public interface LockManager {
-    
+
+    // TODO Review usage of NodeId
+
     /**
      * Lock a node. Checks whether the node is not locked and then
      * returns a lock object for this node.
      *
      * @param nodeId node id.
+     * @param node
      * @param isDeep whether the lock applies to this node only
      * @param isSessionScoped whether the lock is session scoped
      * @return lock object
@@ -38,7 +43,8 @@
      *         node is locked and <code>isDeep</code> is <code>true</code>
      * @see javax.jcr.Node#lock
      */
-    Lock lock(NodeId nodeId, boolean isDeep, boolean isSessionScoped)
+    // TODO review params
+    Lock lock(NodeId nodeId, Node node, boolean isDeep, boolean isSessionScoped)
         throws LockException, RepositoryException;
 
     /**

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/LockManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/LockManagerImpl.java?rev=429652&r1=429651&r2=429652&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/LockManagerImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/LockManagerImpl.java Tue Aug  8 06:39:25 2006
@@ -57,7 +57,8 @@
     private final ItemManager itemManager;
 
     /**
-     * Internal map holding all locks that where created by {@link #lock(NodeId, boolean, boolean)}
+     * Internal map holding all locks that where created by
+     * {@link #lock(NodeId, Node, boolean, boolean)}
      * or accessed by {@link #getLock(NodeId)} until they end their life by
      * an unlock (be it by the current Session or external reported by means
      * of events).
@@ -71,11 +72,9 @@
     }
 
     /**
-     * @see LockManager#lock(NodeId, boolean, boolean)
+     * @see LockManager#lock(NodeId, Node, boolean, boolean)
      */
-    public Lock lock(NodeId nodeId, boolean isDeep, boolean isSessionScoped) throws LockException, RepositoryException {
-        // make sure the node is accessible before trying to create a lock.
-        Node node = (Node) itemManager.getItem(nodeId);
+    public Lock lock(NodeId nodeId, Node node, boolean isDeep, boolean isSessionScoped) throws LockException, RepositoryException {
         // execute the operation
         Operation op = LockOperation.create(nodeId, isDeep, isSessionScoped);
         wspManager.execute(op);
@@ -112,7 +111,7 @@
 
             // retrieve lock holding node. not that this may fail if the session
             // does not have permission to see this node.
-            Item lockHoldingNode = itemManager.getItem(lhNodeId);
+            Item lockHoldingNode = itemManager.getItem(lockHoldingState);
             // TODO: we don;t know if lock is session scoped -> set flag to false
             // TODO: ev. add 'isSessionScoped' to RepositoryService lock-call.
             Lock l = new LockImpl(lhNodeId, (Node)lockHoldingNode, false);