You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by st...@apache.org on 2007/08/03 18:08:42 UTC
svn commit: r562512 - in
/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core:
ItemImpl.java NodeImpl.java state/NodeState.java
state/SessionItemStateManager.java
Author: stefan
Date: Fri Aug 3 09:08:41 2007
New Revision: 562512
URL: http://svn.apache.org/viewvc?view=rev&rev=562512
Log:
JCR-1038: java.lang.ArrayIndexOutOfBoundsException while importXML in Java 6
Modified:
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/NodeState.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java?view=diff&rev=562512&r1=562511&r2=562512
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java Fri Aug 3 09:08:41 2007
@@ -1130,26 +1130,34 @@
dependentIDs.add(oldParentId);
dependentIDs.add(newParentId);
} else {
- // edge case: check whether definition id
- // has changed (indicating that the node
- // had been renamed, subsequently acquiring
- // a new definition) (JCR-1034)
- if (!nodeState.getDefinitionId().equals(
- overlayedState.getDefinitionId())) {
- // node has been renamed and as result
- // got redefined, add parent to dependencies
- dependentIDs.add(newParentId);
+ // 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);
+ }
}
}
}
}
}
- // note that there's no need to check removed/added
- // child node entries since those, being descendants,
- // will automatically be included in the hierarchical
- // scope of this save operation.
-/*
// removed child node entries
for (Iterator cneIt =
nodeState.getRemovedChildNodeEntries().iterator();
@@ -1166,14 +1174,14 @@
(NodeState.ChildNodeEntry) cneIt.next();
dependentIDs.add(cne.getId());
}
- */
+
// now walk through dependencies and check whether they
// are within the scope of this save operation
Iterator depIt = dependentIDs.iterator();
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/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java?view=diff&rev=562512&r1=562511&r2=562512
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java Fri Aug 3 09:08:41 2007
@@ -635,10 +635,6 @@
}
protected void onRedefine(NodeDefId defId) throws RepositoryException {
- if (defId.equals(((NodeState) state).getDefinitionId())) {
- // no change, ignore silently...
- return;
- }
NodeDefinitionImpl newDef =
session.getNodeTypeManager().getNodeDefinition(defId);
// modify the state of 'this', i.e. the target node
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/NodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/NodeState.java?view=diff&rev=562512&r1=562511&r2=562512
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/NodeState.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/NodeState.java Fri Aug 3 09:08:41 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/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java?view=diff&rev=562512&r1=562511&r2=562512
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java Fri Aug 3 09:08:41 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.
*/