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 {