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/18 15:43:42 UTC
svn commit: r432582 - 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: Fri Aug 18 06:43:42 2006
New Revision: 432582
URL: http://svn.apache.org/viewvc?rev=432582&view=rev
Log:
- Implement ItemState.revert() and use in SessionItemStateManager.undo()
- Removed some JR diffs
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=432582&r1=432581&r2=432582&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 Fri Aug 18 06:43:42 2006
@@ -23,6 +23,7 @@
import org.slf4j.LoggerFactory;
import java.util.Collection;
+import java.util.Set;
/**
* <code>ItemState</code> represents the state of an <code>Item</code>.
@@ -475,6 +476,15 @@
public abstract void remove() throws ItemStateException;
/**
+ * Reverts this item state to its initial status and adds itself to the Set
+ * of <code>affectedItemStates</code> if it reverted itself.
+ *
+ * @param affectedItemStates the set of affected item states that reverted
+ * themselfes.
+ */
+ public abstract void revert(Set affectedItemStates);
+
+ /**
* Add an <code>ItemStateListener</code>
*
* @param listener the new listener to be informed on modifications
@@ -503,8 +513,8 @@
*/
public void stateCreated(ItemState created) {
// underlying state has been permanently created
- setStatus(STATUS_EXISTING); // TODO: shouldn't the status change happen after pull?
pull();
+ setStatus(STATUS_EXISTING);
}
/**
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=432582&r1=432581&r2=432582&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 Fri Aug 18 06:43:42 2006
@@ -590,6 +590,101 @@
}
/**
+ * Reverts all property and child node states that belong to this
+ * <code>NodeState</code> and finally reverts this <code>NodeState</code>.
+ *
+ * @inheritDoc
+ * @see ItemState#revert(Set)
+ */
+ public void revert(Set affectedItemStates) {
+ if (overlayedState == null) {
+ throw new IllegalStateException("revert cannot be called on workspace state");
+ }
+ // copy to new list, when a property is reverted it may call this node
+ // state to remove itself from properties.
+ List props = new ArrayList(properties.values());
+ for (Iterator it = props.iterator(); it.hasNext(); ) {
+ PropertyReference ref = (PropertyReference) it.next();
+ if (ref.isResolved()) {
+ try {
+ PropertyState propState = ref.getPropertyState();
+ propState.revert(affectedItemStates);
+ } catch (ItemStateException e) {
+ // should not happen because PropertyReference is resolved
+ log.warn("Unable to get PropertyState from resolved PropertyReference");
+ }
+ } else {
+ // not touched or accessed before
+ }
+ }
+
+ // revert property states in attic
+ props.clear();
+ props.addAll(propertiesInAttic.values());
+ for (Iterator it = props.iterator(); it.hasNext(); ) {
+ PropertyReference ref = (PropertyReference) it.next();
+ try {
+ PropertyState propState = ref.getPropertyState();
+ propState.revert(affectedItemStates);
+ } catch (ItemStateException e) {
+ // probably stale destroyed property
+ // cleaned up when propertiesInAttic is cleared
+ }
+ }
+ propertiesInAttic.clear();
+
+ // now revert child node states
+ List children = new ArrayList(childNodeEntries);
+ for (Iterator it = children.iterator(); it.hasNext(); ) {
+ ChildNodeReference ref = (ChildNodeReference) it.next();
+ if (ref.isResolved()) {
+ try {
+ NodeState nodeState = ref.getNodeState();
+ nodeState.revert(affectedItemStates);
+ } catch (ItemStateException e) {
+ // should not happen because ChildNodeReference is resolved
+ log.warn("Unable to get NodeState from resolved ChildNodeReference");
+ }
+ } else {
+ // not touched or accessed before
+ }
+ }
+
+ // now revert this node state
+ switch (status) {
+ case STATUS_EXISTING:
+ // nothing to do
+ break;
+ case STATUS_EXISTING_MODIFIED:
+ case STATUS_EXISTING_REMOVED:
+ case STATUS_STALE_MODIFIED:
+ // revert state from overlayed
+ pull();
+ setStatus(STATUS_EXISTING);
+ affectedItemStates.add(this);
+ break;
+ case STATUS_NEW:
+ // set removed
+ setStatus(STATUS_REMOVED);
+ // remove from parent
+ parent.childNodeStateRemoved(this);
+ affectedItemStates.add(this);
+ break;
+ case STATUS_REMOVED:
+ // shouldn't happen actually, because a 'removed' state is not
+ // accessible anymore
+ log.warn("trying to revert an already removed node state");
+ parent.childNodeStateRemoved(this);
+ break;
+ case STATUS_STALE_DESTROYED:
+ // overlayed state does not exist anymore
+ parent.childNodeStateRemoved(this);
+ affectedItemStates.add(this);
+ break;
+ }
+ }
+
+ /**
* Determines if there is a property entry with the specified
* <code>QName</code>.
*
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=432582&r1=432581&r2=432582&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 Fri Aug 18 06:43:42 2006
@@ -32,6 +32,8 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.util.Set;
+
/**
* <code>PropertyState</code> represents the state of a <code>Property</code>.
*/
@@ -105,6 +107,47 @@
setStatus(STATUS_EXISTING_REMOVED);
}
parent.propertyStateRemoved(this);
+ }
+
+ /**
+ * @inheritDoc
+ * @see ItemState#revert(Set)
+ */
+ public void revert(Set affectedItemStates) {
+ if (overlayedState == null) {
+ throw new IllegalStateException("revert cannot be called on workspace state");
+ }
+ switch (status) {
+ case STATUS_EXISTING:
+ // nothing to do
+ break;
+ case STATUS_EXISTING_MODIFIED:
+ case STATUS_EXISTING_REMOVED:
+ case STATUS_STALE_MODIFIED:
+ // revert state from overlayed
+ pull();
+ setStatus(STATUS_EXISTING);
+ affectedItemStates.add(this);
+ break;
+ case STATUS_NEW:
+ // set removed
+ setStatus(STATUS_REMOVED);
+ // and remove from parent
+ parent.propertyStateRemoved(this);
+ affectedItemStates.add(this);
+ break;
+ case STATUS_REMOVED:
+ // shouldn't happen actually, because a 'removed' state is not
+ // accessible anymore
+ log.warn("trying to revert an already removed property state");
+ parent.propertyStateRemoved(this);
+ break;
+ case STATUS_STALE_DESTROYED:
+ // overlayed does not exist anymore
+ parent.propertyStateRemoved(this);
+ affectedItemStates.add(this);
+ break;
+ }
}
/**
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=432582&r1=432581&r2=432582&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 Fri Aug 18 06:43:42 2006
@@ -101,7 +101,6 @@
/**
* State manager for the transient items
*/
- // DIFF JACKRABBIT: private final TransientItemStateManager transientStateMgr;
private final TransientItemStateManager transientStateMgr;
/**
@@ -122,7 +121,6 @@
ItemStateValidator validator,
NamespaceResolver nsResolver) {
this.workspaceItemStateMgr = workspaceItemStateMgr;
- // DIFF JACKRABBIT: this.transientStateMgr = new TransientItemStateManager();
this.transientStateMgr = new TransientItemStateManager(idFactory, workspaceItemStateMgr);
// DIFF JR: validator added
this.validator = validator;
@@ -303,99 +301,16 @@
* to be canceled as well in another sub-tree.
*/
public void undo(ItemState itemState) throws ItemStateException {
- if (itemState.getParent() == null) {
- // optimization for root
- transientStateMgr.disposeAllItemStates();
- return;
- }
-
- // list of transient items that should be discarded
- ChangeLog changeLog = new ChangeLog();
-
- // check status of current item's state
- if (itemState.isTransient()) {
- switch (itemState.getStatus()) {
- // safety... should have been checked befoe
- case ItemState.STATUS_NEW:
- throw new ItemStateException("Unexpected state: cannot start undo from a new item state.");
-
- 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(itemState);
- break;
- default:
- log.debug("unexpected state status (" + itemState.getStatus() + ")");
- // ignore
- break;
- }
- }
-
- if (itemState.isNode()) {
- NodeState nodeState = (NodeState)itemState;
- // build list of 'new', 'modified' or 'stale' descendants
- Iterator iter = getDescendantTransientItemStates(nodeState);
- while (iter.hasNext()) {
- ItemState childState = (ItemState) iter.next();
- switch (childState.getStatus()) {
- case ItemState.STATUS_STALE_MODIFIED:
- case ItemState.STATUS_STALE_DESTROYED:
- case ItemState.STATUS_NEW:
- case ItemState.STATUS_EXISTING_MODIFIED:
- // add new or modified state to the list
- changeLog.modified(childState);
- break;
-
- default:
- log.debug("unexpected state status (" + childState.getStatus() + ")");
- // ignore
- break;
- }
- }
-
- // build list of deleted states
- Iterator atticIter = getDescendantTransientItemStatesInAttic(nodeState);
- while (atticIter.hasNext()) {
- ItemState transientState = (ItemState) atticIter.next();
- changeLog.deleted(transientState);
- }
- }
+ // TODO: check if self contained
- /**
- * build set of item id's which are within the scope of
- * (i.e. affected by) this cancel operation
- */
- Set affectedStates = new HashSet();
- Iterator it = new IteratorChain(changeLog.modifiedStates(), changeLog.deletedStates());
- while (it.hasNext()) {
- affectedStates.add(it.next());
- }
- collectOperations(affectedStates, changeLog);
+ Set affectedItemStates = new HashSet();
+ itemState.revert(affectedItemStates);
- // process list of 'new', 'modified' or 'stale' transient states
- Iterator transIter = changeLog.modifiedStates();
- while (transIter.hasNext()) {
- // dispose the transient state, it is no longer used;
- // this will indirectly (through stateDiscarded listener method)
- // either restore or permanently invalidate the wrapping Item instances
- ItemState transientState = (ItemState) transIter.next();
- transientStateMgr.disposeItemState(transientState);
- }
- // process list of deleted states
- Iterator remIter = changeLog.deletedStates();
- while (remIter.hasNext()) {
- ItemState rmState = (ItemState) remIter.next();
- // dispose the transient state; this will indirectly (through
- // stateDiscarded listener method) resurrect the wrapping Item instances
- transientStateMgr.disposeItemStateInAttic(rmState);
- }
+ ChangeLog changeLog = new ChangeLog();
+ collectOperations(affectedItemStates, changeLog);
// remove all canceled operations
- Iterator opIter = changeLog.getOperations();
- while (opIter.hasNext()) {
- transientStateMgr.removeOperation((Operation) opIter.next());
- }
+ transientStateMgr.disposeOperations(changeLog.getOperations());
}
/**
@@ -534,7 +449,6 @@
* @return an iterator over descendant transient item state instances in the attic
*/
private Iterator getDescendantTransientItemStatesInAttic(NodeState parent) {
- // DIFF JACKRABBIT: if (!transientStateMgr.hasAnyItemStatesInAttic()) {
if (!transientStateMgr.hasDeletedItemStates()) {
return Collections.EMPTY_LIST.iterator();
}