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/12/01 17:53:19 UTC
svn commit: r481293 - in
/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state:
ChangeLog.java ItemState.java NodeState.java SessionItemStateManager.java
TransientItemStateManager.java
Author: angela
Date: Fri Dec 1 08:53:18 2006
New Revision: 481293
URL: http://svn.apache.org/viewvc?view=rev&rev=481293
Log:
work in progress
- cleaning changeLog upon status changes (resolve TODO)
- ChangeLog: make state-sets private
Modified:
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ChangeLog.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/NodeState.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/TransientItemStateManager.java
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ChangeLog.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ChangeLog.java?view=diff&rev=481293&r1=481292&r2=481293
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ChangeLog.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ChangeLog.java Fri Dec 1 08:53:18 2006
@@ -35,17 +35,17 @@
/**
* Added states
*/
- final Set addedStates = new LinkedHashSet();
+ private final Set addedStates = new LinkedHashSet();
/**
* Modified states
*/
- final Set modifiedStates = new LinkedHashSet();
+ private final Set modifiedStates = new LinkedHashSet();
/**
* Deleted states
*/
- final Set deletedStates = new LinkedHashSet();
+ private final Set deletedStates = new LinkedHashSet();
/**
* Type of operation this changelog is collection state modifications for.
@@ -170,6 +170,17 @@
}
/**
+ * Returns true, if this change log contains the given <code>ItemState</code>
+ * in the set of transiently removed states.
+ *
+ * @param state
+ * @return
+ */
+ public boolean containsDeletedState(ItemState state) {
+ return deletedStates.contains(state);
+ }
+
+ /**
* Removes the subset of this changelog represented by the given
* <code>ChangeLog</code> from this changelog.
*
@@ -182,6 +193,72 @@
deletedStates.removeAll(subChangeLog.deletedStates);
operations.removeAll(subChangeLog.operations);
+ }
+
+ /**
+ * Remove all entries and operation related to the given ItemState, that
+ * are not used any more (respecting the status change).
+ *
+ * @param state
+ */
+ public void removeAffected(ItemState state, int previousStatus) {
+ switch (state.getStatus()) {
+ case (Status.EXISTING):
+ switch (previousStatus) {
+ case Status.EXISTING_MODIFIED:
+ // was modified and is now refreshed
+ modifiedStates.remove(state);
+ break;
+ case Status.EXISTING_REMOVED:
+ // was removed and is now refreshed
+ deletedStates.remove(state);
+ break;
+ case Status.STALE_MODIFIED:
+ // was modified and state and is now refreshed
+ modifiedStates.remove(state);
+ break;
+ case Status.NEW:
+ // was new and has been saved now
+ addedStates.remove(state);
+ break;
+ }
+ // TODO: check if correct: changelog gets cleared any way -> no need to remove operations
+ break;
+ case Status.EXISTING_MODIFIED:
+ modified(state);
+ break;
+ case (Status.REMOVED):
+ if (previousStatus == Status.NEW) {
+ // was new and now removed again
+ addedStates.remove(state);
+ // TODO: remove 'addNode' or 'setProperty' operation
+ deletedStates.remove(state);
+ removeAffectedOperations(state);
+ } else if (previousStatus == Status.EXISTING_REMOVED) {
+ // was removed and is now saved
+ deletedStates.remove(state);
+ removeAffectedOperations(state);
+ }
+ break;
+ case (Status.EXISTING_REMOVED):
+ deleted(state);
+ removeAffectedOperations(state);
+ break;
+ case Status.STALE_DESTROYED:
+ // state is now stale. remove from modified
+ modifiedStates.remove(state);
+ removeAffectedOperations(state);
+ break;
+ }
+ }
+
+ private void removeAffectedOperations(ItemState state) {
+ for (Iterator it = operations.iterator(); it.hasNext();) {
+ Operation op = (Operation) it.next();
+ if (op.getAffectedItemStates().contains(state)) {
+ it.remove();
+ }
+ }
}
/**
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?view=diff&rev=481293&r1=481292&r2=481293
==============================================================================
--- 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 Dec 1 08:53:18 2006
@@ -286,7 +286,6 @@
force the overlaying state to synchronize as well as to inform
other listeners about changes.
*/
- // TODO: improve...
status = 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?view=diff&rev=481293&r1=481292&r2=481293
==============================================================================
--- 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 Dec 1 08:53:18 2006
@@ -876,7 +876,7 @@
// adjust parent states unless the parent is removed as well
NodeState parent = state.getParent();
- if (!changeLog.deletedStates.contains(parent)) {
+ if (!changeLog.containsDeletedState(parent)) {
NodeState overlayedParent = (NodeState) parent.overlayedState;
if (state.isNode()) {
overlayedParent.childNodeEntries.remove((NodeState)state.overlayedState);
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?view=diff&rev=481293&r1=481292&r2=481293
==============================================================================
--- 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 Dec 1 08:53:18 2006
@@ -482,8 +482,10 @@
| ItemStateValidator.CHECK_VERSIONING
| ItemStateValidator.CHECK_CONSTRAINTS;
removeItemState(state, options);
- // remember operation
- transientStateMgr.addOperation(operation);
+ // remember operation unless new state got removed
+ if (!Status.isTerminal(state.getStatus())) {
+ transientStateMgr.addOperation(operation);
+ }
}
/**
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientItemStateManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientItemStateManager.java?view=diff&rev=481293&r1=481292&r2=481293
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientItemStateManager.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientItemStateManager.java Fri Dec 1 08:53:18 2006
@@ -236,61 +236,21 @@
//-----------------------------------------< ItemStateLifeCycleListener >---
/**
- * @inheritDoc
+ * Depending on status of the given state adapt change log.
+ * E.g. a revert on states will reset the status from 'existing modified' to
+ * 'existing'. A state which changes from 'existing' to 'existing modified'
+ * will go into the modified set of the change log, etc.
+ *
* @see ItemStateLifeCycleListener#statusChanged(ItemState, int)
*/
public void statusChanged(ItemState state, int previousStatus) {
- // TODO: depending on status of state adapt change log
- // e.g. a revert on states will reset the status from
- // 'existing modified' to 'existing'.
- // a state which changes from 'existing' to 'existing modified' will
- // go into the modified set of the change log, etc.
switch (state.getStatus()) {
case Status.EXISTING:
- switch (previousStatus) {
- case Status.EXISTING_MODIFIED:
- // was modified and is now refreshed
- changeLog.modifiedStates.remove(state);
- break;
- case Status.EXISTING_REMOVED:
- // was removed and is now refreshed
- changeLog.deletedStates.remove(state);
- break;
- case Status.STALE_MODIFIED:
- // was modified and state and is now refreshed
- changeLog.modifiedStates.remove(state);
- break;
- case Status.NEW:
- // was new and has been saved now
- changeLog.addedStates.remove(state);
- break;
- }
- break;
case Status.EXISTING_MODIFIED:
- changeLog.modified(state);
- break;
case Status.EXISTING_REMOVED:
- // check if modified earlier
- if (previousStatus == Status.EXISTING_MODIFIED) {
- changeLog.modifiedStates.remove(state);
- // todo: remove operation(s) as well
- }
- changeLog.deleted(state);
- break;
case Status.REMOVED:
- if (previousStatus == Status.NEW) {
- // was new and now removed again
- changeLog.addedStates.remove(state);
- // TODO: remove operation as well
- } else if (previousStatus == Status.EXISTING_REMOVED) {
- // was removed and is now saved
- changeLog.deletedStates.remove(state);
- }
- break;
case Status.STALE_DESTROYED:
- // state is now stale. remove from modified
- changeLog.modifiedStates.remove(state);
- // TODO: remove operation as well
+ changeLog.removeAffected(state, previousStatus);
break;
case Status.STALE_MODIFIED:
// state is now stale. keep in modified. wait until refreshed