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/14 16:16:04 UTC

svn commit: r431352 - in /jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi: ./ operation/ security/ state/ version/

Author: angela
Date: Mon Aug 14 07:16:02 2006
New Revision: 431352

URL: http://svn.apache.org/viewvc?rev=431352&view=rev
Log:
div

- get rid of rootId stored with ISM, HierarchyManagers etc.
- remove corresponding method with WorkspaceManager and WorkspaceImpl

jcr2spi/state/ItemState

- move parent field from Node/PropertyState to ItemState
- move idFactory field from NodeState to ItemState
- let PropertyState build its id instead of calling parentstate method.
- minor reordering of status related methods
- remove modCount and its usage

jcr2spi/state/ItemStateManager

- add method getRootNode()

jcr2spi/security/AccessManager

- replace ItemId by ItemState

Modified:
    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/NodeImpl.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/WorkspaceManager.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/operation/AbstractOperation.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/security/AccessManager.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/CachingItemStateManager.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemState.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemStateManager.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/PropertyState.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/state/TransientChangeLog.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/WorkspaceItemStateFactory.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/version/VersionImpl.java

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=431352&r1=431351&r2=431352&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 Mon Aug 14 07:16:02 2006
@@ -43,17 +43,12 @@
 
     private static Logger log = LoggerFactory.getLogger(HierarchyManagerImpl.class);
 
-    // 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
     protected final NamespaceResolver nsResolver;
 
-    public HierarchyManagerImpl(NodeId rootNodeId,
-                                ItemStateManager itemStateManager,
+    public HierarchyManagerImpl(ItemStateManager itemStateManager,
                                 NamespaceResolver nsResolver) {
-        this.rootNodeId = rootNodeId;
         this.itemStateManager = itemStateManager;
         this.nsResolver = nsResolver;
     }
@@ -191,18 +186,11 @@
      */
     protected void buildPath(Path.PathBuilder builder, ItemState state)
             throws ItemStateException, RepositoryException {
-        // shortcut
-        if (state.getParent() == null) {
-            builder.addRoot();
-            return;
-        }
-
         NodeState parentState = state.getParent();
+        // shortcut for root state
         if (parentState == null) {
-            String msg = "failed to build path of " + state.getId()
-                    + ": orphaned item";
-            log.debug(msg);
-            throw new ItemNotFoundException(msg);
+            builder.addRoot();
+            return;
         }
 
         // recursively build path of parent
@@ -239,7 +227,8 @@
      */
     public ItemState getItemState(Path qPath) throws PathNotFoundException, RepositoryException {
         try {
-            ItemState rootState = itemStateManager.getItemState(rootNodeId);
+            // retrieve root state first
+            NodeState rootState = itemStateManager.getRootState();
             // shortcut
             if (qPath.denotesRoot()) {
                 return rootState;
@@ -251,9 +240,9 @@
                 throw new RepositoryException(msg);
             }
 
-            return resolvePath(qPath, rootState, 1);
+            return resolvePath(qPath, rootState, Path.INDEX_DEFAULT);
         } catch (ItemStateException e) {
-            // should never occur
+            // should not occur
             throw new RepositoryException(e);
         }
     }
@@ -262,9 +251,14 @@
      * @see HierarchyManager#getQPath(ItemState)
      */
     public Path getQPath(ItemState itemState) throws ItemNotFoundException, RepositoryException {
+        // shortcut for root state
+        if (itemState.getParent() == null) {
+            return Path.ROOT;
+        }
 
-        Path.PathBuilder builder = new Path.PathBuilder();
+        // build path otherwise
         try {
+            Path.PathBuilder builder = new Path.PathBuilder();
             buildPath(builder, itemState);
             return builder.getPath();
         } catch (NoSuchItemStateException e) {

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=431352&r1=431351&r2=431352&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 Mon Aug 14 07:16:02 2006
@@ -208,7 +208,7 @@
                 // any transient modifications.
                 // TODO: TO_BE_FIXED check if this is sufficient check (SPI-id)
                 ItemId thisId = (state.hasOverlayedState()) ? state.getOverlayedState().getId() : state.getId();
-                ItemId otherId = (other.getItemState().hasOverlayedState()) ? other.getItemState().getOverlayedState().getId() : other.getId();
+                ItemId otherId = (other.getItemState().hasOverlayedState()) ? other.getItemState().getOverlayedState().getId() : other.getItemState().getId();
                 return thisId.equals(otherId);
             }
         }
@@ -290,7 +290,7 @@
         session.getSessionItemStateManager().execute(rm);
     }
 
-    //-----------------------------------------------------< ItemStateListener >
+    //--------------------------------------------------< ItemStateListener >---
     /**
      * {@inheritDoc}
      */
@@ -553,15 +553,6 @@
 
     //------------------------------------< Implementation specific methods >---
     /**
-     * Return the id of this <code>Item</code>.
-     *
-     * @return the id of this <code>Item</code>
-     */
-    public ItemId getId() {
-        return getItemState().getId();
-    }
-
-    /**
      * Same as <code>{@link Item#getName()}</code> except that
      * this method returns a <code>QName</code> instead of a
      * <code>String</code>.
@@ -571,7 +562,6 @@
      */
     abstract QName getQName() throws RepositoryException;
 
-    // DIFF JR: getPrimaryPath
     /**
      * Returns the primary path to this <code>Item</code>.
      *

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=431352&r1=431351&r2=431352&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 Mon Aug 14 07:16:02 2006
@@ -33,8 +33,6 @@
  */
 public interface ItemManager extends ItemLifeCycleListener {
 
-    // DIFF JR: removed 'getRootNode' shortcut
-
     /**
      * Disposes this <code>ItemManager</code> and frees resources.
      */

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=431352&r1=431351&r2=431352&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 Mon Aug 14 07:16:02 2006
@@ -21,15 +21,13 @@
 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.state.ItemStateException;
 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;
 import org.apache.jackrabbit.name.Path;
-import org.apache.jackrabbit.spi.NodeId;
-import org.apache.jackrabbit.spi.ItemId;
-import org.apache.jackrabbit.spi.PropertyId;
 import org.apache.jackrabbit.spi.QNodeDefinition;
 import org.apache.jackrabbit.spi.QPropertyDefinition;
 import org.apache.commons.collections.map.ReferenceMap;
@@ -82,7 +80,7 @@
 
     /**
      * A cache for item instances created by this <code>ItemManagerImpl</code>.
-     * // DIFF JR:
+     * 
      * The <code>ItemState</code>s act as keys for the map. In contrast to
      * o.a.j.core the item state are copied to transient space for reading and
      * will therefor not change upon transient modifications.
@@ -194,11 +192,15 @@
 
         Iterator iter = parentState.getChildNodeEntries().iterator();
         while (iter.hasNext()) {
-            ChildNodeEntry entry = (ChildNodeEntry) iter.next();
-            NodeId id = entry.getId();
-            // check read access
-            if (session.getAccessManager().canRead(id)) {
-                return true;
+            try {
+                // check read access
+                ChildNodeEntry entry = (ChildNodeEntry) iter.next();
+                if (session.getAccessManager().canRead(entry.getNodeState())) {
+                    return true;
+                }
+            } catch (ItemStateException e) {
+                // should not occur. ignore
+                log.debug("Failed to access node state.", e);
             }
         }
         return false;
@@ -227,14 +229,17 @@
 
         Iterator iter = parentState.getPropertyEntries().iterator();
         while (iter.hasNext()) {
-            ChildPropertyEntry entry = (ChildPropertyEntry) iter.next();
-            PropertyId id = entry.getId();
-            // check read access
-            if (session.getAccessManager().canRead(id)) {
-                return true;
+            try {
+                ChildPropertyEntry entry = (ChildPropertyEntry) iter.next();
+                // check read access
+                if (session.getAccessManager().canRead(entry.getPropertyState())) {
+                    return true;
+                }
+            } catch (ItemStateException e) {
+                // should not occur. ignore
+                log.debug("Failed to access node state.", e);
             }
         }
-
         return false;
     }
 
@@ -336,8 +341,7 @@
      */
     private void checkAccess(ItemState state, boolean removeFromCache) throws RepositoryException {
         // check privileges
-        ItemId id = state.getId();
-        if (!session.getAccessManager().canRead(id)) {
+        if (!session.getAccessManager().canRead(state)) {
             if (removeFromCache) {
                 // clear cache
                 Item item = retrieveItem(state);
@@ -345,7 +349,7 @@
                     evictItem(state);
                 }
             }
-            throw new AccessDeniedException("cannot read item " + id);
+            throw new AccessDeniedException("cannot read item " + state.getId());
         }
     }
 

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=431352&r1=431351&r2=431352&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 Mon Aug 14 07:16:02 2006
@@ -146,8 +146,9 @@
      */
     public Node getParent() throws ItemNotFoundException, AccessDeniedException, RepositoryException {
         checkStatus();
-        // check if root node
+
         NodeState parentState = getItemState().getParent();
+        // special treatment for root node
         if (parentState == null) {
             String msg = "Root node doesn't have a parent.";
             log.debug(msg);
@@ -534,7 +535,7 @@
             throw new UnsupportedRepositoryOperationException();
         }
         // Node is referenceable -> NodeId must contain a UUID part
-        return getNodeState().getNodeId().getUUID();
+        return getNodeId().getUUID();
     }
 
     /**
@@ -542,12 +543,14 @@
      */
     public int getIndex() throws RepositoryException {
         checkStatus();
+
         NodeState parentState = getItemState().getParent();
         if (parentState == null) {
             // the root node cannot have same-name siblings; always return the
             // default index
             return Path.INDEX_DEFAULT;
         }
+
         ChildNodeEntry parentEntry = parentState.getChildNodeEntry(getNodeId());
         return parentEntry.getIndex();
     }
@@ -834,7 +837,8 @@
         }
 
         if (version instanceof VersionImpl) {
-            session.getVersionManager().resolveMergeConflict(getNodeId(), (NodeId) ((VersionImpl)version).getId(), done);
+            NodeId versionId = ((VersionImpl)version).getNodeId();
+            session.getVersionManager().resolveMergeConflict(getNodeId(), versionId, done);
         } else {
             throw new RepositoryException("Incompatible Version object :" + version);
         }
@@ -1053,7 +1057,8 @@
      */
     private void restore(NodeId nodeId, Version version, boolean removeExisting) throws PathNotFoundException, ItemExistsException, VersionException, ConstraintViolationException, UnsupportedRepositoryOperationException, LockException, InvalidItemStateException, RepositoryException {
         if (version instanceof VersionImpl) {
-            session.getVersionManager().restore(nodeId, (NodeId) ((VersionImpl)version).getId(), removeExisting);
+            NodeId versionId = ((VersionImpl)version).getNodeId();
+            session.getVersionManager().restore(nodeId, versionId, removeExisting);
         } else {
             throw new RepositoryException("Unexpected error: Failed to retrieve a valid ID for the given version " + version.getPath());
         }
@@ -1185,10 +1190,9 @@
             return QName.ROOT;
         }
 
-        NodeId nodeId = getNodeState().getNodeId();
-        ChildNodeEntry entry = parentState.getChildNodeEntry(nodeId);
+        ChildNodeEntry entry = parentState.getChildNodeEntry(getNodeId());
         if (entry == null) {
-            String msg = "Failed to retrieve qualified name of Node " + nodeId;
+            String msg = "Failed to retrieve qualified name of Node " + getNodeId();
             log.debug(msg);
             throw new RepositoryException(msg);
         }
@@ -1491,11 +1495,12 @@
     }
 
     /**
-     * Return the id of this <code>Node</code>.
+     * Return the id of this <code>Node</code>. Protected for usage within
+     * <code>VersionImpl</code> and <code>VersionHistoryImpl</code>.
      *
      * @return the id of this <code>Node</code>
      */
