You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by re...@apache.org on 2014/01/07 16:39:05 UTC

svn commit: r1556248 - in /jackrabbit/trunk/jackrabbit-core/src: main/java/org/apache/jackrabbit/core/RepositoryChecker.java test/java/org/apache/jackrabbit/core/persistence/AutoFixCorruptNode.java

Author: reschke
Date: Tue Jan  7 15:39:04 2014
New Revision: 1556248

URL: http://svn.apache.org/r1556248
Log:
JCR-3711: in RepositoryChecker, when removing mix:versionable also add mix:referenceable

Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryChecker.java
    jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/persistence/AutoFixCorruptNode.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryChecker.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryChecker.java?rev=1556248&r1=1556247&r2=1556248&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryChecker.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryChecker.java Tue Jan  7 15:39:04 2014
@@ -23,6 +23,7 @@ import static org.apache.jackrabbit.spi.
 import static org.apache.jackrabbit.spi.commons.name.NameConstants.JCR_ROOTVERSION;
 import static org.apache.jackrabbit.spi.commons.name.NameConstants.JCR_VERSIONHISTORY;
 import static org.apache.jackrabbit.spi.commons.name.NameConstants.MIX_VERSIONABLE;
+import static org.apache.jackrabbit.spi.commons.name.NameConstants.MIX_REFERENCEABLE;
 
 import java.util.Calendar;
 import java.util.HashSet;
