You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by tr...@apache.org on 2005/02/10 22:06:19 UTC

svn commit: r153288 - in incubator/jackrabbit/trunk/src: java/org/apache/jackrabbit/core/version/ java/org/apache/jackrabbit/core/version/persistence/ test/org/apache/jackrabbit/test/api/

Author: tripod
Date: Thu Feb 10 13:06:16 2005
New Revision: 153288

URL: http://svn.apache.org/viewcvs?view=rev&rev=153288
Log:
- fixing VersionHistory.removeVersion()
- adding references test

Added:
    incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/ReferencesTest.java   (with props)
Modified:
    incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionHistoryImpl.java
    incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/InternalVersionHistoryImpl.java
    incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/InternalVersionImpl.java
    incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/TestAll.java

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionHistoryImpl.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionHistoryImpl.java?view=diff&r1=153287&r2=153288
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionHistoryImpl.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionHistoryImpl.java Thu Feb 10 13:06:16 2005
@@ -22,6 +22,7 @@
 import javax.jcr.Item;
 import javax.jcr.RepositoryException;
 import javax.jcr.UnsupportedRepositoryOperationException;
+import javax.jcr.PropertyIterator;
 import javax.jcr.nodetype.NodeDef;
 import javax.jcr.version.Version;
 import javax.jcr.version.VersionException;
@@ -163,13 +164,14 @@
     public void removeVersion(String versionName)
             throws UnsupportedRepositoryOperationException, VersionException,
             RepositoryException {
-        try {
-            history.removeVersion(QName.fromJCRName(versionName, session.getNamespaceResolver()));
-        } catch (IllegalNameException e) {
-            throw new VersionException("Unable to remove version.", e);
-        } catch (UnknownPrefixException e) {
-            throw new VersionException("Unable to remove version.", e);
-        }
+
+	// check if any references exist on this version
+	VersionImpl v = (VersionImpl) getVersion(versionName);
+	PropertyIterator iter = v.getReferences();
+	if (iter.hasNext()) {
+	    throw new VersionException("Unable to remove version. At least once referenced: " + ((PropertyImpl) iter.nextProperty()).safeGetJCRPath());
+	}
+	history.removeVersion(v.getQName());
     }
 
     /**

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/InternalVersionHistoryImpl.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/InternalVersionHistoryImpl.java?view=diff&r1=153287&r2=153288
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/InternalVersionHistoryImpl.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/InternalVersionHistoryImpl.java Thu Feb 10 13:06:16 2005
@@ -251,7 +251,7 @@
             stateMgr.edit();
 
             // remove from persistance state
-            node.removeNode(v.getName());
+            node.removeNode(v.getNode().getName());
 
             // unregister from labels
             String[] labels = v.internalGetLabels();

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/InternalVersionImpl.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/InternalVersionImpl.java?view=diff&r1=153287&r2=153288
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/InternalVersionImpl.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/InternalVersionImpl.java Thu Feb 10 13:06:16 2005
@@ -186,14 +186,14 @@
      * @see javax.jcr.version.Version#getSuccessors()
      */
     public InternalVersion[] getSuccessors() {
-        return (InternalVersion[]) successors.toArray(new InternalVersion[successors.size()]);
+        return (InternalVersionImpl[]) successors.toArray(new InternalVersionImpl[successors.size()]);
     }
 
     /**
      * @see javax.jcr.version.Version#getSuccessors()
      */
     public InternalVersion[] getPredecessors() {
-        return (InternalVersion[]) predecessors.toArray(new InternalVersion[predecessors.size()]);
+        return (InternalVersionImpl[]) predecessors.toArray(new InternalVersionImpl[predecessors.size()]);
     }
 
     /**
@@ -221,22 +221,27 @@
             succ[i].internalDetachPredecessor(this);
         }
 
+	// detach cached successors from preds
+	InternalVersionImpl[] preds = (InternalVersionImpl[]) getPredecessors();
+	for (int i=0; i<preds.length; i++) {
+	    preds[i].internalDetachSuccessor(this);
+	}
+
         // clear properties
         successors.clear();
         predecessors.clear();
         labelCache = null;
-        storePredecessors();
     }
 
     /**
-     * Removes the predecessor V of this predecessor list and adds all of Vs
+     * Removes the predecessor V of this predecessors list and adds all of Vs
      * predecessors to it.
      * <p/>
      * please note, that this operation might corrupt the version graph
      *
      * @param v the successor to detach
      */
