You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ba...@apache.org on 2015/12/21 19:49:16 UTC

svn commit: r1721233 - in /jackrabbit/branches/2.6/jackrabbit-core/src: main/java/org/apache/jackrabbit/core/ main/java/org/apache/jackrabbit/core/persistence/bundle/ main/java/org/apache/jackrabbit/core/persistence/util/ main/java/org/apache/jackrabbi...

Author: baedke
Date: Mon Dec 21 18:49:15 2015
New Revision: 1721233

URL: http://svn.apache.org/viewvc?rev=1721233&view=rev
Log:
JCR-2633: Modified externally exception when modifying mixinTypes with single session

Persist jcr:mixinTypes to avoid inconsistencies when adding and removing mixin types (patch created by berry@halderen.net).

Added:
    jackrabbit/branches/2.6/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/LostFromCacheIssueTest.java   (with props)
Modified:
    jackrabbit/branches/2.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemManager.java
    jackrabbit/branches/2.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/AbstractBundlePersistenceManager.java
    jackrabbit/branches/2.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/BundleReader.java
    jackrabbit/branches/2.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/NodePropBundle.java
    jackrabbit/branches/2.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java
    jackrabbit/branches/2.6/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/TestAll.java

Modified: jackrabbit/branches/2.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemManager.java?rev=1721233&r1=1721232&r2=1721233&view=diff
==============================================================================
--- jackrabbit/branches/2.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemManager.java (original)
+++ jackrabbit/branches/2.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemManager.java Mon Dec 21 18:49:15 2015
@@ -381,7 +381,7 @@ public class ItemManager implements Item
             try {
                 state = sism.getItemState(itemId);
             } catch (NoSuchItemStateException nsise) {
-                throw new ItemNotFoundException(itemId.toString());
+                throw new ItemNotFoundException(itemId.toString(), nsise);
             } catch (ItemStateException ise) {
                 String msg = "failed to retrieve item state of item " + itemId;
                 log.error(msg, ise);

Modified: jackrabbit/branches/2.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/AbstractBundlePersistenceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/AbstractBundlePersistenceManager.java?rev=1721233&r1=1721232&r2=1721233&view=diff
==============================================================================
--- jackrabbit/branches/2.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/AbstractBundlePersistenceManager.java (original)
+++ jackrabbit/branches/2.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/AbstractBundlePersistenceManager.java Mon Dec 21 18:49:15 2015
@@ -639,9 +639,8 @@ public abstract class AbstractBundlePers
                 bundle.update((NodeState) state);
             } else {
                 PropertyId id = (PropertyId) state.getId();
-                // skip redundant primaryType, mixinTypes and uuid properties
+                // skip redundant primaryType and uuid properties
                 if (id.getName().equals(JCR_PRIMARYTYPE)
-                    || id.getName().equals(JCR_MIXINTYPES)
                     || id.getName().equals(JCR_UUID)) {
                     continue;
                 }
@@ -687,9 +686,8 @@ public abstract class AbstractBundlePers
         for (ItemState state : changeLog.addedStates()) {
             if (!state.isNode()) {
                 PropertyId id = (PropertyId) state.getId();
-                // skip primaryType pr mixinTypes properties
+                // skip primaryType and uuid properties
                 if (id.getName().equals(JCR_PRIMARYTYPE)
-                    || id.getName().equals(JCR_MIXINTYPES)
                     || id.getName().equals(JCR_UUID)) {
                     continue;
                 }

Modified: jackrabbit/branches/2.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/BundleReader.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/BundleReader.java?rev=1721233&r1=1721232&r2=1721233&view=diff
==============================================================================
--- jackrabbit/branches/2.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/BundleReader.java (original)
+++ jackrabbit/branches/2.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/BundleReader.java Mon Dec 21 18:49:15 2015
@@ -247,7 +247,6 @@ class BundleReader {
             NodePropBundle.PropertyEntry pState = readPropertyEntry(pId);
             // skip redundant primaryType, mixinTypes and uuid properties
             if (!name.equals(NameConstants.JCR_PRIMARYTYPE)
-                    && !name.equals(NameConstants.JCR_MIXINTYPES)
                     && !name.equals(NameConstants.JCR_UUID)) {
                 bundle.addProperty(pState);
             }

Modified: jackrabbit/branches/2.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/NodePropBundle.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/NodePropBundle.java?rev=1721233&r1=1721232&r2=1721233&view=diff
==============================================================================
--- jackrabbit/branches/2.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/NodePropBundle.java (original)
+++ jackrabbit/branches/2.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/NodePropBundle.java Mon Dec 21 18:49:15 2015
@@ -306,7 +306,6 @@ public class NodePropBundle {
      */
     public void addProperty(PropertyEntry entry) {
         assert !NameConstants.JCR_PRIMARYTYPE.equals(entry.getName());
-        assert !NameConstants.JCR_MIXINTYPES.equals(entry.getName());
         assert !NameConstants.JCR_UUID.equals(entry.getName());
         properties.put(entry.getName(), entry);
     }

Modified: jackrabbit/branches/2.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java?rev=1721233&r1=1721232&r2=1721233&view=diff
==============================================================================
--- jackrabbit/branches/2.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java (original)
+++ jackrabbit/branches/2.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java Mon Dec 21 18:49:15 2015
@@ -264,6 +264,7 @@ public class SharedItemStateManager
             }
         }
 
+        Exception ex = null;
         ISMLocking.ReadLock readLock = acquireReadLock(id);
         try {
             // check internal first
@@ -273,6 +274,7 @@ public class SharedItemStateManager
             // exception-for-control-flow performance hit here, as almost
             // all performance-critical content is non-virtual. With this
             // catch we can avoid an extra hasNonVirtualItemState() call.
+            ex = e;
         } finally {
             readLock.release();
         }
@@ -284,7 +286,8 @@ public class SharedItemStateManager
             }
         }
 
-        throw new NoSuchItemStateException(id.toString());
+        String message = id.toString();
+        throw ex == null ? new NoSuchItemStateException(message) : new NoSuchItemStateException(message, ex);
     }
 
     /**

Added: jackrabbit/branches/2.6/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/LostFromCacheIssueTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.6/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/LostFromCacheIssueTest.java?rev=1721233&view=auto
==============================================================================
--- jackrabbit/branches/2.6/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/LostFromCacheIssueTest.java (added)
+++ jackrabbit/branches/2.6/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/LostFromCacheIssueTest.java Mon Dec 21 18:49:15 2015
@@ -0,0 +1,84 @@
+package org.apache.jackrabbit.core;
+
+import javax.jcr.NamespaceException;
+import javax.jcr.NamespaceRegistry;
+import javax.jcr.Node;
+import javax.jcr.Property;
+import javax.jcr.Session;
+import javax.jcr.Workspace;
+import javax.jcr.nodetype.NodeTypeManager;
+
+import org.apache.jackrabbit.core.nodetype.NodeTypeManagerImpl;
+import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry;
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.QNodeDefinition;
+import org.apache.jackrabbit.spi.QNodeTypeDefinition;
+import org.apache.jackrabbit.spi.QPropertyDefinition;
+import org.apache.jackrabbit.spi.commons.QNodeTypeDefinitionImpl;
+import org.apache.jackrabbit.test.AbstractJCRTest;
+
+public class LostFromCacheIssueTest extends AbstractJCRTest {
+
+    public Property mixinTypes;
+
+
+    public void setUp() throws Exception {
+
+        super.setUp();
+        Session session = superuser;
+
+        System.err.println("Registering namespace and node types...");
+        Workspace workspace = session.getWorkspace();
+        NamespaceRegistry namespaceRegistry = workspace.getNamespaceRegistry();
+        NodeTypeManager ntmgr = workspace.getNodeTypeManager();
+        NodeTypeRegistry nodetypeRegistry = ((NodeTypeManagerImpl)ntmgr).getNodeTypeRegistry();
+        try {
+            namespaceRegistry.registerNamespace("lfcit", "data:lfcit");
+        } catch (NamespaceException ignore) { /* mapping may already be present */  }
+        QNodeTypeDefinition nodeTypeDefinition = new QNodeTypeDefinitionImpl(
+                ((SessionImpl)session).getQName("lfcit:mixin"),
+                Name.EMPTY_ARRAY,
+                Name.EMPTY_ARRAY,
+                true,
+                false,
+                true,
+                false,
+                null,
+                QPropertyDefinition.EMPTY_ARRAY,
+                QNodeDefinition.EMPTY_ARRAY
+                );
+        nodetypeRegistry.registerNodeType(nodeTypeDefinition);
+        nodeTypeDefinition = new QNodeTypeDefinitionImpl(
+                ((SessionImpl)session).getQName("lfcit:mxn"),
+                Name.EMPTY_ARRAY,
+                Name.EMPTY_ARRAY,
+                true,
+                false,
+                true,
+                false,
+                null,
+                QPropertyDefinition.EMPTY_ARRAY,
+                QNodeDefinition.EMPTY_ARRAY
+                );
+        nodetypeRegistry.registerNodeType(nodeTypeDefinition);
+
+        session.getRootNode().addNode("test").addNode("node");
+        session.save();
+    }
+
+    public void testIssue() throws Exception {
+        String path = "/test/node";
+        Session session = superuser;
+        Node node = session.getRootNode().getNode(path.substring(1));
+        node.addMixin("lfcit:mxn");
+        mixinTypes = node.getProperty("jcr:mixinTypes");
+        session.save();
+        node.addMixin("lfcit:mixin");
+        session.save();
+        node.removeMixin("lfcit:mxn");
+        node.removeMixin("lfcit:mixin");
+        session.save();
+        node.addMixin("lfcit:mixin");
+        session.save();
+    }
+}

Propchange: jackrabbit/branches/2.6/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/LostFromCacheIssueTest.java
------------------------------------------------------------------------------
    svn:executable = *

Modified: jackrabbit/branches/2.6/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/TestAll.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.6/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/TestAll.java?rev=1721233&r1=1721232&r2=1721233&view=diff
==============================================================================
--- jackrabbit/branches/2.6/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/TestAll.java (original)
+++ jackrabbit/branches/2.6/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/TestAll.java Mon Dec 21 18:49:15 2015
@@ -58,6 +58,8 @@ public class TestAll extends TestCase {
         suite.addTestSuite(ConcurrentReorderTest.class);
         suite.addTestSuite(ConcurrentAddRemoveNodeTest.class);
 
+        suite.addTestSuite(LostFromCacheIssueTest.class);
+
         // TODO: These tests pass, but they cause some instability in other
         // parts of the test suite, most likely due to uncleaned test data
         if (Boolean.getBoolean("org.apache.jackrabbit.test.integration")) {