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 2011/09/27 20:43:46 UTC

svn commit: r1176515 - in /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core: ItemSaveOperation.java state/SessionItemStateManager.java

Author: jukka
Date: Tue Sep 27 18:43:46 2011
New Revision: 1176515

URL: http://svn.apache.org/viewvc?rev=1176515&view=rev
Log:
JCR-3063: NullPointerException in ItemManager

Add a few extra checks against NPEs and CMEs

Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemSaveOperation.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/ItemSaveOperation.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemSaveOperation.java?rev=1176515&r1=1176514&r2=1176515&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemSaveOperation.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemSaveOperation.java Tue Sep 27 18:43:46 2011
@@ -490,9 +490,18 @@ class ItemSaveOperation implements Sessi
                  * its primary type has changed, check its node type against the
                  * required node type in its definition
                  */
-                if (nodeState.getStatus() == ItemState.STATUS_NEW
-                        || !nodeState.getNodeTypeName().equals(
-                            ((NodeState) nodeState.getOverlayedState()).getNodeTypeName())) {
+                boolean primaryTypeChanged =
+                        nodeState.getStatus() == ItemState.STATUS_NEW;
+                if (!primaryTypeChanged) {
+                    NodeState overlaid =
+                            (NodeState) nodeState.getOverlayedState();
+                    if (overlaid != null) {
+                        Name newName = nodeState.getNodeTypeName();
+                        Name oldName = overlaid.getNodeTypeName();
+                        primaryTypeChanged = !newName.equals(oldName);
+                    }
+                }
+                if (primaryTypeChanged) {
                     for (NodeType ntReq : nodeDef.getRequiredPrimaryTypes()) {
                         Name ntName = ((NodeTypeImpl) ntReq).getQName();
                         if (!(pnt.getQName().equals(ntName)

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?rev=1176515&r1=1176514&r2=1176515&view=diff
==============================================================================
--- 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 Tue Sep 27 18:43:46 2011
@@ -470,7 +470,9 @@ public class SessionItemStateManager
         Collection<NodeId> candidateIds = new LinkedList<NodeId>();
         try {
             HierarchyManager hierMgr = getHierarchyMgr();
-            for (ItemState state : transientStore.values()) {
+            ItemState[] states =
+                    transientStore.values().toArray(new ItemState[0]);
+            for (ItemState state : states) {
                 if (state.getStatus() == ItemState.STATUS_EXISTING_MODIFIED
                         || state.getStatus() == ItemState.STATUS_STALE_DESTROYED) {
                     NodeId nodeId;
@@ -567,7 +569,6 @@ public class SessionItemStateManager
      */
     public NodeState createTransientNodeState(NodeId id, Name nodeTypeName, NodeId parentId, int initialStatus)
             throws ItemStateException {
-
         // check map; synchronized to ensure an entry is not created twice.
         synchronized (transientStore) {
             if (transientStore.containsKey(id)) {