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 md...@apache.org on 2012/08/23 23:36:50 UTC
svn commit: r1376710 - in /jackrabbit/oak/trunk:
oak-core/src/main/java/org/apache/jackrabbit/oak/core/
oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/
Author: mduerig
Date: Thu Aug 23 21:36:50 2012
New Revision: 1376710
URL: http://svn.apache.org/viewvc?rev=1376710&view=rev
Log:
OAK-275 Introduce TreeLocation interface
OAK-212 Move status of property to PropertyState
OAK-214 PropertyImpl#getParent violates JCR API
OAK-220 PropertyState can only be accessed from parent tree
OAK-226 Property#getPath() relies on accessibility of the parent node
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TreeImpl.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeDelegate.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/PropertyDelegate.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TreeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TreeImpl.java?rev=1376710&r1=1376709&r2=1376710&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TreeImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TreeImpl.java Thu Aug 23 21:36:50 2012
@@ -570,12 +570,15 @@ public class TreeImpl implements Tree, P
String parentPath = PathUtils.getParentPath(relPath);
for (String name : PathUtils.elements(parentPath)) {
child = child.internalGetChild(name);
+ if (child == null) {
+ return NullLocation.INSTANCE;
+ }
}
String name = PathUtils.getName(relPath);
PropertyState property = child.internalGetProperty(name);
if (property != null) {
- return new PropertyLocation(this, property);
+ return new PropertyLocation(new NodeLocation(child), property);
}
else {
child = child.internalGetChild(name);
@@ -651,7 +654,7 @@ public class TreeImpl implements Tree, P
}
private static class NullLocation implements TreeLocation {
- static NullLocation INSTANCE = new NullLocation();
+ public static final NullLocation INSTANCE = new NullLocation();
@Override
public TreeLocation getParent() {
Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeDelegate.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeDelegate.java?rev=1376710&r1=1376709&r2=1376710&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeDelegate.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeDelegate.java Thu Aug 23 21:36:50 2012
@@ -40,7 +40,6 @@ import org.apache.jackrabbit.oak.api.Pro
import org.apache.jackrabbit.oak.api.Tree;
import org.apache.jackrabbit.oak.api.Tree.Status;
import org.apache.jackrabbit.oak.api.TreeLocation;
-import org.apache.jackrabbit.oak.commons.PathUtils;
/**
* {@code NodeDelegate} serve as internal representations of {@code Node}s.
@@ -51,11 +50,11 @@ import org.apache.jackrabbit.oak.commons
public class NodeDelegate extends ItemDelegate {
/** The underlying {@link TreeLocation} of this node. */
- private TreeLocation treeLocation;
+ private TreeLocation location;
public NodeDelegate(SessionDelegate sessionDelegate, Tree tree) {
super(sessionDelegate);
- this.treeLocation = tree.getLocation();
+ this.location = tree.getLocation();
}
@Override
@@ -76,7 +75,7 @@ public class NodeDelegate extends ItemDe
@Override
public boolean isStale() {
- return treeLocation.getStatus() == Status.REMOVED;
+ return location.getStatus() == Status.REMOVED;
}
@Override
@@ -87,7 +86,7 @@ public class NodeDelegate extends ItemDe
@Override
public String toString() {
// don't disturb the state: avoid resolving the tree
- return "NodeDelegate[" + treeLocation.getPath() + ']';
+ return "NodeDelegate[" + location.getPath() + ']';
}
@Nonnull
@@ -119,17 +118,12 @@ public class NodeDelegate extends ItemDe
* no such property exists
*/
@CheckForNull
- public PropertyDelegate getProperty(String relPath) throws InvalidItemStateException {
- Tree parent = getTree(PathUtils.getParentPath(relPath));
- if (parent == null) {
- return null;
- }
-
- String name = PathUtils.getName(relPath);
- PropertyState propertyState = parent.getProperty(name);
+ public PropertyDelegate getProperty(String relPath) {
+ TreeLocation propertyLocation = getLocation().getChild(relPath);
+ PropertyState propertyState = propertyLocation.getProperty();
return propertyState == null
- ? null
- : new PropertyDelegate(sessionDelegate, parent, propertyState);
+ ? null
+ : new PropertyDelegate(sessionDelegate, propertyLocation);
}
/**
@@ -157,8 +151,8 @@ public class NodeDelegate extends ItemDe
* no such node exists
*/
@CheckForNull
- public NodeDelegate getChild(String relPath) throws InvalidItemStateException {
- Tree tree = getTree(relPath);
+ public NodeDelegate getChild(String relPath) {
+ Tree tree = getLocation().getChild(relPath).getTree();
return tree == null ? null : new NodeDelegate(sessionDelegate, tree);
}
@@ -276,12 +270,13 @@ public class NodeDelegate extends ItemDe
*/
@Nonnull
public PropertyDelegate setProperty(String name, CoreValue value) throws InvalidItemStateException, ValueFormatException {
- PropertyState old = getTree().getProperty(name);
+ Tree tree = getTree();
+ PropertyState old = tree.getProperty(name);
if (old != null && old.isArray()) {
throw new ValueFormatException("Attempt to set a single value to multi-valued property.");
}
- PropertyState propertyState = getTree().setProperty(name, value);
- return new PropertyDelegate(sessionDelegate, getTree(), propertyState);
+ PropertyState propertyState = tree.setProperty(name, value);
+ return new PropertyDelegate(sessionDelegate, tree, propertyState);
}
public void removeProperty(String name) throws InvalidItemStateException {
@@ -296,12 +291,13 @@ public class NodeDelegate extends ItemDe
*/
@Nonnull
public PropertyDelegate setProperty(String name, List<CoreValue> value) throws InvalidItemStateException, ValueFormatException {
- PropertyState old = getTree().getProperty(name);
+ Tree tree = getTree();
+ PropertyState old = tree.getProperty(name);
if (old != null && ! old.isArray()) {
throw new ValueFormatException("Attempt to set multiple values to single valued property.");
}
- PropertyState propertyState = getTree().setProperty(name, value);
- return new PropertyDelegate(sessionDelegate, getTree(), propertyState);
+ PropertyState propertyState = tree.setProperty(name, value);
+ return new PropertyDelegate(sessionDelegate, tree, propertyState);
}
/**
@@ -326,22 +322,32 @@ public class NodeDelegate extends ItemDe
// -----------------------------------------------------------< private >---
- private Tree getTree(String relPath) throws InvalidItemStateException {
- String absPath = PathUtils.concat(getPath(), relPath);
- return sessionDelegate.getTree(absPath);
+ @Nonnull
+ Tree getTree() throws InvalidItemStateException {
+ resolve();
+ Tree tree = location.getTree();
+ if (tree == null) {
+ throw new InvalidItemStateException("Node is stale");
+ }
+ else {
+ return tree;
+ }
}
@Nonnull
- synchronized Tree getTree() throws InvalidItemStateException {
- String path = treeLocation.getPath();
+ private TreeLocation getLocation() {
+ resolve();
+ return location;
+ }
+
+ private synchronized void resolve() {
+ String path = location.getPath();
if (path != null) {
Tree tree = sessionDelegate.getTree(path);
if (tree != null) {
- treeLocation = tree.getLocation();
- return tree;
+ location = tree.getLocation();
}
}
- throw new InvalidItemStateException("Node is stale");
}
private Iterator<NodeDelegate> nodeDelegateIterator(
@@ -373,7 +379,7 @@ public class NodeDelegate extends ItemDe
new Function<PropertyState, PropertyDelegate>() {
@Override
public PropertyDelegate apply(PropertyState propertyState) {
- return new PropertyDelegate(sessionDelegate, treeLocation.getTree(),
+ return new PropertyDelegate(sessionDelegate, location.getTree(),
propertyState);
}
});
Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/PropertyDelegate.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/PropertyDelegate.java?rev=1376710&r1=1376709&r2=1376710&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/PropertyDelegate.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/PropertyDelegate.java Thu Aug 23 21:36:50 2012
@@ -29,6 +29,7 @@ import org.apache.jackrabbit.oak.api.Cor
import org.apache.jackrabbit.oak.api.PropertyState;
import org.apache.jackrabbit.oak.api.Tree;
import org.apache.jackrabbit.oak.api.Tree.Status;
+import org.apache.jackrabbit.oak.api.TreeLocation;
import org.apache.jackrabbit.oak.commons.PathUtils;
/**
@@ -39,27 +40,21 @@ import org.apache.jackrabbit.oak.commons
*/
public class PropertyDelegate extends ItemDelegate {
- /**
- * The underlying {@link Tree} of the parent node. In order to ensure the
- * instance is up to date, this field <em>should not be accessed directly</em>
- * but rather the {@link #getParentTree()} Tree()} method should be used.
- */
- private Tree parent;
-
- /**
- * The underlying {@link PropertyState}. In order to ensure the instance is up
- * to date, this field <em>should not be accessed directly</em> but rather the
- * {@link #getPropertyState()} method should be used.
- */
- private PropertyState propertyState;
+ /** The underlying {@link TreeLocation} of this node. */
+ private TreeLocation location;
PropertyDelegate(SessionDelegate sessionDelegate, Tree parent, PropertyState propertyState) {
super(sessionDelegate);
assert parent != null;
assert propertyState != null;
- this.parent = parent;
- this.propertyState = propertyState;
+ this.location = parent.getLocation().getChild(propertyState.getName());
+ }
+
+ public PropertyDelegate(SessionDelegate sessionDelegate, TreeLocation location) {
+ super(sessionDelegate);
+ assert location != null;
+ this.location = location;
}
@Override
@@ -81,7 +76,7 @@ public class PropertyDelegate extends It
@Override
public boolean isStale() {
resolve();
- return parent == null;
+ return location.getStatus() == Status.REMOVED;
}
@Override
@@ -97,7 +92,7 @@ public class PropertyDelegate extends It
@Override
public String toString() {
// don't disturb the state: avoid calling resolve()
- return "PropertyDelegate[" + parent.getPath() + '/' + propertyState.getName() + ']';
+ return "PropertyDelegate[" + location.getPath() + ']';
}
/**
@@ -255,36 +250,32 @@ public class PropertyDelegate extends It
@Nonnull
private PropertyState getPropertyState() throws InvalidItemStateException {
resolve();
- if (parent == null) {
+ PropertyState property = location.getProperty();
+ if (property == null) {
throw new InvalidItemStateException("Property is stale");
}
-
- return propertyState;
+ return property;
}
@Nonnull
private Tree getParentTree() throws InvalidItemStateException {
resolve();
- if (parent == null) {
- throw new InvalidItemStateException("Property is stale");
+ Tree tree = location.getParent().getTree();
+ if (tree == null) {
+ throw new InvalidItemStateException("Parent node is stale");
}
-
- return parent;
+ return tree;
}
- private synchronized void resolve() {
- if (parent != null) {
- parent = parent.getStatus() == Status.REMOVED
- ? null
- : sessionDelegate.getTree(parent.getPath());
-
- if (parent == null) {
- propertyState = null;
- } else {
- String path = PathUtils.concat(parent.getPath(), propertyState.getName());
- propertyState = parent.getProperty(PathUtils.getName(path));
+ synchronized void resolve() {
+ String path = location.getPath();
+ if (path != null) {
+ Tree parent = sessionDelegate.getTree(PathUtils.getParentPath(path));
+ if (parent != null) {
+ location = parent.getLocation().getChild(PathUtils.getName(path));
}
}
}
+
}