You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by st...@apache.org on 2005/02/11 13:55:55 UTC
svn commit: r153396 - in incubator/jackrabbit/trunk/src:
java/org/apache/jackrabbit/core/ItemImpl.java
test/org/apache/jackrabbit/test/api/ReferencesTest.java
Author: stefan
Date: Fri Feb 11 04:55:53 2005
New Revision: 153396
URL: http://svn.apache.org/viewcvs?view=rev&rev=153396
Log:
fixing JCR-44: Overwriting a reference property with different type corrupts rep
Modified:
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/ItemImpl.java
incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/ReferencesTest.java
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/ItemImpl.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/ItemImpl.java?view=diff&r1=153395&r2=153396
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/ItemImpl.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/ItemImpl.java Fri Feb 11 04:55:53 2005
@@ -672,11 +672,14 @@
ItemState transientState = (ItemState) iterDirty.next();
if (!transientState.isNode()) {
PropertyState propState = (PropertyState) transientState;
- if (propState.getType() == PropertyType.REFERENCE) {
- if (propState.getStatus() == ItemState.STATUS_EXISTING_MODIFIED) {
+ int type = propState.getType();
+ if (propState.getStatus() == ItemState.STATUS_EXISTING_MODIFIED) {
+ // this is a modified property, check old type...
+ PropertyState oldPropState = (PropertyState) propState.getOverlayedState();
+ int oldType = oldPropState.getType();
+ if (oldType == PropertyType.REFERENCE) {
// this is a modified REFERENCE property:
// remove the 'reference' stored in the old value
- PropertyState oldPropState = (PropertyState) propState.getOverlayedState();
InternalValue[] vals = oldPropState.getValues();
for (int i = 0; vals != null && i < vals.length; i++) {
String uuid = vals[i].toString();
@@ -699,7 +702,10 @@
refs.removeReference((PropertyId) propState.getId());
}
}
- // add the reference stored in the new value
+ }
+ if (type == PropertyType.REFERENCE) {
+ // this is a modified REFERENCE property:
+ // add the 'reference' stored in the new value
InternalValue[] vals = propState.getValues();
for (int i = 0; vals != null && i < vals.length; i++) {
String uuid = vals[i].toString();
Modified: 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=diff&r1=153395&r2=153396
==============================================================================
--- incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/ReferencesTest.java (original)
+++ incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/api/ReferencesTest.java Fri Feb 11 04:55:53 2005
@@ -38,13 +38,13 @@
n1.addMixin(mixReferenceable);
// create references: n2.p1 -> n1
Node n2 = testRootNode.addNode(nodeName2, testNodeType);
- n2.setProperty(propertyName1, new Value[]{new ReferenceValue(n1)});
+ Property p1 = 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());
+ assertEquals("Wrong referer", iter.nextProperty().getPath(), p1.getPath());
} else {
- fail("no referencer");
+ fail("no referer");
}
// create references: n3.p1 -> n1
@@ -59,14 +59,14 @@
} else if (n3 != null && p.getParent().getPath().equals(n3.getPath())) {
n3 = null;
} else {
- fail("too many referencers: " + p.getPath());
+ fail("too many referers: " + p.getPath());
}
}
if (n2 != null) {
- fail("referencer not in references set: " + n2.getPath());
+ fail("referer not in references set: " + n2.getPath());
}
if (n3 != null) {
- fail("referencer not in references set: " + n3.getPath());
+ fail("referer not in references set: " + n3.getPath());
}
// remove reference n3.p1 -> n1
@@ -74,12 +74,12 @@
testRootNode.save();
iter = n1.getReferences();
if (iter.hasNext()) {
- assertEquals("Wrong referencer", iter.nextProperty().getParent().getPath(), testRootNode.getNode(nodeName2).getPath());
+ assertEquals("Wrong referer", iter.nextProperty().getParent().getPath(), testRootNode.getNode(nodeName2).getPath());
} else {
- fail("no referencer");
+ fail("no referer");
}
if (iter.hasNext()) {
- fail("too many referencers: " + iter.nextProperty().getPath());
+ fail("too many referers: " + iter.nextProperty().getPath());
}
// remove reference n2.p1 -> n1
@@ -87,12 +87,12 @@
testRootNode.save();
iter = n1.getReferences();
if (iter.hasNext()) {
- fail("too many referencers: " + iter.nextProperty().getPath());
+ fail("too many referers: " + iter.nextProperty().getPath());
}
}
/**
- * Test Property.getNode();
+ * Tests Property.getNode();
*/
public void testReferenceTarget() throws RepositoryException {
Node n1 = testRootNode.addNode(nodeName1, testNodeType);
@@ -107,7 +107,7 @@
}
/**
- * Test changing a refrence property
+ * Tests changing a reference property
*/
public void testAlterReference() throws RepositoryException {
Node n1 = testRootNode.addNode(nodeName1, testNodeType);
@@ -121,12 +121,12 @@
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());
+ assertEquals("Wrong referer", iter.nextProperty().getParent().getPath(), n3.getPath());
} else {
- fail("no referencer");
+ fail("no referer");
}
if (iter.hasNext()) {
- fail("too many referencers: " + iter.nextProperty().getPath());
+ fail("too many referers: " + iter.nextProperty().getPath());
}
// change reference: n3.p1 -> n2
n3.setProperty(propertyName1, n2);
@@ -134,16 +134,16 @@
assertEquals("Wrong reference target.", n3.getProperty(propertyName1).getNode(), n2);
iter = n1.getReferences();
if (iter.hasNext()) {
- fail("too many referencers: " + iter.nextProperty().getPath());
+ fail("too many referers: " + iter.nextProperty().getPath());
}
iter = n2.getReferences();
if (iter.hasNext()) {
- assertEquals("Wrong referencer", iter.nextProperty().getParent().getPath(), n3.getPath());
+ assertEquals("Wrong referer", iter.nextProperty().getParent().getPath(), n3.getPath());
} else {
- fail("no referencer");
+ fail("no referers");
}
if (iter.hasNext()) {
- fail("too many referencers: " + iter.nextProperty().getPath());
+ fail("too many referers: " + iter.nextProperty().getPath());
}
// clear reference by overwriting by other type
@@ -151,7 +151,7 @@
n3.save();
iter = n2.getReferences();
if (iter.hasNext()) {
- fail("too many referencers: " + iter.nextProperty().getPath());
+ fail("too many referers: " + iter.nextProperty().getPath());
}
}