@@ -180,7 +181,7 @@ class RepositoryChecker {
 
         try {
             String type = isVersioned ? "in-use" : "candidate";
-            
+
             log.debug("Checking " + type + " version history of node {}", nid);
 
             String intro = "Removing references to an inconsistent " + type
@@ -197,7 +198,7 @@ class RepositoryChecker {
             message = intro + " (getting the InternalVersionHistory)";
 
             InternalVersionHistory vh = null;
-            
+
             try {
                 vh = versionManager.getVersionHistoryOfNode(nid);
             }
@@ -215,7 +216,7 @@ class RepositoryChecker {
                 }
             } else { 
                 vhid = vh.getId();
-                
+
                 // additional checks, see JCR-3101
 
                 message = intro + " (getting the version names failed)";
@@ -269,6 +270,8 @@ class RepositoryChecker {
 
         Set<Name> mixins = new HashSet<Name>(node.getMixinTypeNames());
         if (mixins.remove(MIX_VERSIONABLE)) {
+            // we are keeping jcr:uuid, so we need to make sure the type info stays valid
+            mixins.add(MIX_REFERENCEABLE);
             modified.setMixinTypeNames(mixins);
         }
 
@@ -278,29 +281,29 @@ class RepositoryChecker {
         removeProperty(modified, JCR_ISCHECKEDOUT);
 
         workspaceChanges.modified(modified);
-        
+
         if (vhid != null) {
             // attempt to rename the version history, so it doesn't interfere with
             // a future attempt to put the node under version control again 
             // (see JCR-3115)
-            
+
             log.info("trying to rename version history of node " + node.getId());
 
             NameFactory nf = NameFactoryImpl.getInstance();
-            
+
             // Name of VHR in parent folder is ID of versionable node
             Name vhrname = nf.create(Name.NS_DEFAULT_URI, node.getId().toString());
 
             try {
                 NodeState vhrState = versionManager.getPersistenceManager().load(vhid);
                 NodeState vhrParentState = versionManager.getPersistenceManager().load(vhrState.getParentId());
-                
+
                 if (vhrParentState.hasChildNodeEntry(vhrname)) {
                     NodeState modifiedParent = (NodeState) vworkspaceChanges.get(vhrState.getParentId());
                     if (modifiedParent == null) {
                         modifiedParent = new NodeState(vhrParentState, NodeState.STATUS_EXISTING_MODIFIED, true);
                     }
-                    
+
                     Calendar now = Calendar.getInstance();
                     String appendme = " (disconnected by RepositoryChecker on "
                             + ISO8601.format(now) + ")";

Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/persistence/AutoFixCorruptNode.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/persistence/AutoFixCorruptNode.java?rev=1556248&r1=1556247&r2=1556248&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/persistence/AutoFixCorruptNode.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/persistence/AutoFixCorruptNode.java Tue Jan  7 15:39:04 2014
@@ -103,17 +103,17 @@ public class AutoFixCorruptNode extends 
             test.addMixin("mix:referenceable");
 
             String lost = test.getIdentifier();
-            
+
             Node lnf = root.addNode("lost+found");
             lnf.addMixin("mix:referenceable");
             String lnfid = lnf.getIdentifier();
-            
+
             s.save();
 
             Node brokenNode = parent;
             UUID destroy = UUID.fromString(brokenNode.getIdentifier());
             s.logout();
-            
+
             destroyBundle(destroy, "workspaces/default");
 
             s = openSession(rep, false);
@@ -123,12 +123,12 @@ public class AutoFixCorruptNode extends 
             // now retry with lost+found functionality
             ConsistencyReport report2 = TestHelper.checkConsistency(s, true, lnfid);
             assertTrue("Report should have reported broken nodes", !report2.getItems().isEmpty());
-            
+
             s.logout();
-            
+
             s = openSession(rep, false);
             Node q = s.getNodeByIdentifier(lost);
-            
+
             // check the node was moved
             assertEquals(lnfid, q.getParent().getIdentifier());
         } finally {
@@ -162,14 +162,14 @@ public class AutoFixCorruptNode extends 
             String vhrRootVersionId = vhr.getNode("jcr:rootVersion").getIdentifier();
             UUID destroy = UUID.fromString(brokenNode.getIdentifier());
             s.logout();
-            
+
             destroyBundle(destroy, "version");
 
             s = openSession(rep, false);
 
             ConsistencyReport report = TestHelper.checkVersionStoreConsistency(s, false, null);
             assertTrue("Report should have reported broken nodes", !report.getItems().isEmpty());
-            
+
             try {
                 test = s.getRootNode().getNode("test");
                 vhr = s.getWorkspace().getVersionManager()
@@ -188,31 +188,31 @@ public class AutoFixCorruptNode extends 
             test = s.getRootNode().getNode("test");
             // versioning should be disabled now
             assertFalse(test.isNodeType("mix:versionable"));
-            
+
             try {
                 // try to enable versioning again
                 test.addMixin("mix:versionable");
                 s.save();
-                
+
                 fail("enabling versioning succeeded unexpectedly");
             }
             catch (Exception e) {
                 // we expect this to fail
             }
-            
+
             s.logout();
-            
+
             // now redo after running fixup on versioning storage
             s = openSession(rep, false);
 
             report = TestHelper.checkVersionStoreConsistency(s, true, null);
             assertTrue("Report should have reported broken nodes", !report.getItems().isEmpty());
             int reportitems = report.getItems().size();
-            
+
             // problems should now be fixed
             report = TestHelper.checkVersionStoreConsistency(s, false, null);
             assertTrue("Some problems should have been fixed but are not: " + report, report.getItems().size() < reportitems);
-            
+
             // get a fresh session
             s.logout();
             s = openSession(rep, false);
@@ -220,11 +220,11 @@ public class AutoFixCorruptNode extends 
             test = s.getRootNode().getNode("test");
             // versioning should be disabled now
             assertFalse(test.isNodeType("mix:versionable"));
-            
+
             // try to enable versioning again
             test.addMixin("mix:versionable");
             s.save();
-            
+
             Node oldRootVersion = s.getNodeByIdentifier(vhrRootVersionId);
             try {
                 String path = oldRootVersion.getPath();
@@ -233,7 +233,7 @@ public class AutoFixCorruptNode extends 
             catch (ItemNotFoundException ex) {
                 // orphaned
             }
-            
+
             Node newRootVersion = s.getWorkspace().getVersionManager()
                     .getVersionHistory(test.getPath()).getRootVersion();
             assertFalse(
@@ -262,7 +262,8 @@ public class AutoFixCorruptNode extends 
             Node root = s.getRootNode();
 
             // add nodes /test and /test/missing
-            Node test = root.addNode("test");
+            Node test = root.addNode("test", "nt:file");
+            test.addNode("jcr:content", "nt:unstructured");
             test.addMixin("mix:versionable");
 
             s.save();
@@ -274,17 +275,17 @@ public class AutoFixCorruptNode extends 
 
             Node brokenNode = vhr.getNode("jcr:rootVersion");
             String vhrId = vhr.getIdentifier();
-            
+
             UUID destroy = UUID.fromString(brokenNode.getIdentifier());
             s.logout();
-            
+
             destroyBundle(destroy, "version");
 
             s = openSession(rep, false);
 
             ConsistencyReport report = TestHelper.checkVersionStoreConsistency(s, false, null);
             assertTrue("Report should have reported broken nodes", !report.getItems().isEmpty());
-            
+
             try {
                 test = s.getRootNode().getNode("test");
                 vhr = s.getWorkspace().getVersionManager()
@@ -303,39 +304,42 @@ public class AutoFixCorruptNode extends 
             test = s.getRootNode().getNode("test");
             // versioning should be disabled now
             assertFalse(test.isNodeType("mix:versionable"));
-            
+
             try {
                 // try to enable versioning again
                 test.addMixin("mix:versionable");
                 s.save();
-                
+
                 fail("enabling versioning succeeded unexpectedly");
             }
             catch (Exception e) {
                 // we expect this to fail
             }
-            
+
             s.logout();
-            
+
             // now redo after running fixup on versioning storage
             s = openSession(rep, false);
 
             report = TestHelper.checkVersionStoreConsistency(s, true, null);
             assertTrue("Report should have reported broken nodes", !report.getItems().isEmpty());
             int reportitems = report.getItems().size();
-            
+
             // problems should now be fixed
             report = TestHelper.checkVersionStoreConsistency(s, false, null);
             assertTrue("Some problems should have been fixed but are not: " + report, report.getItems().size() < reportitems);
-            
+
             test = s.getRootNode().getNode("test");
             // versioning should be disabled now
             assertFalse(test.isNodeType("mix:versionable"));
-            
+            // jcr:uuid property should still be present
+            assertTrue(test.hasProperty("jcr:uuid"));
+            // ...and have a proper definition
+            assertNotNull(test.getProperty("jcr:uuid").getDefinition().getName());
             // try to enable versioning again
             test.addMixin("mix:versionable");
             s.save();
-            
+
             Node oldVHR = s.getNodeByIdentifier(vhrId);
             Node newVHR = s.getWorkspace().getVersionManager().getVersionHistory(test.getPath());
 
@@ -345,11 +349,11 @@ public class AutoFixCorruptNode extends 
 
             // name should be same plus suffix
             assertTrue(oldVHR.getName().startsWith(newVHR.getName()));
-            
+
             // try a checkout / checkin
             s.getWorkspace().getVersionManager().checkout(test.getPath());
             s.getWorkspace().getVersionManager().checkin(test.getPath());
-            
+
         } finally {
             s.logout();
             System.setProperty("org.apache.jackrabbit.version.recovery",
@@ -384,23 +388,23 @@ public class AutoFixCorruptNode extends 
 
             Node brokenNode = vhr.getNode("jcr:rootVersion");
             String vhrId = vhr.getIdentifier();
-            
+
             UUID destroy = UUID.fromString(brokenNode.getIdentifier());
 
             // disable versioning
             test.removeMixin("mix:versionable");
             s.save();
-            
+
             s.logout();
-            
-            
+
+
             destroyBundle(destroy, "version");
 
             s = openSession(rep, false);
 
             ConsistencyReport report = TestHelper.checkVersionStoreConsistency(s, false, null);
             assertTrue("Report should have reported broken nodes", !report.getItems().isEmpty());
-            
+
             s.logout();
 
             System.setProperty("org.apache.jackrabbit.version.recovery", "true");
@@ -413,7 +417,7 @@ public class AutoFixCorruptNode extends 
             test = s.getRootNode().getNode("test");
             // versioning should still be disabled
             assertFalse(test.isNodeType("mix:versionable"));
-            
+
             // try to enable versioning again
             test.addMixin("mix:versionable");
             s.save();
@@ -427,7 +431,7 @@ public class AutoFixCorruptNode extends 
 
             // name should be same plus suffix
             assertTrue(oldVHR.getName().startsWith(newVHR.getName()));
-            
+
             // try a checkout / checkin
             s.getWorkspace().getVersionManager().checkout(test.getPath());
             s.getWorkspace().getVersionManager().checkin(test.getPath());