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