You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by mr...@apache.org on 2006/08/16 11:15:55 UTC

svn commit: r431866 - in /jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state: ItemState.java NodeState.java PropertyState.java SessionItemStateManager.java

Author: mreutegg
Date: Wed Aug 16 02:15:54 2006
New Revision: 431866

URL: http://svn.apache.org/viewvc?rev=431866&view=rev
Log:
- Implement remove on NodeState and PropertyState.
- Use new remove method in SessionItemStateManager.

Modified:
    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/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

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=431866&r1=431865&r2=431866&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 Wed Aug 16 02:15:54 2006
@@ -381,6 +381,20 @@
     }
 
     /**
+     * Returns <code>true</code> if this item state is valid, that is its status
+     * is one of:
+     * <ul>
+     * <li>{@link #STATUS_EXISTING}</li>
+     * <li>{@link #STATUS_EXISTING_MODIFIED}</li>
+     * <li>{@link #STATUS_NEW}</li>
+     * </ul>
+     * @return
+     */
+    public boolean isValid() {
+        return status == STATUS_EXISTING || status == STATUS_EXISTING_MODIFIED || status == STATUS_NEW;
+    }
+
+    /**
      * 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.
@@ -449,6 +463,17 @@
     public ItemState getOverlayedState() {
         return overlayedState;
     }
+
+    /**
+     * Removes this item state. This will change the status of this property
+     * state to either {@link #STATUS_EXISTING_REMOVED} or {@link
+     * #STATUS_REMOVED} depending on the current status.
+     *
+     * @throws ItemStateException if an error occurs while removing this item
+     *                            state. e.g. this item state is not valid
+     *                            anymore.
+     */
+    public abstract void remove() throws ItemStateException;
 
     /**
      * Add an <code>ItemStateListener</code>

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=431866&r1=431865&r2=431866&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 Wed Aug 16 02:15:54 2006
@@ -565,6 +565,36 @@
     }
 
     /**
+     * Notifies this node state that a child node state has been removed.
+     *
+     * @param nodeState the node state that has been removed.
+     * @throws IllegalArgumentException if <code>this</code> is not the parent
+     *                                  of <code>nodeState</code>.
+     */
+    synchronized void childNodeStateRemoved(NodeState nodeState) {
+        if (nodeState.getParent() != this) {
+            throw new IllegalArgumentException("This NodeState is not the parent of nodeState");
+        }
+        // if nodeState does not exist anymore remove its child node entry
+        if (nodeState.getStatus() == STATUS_REMOVED) {
+            List entries = getChildNodeEntries(nodeState.getName());
+            for (Iterator it = entries.iterator(); it.hasNext(); ) {
+                ChildNodeEntry cne = (ChildNodeEntry) it.next();
+                try {
+                    if (cne.getNodeState() == nodeState) {
+                        childNodeEntries.remove(cne);
+                        break;
+                    }
+                } catch (ItemStateException e) {
+                    // does not exist anymore? TODO: better error handling
+                    log.warn("child node entry does not exist anymore", e);
+                }
+            }
+        }
+        markModified();
+    }
+
+    /**
      * Sets the list of <code>ChildNodeEntry</code> objects denoting the
      * child nodes of this node.
      */
@@ -579,6 +609,43 @@
     }
 
     /**
+
+    /**
+     * @inheritDoc
+     * @see ItemState#remove()
+     */
+    public void remove() throws ItemStateException {
+        if (!isValid()) {
+            throw new ItemStateException("cannot remove an invalid NodeState");
+        }
+        // first remove all properties
+        for (Iterator it = properties.values().iterator(); it.hasNext(); ) {
+            PropertyState propState = ((ChildPropertyEntry) it.next()).getPropertyState();
+            if (propState.isValid()) {
+                propState.remove();
+            } else {
+                // already removed
+            }
+        }
+        // then remove child node entries
+        for (Iterator it = childNodeEntries.iterator(); it.hasNext(); ) {
+            NodeState nodeState = ((ChildNodeEntry) it.next()).getNodeState();
+            if (nodeState.isValid()) {
+                nodeState.remove();
+            } else {
+                // already removed
+            }
+        }
+        if (status == STATUS_EXISTING || status == STATUS_EXISTING_MODIFIED) {
+            setStatus(STATUS_EXISTING_REMOVED);
+        } else if (status == STATUS_NEW) {
+            setStatus(STATUS_REMOVED);
+        }
+        // now inform parent
+        parent.childNodeStateRemoved(this);
+    }
+
+    /**
      * Determines if there is a property entry with the specified
      * <code>QName</code>.
      *
@@ -655,6 +722,25 @@
      */
     synchronized boolean removePropertyName(QName propName) {
         return properties.remove(propName) != null;
+    }
+
+    /**
+     * Notifies this node state that a property state has been removed.
+     *
+     * @param propState the property state that has been removed.
+     * @throws IllegalArgumentException if <code>this</code> is not the parent
+     *                                  of <code>propState</code>.
+     */
+    synchronized void propertyStateRemoved(PropertyState propState) {
+        if (propState.getParent() != this) {
+            throw new IllegalArgumentException("This NodeState is not the parent of propState");
+        }
+        // remove property state from map of properties if it does not exist
+        // anymore, otherwise leave the property state in the map
+        if (propState.getStatus() == STATUS_REMOVED) {
+            properties.remove(propState.getQName());
+        }
+        markModified();
     }
 
     /**

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=431866&r1=431865&r2=431866&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 Wed Aug 16 02:15:54 2006
@@ -96,6 +96,18 @@
     }
 
     /**
+     * @inheritDoc
+     */
+    public void remove() {
+        if (status == STATUS_NEW) {
+            setStatus(STATUS_REMOVED);
+        } else {
+            setStatus(STATUS_EXISTING_REMOVED);
+        }
+        parent.propertyStateRemoved(this);
+    }
+
+    /**
      * {@inheritDoc}
      */
     protected synchronized void copy(ItemState state) {

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=431866&r1=431865&r2=431866&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 Wed Aug 16 02:15:54 2006
@@ -1339,7 +1339,6 @@
         }
     }
 