-    private void internalDetachPredecessor(InternalVersion v) throws RepositoryException {
+    private void internalDetachPredecessor(InternalVersionImpl v) throws RepositoryException {
         // remove 'v' from predecessor list
         for (int i = 0; i < predecessors.size(); i++) {
             if (predecessors.get(i).equals(v)) {
@@ -244,10 +249,30 @@
                 break;
             }
         }
-        // attach v's successors
-        predecessors.clear();
+        // attach v's predecessors
         predecessors.addAll(Arrays.asList(v.getPredecessors()));
         storePredecessors();
+	node.store();
+    }
+
+    /**
+     * Removes the successor V of this successors list and adds all of Vs
+     * successors to it.
+     * <p/>
+     * please note, that this operation might corrupt the version graph
+     *
+     * @param v the successor to detach
+     */
+    private void internalDetachSuccessor(InternalVersionImpl v) throws RepositoryException {
+        // remove 'v' from successors list
+        for (int i = 0; i < successors.size(); i++) {
+            if (successors.get(i).equals(v)) {
+                successors.remove(i);
+                break;
+            }
+        }
+        // attach v's successors
+        successors.addAll(Arrays.asList(v.getSuccessors()));
     }
 
     /**

Added: incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/ReferencesTest.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/ReferencesTest.java?view=auto&rev=153288
==============================================================================
--- incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/ReferencesTest.java (added)
+++ incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/ReferencesTest.java Thu Feb 10 13:06:16 2005
@@ -0,0 +1,147 @@
+/*
+ * Copyright (c) 2005 Your Corporation. All Rights Reserved.
+ */
+package org.apache.jackrabbit.test.api;
+
+import org.apache.jackrabbit.test.AbstractJCRTest;
+
+import javax.jcr.*;
+import javax.jcr.nodetype.NoSuchNodeTypeException;
+import javax.jcr.nodetype.ConstraintViolationException;
+
+/**
+ * <code>ReferencesTest</code> contains the test cases for the references.
+ *
+ * @test
+ * @sources ReferencesTest.java
+ * @executeClass org.apache.jackrabbit.test.api.ReferencesTest
+ * @keywords level2
+ */
+public class ReferencesTest extends AbstractJCRTest {
+
+    /**
+     * Tests Node.getReferences()
+     */
+    public void testReferences() throws RepositoryException {
+        Node n1 = testRootNode.addNode(nodeName1, testNodeType);
+	n1.addMixin(mixReferenceable);
+	// create references: n2.p1 -> n1
+	Node n2 = testRootNode.addNode(nodeName2, testNodeType);
+	n2.setProperty(propertyName1, new Value[]{new ReferenceValue(n1)});
+	testRootNode.save();
+	PropertyIterator iter = n1.getReferences();
+	if (iter.hasNext()) {
+	    assertEquals("Wrong referencer", iter.nextProperty().getParent().getPath(), n2.getPath());
+	} else {
+	    fail("no referencer");
+	}
+
+	// create references: n3.p1 -> n1
+	Node n3 = testRootNode.addNode(nodeName3, testNodeType);
+	n3.setProperty(propertyName1, n1);
+	testRootNode.save();
+	iter = n1.getReferences();
+	while (iter.hasNext()) {
+	    Property p = iter.nextProperty();
+	    if (n2 != null && p.getParent().getPath().equals(n2.getPath())) {
+		n2 = null;
+	    } else if (n3 != null && p.getParent().getPath().equals(n3.getPath())) {
+		n3 = null;
+	    } else {
+		fail("too many referencers: " + p.getPath());
+	    }
+	}
+	if (n2 != null) {
+	    fail("referencer not in references set: " + n2.getPath());
+	}
+	if (n3 != null) {
+	    fail("referencer not in references set: " + n3.getPath());
+	}
+
+	// remove reference n3.p1 -> n1
+	testRootNode.getNode(nodeName3).getProperty(propertyName1).remove();
+	testRootNode.save();
+	iter = n1.getReferences();
+	if (iter.hasNext()) {
+	    assertEquals("Wrong referencer", iter.nextProperty().getParent().getPath(), testRootNode.getNode(nodeName2).getPath());
+	} else {
+	    fail("no referencer");
+	}
+	if (iter.hasNext()) {
+	    fail("too many referencers: " + iter.nextProperty().getPath());
+	}
+
+	// remove reference n2.p1 -> n1
+	testRootNode.getNode(nodeName2).getProperty(propertyName1).setValue(new Value[0]);
+	testRootNode.save();
+	iter = n1.getReferences();
+	if (iter.hasNext()) {
+	    fail("too many referencers: " + iter.nextProperty().getPath());
+	}
+    }
+
+    /**
+     * Test Property.getNode();
+     */
+    public void testReferenceTarget() throws RepositoryException {
+	Node n1 = testRootNode.addNode(nodeName1, testNodeType);
+	n1.addMixin(mixReferenceable);
+	// create references: n2.p1 -> n1
+	Node n2 = testRootNode.addNode(nodeName2, testNodeType);
+	n2.setProperty(propertyName1, n1);
+	testRootNode.save();
+	assertEquals("Wrong reference target.", n2.getProperty(propertyName1).getNode(), n1);
+	n2.remove();
+	testRootNode.save();
+    }
+
+    /**
+     * Test changing a refrence property
+     */
+    public void testAlterReference() throws RepositoryException {
+	Node n1 = testRootNode.addNode(nodeName1, testNodeType);
+	n1.addMixin(mixReferenceable);
+	Node n2 = testRootNode.addNode(nodeName2, testNodeType);
+	n2.addMixin(mixReferenceable);
+	// create references: n3.p1 -> n1
+	Node n3 = testRootNode.addNode(nodeName3, testNodeType);
+	n3.setProperty(propertyName1, n1);
+	testRootNode.save();
+	assertEquals("Wrong reference target.", n3.getProperty(propertyName1).getNode(), n1);
+	PropertyIterator iter = n1.getReferences();
+	if (iter.hasNext()) {
+	    assertEquals("Wrong referencer", iter.nextProperty().getParent().getPath(), n3.getPath());
+	} else {
+	    fail("no referencer");
+	}
+	if (iter.hasNext()) {
+	    fail("too many referencers: " + iter.nextProperty().getPath());
+	}
+	// change reference: n3.p1 -> n2
+	n3.setProperty(propertyName1, n2);
+	n3.save();
+	assertEquals("Wrong reference target.", n3.getProperty(propertyName1).getNode(), n2);
+	iter = n1.getReferences();
+	if (iter.hasNext()) {
+	    fail("too many referencers: " + iter.nextProperty().getPath());
+	}
+	iter = n2.getReferences();
+	if (iter.hasNext()) {
+	    assertEquals("Wrong referencer", iter.nextProperty().getParent().getPath(), n3.getPath());
+	} else {
+	    fail("no referencer");
+	}
+	if (iter.hasNext()) {
+	    fail("too many referencers: " + iter.nextProperty().getPath());
+	}
+
+	// clear reference by overwriting by other type
+	n3.setProperty(propertyName1, "Hello, world.");
+	n3.save();
+	iter = n2.getReferences();
+	if (iter.hasNext()) {
+	    fail("too many referencers: " + iter.nextProperty().getPath());
+	}
+
+    }
+}
\ No newline at end of file

Propchange: incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/ReferencesTest.java
------------------------------------------------------------------------------
    svn = 

Propchange: incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/ReferencesTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/TestAll.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/TestAll.java?view=diff&r1=153287&r2=153288
==============================================================================
--- incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/TestAll.java (original)
+++ incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/TestAll.java Thu Feb 10 13:06:16 2005
@@ -42,6 +42,10 @@
         suite.addTestSuite(RootNodeTest.class);
         suite.addTestSuite(NamespaceRegistryTest.class);
 
+	// references test currently corrupts repository
+	// enable again, when bug JCR-44 is fixed
+        // suite.addTestSuite(ReferencesTest.class);
+
         return suite;
     }
 }