You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by re...@apache.org on 2015/09/01 16:26:12 UTC

svn commit: r1700571 - in /jackrabbit/oak/trunk/oak-jcr/src: main/java/org/apache/jackrabbit/oak/jcr/session/ test/java/org/apache/jackrabbit/oak/jcr/version/

Author: reschke
Date: Tue Sep  1 14:26:11 2015
New Revision: 1700571

URL: http://svn.apache.org/r1700571
Log:
OAK-3310: consistently check the checked-out state of a Node for property modifications

Modified:
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/PropertyImpl.java
    jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/version/VersionableTest.java

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java?rev=1700571&r1=1700570&r2=1700571&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java Tue Sep  1 14:26:11 2015
@@ -1424,6 +1424,14 @@ public class NodeImpl<T extends NodeDele
             throws RepositoryException {
         final String oakName = getOakName(checkNotNull(jcrName));
         return perform(new ItemWriteOperation<Property>("internalRemoveProperty") {
+            @Override
+            public void checkPreconditions() throws RepositoryException {
+                super.checkPreconditions();
+                if (!isCheckedOut()) {
+                    throw new VersionException(
+                            "Cannot remove property. Node is checked in.");
+                }
+            }
             @Nonnull
             @Override
             public Property perform() throws RepositoryException {

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/PropertyImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/PropertyImpl.java?rev=1700571&r1=1700570&r2=1700571&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/PropertyImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/PropertyImpl.java Tue Sep  1 14:26:11 2015
@@ -37,6 +37,7 @@ import javax.jcr.Value;
 import javax.jcr.ValueFactory;
 import javax.jcr.ValueFormatException;
 import javax.jcr.nodetype.PropertyDefinition;
+import javax.jcr.version.VersionException;
 
 import org.apache.jackrabbit.oak.api.Tree.Status;
 import org.apache.jackrabbit.oak.api.Type;
@@ -110,6 +111,15 @@ public class PropertyImpl extends ItemIm
     public void remove() throws RepositoryException {
         sessionDelegate.performVoid(new ItemWriteOperation("remove") {
             @Override
+            public void checkPreconditions() throws RepositoryException {
+                super.checkPreconditions();
+                if (!getParent().isCheckedOut()) {
+                    throw new VersionException(
+                            "Cannot set property. Node is checked in.");
+                }
+            }
+
+            @Override
             public void performVoid() {
                 dlg.remove();
             }
@@ -451,6 +461,15 @@ public class PropertyImpl extends ItemIm
             throws RepositoryException {
         sessionDelegate.performVoid(new ItemWriteOperation("internalSetValue") {
             @Override
+            public void checkPreconditions() throws RepositoryException {
+                super.checkPreconditions();
+                if (!getParent().isCheckedOut()) {
+                    throw new VersionException(
+                            "Cannot set property. Node is checked in.");
+                }
+            }
+
+            @Override
             public void performVoid() throws RepositoryException {
                 Type<?> type = dlg.getPropertyState().getType();
                 if (type.isArray()) {
@@ -478,6 +497,15 @@ public class PropertyImpl extends ItemIm
 
         sessionDelegate.performVoid(new ItemWriteOperation("internalSetValue") {
             @Override
+            public void checkPreconditions() throws RepositoryException {
+                super.checkPreconditions();
+                if (!getParent().isCheckedOut()) {
+                    throw new VersionException(
+                            "Cannot set property. Node is checked in.");
+                }
+            }
+
+            @Override
             public void performVoid() throws RepositoryException {
                 Type<?> type = dlg.getPropertyState().getType();
                 if (!type.isArray()) {

Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/version/VersionableTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/version/VersionableTest.java?rev=1700571&r1=1700570&r2=1700571&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/version/VersionableTest.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/version/VersionableTest.java Tue Sep  1 14:26:11 2015
@@ -24,6 +24,7 @@ import javax.jcr.RepositoryException;
 import javax.jcr.version.Version;
 import javax.jcr.version.VersionException;
 import javax.jcr.version.VersionManager;
+
 import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.test.AbstractJCRTest;
 
@@ -48,13 +49,41 @@ public class VersionableTest extends Abs
         node.addMixin(mixVersionable);
         superuser.save();
         VersionManager vMgr = superuser.getWorkspace().getVersionManager();
+        if (!node.isCheckedOut()) {
+            vMgr.checkout(node.getPath());
+        }
+        superuser.refresh(false);
+        node.setProperty(propertyName1, "foo");
+        superuser.save();
         vMgr.checkin(node.getPath());
         try {
-            node.setProperty(propertyName1, "value");
+            node.setProperty(propertyName1, "bar");
             fail("setProperty() must fail on a checked-in node");
         } catch (VersionException e) {
             // expected
         }
+        try {
+            node.setProperty(propertyName1, (String)null);
+            fail("setProperty(..., null) must fail on a checked-in node");
+        } catch (VersionException e) {
+            // expected
+        }
+        try {
+            Property prop = node.getProperty(propertyName1);
+            assertNotNull(prop);
+            prop.setValue("bar");
+            fail("Property.setValue() must fail on a checked-in node");
+        } catch (VersionException e) {
+            // expected
+        }
+        try {
+            Property prop = node.getProperty(propertyName1);
+            assertNotNull(prop);
+            prop.remove();
+            fail("Property.remove() must fail on a checked-in node");
+        } catch (VersionException e) {
+            // expected
+        }
     }
 
     public void testReferenceableChild() throws RepositoryException {