-    // TODO: TO-BE-FIXED. removal of same-name-sibling node must include reordering
     private void removeItemState(ItemState itemState, int options) throws RepositoryException {
         // DIFF JR: check for both, node- and propertyState
         validator.checkRemoveItem(itemState, options);
@@ -1347,13 +1346,10 @@
         // recursively remove the complete tree including the given node state.
         boolean success = false;
         try {
-            NodeState parent = itemState.getParent();
-            if (itemState.isNode()) {
-                removeNodeState(parent, (NodeState)itemState);
-            } else {
-                removePropertyState(parent, (PropertyState)itemState);
-            }
+            itemState.remove();
             success = true;
+        } catch (ItemStateException e) {
+            throw new RepositoryException("Cannot remove item: " + e.getMessage(), e);
         } finally {
             if (!success) {
                 // TODO: undo state modifications
@@ -1362,90 +1358,6 @@
     }
 
     /**
-     * Unlinks the specified node state from its parent and recursively
-     * removes it including its properties and child nodes.
-     * <p/>
-     * Note that no checks (access rights etc.) are performed on the specified
-     * target node state. Those checks have to be performed beforehand by the
-     * caller. However, the (recursive) removal of target node's child nodes are
-     * subject to the following checks: access rights, locking, versioning.
-     *
-     * @param target
-     */
-    private void removeNodeState(NodeState parent, NodeState target) throws ItemNotFoundException, RepositoryException {
-        // TODO: implement this functionality in NodeState. i.e. target.remove()
-        // remove child node entry from parent
-        parent.removeChildNodeEntry(target.getNodeId());
-        // remove target
-        recursiveRemoveNodeState(target);
-    }
-
-    /**
-     *
-     * @param parent
-     * @param target
-     */
-    private void removePropertyState(NodeState parent, PropertyState target) {
-        // TODO: implement this functionality in PropertyState. i.e. target.remove()
-        // remove property entry
-        parent.removePropertyName(target.getQName());
-        // destroy property state
-        // DIFF JR: notification of transient item state manager is done using ItemStateLifeCycleListener
-        //destroy(target);
-        target.notifyStateDiscarded();
-    }
-
-    /**
-     * Recursively removes the given node state including its child states.
-     * <p/>
-     * The removal of child nodes is subject to the following checks:
-     * access rights, locking & versioning status. Referential integrity
-     * (references) is checked on commit.
-     * <p/>
-     * Note that the child node entry refering to <code>targetState</code> is
-     * <b><i>not</i></b> automatically removed from <code>targetState</code>'s
-     * parent.
-     *
-     * // TODO fix description
-     *
-     * @param targetState
-     */
-    private void recursiveRemoveNodeState(NodeState targetState) throws RepositoryException  {
-        if (targetState.hasChildNodeEntries()) {
-            // remove child nodes
-            // use temp array to avoid ConcurrentModificationException
-            Iterator tmpIter = new ArrayList(targetState.getChildNodeEntries()).iterator();
-            // remove from tail to avoid problems with same-name siblings
-            while (tmpIter.hasNext()) {
-                ChildNodeEntry entry = (ChildNodeEntry) tmpIter.next();
-                try {
-                    NodeState child = entry.getNodeState();
-                    // remove child node
-                    // DIFF JR: don't recheck permission for child states
-                    // DIFF JR: jr first calls recursive-method then removes c-n-entry
-                    removeNodeState(targetState, child);
-                } catch (ItemStateException e) {
-                    // ignore
-                    // TODO: check if correct
-                }
-            }
-        }
-
-        // remove properties
-        Iterator tmpIter = new HashSet(targetState.getPropertyEntries()).iterator();
-        while (tmpIter.hasNext()) {
-            ChildPropertyEntry entry = (PropertyReference) tmpIter.next();
-            try {
-                PropertyState child = entry.getPropertyState();
-                removePropertyState(targetState, child);
-            } catch (ItemStateException e) {
-                // ignore
-                // TODO: check if correct
-            }
-        }
-    }
-
-    /**
      *
      * @param propState
      * @param iva
@@ -1571,4 +1483,4 @@
             throw new RepositoryException(msg, e);
         }
     }
-}
\ No newline at end of file
+}