-    private NodeId getNodeId() {
+    protected NodeId getNodeId() {
         return getNodeState().getNodeId();
     }
 

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=431352&r1=431351&r2=431352&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 Mon Aug 14 07:16:02 2006
@@ -27,6 +27,7 @@
 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.state.NodeState;
 import org.apache.jackrabbit.jcr2spi.xml.DocViewSAXEventGenerator;
 import org.apache.jackrabbit.jcr2spi.xml.SysViewSAXEventGenerator;
 import org.apache.jackrabbit.jcr2spi.xml.ImportHandler;
@@ -48,7 +49,6 @@
 import org.apache.jackrabbit.spi.RepositoryService;
 import org.apache.jackrabbit.spi.SessionInfo;
 import org.apache.jackrabbit.spi.NodeId;
-import org.apache.jackrabbit.spi.ItemId;
 import org.apache.jackrabbit.spi.IdFactory;
 import org.apache.commons.collections.map.ReferenceMap;
 import org.slf4j.LoggerFactory;
@@ -163,7 +163,7 @@
 
         // build the state mananger
         // DIFF JACKRABBIT: itemStateMgr = createSessionItemStateManager(wsp.getSessionItemStateManager());
-        itemStateManager = createSessionItemStateManager(workspace.getRootNodeId(), workspace.getUpdatableItemStateManager(), nsMappings);
+        itemStateManager = createSessionItemStateManager(workspace.getUpdatableItemStateManager(), nsMappings);
 
         // DIFF JACKRABBIT: itemManager = createItemManager(itemStateMgr, hierMgr);
         itemManager = createItemManager(getHierarchyManager());
@@ -242,10 +242,8 @@
     public Node getRootNode() throws RepositoryException {
         checkIsAlive();
         try {
-            ItemState state = getItemStateManager().getItemState(workspace.getRootNodeId());
+            ItemState state = getItemStateManager().getRootState();
             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);
@@ -401,25 +399,24 @@
         boolean isGranted;
         if (itemExists(absPath)) {
             ItemState itemState = getHierarchyManager().getItemState(targetPath);
-            isGranted = getAccessManager().isGranted(itemState.getId(), actionsArr);
+            isGranted = getAccessManager().isGranted(itemState, 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
             Path parentPath = targetPath;
-            NodeId parentId = null;
-            while (parentId == null) {
+            NodeState parentState = null;
+            while (parentState == null) {
                 parentPath = parentPath.getAncestor(1);
                 if (itemManager.itemExists(parentPath)) {
-                    ItemId id = getHierarchyManager().getItemState(parentPath).getId();
-                    if (id.denotesNode()) {
-                        parentId = (NodeId) id;
+                    ItemState itemState = getHierarchyManager().getItemState(parentPath);
+                    if (itemState.isNode()) {
+                        parentState = itemState.getParent();
                     }
                 }
             }
-            // TODO build Id instead
             try {
                 Path relPath = parentPath.computeRelativePath(targetPath);
-                isGranted = getAccessManager().isGranted(parentId, relPath, actionsArr);
+                isGranted = getAccessManager().isGranted(parentState, relPath, actionsArr);
                 if (!isGranted) {
                     throw new AccessControlException(actions);
                 }
@@ -706,8 +703,8 @@
         return new WorkspaceImpl(sessionInfo.getWorkspaceName(), this, service, sessionInfo);
     }
 
-    protected SessionItemStateManager createSessionItemStateManager(NodeId rootId, UpdatableItemStateManager workspaceStateManager, NamespaceResolver nsResolver) {
-        return new SessionItemStateManager(rootId, workspaceStateManager, getIdFactory(), getValidator(), nsResolver);
+    protected SessionItemStateManager createSessionItemStateManager(UpdatableItemStateManager workspaceStateManager, NamespaceResolver nsResolver) {
+        return new SessionItemStateManager(workspaceStateManager, getIdFactory(), getValidator(), nsResolver);
     }
 
     protected ItemManager createItemManager(HierarchyManager hierarchyMgr) {

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=431352&r1=431351&r2=431352&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 Mon Aug 14 07:16:02 2006
@@ -238,7 +238,7 @@
         NodeId[] versionIds = new NodeId[versions.length];
         for (int i = 0; i < versions.length; i++) {
             if (versions[i] instanceof VersionImpl) {
-                versionIds[i] = (NodeId) ((VersionImpl)versions[i]).getId();
+                versionIds[i] = ((VersionImpl)versions[i]).getNodeId();
             } else {
                 throw new RepositoryException("Unexpected error: Failed to retrieve a valid ID for the given version " + versions[i].getPath());
             }
@@ -343,8 +343,7 @@
      */
     public HierarchyManager getHierarchyManager() {
         if (hierManager == null) {
-            hierManager = new HierarchyManagerImpl(getRootNodeId(),
-                getItemStateManager(), getNamespaceResolver());
+            hierManager = new HierarchyManagerImpl(getItemStateManager(), getNamespaceResolver());
         }
         return hierManager;
     }
@@ -388,10 +387,6 @@
         return wspManager.getIdFactory();
     }
 
-    NodeId getRootNodeId() {
-        return wspManager.getRootNodeId();
-    }
-
     NodeTypeRegistry getNodeTypeRegistry() {
         return wspManager.getNodeTypeRegistry();
     }
@@ -406,7 +401,7 @@
      *
      * @return the state manager of this workspace
      */
-    public UpdatableItemStateManager getUpdatableItemStateManager() {
+    UpdatableItemStateManager getUpdatableItemStateManager() {
         return wspManager;
     }
     //-----------------------------------------------------< initialization >---

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java?rev=431352&r1=431351&r2=431352&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java Mon Aug 14 07:16:02 2006
@@ -31,6 +31,8 @@
 import org.apache.jackrabbit.jcr2spi.state.CachingItemStateManager;
 import org.apache.jackrabbit.jcr2spi.state.ItemStateFactory;
 import org.apache.jackrabbit.jcr2spi.state.WorkspaceItemStateFactory;
+import org.apache.jackrabbit.jcr2spi.state.NodeState;
+import org.apache.jackrabbit.jcr2spi.state.ItemStateManager;
 import org.apache.jackrabbit.jcr2spi.operation.OperationVisitor;
 import org.apache.jackrabbit.jcr2spi.operation.AddNode;
 import org.apache.jackrabbit.jcr2spi.operation.AddProperty;
@@ -56,6 +58,7 @@
 import org.apache.jackrabbit.jcr2spi.security.AccessManager;
 import org.apache.jackrabbit.jcr2spi.observation.InternalEventListener;
 import org.apache.jackrabbit.util.IteratorHelper;
+import org.apache.jackrabbit.name.Path;
 import org.apache.jackrabbit.name.QName;
 import org.apache.jackrabbit.spi.RepositoryService;
 import org.apache.jackrabbit.spi.SessionInfo;
@@ -69,7 +72,6 @@
 import org.apache.jackrabbit.spi.EventIterator;
 import org.apache.jackrabbit.spi.Event;
 import org.apache.jackrabbit.spi.ItemId;
-import org.apache.jackrabbit.name.Path;
 import org.apache.jackrabbit.spi.QNodeTypeDefinition;
 import org.apache.jackrabbit.value.QValue;
 import org.slf4j.LoggerFactory;
@@ -116,9 +118,6 @@
     // TODO: TO-BE-FIXED. Major refactoring of caching mechanism with change to SPI ids
     private final CachingItemStateManager cache;
 
-    // TODO: TO-BE-FIXED. With SPI_ItemId rootId must not be stored separately
-    private final NodeId rootNodeId;
-
     private final NamespaceRegistryImpl nsRegistry;
     private final NodeTypeRegistry ntRegistry;
 
@@ -146,7 +145,6 @@
 
             nsRegistry = createNamespaceRegistry();
             ntRegistry = createNodeTypeRegistry(nsRegistry);
-            rootNodeId = createRootNodeId();
             externalChangeListener = createChangeListener();
         } catch (ItemStateException e) {
             throw new RepositoryException(e);
@@ -161,10 +159,6 @@
         return ntRegistry;
     }
 
-    public NodeId getRootNodeId() {
-        return rootNodeId;
-    }
-
     public String[] getWorkspaceNames() throws RepositoryException {
         // TODO: review
         return service.getWorkspaceNames(sessionInfo);
@@ -297,13 +291,21 @@
         return l;
     }
 
-    private NodeId createRootNodeId() throws RepositoryException {
-        return service.getRootId(sessionInfo);
+    //---------------------------------------------------< ItemStateManager >---
+    /**
+     * @inheritDoc
+     * @see ItemStateManager#getRootState()
+     */
+    public NodeState getRootState() throws ItemStateException {
+        // retrieve through cache
+        synchronized (cache) {
+            return cache.getRootState();
+        }
     }
 
-    //---------------------------------------------------< ItemStateManager >---
     /**
      * @inheritDoc
+     * @see ItemStateManager#getItemState(ItemId)
      */
     public ItemState getItemState(ItemId id) throws NoSuchItemStateException, ItemStateException {
         // retrieve through cache
@@ -314,6 +316,7 @@
 
     /**
      * @inheritDoc
+     * @see ItemStateManager#hasItemState(ItemId)
      */
     public boolean hasItemState(ItemId id) {
         synchronized (cache) {
@@ -323,6 +326,7 @@
 
     /**
      * @inheritDoc
+     * @see ItemStateManager#getNodeReferences(NodeId)
      */
     public NodeReferences getNodeReferences(NodeId id) throws NoSuchItemStateException, ItemStateException {
         synchronized (cache) {
@@ -332,6 +336,7 @@
 
     /**
      * @inheritDoc
+     * @see ItemStateManager#hasNodeReferences(NodeId)
      */
     public boolean hasNodeReferences(NodeId id) {
         synchronized (cache) {
@@ -370,7 +375,7 @@
     public void dispose() {
         if (externalChangeListener != null) {
             try {
-                service.removeEventListener(sessionInfo, rootNodeId, externalChangeListener);
+                service.removeEventListener(sessionInfo, service.getRootId(sessionInfo), externalChangeListener);
             } catch (RepositoryException e) {
                 log.warn("exception while disposing workspace manager: " + e);
             }
@@ -378,25 +383,39 @@
     }
     //------------------------------------------------------< AccessManager >---
 
-    // TODO: method can be removed, if jcr2spi uses spi-ids as well
-    public boolean isGranted(NodeId parentId, Path relPath, String[] actions) throws ItemNotFoundException, RepositoryException {
+    /**
+     * @see AccessManager#isGranted(NodeState, Path, String[])
+     */
+    public boolean isGranted(NodeState parentState, Path relPath, String[] actions) throws ItemNotFoundException, RepositoryException {
         // TODO: 'createNodeId' is basically wrong since isGranted is unspecific for any item.
-        ItemId id = getIdFactory().createNodeId(parentId, relPath);
-        return isGranted(id, actions);
+        ItemId id = getIdFactory().createNodeId(parentState.getNodeId(), relPath);
+        return service.isGranted(sessionInfo, id, actions);
     }
 
-    public boolean isGranted(ItemId id, String[] actions) throws ItemNotFoundException, RepositoryException {
-        return service.isGranted(sessionInfo, id, actions);
+    /**
+     * @see AccessManager#isGranted(ItemState, String[])
+     */
+    public boolean isGranted(ItemState itemState, String[] actions) throws ItemNotFoundException, RepositoryException {
+        return service.isGranted(sessionInfo, itemState.getId(), actions);
     }
 
-    public boolean canRead(ItemId id) throws ItemNotFoundException, RepositoryException {
-        return service.isGranted(sessionInfo, id, AccessManager.READ);
+    /**
+     * @see AccessManager#canRead(ItemState)
+     */
+    public boolean canRead(ItemState itemState) throws ItemNotFoundException, RepositoryException {
+        return service.isGranted(sessionInfo, itemState.getId(), AccessManager.READ);
     }
 
-    public boolean canRemove(ItemId id) throws ItemNotFoundException, RepositoryException {
-        return service.isGranted(sessionInfo, id, AccessManager.REMOVE);
+    /**
+     * @see AccessManager#canRemove(ItemState)
+     */
+    public boolean canRemove(ItemState itemState) throws ItemNotFoundException, RepositoryException {
+        return service.isGranted(sessionInfo, itemState.getId(), AccessManager.REMOVE);
     }
 
+    /**
+     * @see AccessManager#canAccess(String)
+     */
     public boolean canAccess(String workspaceName) throws NoSuchWorkspaceException, RepositoryException {
         String[] wspNames = getWorkspaceNames();
         for (int i = 0; i < wspNames.length; i++) {

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=431352&r1=431351&r2=431352&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 Mon Aug 14 07:16:02 2006
@@ -38,11 +38,10 @@
      */
     protected ItemStateManager attic;
 
-    public ZombieHierarchyManager(NodeId rootNodeId,
-                                  ItemStateManager provider,
+    public ZombieHierarchyManager(ItemStateManager itemStateManager,
                                   ItemStateManager attic,
                                   NamespaceResolver nsResolver) {
-        super(rootNodeId, provider, nsResolver);
+        super(itemStateManager, nsResolver);
         this.attic = attic;
     }
 

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/AbstractOperation.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/AbstractOperation.java?rev=431352&r1=431351&r2=431352&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/AbstractOperation.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/AbstractOperation.java Mon Aug 14 07:16:02 2006
@@ -66,8 +66,6 @@
         affectedIds.add(affectedId);
     }
 
-    // TODO to be removed after ID refactoring completed
-
     /**
      * 
      * @param nodePath

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/security/AccessManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/security/AccessManager.java?rev=431352&r1=431351&r2=431352&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/security/AccessManager.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/security/AccessManager.java Mon Aug 14 07:16:02 2006
@@ -16,9 +16,9 @@
  */
 package org.apache.jackrabbit.jcr2spi.security;
 
-import org.apache.jackrabbit.spi.ItemId;
-import org.apache.jackrabbit.spi.NodeId;
 import org.apache.jackrabbit.name.Path;
+import org.apache.jackrabbit.jcr2spi.state.ItemState;
+import org.apache.jackrabbit.jcr2spi.state.NodeState;
 
 import javax.jcr.ItemNotFoundException;
 import javax.jcr.NoSuchWorkspaceException;
@@ -46,52 +46,50 @@
      * Determines whether the specified <code>permissions</code> are granted
      * on the item with the specified path.
      *
-     * @param parentId The node id the existing ancestor.
+     * @param parentState The node state of the next existing ancestor.
      * @param relPath The relative path pointing to the non-existing target item.
      * @param actions An array of actions that need to be checked.
      * @return <code>true</code> if the actions are granted; otherwise <code>false</code>
      * @throws ItemNotFoundException if the target item does not exist
      * @throws RepositoryException if another error occurs
      */
-    // TODO: method can be removed, if jcr2spi uses spi-ids as well
-    boolean isGranted(NodeId parentId, Path relPath, String[] actions) throws ItemNotFoundException, RepositoryException;
+    boolean isGranted(NodeState parentState, Path relPath, String[] actions) throws ItemNotFoundException, RepositoryException;
 
     /**
-      * Determines whether the specified <code>permissions</code> are granted
-      * on the item with the specified path.
-      *
-      * @param itemId The id of an existing target item.
-      * @param actions An array of actions that need to be checked.
-      * @return <code>true</code> if the actions are granted; otherwise <code>false</code>
-      * @throws ItemNotFoundException if the target item does not exist
-      * @throws RepositoryException if another error occurs
-      */
-     boolean isGranted(ItemId itemId, String[] actions) throws ItemNotFoundException, RepositoryException;
+     * Determines whether the specified <code>permissions</code> are granted
+     * on the item with the specified path.
+     *
+     * @param itemState
+     * @param actions An array of actions that need to be checked.
+     * @return <code>true</code> if the actions are granted; otherwise <code>false</code>
+     * @throws ItemNotFoundException if the target item does not exist
+     * @throws RepositoryException if another error occurs
+     */
+     boolean isGranted(ItemState itemState, String[] actions) throws ItemNotFoundException, RepositoryException;
 
 
     /**
      * Returns true if the existing item with the given <code>ItemId</code> can
      * be read.
      *
-     * @param id The id of an existing target item.
+     * @param itemState
      * @return
      * @throws ItemNotFoundException
      * @throws RepositoryException
      */
-    boolean canRead(ItemId id) throws ItemNotFoundException, RepositoryException;
+    boolean canRead(ItemState itemState) throws ItemNotFoundException, RepositoryException;
 
     // TODO need for canWrite(ItemId ?)
 
     /**
-     * Returns true if the existing item with the given <code>ItemId</code> can
-     * be removed.
+     * Returns true if the existing item state can be removed.
      *
-     * @param id The id of an existing target item.
+     * @param itemState
      * @return
      * @throws ItemNotFoundException
      * @throws RepositoryException
      */
-    boolean canRemove(ItemId id) throws ItemNotFoundException, RepositoryException;
+    boolean canRemove(ItemState itemState) throws ItemNotFoundException, RepositoryException;
 
     /**
      * Determines whether the subject of the current context is granted access

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/CachingItemStateManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/CachingItemStateManager.java?rev=431352&r1=431351&r2=431352&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/CachingItemStateManager.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/CachingItemStateManager.java Mon Aug 14 07:16:02 2006
@@ -92,6 +92,11 @@
     }
 
     //---------------------------------------------------< ItemStateManager >---
+
+    public NodeState getRootState() throws ItemStateException {
+        return root;
+    }
+
     /**
      * @inheritDoc
      * @see ItemStateManager#getItemState(ItemId)

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemState.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemState.java?rev=431352&r1=431351&r2=431352&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemState.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemState.java Mon Aug 14 07:16:02 2006
@@ -18,6 +18,7 @@
 
 import org.apache.jackrabbit.util.WeakIdentityCollection;
 import org.apache.jackrabbit.spi.ItemId;
+import org.apache.jackrabbit.spi.IdFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -74,11 +75,6 @@
     protected int status = STATUS_UNDEFINED;
 
     /**
-     * a modification counter used to prevent concurrent modifications
-     */
-    private short modCount;
-
-    /**
      * Flag indicating whether this state is transient
      */
     private final boolean isTransient;
@@ -88,18 +84,33 @@
      */
     private final transient Collection listeners = new WeakIdentityCollection(5);
 
+    // TODO: check again...
+    /**
+     *  IdFactory used to build id of the states
+     */
+    final IdFactory idFactory;
+
+    // DIFF JR
+    /**
+     * The parent <code>NodeState</code> or <code>null</code> if this
+     * instance represents the root node.
+     */
+    NodeState parent;
+
     /**
      * the backing persistent item state (may be null)
      */
-    protected transient ItemState overlayedState;
+    transient ItemState overlayedState;
 
     /**
      * Constructs a new unconnected item state
      *
+     * @param parent
      * @param initialStatus the initial status of the item state object
      * @param isTransient   flag indicating whether this state is transient or not
      */
-    protected ItemState(int initialStatus, boolean isTransient) {
+    protected ItemState(NodeState parent, int initialStatus, boolean isTransient,
+                        IdFactory idFactory) {
         switch (initialStatus) {
             case STATUS_EXISTING:
             case STATUS_NEW:
@@ -110,9 +121,10 @@
                 log.debug(msg);
                 throw new IllegalArgumentException(msg);
         }
-        modCount = 0;
+        this.parent = parent;
         overlayedState = null;
         this.isTransient = isTransient;
+        this.idFactory = idFactory;
     }
 
     /**
@@ -123,7 +135,8 @@
      * @param initialStatus the initial status of the new <code>ItemState</code> instance
      * @param isTransient   flag indicating whether this state is transient or not
      */
-    protected ItemState(ItemState overlayedState, int initialStatus, boolean isTransient) {
+    protected ItemState(ItemState overlayedState, NodeState parent, int initialStatus,
+                        boolean isTransient, IdFactory idFactory) {
         switch (initialStatus) {
             case STATUS_EXISTING:
             case STATUS_EXISTING_MODIFIED:
@@ -136,9 +149,11 @@
                 throw new IllegalArgumentException(msg);
         }
         this.isTransient = isTransient;
+        this.parent = parent;
+        this.idFactory = idFactory;
         connect(overlayedState);
     }
-    
+
     /**
      * Copy state information from another state into this state
      * @param state source state information
@@ -151,8 +166,6 @@
     void pull() {
         if (overlayedState != null) {
             copy(overlayedState);
-            // sync modification count
-            modCount = overlayedState.getModCount();
         }
     }
 
@@ -214,6 +227,19 @@
         }
     }
 
+
+    /**
+     * Discards this instance, i.e. renders it 'invalid'.
+     */
+    protected void discard() {
+        if (status != STATUS_UNDEFINED) {
+            // notify listeners
+            notifyStateDiscarded();
+            // reset status
+            setStatus(STATUS_UNDEFINED);
+        }
+    }
+
     /**
      * Notify the listeners that the persistent state this object is
      * representing has been discarded.
@@ -252,7 +278,7 @@
      * Notify the listeners that the persistent state this object is
      * representing has been updated.
      */
-    public void notifyStateUpdated() {
+    protected void notifyStateUpdated() {
         // copy listeners to array to avoid ConcurrentModificationException
         ItemStateListener[] la;
         synchronized (listeners) {
@@ -269,7 +295,7 @@
      * Notify the listeners that the persistent state this object is
      * representing has been destroyed.
      */
-    public void notifyStateDestroyed() {
+    protected void notifyStateDestroyed() {
         // copy listeners to array to avoid ConcurrentModificationException
         ItemStateListener[] la;
         synchronized (listeners) {
@@ -321,14 +347,13 @@
             case STATUS_EXISTING_REMOVED:
             case STATUS_UNDEFINED:
             default:
-                String msg = "Cannot mark item state with status " +
-                        status + " modified.";
+                String msg = "Cannot mark item state with status " + status + " modified.";
                 throw new IllegalStateException(msg);
         }
     }
 
 
-    //-------------------------------------------------------< public methods >
+    //--------------------< public READ methods and package private Setters >---
     /**
      * Determines if this item state represents a node.
      *
@@ -356,27 +381,15 @@
     }
 
     /**
-     * Determines whether this item state has become stale.
-     * @return true if this item state has become stale, false otherwise.
-     */
-    public boolean isStale() {
-        if (isTransient) {
-            return status == STATUS_STALE_MODIFIED
-                || status == STATUS_STALE_DESTROYED;
-        } else {
-            return overlayedState != null
-                && modCount != overlayedState.getModCount();
-        }
-    }
-
-    /**
      * Returns the parent <code>NodeState</code> or <code>null</code>
      * if either this item state represents the root node or this item state is
      * 'free floating', i.e. not attached to the repository's hierarchy.
      *
      * @return the parent <code>NodeState</code>
      */
-    public abstract NodeState getParent();
+    public NodeState getParent() {
+        return parent;
+    }
 
     /**
      * Returns the status of this item.
@@ -388,13 +401,11 @@
     }
 
     /**
-     * TODO: this method should be at least protected. the outside should not
-     * TODO: control the status of an item state
      * Sets the new status of this item.
      *
      * @param newStatus the new status
      */
-    public void setStatus(int newStatus) {
+    void setStatus(int newStatus) {
         if (status == newStatus) {
             return;
         }
@@ -415,43 +426,6 @@
                 throw new IllegalArgumentException(msg);
         }
         notifyStatusChanged(oldStatus);
-    }
-
-    /**
-     * Returns the modification count.
-     *
-     * @return the modification count.
-     */
-    public short getModCount() {
-        return modCount;
-    }
-
-    /**
-     * Sets the modification count.
-     *
-     * @param modCount the modification count of this item
-     */
-    public void setModCount(short modCount) {
-        this.modCount = modCount;
-    }
-
-    /**
-     * Updates the modification count.
-     */
-    synchronized void touch() {
-        modCount++;
-    }
-
-    /**
-     * Discards this instance, i.e. renders it 'invalid'.
-     */
-    public void discard() {
-        if (status != STATUS_UNDEFINED) {
-            // notify listeners
-            notifyStateDiscarded();
-            // reset status
-            setStatus(STATUS_UNDEFINED);
-        }
     }
 
     /**

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemStateManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemStateManager.java?rev=431352&r1=431351&r2=431352&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemStateManager.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemStateManager.java Mon Aug 14 07:16:02 2006
@@ -26,7 +26,16 @@
 public interface ItemStateManager {
 
     /**
+     * Returns the <code>NodeState</code> of the root node.
+     *
+     * @return node state of the root node.
+     * @throws ItemStateException
+     */
+    NodeState getRootState() throws ItemStateException;
+
+    /**
      * Return an item state, given its item id.
+     *
      * @param id item id
      * @return item state
      * @throws NoSuchItemStateException if the item does not exist
@@ -37,6 +46,7 @@
     /**
      * Return a flag indicating whether an item state for a given
      * item id exists.
+     *
      * @param id item id
      * @return <code>true</code> if an item state exists,
      *         otherwise <code>false</code>
@@ -45,7 +55,8 @@
 
     // DIFF JR: NodeId param instead of NodeReferenceId
     /**
-     * Return a node references object, given its target id
+     * Return a node references object, given its target id.
+     *
      * @param id target id
      * @return node references object
      * @throws NoSuchItemStateException if the item does not exist
@@ -58,6 +69,7 @@
     /**
      * Return a flag indicating whether a node references object
      * for a given target id exists.
+     *
      * @param id target id
      * @return <code>true</code> if a node reference object exists for the given
      *         id, otherwise <code>false</code>.

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemStateValidator.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemStateValidator.java?rev=431352&r1=431351&r2=431352&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemStateValidator.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemStateValidator.java Mon Aug 14 07:16:02 2006
@@ -40,7 +40,6 @@
 import org.apache.jackrabbit.spi.QPropertyDefinition;
 import org.apache.jackrabbit.spi.QItemDefinition;
 import org.apache.jackrabbit.spi.NodeId;
-import org.apache.jackrabbit.spi.ItemId;
 import org.apache.jackrabbit.name.QName;
 import org.apache.jackrabbit.name.Path;
 import org.apache.jackrabbit.name.NamespaceResolver;
@@ -365,7 +364,7 @@
 
         if ((options & CHECK_ACCESS) == CHECK_ACCESS) {
             // make sure current session is granted read access on parent node
-            if (!mgrProvider.getAccessManager().canRead(parentState.getNodeId())) {
+            if (!mgrProvider.getAccessManager().canRead(parentState)) {
                 throw new ItemNotFoundException(safeGetJCRPath(parentState));
             }
         }
@@ -487,7 +486,7 @@
         if ((options & CHECK_ACCESS) == CHECK_ACCESS) {
             // make sure current session is granted write access on new prop
             Path relPath = Path.create(propertyName, Path.INDEX_UNDEFINED);
-            if (!mgrProvider.getAccessManager().isGranted(parentState.getNodeId(), relPath, new String[] {AccessManager.SET_PROPERTY_ACTION})) {
+            if (!mgrProvider.getAccessManager().isGranted(parentState, relPath, new String[] {AccessManager.SET_PROPERTY_ACTION})) {
                 throw new AccessDeniedException(safeGetJCRPath(parentState) + ": not allowed to create property with name " + propertyName);
             }
         }
@@ -550,7 +549,7 @@
             // make sure current session is granted write access on parent node
             // TODO build Id instead 
             Path relPath = Path.create(nodeName, org.apache.jackrabbit.name.Path.INDEX_UNDEFINED);
-            if (!mgrProvider.getAccessManager().isGranted(parentState.getNodeId(), relPath, new String[] {AccessManager.ADD_NODE_ACTION})) {
+            if (!mgrProvider.getAccessManager().isGranted(parentState, relPath, new String[] {AccessManager.ADD_NODE_ACTION})) {
                 throw new AccessDeniedException(safeGetJCRPath(parentState) + ": not allowed to add child node '" + nodeName +"'");
             }
         }
@@ -602,14 +601,11 @@
 
         // TODO: missing check if all affected child-states can be removed as well
         // NOTE: referencial integrity should be asserted for all child-nodes.
-
-        ItemId targetId = targetState.getId();
         NodeState parentState = targetState.getParent();
         if (parentState == null) {
-            // root or orphaned node
-            throw new ConstraintViolationException("Cannot remove root node");
+            // root node
+            throw new ConstraintViolationException("Cannot remove root node.");
         }
-
         // check parent
         checkIsWritable(parentState, options);
 
@@ -617,11 +613,11 @@
         if ((options & CHECK_ACCESS) == CHECK_ACCESS) {
             try {
                 // make sure current session is granted read access on parent node
-                if (!mgrProvider.getAccessManager().canRead(targetId)) {
+                if (!mgrProvider.getAccessManager().canRead(targetState)) {
                     throw new PathNotFoundException(safeGetJCRPath(targetState));
                 }
                 // make sure current session is allowed to remove target node
-                if (!mgrProvider.getAccessManager().canRemove(targetId)) {
+                if (!mgrProvider.getAccessManager().canRemove(targetState)) {
                     throw new AccessDeniedException(safeGetJCRPath(targetState)
                             + ": not allowed to remove node");
                 }
@@ -683,10 +679,8 @@
     private void checkLock(ItemState itemState)
             throws LockException, RepositoryException {
         // make sure there's no foreign lock present the node (or the parent node
-        // for properties.
-        NodeState nodeState = (itemState.isNode())
-            ? ((NodeState)itemState)
-            : itemState.getParent();
+        // in case the state represents a PropertyState).
+        NodeState nodeState = (itemState.isNode()) ? ((NodeState)itemState) : itemState.getParent();
         mgrProvider.getLockManager().checkLock(nodeState);
     }
 

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/NodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/NodeState.java?rev=431352&r1=431351&r2=431352&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/NodeState.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/NodeState.java Mon Aug 14 07:16:02 2006
@@ -27,7 +27,6 @@
 import org.apache.jackrabbit.name.MalformedPathException;
 import org.apache.jackrabbit.spi.NodeId;
 import org.apache.jackrabbit.spi.ItemId;
-import org.apache.jackrabbit.spi.PropertyId;
 import org.apache.jackrabbit.jcr2spi.nodetype.NodeTypeConflictException;
 import org.apache.jackrabbit.jcr2spi.nodetype.NodeTypeRegistry;
 import org.apache.jackrabbit.jcr2spi.nodetype.EffectiveNodeType;
@@ -86,6 +85,8 @@
     private String uuid;
 
     /**
+<<<<<<< .mine
+=======
      * The name of this node
      */
     private QName name;
@@ -97,6 +98,7 @@
     private NodeState parent;
 
     /**
+>>>>>>> .r431350
      * this node's definition
      */
     private QNodeDefinition def;
@@ -118,10 +120,6 @@
      */
     private final transient Collection listeners = new WeakIdentityCollection(3);
 
-    // DIFF JR: limit creation of property-ids to the nodeState
-    // TODO: check again....
-    private final IdFactory idFactory;
-
     /**
      * The <code>ItemStateFactory</code> which is used to create new
      * <code>ItemState</code> instances.
@@ -144,14 +142,12 @@
      * @param idFactory     the <code>IdFactory</code> to create new id
      *                      instance.
      */
-    public NodeState(QName name, String uuid, NodeState parent,
+    protected NodeState(QName name, String uuid, NodeState parent,
                      QName nodeTypeName, int initialStatus, boolean isTransient,
                      ItemStateFactory isf, IdFactory idFactory) {
-        super(initialStatus, isTransient);
+        super(parent, initialStatus, isTransient, idFactory);
         this.name = name;
         this.uuid = uuid;
-        this.parent = parent;
-        this.idFactory = idFactory;
         this.nodeTypeName = nodeTypeName;
         this.isf = isf;
     }
@@ -168,13 +164,11 @@
      * @param idFactory      the <code>IdFactory</code> to create new id
      *                       instance.
      */
-    public NodeState(NodeState overlayedState, NodeState parent,
+    protected NodeState(NodeState overlayedState, NodeState parent,
                      int initialStatus, boolean isTransient,
                      ItemStateFactory isf, IdFactory idFactory) {
-        super(overlayedState, initialStatus, isTransient);
+        super(overlayedState, parent, initialStatus, isTransient, idFactory);
         pull();
-        this.parent = parent;
-        this.idFactory = idFactory;
         this.isf = isf;
     }
 
@@ -206,7 +200,7 @@
         }
     }
 
-    //----------------------< public READ methods and package private WRITE >---
+    //--------------------< public READ methods and package private Setters >---
     /**
      * Determines if this item state represents a node.
      *
@@ -218,13 +212,6 @@
     }
 
     /**
-     * {@inheritDoc}
-     */
-    public NodeState getParent() {
-        return parent;
-    }
-
-    /**
      * Sets the the parent <code>NodeState</code>.
      *
      * @param parent the parent <code>NodeState</code> or <code>null</code>
@@ -232,6 +219,7 @@
      * state should be 'free floating', i.e. detached from the repository's
      * hierarchy.
      */
+    // TODO: change to private and only let new parent node state set the parent.
     void setParent(NodeState parent) {
         this.parent = parent;
     }
@@ -355,21 +343,20 @@
         // make sure the state has the definition set now
         if (def == null) {
             NodeState parentState = getParent();
-            try {
-                if (parentState == null) {
-                    // special case for root state
-                    def = ntRegistry.getRootNodeDef();
-                } else {
+            if (parentState == null) {
+                // special case for root state
+                def = ntRegistry.getRootNodeDef();
+            } else {
+                try {
                     ChildNodeEntry cne = parentState.getChildNodeEntry(getNodeId());
                     EffectiveNodeType ent = ntRegistry.getEffectiveNodeType(parentState.getNodeTypeNames());
-                    setDefinition(ent.getApplicableNodeDefinition(cne.getName(), getNodeTypeName()));
+                    def = ent.getApplicableNodeDefinition(cne.getName(), getNodeTypeName());
+                } catch (NodeTypeConflictException e) {
+                    String msg = "internal error: failed to build effective node type.";
+                    log.debug(msg);
+                    throw new RepositoryException(msg, e);
                 }
-            } catch (NodeTypeConflictException e) {
-                String msg = "internal error: failed to build effective node type.";
-                log.debug(msg);
-                throw new RepositoryException(msg, e);
             }
-
         }
         return def;
     }
@@ -480,7 +467,7 @@
      * @return the newly added <code>ChildNodeEntry</code>
      */
     synchronized ChildNodeEntry addChildNodeEntry(QName nodeName,
-                                                         NodeId id) {
+                                                  NodeId id) {
         ChildNodeEntry entry = childNodeEntries.add(nodeName, id);
         notifyNodeAdded(entry);
         return entry;
@@ -617,18 +604,6 @@
      */
     public synchronized Collection getPropertyEntries() {
         return Collections.unmodifiableCollection(properties.values());
-    }
-
-    /**
-     * Returns the <code>PropertyId</code> for a property with
-     * <code>propertyName</code>. The property does not necessarily have to
-     * exist on <code>this</code> node state.
-     *
-     * @param propertyName the name of a property.
-     * @return the property id.
-     */
-    PropertyId getPropertyId(QName propertyName) {
-        return idFactory.createPropertyId(getNodeId(), propertyName);
     }
 
     /**

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/PropertyState.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/PropertyState.java?rev=431352&r1=431351&r2=431352&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/PropertyState.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/PropertyState.java Mon Aug 14 07:16:02 2006
@@ -24,6 +24,7 @@
 import org.apache.jackrabbit.name.QName;
 import org.apache.jackrabbit.spi.PropertyId;
 import org.apache.jackrabbit.spi.ItemId;
+import org.apache.jackrabbit.spi.IdFactory;
 import org.apache.jackrabbit.value.QValue;
 import org.apache.jackrabbit.jcr2spi.nodetype.NodeTypeConflictException;
 import org.apache.jackrabbit.jcr2spi.nodetype.NodeTypeRegistry;
@@ -44,11 +45,6 @@
     private QName name;
 
     /**
-     * The parent state
-     */
-    private NodeState parent;
-
-    /**
      * the internal values
      */
     private QValue[] values;
@@ -73,11 +69,10 @@
      * @param initialStatus  the initial status of the property state object
      * @param isTransient    flag indicating whether this state is transient or not
      */
-    public PropertyState(PropertyState overlayedState, NodeState parent, int initialStatus,
-                         boolean isTransient) {
-        super(overlayedState, initialStatus, isTransient);
+    protected PropertyState(PropertyState overlayedState, NodeState parent, int initialStatus,
+                         boolean isTransient, IdFactory idFactory) {
+        super(overlayedState, parent, initialStatus, isTransient, idFactory);
         pull();
-        this.parent = parent;
     }
 
     /**
@@ -88,10 +83,10 @@
      * @param isTransient   flag indicating whether this state is transient or
      *                      not
      */
-    public PropertyState(QName name, NodeState parent, int initialStatus, boolean isTransient) {
-        super(initialStatus, isTransient);
+    protected PropertyState(QName name, NodeState parent, int initialStatus,
+                            boolean isTransient, IdFactory idFactory) {
+        super(parent, initialStatus, isTransient, idFactory);
         this.name = name;
-        this.parent = parent;
         type = PropertyType.UNDEFINED;
         values = QValue.EMPTY_ARRAY;
         multiValued = false;
@@ -112,9 +107,9 @@
         }
     }
 
-    //----------------------< public READ methods and package private WRITE >---
+    //--------------------< public READ methods and package private Setters >---
     /**
-     * Determines if this item state represents a node.
+     * Always returns false.
      *
      * @return always false
      * @see ItemState#isNode
@@ -122,7 +117,7 @@
     public boolean isNode() {
         return false;
     }
-
+    
     /**
      * {@inheritDoc}
      */
@@ -132,18 +127,11 @@
 
     /**
      * Returns the identifier of this property.
-     * 
+     *
      * @return the id of this property.
      */
     public PropertyId getPropertyId() {
-        return parent.getPropertyId(name);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public NodeState getParent() {
-        return parent;
+        return idFactory.createPropertyId(parent.getNodeId(), getQName());
     }
 
     /**
@@ -225,6 +213,11 @@
         if (def == null) {
             try {
                 NodeState parentState = getParent();
+                if (parentState == null) {
+                    String msg = "Internal error: cannot determine definition for orphaned state.";
+                    log.debug(msg);
+                    throw new RepositoryException(msg);
+                }
                 EffectiveNodeType ent = ntRegistry.getEffectiveNodeType(parentState.getNodeTypeNames());
                 setDefinition(ent.getApplicablePropertyDefinition(getQName(), getType(), isMultiValued()));
             } catch (NodeTypeConflictException e) {

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/SessionItemStateManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/SessionItemStateManager.java?rev=431352&r1=431351&r2=431352&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/SessionItemStateManager.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/SessionItemStateManager.java Mon Aug 14 07:16:02 2006
@@ -114,19 +114,13 @@
     private final IdFactory idFactory;
     private final ItemStateValidator validator;
 
-    // DIFF JR: store root id. since 'CachingItemStateManager' not used any more
-    // TODO: TO-BE-FIXED. With SPI_ItemId rootId must not be stored separately
-    private NodeId rootId;
-
     /**
      * Creates a new <code>SessionItemStateManager</code> instance.
      *
-     * @param rootId
      * @param workspaceItemStateMgr
      * @param nsResolver
      */
-    public SessionItemStateManager(NodeId rootId,
-                                   UpdatableItemStateManager workspaceItemStateMgr,
+    public SessionItemStateManager(UpdatableItemStateManager workspaceItemStateMgr,
                                    IdFactory idFactory,
                                    ItemStateValidator validator,
                                    NamespaceResolver nsResolver) {
@@ -139,10 +133,9 @@
         this.idFactory = idFactory;
 
         this.nsResolver = nsResolver;
-        this.rootId = rootId;
 
         // create hierarchy manager
-        hierMgr = new HierarchyManagerImpl(rootId, this, nsResolver);
+        hierMgr = new HierarchyManagerImpl(this, nsResolver);
 
     }
 
@@ -158,6 +151,16 @@
     //---------------------------------------------------< ItemStateManager >---
     /**
      * {@inheritDoc}
+     * @see ItemStateManager#getRootState()
+     */
+    public NodeState getRootState() throws ItemStateException {
+        // TODO
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @see ItemStateManager#getItemState(ItemId)
      */
     public ItemState getItemState(ItemId id)
             throws NoSuchItemStateException, ItemStateException {
@@ -189,6 +192,7 @@
 
     /**
      * {@inheritDoc}
+     * @see ItemStateManager#hasItemState(ItemId)
      */
     public boolean hasItemState(ItemId id) {
         // first check if the specified item has been transiently removed
@@ -210,6 +214,7 @@
 
     /**
      * {@inheritDoc}
+     * @see ItemStateManager#getNodeReferences(NodeId)
      */
     public NodeReferences getNodeReferences(NodeId id)
             throws NoSuchItemStateException, ItemStateException {
@@ -219,6 +224,7 @@
 
     /**
      * {@inheritDoc}
+     * @see ItemStateManager#hasNodeReferences(NodeId)
      */
     public boolean hasNodeReferences(NodeId id) {
         return workspaceItemStateMgr.hasNodeReferences(id);
@@ -308,14 +314,14 @@
      * This will undo all changes made to <code>state</code> and descendant
      * items of <code>state</code> inside this item state manager.
      *
-     * @param state the root state of the cancel operation.
+     * @param itemState the root state of the cancel operation.
      * @throws ItemStateException if undoing changes made to <code>state</code>
      *                            and descendant items is not a closed set of
      *                            changes. That is, at least another item needs
      *                            to be canceled as well in another sub-tree.
      */
-    public void undo(ItemState state) throws ItemStateException {
-        if (state.getParent() == null) {
+    public void undo(ItemState itemState) throws ItemStateException {
+        if (itemState.getParent() == null) {
             // optimization for root
             transientStateMgr.disposeAllItemStates();
             return;
@@ -325,23 +331,23 @@
         ChangeLog changeLog = new TransientChangeLog(idFactory, workspaceItemStateMgr);
 
         // check status of current item's state
-        if (state.isTransient()) {
-            switch (state.getStatus()) {
+        if (itemState.isTransient()) {
+            switch (itemState.getStatus()) {
                 case ItemState.STATUS_STALE_MODIFIED:
                 case ItemState.STATUS_STALE_DESTROYED:
                 case ItemState.STATUS_EXISTING_MODIFIED:
                     // add this item's state to the list
-                    changeLog.modified(state);
+                    changeLog.modified(itemState);
                     break;
                 default:
-                    log.debug("unexpected state status (" + state.getStatus() + ")");
+                    log.debug("unexpected state status (" + itemState.getStatus() + ")");
                     // ignore
                     break;
             }
         }
 
-        if (state.isNode()) {
-            NodeState nodeState = (NodeState)state;
+        if (itemState.isNode()) {
+            NodeState nodeState = (NodeState)itemState;
             // build list of 'new', 'modified' or 'stale' descendants
             Iterator iter = getDescendantTransientItemStates(nodeState);
             while (iter.hasNext()) {
@@ -471,7 +477,7 @@
                 // determine relative depth: > 0 means it's a descendant
                 int depth;
                 try {
-                    depth = getHierarchyManager().getRelativeDepth(parent, state);
+                    depth = hierMgr.getRelativeDepth(parent, state);
                 } catch (ItemNotFoundException infe) {
                     /**
                      * one of the parents of the specified item has been
@@ -553,10 +559,7 @@
 
         // use a special attic-aware hierarchy manager
         ZombieHierarchyManager zombieHierMgr =
-                new ZombieHierarchyManager(rootId,
-                        this,
-                        transientStateMgr.getAttic(),
-                        nsResolver);
+                new ZombieHierarchyManager(this, transientStateMgr.getAttic(), nsResolver);
 
         // use an array of lists to group the descendants by relative depth;
         // the depth is used as array index
@@ -713,28 +716,28 @@
 
                 case ItemState.STATUS_NEW:
                     {
-                        String msg = LogUtil.safeGetJCRPath(state, nsResolver, getHierarchyManager()) + ": cannot save a new item.";
+                        String msg = LogUtil.safeGetJCRPath(state, nsResolver, hierMgr) + ": cannot save a new item.";
                         log.debug(msg);
                         throw new ItemStateException(msg);
                     }
 
                 case ItemState.STATUS_STALE_MODIFIED:
                     {
-                        String msg = LogUtil.safeGetJCRPath(state, nsResolver, getHierarchyManager()) + ": the item cannot be saved because it has been modified externally.";
+                        String msg = LogUtil.safeGetJCRPath(state, nsResolver, hierMgr) + ": the item cannot be saved because it has been modified externally.";
                         log.debug(msg);
                         throw new StaleItemStateException(msg);
                     }
 
                 case ItemState.STATUS_STALE_DESTROYED:
                     {
-                        String msg = LogUtil.safeGetJCRPath(state, nsResolver, getHierarchyManager()) + ": the item cannot be saved because it has been deleted externally.";
+                        String msg = LogUtil.safeGetJCRPath(state, nsResolver, hierMgr) + ": the item cannot be saved because it has been deleted externally.";
                         log.debug(msg);
                         throw new StaleItemStateException(msg);
                     }
 
                 case ItemState.STATUS_UNDEFINED:
                     {
-                        String msg = LogUtil.safeGetJCRPath(state, nsResolver, getHierarchyManager()) + ": the item cannot be saved; it seems to have been removed externally.";
+                        String msg = LogUtil.safeGetJCRPath(state, nsResolver, hierMgr) + ": the item cannot be saved; it seems to have been removed externally.";
                         log.debug(msg);
                         throw new StaleItemStateException(msg);
                     }
@@ -957,7 +960,7 @@
         QNodeDefinition newDefinition = validator.getApplicableNodeDefinition(operation.getDestinationName(), srcState.getNodeTypeName(), destParent);
 
         // perform the move (modifying states)
-        // TODO: TO-BE-FIXED. Move with SPI id       
+        // TODO: TO-BE-FIXED. Move with SPI id
         boolean renameOnly = srcParent.getNodeId().equals(destParent.getNodeId());
         ChildNodeEntry cne = srcParent.getChildNodeEntry(srcState.getNodeId());
         if (cne == null) {
@@ -1434,8 +1437,6 @@
             }
         }
 
-        // now actually do unlink target state
-        targetState.setParent(null);
         // destroy target state
         // DIFF JR: destroy targetState (not overlayed state)
         destroy(targetState);

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientChangeLog.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientChangeLog.java?rev=431352&r1=431351&r2=431352&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientChangeLog.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientChangeLog.java Mon Aug 14 07:16:02 2006
@@ -101,6 +101,19 @@
     //-----------------------< ItemStateManager >-------------------------------
 
     /**
+     * Return the root node state or <code>null</code> if the root state has
+     * not been modified yet.
+     *
+     * @return
+     * @throws ItemStateException
+     * @see ItemStateManager#getRootState()
+     */
+    public NodeState getRootState() throws ItemStateException {
+        // TODO
+        return null;
+    }
+
+    /**
      * Return an item state given its id. Returns <code>null</code>
      * if the item state is neither in the added nor in the modified
      * section. Throws a <code>NoSuchItemStateException</code> if
@@ -358,7 +371,7 @@
      */
     public PropertyState createNewPropertyState(QName name, NodeState parent) {
         PropertyState propState = new PropertyState(name, parent,
-                ItemState.STATUS_NEW, true);
+                ItemState.STATUS_NEW, true, idFactory);
         // get a notification when this item state is saved or invalidated
         propState.addListener(this);
         added(propState);
@@ -407,7 +420,7 @@
         NodeId parentId = overlayedState.getParent().getNodeId();
         NodeState parentState = (NodeState) ism.getItemState(parentId);
         PropertyState propState = new PropertyState(overlayedState, parentState,
-                ItemState.STATUS_EXISTING, true);
+                ItemState.STATUS_EXISTING, true, idFactory);
         propState.addListener(this);
         return propState;
     }
@@ -422,7 +435,7 @@
         // retrieve state to overlay
         PropertyState overlayedState = (PropertyState) parent.getItemState(propertyId);
         PropertyState propState = new PropertyState(overlayedState, parentState,
-                ItemState.STATUS_EXISTING, true);
+                ItemState.STATUS_EXISTING, true, idFactory);
         propState.addListener(this);
         return propState;
     }
@@ -528,6 +541,18 @@
     private class AtticItemStateManager implements ItemStateManager {
 
         AtticItemStateManager() {
+        }
+
+        /**
+         * Since the root node may never be removed, this method always returns
+         * <code>null</code>.
+         *
+         * @return <code>null</code> since the root node cannot be removed.
+         * @throws ItemStateException
+         * @see ItemStateManager#getRootState()
+         */
+        public NodeState getRootState() throws ItemStateException {
+            return null;
         }
 
         /**

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/WorkspaceItemStateFactory.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/WorkspaceItemStateFactory.java?rev=431352&r1=431351&r2=431352&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/WorkspaceItemStateFactory.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/WorkspaceItemStateFactory.java Mon Aug 14 07:16:02 2006
@@ -201,7 +201,7 @@
             // NOTE: unable to retrieve definitionId -> needs to be retrieved
             // by the itemManager upon Property creation.
             PropertyState state = new PropertyState(info.getQName(), parent,
-                    ItemState.STATUS_EXISTING, false);
+                    ItemState.STATUS_EXISTING, false, service.getIdFactory());
             state.setMultiValued(info.isMultiValued());
             state.setType(info.getType());
             QValue[] qValues;

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionHistoryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionHistoryImpl.java?rev=431352&r1=431351&r2=431352&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionHistoryImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionHistoryImpl.java Mon Aug 14 07:16:02 2006
@@ -187,7 +187,7 @@
         QName qLabel = getQLabel(label);
         ChildNodeEntry vEntry = getVersionEntry(versionName);
         // delegate to version manager that operates on workspace directely
-        session.getVersionManager().addVersionLabel(vhState.getNodeId(), vEntry.getId(), qLabel, moveLabel);
+        session.getVersionManager().addVersionLabel(getNodeId(), vEntry.getId(), qLabel, moveLabel);
     }
 
     /**
@@ -202,7 +202,7 @@
         ChildNodeEntry vEntry = getVersionEntryByLabel(getQLabel(label));
 
         // delegate to version manager that operates on workspace directely
-        session.getVersionManager().removeVersionLabel(vhState.getNodeId(), vEntry.getId(), qLabel);
+        session.getVersionManager().removeVersionLabel(getNodeId(), vEntry.getId(), qLabel);
     }
 
     /**
@@ -308,7 +308,7 @@
      */
     public void removeVersion(String versionName) throws RepositoryException {
         ChildNodeEntry vEntry = getVersionEntry(versionName);
-        session.getVersionManager().removeVersion(vEntry.getId(), vhState.getNodeId());
+        session.getVersionManager().removeVersion(vEntry.getId(), getNodeId());
     }
 
     //---------------------------------------------------------------< Item >---
@@ -323,7 +323,7 @@
             // since all version histories are referenceable, protected and live
             // in the same workspace, a simple comparison of the ids is sufficient
             VersionHistoryImpl other = ((VersionHistoryImpl) otherItem);
-            return other.getId().equals(getId());
+            return getNodeId().equals(other.getNodeId());
         }
         return false;
     }

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionImpl.java?rev=431352&r1=431351&r2=431352&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionImpl.java Mon Aug 14 07:16:02 2006
@@ -99,7 +99,7 @@
             // since all versions are referenceable, protected and live
             // in the same workspace, a simple comparision of the ids is sufficient
             VersionImpl other = ((VersionImpl) otherItem);
-            return other.getId().equals(getId());
+            return other.getNodeId().equals(other.getNodeId());
         }
         return false;
     }