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 2010/05/14 16:23:31 UTC
svn commit: r944282 -
/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/NodeImplTest.java
Author: jukka
Date: Fri May 14 14:23:31 2010
New Revision: 944282
URL: http://svn.apache.org/viewvc?rev=944282&view=rev
Log:
JCR-2503: inconsistent session and persistent state after ReferentialIntegrityException
Added a test case based on code by Bram de Kruijff.
Modified:
jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/NodeImplTest.java
Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/NodeImplTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/NodeImplTest.java?rev=944282&r1=944281&r2=944282&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/NodeImplTest.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/NodeImplTest.java Fri May 14 14:23:31 2010
@@ -24,6 +24,7 @@ import javax.jcr.ItemExistsException;
import javax.jcr.Node;
import javax.jcr.Property;
import javax.jcr.PropertyType;
+import javax.jcr.ReferentialIntegrityException;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.nodetype.NodeType;
@@ -33,6 +34,7 @@ import javax.jcr.security.AccessControlP
import javax.jcr.security.Privilege;
import org.apache.jackrabbit.api.security.JackrabbitAccessControlList;
+import org.apache.jackrabbit.commons.JcrUtils;
import org.apache.jackrabbit.test.AbstractJCRTest;
import org.apache.jackrabbit.test.NotExecutableException;
import org.slf4j.Logger;
@@ -252,4 +254,85 @@ public class NodeImplTest extends Abstra
testRootNode.getSession().save();
assertFalse(n2.hasProperty("jcr:uuid"));
}
+
+
+ /**
+ * Test corruption in session / persistence state after
+ * {@link ReferentialIntegrityException}.
+ *
+ * @see <a href="https://issues.apache.org/jira/browse/JCR-2503">JCR-2503</a>
+ */
+ public void testReferentialIntegrityCorruption() throws Exception {
+ Session session = testRootNode.getSession();
+ Node root = testRootNode.addNode("testReferentialIntegrityCorruption");
+
+ // Create test nodes P1 and P2
+ Node nodeP1 = root.addNode("P1");
+ nodeP1.addMixin("mix:referenceable");
+ Node nodeP2 = root.addNode("P2");
+ nodeP2.addMixin("mix:referenceable");
+ session.save();
+
+ // Create reference from P2 to P1 and save
+ nodeP2.setProperty("referencetoP1", nodeP1);
+ session.save();
+
+ // Add node P3
+ Node nodeP3 = root.addNode("P3");
+ nodeP3.addMixin("mix:referenceable");
+
+ // And try to remove P1 while P2 still references P1
+ nodeP1.remove();
+ try {
+ session.save();
+ } catch (ReferentialIntegrityException expected) {
+ // Got ReferentialIntegrityException as expected
+ }
+
+ // Remove P2 and save again, this will succeed. As P1, P2
+ // should be removed and P3 should exist
+ try {
+ nodeP2.remove();
+ session.save();
+ } catch (Exception e) {
+ String msg =
+ "JCR-2503: Saving delete after"
+ + " ReferentialIntegrityException failed";
+ log.error(msg, e);
+ fail(msg);
+ }
+
+ try {
+ nodeP3 = session.getNodeByIdentifier(nodeP3.getIdentifier());
+ } catch (Exception e) {
+ String msg =
+ "JCR-2503: Retrieving P3 by uuid failed. Corrupt session?";
+ log.error(msg, e);
+ fail(msg);
+ }
+
+ try {
+ nodeP3.remove();
+ session.save();
+ } catch (Exception e) {
+ String msg = "JCR-2503: Removing P3 failed. Corrupt session?";
+ log.error(msg, e);
+ fail(msg);
+ }
+
+ try {
+ root = testRootNode.getNode("testReferentialIntegrityCorruption");
+ for (@SuppressWarnings("unused") Node ignore
+ : JcrUtils.getChildNodes(root)) {
+ }
+ } catch (Exception e) {
+ String msg = "JCR-2503: Failed to scan empty node. Corrupt session?";
+ log.error(msg, e);
+ fail(msg);
+ }
+
+ root.remove();
+ session.save();
+ }
+
}