You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2007/09/20 13:56:42 UTC
svn commit: r577701 - in
/jackrabbit/branches/1.3/jackrabbit-core/src/main/java/org/apache/jackrabbit/core:
ItemImpl.java state/NodeState.java state/SessionItemStateManager.java
Author: jukka
Date: Thu Sep 20 04:56:42 2007
New Revision: 577701
URL: http://svn.apache.org/viewvc?rev=577701&view=rev
Log:
1.3: Merged revisions 56100 and 562512 (JCR-1034)
Modified:
jackrabbit/branches/1.3/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java
jackrabbit/branches/1.3/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/NodeState.java
jackrabbit/branches/1.3/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java
Modified: jackrabbit/branches/1.3/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.3/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java?rev=577701&r1=577700&r2=577701&view=diff
==============================================================================
--- jackrabbit/branches/1.3/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java (original)
+++ jackrabbit/branches/1.3/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java Thu Sep 20 04:56:42 2007
@@ -1114,8 +1114,9 @@
NodeState nodeState = (NodeState) transientState;
Set dependentIDs = new HashSet();
if (nodeState.hasOverlayedState()) {
- NodeId oldParentId =
- nodeState.getOverlayedState().getParentId();
+ NodeState overlayedState =
+ (NodeState) nodeState.getOverlayedState();
+ NodeId oldParentId = overlayedState.getParentId();
NodeId newParentId = nodeState.getParentId();
if (oldParentId != null) {
if (newParentId == null) {
@@ -1124,14 +1125,39 @@
dependentIDs.add(oldParentId);
} else {
if (!oldParentId.equals(newParentId)) {
- // node has been moved, add old and new parent
- // to dependencies
+ // node has been moved to a new location,
+ // add old and new parent to dependencies
dependentIDs.add(oldParentId);
dependentIDs.add(newParentId);
+ } else {
+ // parent id hasn't changed, check whether
+ // the node has been renamed (JCR-1034)
+ if (!affectedIds.contains(newParentId)
+ && stateMgr.hasTransientItemState(newParentId)) {
+ try {
+ NodeState parent = (NodeState) stateMgr.getTransientItemState(newParentId);
+ // check parent's renamed child node entries
+ for (Iterator cneIt =
+ parent.getRenamedChildNodeEntries().iterator();
+ cneIt.hasNext();) {
+ NodeState.ChildNodeEntry cne =
+ (NodeState.ChildNodeEntry) cneIt.next();
+ if (cne.getId().equals(nodeState.getId())) {
+ // node has been renamed,
+ // add parent to dependencies
+ dependentIDs.add(newParentId);
+ }
+ }
+ } catch (ItemStateException ise) {
+ // should never get here
+ log.warn("failed to retrieve transient state: " + newParentId, ise);
+ }
+ }
}
}
}
}
+
// removed child node entries
for (Iterator cneIt =
nodeState.getRemovedChildNodeEntries().iterator();
@@ -1155,7 +1181,7 @@
while (depIt.hasNext()) {
NodeId id = (NodeId) depIt.next();
if (!affectedIds.contains(id)) {
- // need to save the parent as well
+ // need to save dependency as well
String msg = itemMgr.safeGetJCRPath(id)
+ " needs to be saved as well.";
log.debug(msg);
Modified: jackrabbit/branches/1.3/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/NodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.3/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/NodeState.java?rev=577701&r1=577700&r2=577701&view=diff
==============================================================================
--- jackrabbit/branches/1.3/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/NodeState.java (original)
+++ jackrabbit/branches/1.3/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/NodeState.java Thu Sep 20 04:56:42 2007
@@ -626,6 +626,43 @@
/**
* Returns a list of child node entries that exist both in <i>this</i> node
+ * state and in the overlayed node state but have been renamed.
+ *
+ * @return list of renamed child node entries
+ */
+ public synchronized List getRenamedChildNodeEntries() {
+ if (!hasOverlayedState()) {
+ return Collections.EMPTY_LIST;
+ }
+
+ ChildNodeEntries otherChildNodeEntries =
+ ((NodeState) overlayedState).childNodeEntries;
+
+ // do a lazy init
+ List renamed = null;
+
+ for (Iterator iter = childNodeEntries.iterator(); iter.hasNext();) {
+ ChildNodeEntry cne = (ChildNodeEntry) iter.next();
+ ChildNodeEntry cneOther = otherChildNodeEntries.get(cne.getId());
+ if (cneOther != null && !cne.getName().equals(cneOther.getName())) {
+ // child node entry with same id but different name exists in
+ // overlayed and this state => renamed entry detected
+ if (renamed == null) {
+ renamed = new ArrayList();
+ }
+ renamed.add(cne);
+ }
+ }
+
+ if (renamed == null) {
+ return Collections.EMPTY_LIST;
+ } else {
+ return renamed;
+ }
+ }
+
+ /**
+ * Returns a list of child node entries that exist both in <i>this</i> node
* state and in the overlayed node state but have been reordered.
* <p/>
* The list may include only the minimal set of nodes that have been
Modified: jackrabbit/branches/1.3/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.3/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java?rev=577701&r1=577700&r2=577701&view=diff
==============================================================================
--- jackrabbit/branches/1.3/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java (original)
+++ jackrabbit/branches/1.3/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java Thu Sep 20 04:56:42 2007
@@ -336,6 +336,24 @@
}
/**
+ *
+ * @param id
+ * @return
+ */
+ public boolean hasTransientItemState(ItemId id) {
+ return transientStore.contains(id);
+ }
+
+ /**
+ *
+ * @param id
+ * @return
+ */
+ public boolean hasTransientItemStateInAttic(ItemId id) {
+ return atticStore.contains(id);
+ }
+
+ /**
* @return <code>true</code> if this manager has any transient state;
* <code>false</code> otherwise.
*/