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;
}
}