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 2013/02/07 10:49:56 UTC
svn commit: r1443375 - in /jackrabbit/oak/trunk/oak-core/src:
main/java/org/apache/jackrabbit/oak/core/
test/java/org/apache/jackrabbit/oak/core/
Author: mduerig
Date: Thu Feb 7 09:49:55 2013
New Revision: 1443375
URL: http://svn.apache.org/viewvc?rev=1443375&view=rev
Log:
OAK-568: Duplicated code in TreeLocation implementations
Added:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/AbstractTreeLocation.java
- copied, changed from r1443368, jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/NullLocation.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/AbstractNodeLocation.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/AbstractPropertyLocation.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/NullLocation.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ReadOnlyTree.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TreeImpl.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/TreeLocationTest.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/AbstractNodeLocation.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/AbstractNodeLocation.java?rev=1443375&r1=1443374&r2=1443375&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/AbstractNodeLocation.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/AbstractNodeLocation.java Thu Feb 7 09:49:55 2013
@@ -20,20 +20,68 @@ 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;
+import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* AbstractNodeLocation... TODO
*/
-abstract class AbstractNodeLocation<T extends Tree> implements TreeLocation {
-
+abstract class AbstractNodeLocation<T extends Tree> extends AbstractTreeLocation {
protected final T tree;
AbstractNodeLocation(T tree) {
this.tree = checkNotNull(tree);
}
+ protected abstract TreeLocation createNodeLocation(T tree);
+
+ protected abstract TreeLocation createPropertyLocation(AbstractNodeLocation<T> parentLocation, String name);
+
+ protected abstract T getParentTree();
+
+ protected abstract T getChildTree(String name);
+
+ protected abstract PropertyState getPropertyState(String name);
+
+ protected boolean canRead(T tree) {
+ return true;
+ }
+
+ @Override
+ public TreeLocation getParent() {
+ T parentTree = getParentTree();
+ return parentTree == null
+ ? NullLocation.NULL
+ : createNodeLocation(parentTree);
+ }
+
+ @Override
+ public TreeLocation getChild(String relPath) {
+ checkArgument(!PathUtils.isAbsolute(relPath), "Not a relative path: " + relPath);
+ if (relPath.isEmpty()) {
+ return this;
+ }
+
+ String parent = PathUtils.getParentPath(relPath);
+ if (parent.isEmpty()) {
+ T child = getChildTree(relPath);
+ if (child != null) {
+ return createNodeLocation(child);
+ }
+
+ PropertyState prop = getPropertyState(relPath);
+ if (prop != null) {
+ return createPropertyLocation(this, relPath);
+ }
+ return new NullLocation(this, relPath);
+ }
+ else {
+ return getChild(parent).getChild(PathUtils.getName(relPath));
+ }
+ }
+
@Override
public boolean exists() {
Status status = getStatus();
@@ -41,18 +89,23 @@ abstract class AbstractNodeLocation<T ex
}
@Override
- public String getPath() {
- return tree.getPath();
+ public Tree getTree() {
+ return canRead(tree) ? tree : null;
}
@Override
- public PropertyState getProperty() {
- return null;
+ public Tree.Status getStatus() {
+ return tree.getStatus();
}
@Override
- public Tree.Status getStatus() {
- return tree.getStatus();
+ public String getPath() {
+ return tree.getPath();
+ }
+
+ @Override
+ public boolean remove() {
+ return tree.remove();
}
@Override
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/AbstractPropertyLocation.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/AbstractPropertyLocation.java?rev=1443375&r1=1443374&r2=1443375&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/AbstractPropertyLocation.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/AbstractPropertyLocation.java Thu Feb 7 09:49:55 2013
@@ -16,42 +16,33 @@
*/
package org.apache.jackrabbit.oak.core;
+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;
-import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* AbstractPropertyLocation... TODO
*/
-abstract class AbstractPropertyLocation<T extends Tree, L extends AbstractNodeLocation<T>> implements TreeLocation {
-
- protected final L parentLocation;
+abstract class AbstractPropertyLocation<T extends Tree> extends AbstractTreeLocation {
+ protected final AbstractNodeLocation<T> parentLocation;
protected final String name;
- AbstractPropertyLocation(L parentLocation, String name) {
+ AbstractPropertyLocation(AbstractNodeLocation<T> parentLocation, String name) {
this.parentLocation = checkNotNull(parentLocation);
this.name = checkNotNull(name);
}
- @Override
- public L getParent() {
- return parentLocation;
+ protected boolean canRead(PropertyState property) {
+ return true;
}
@Override
- public TreeLocation getChild(String relPath) {
- checkArgument(!PathUtils.isAbsolute(relPath), "Not a relative path: " + relPath);
-
- TreeLocation child = this;
- for (String name : PathUtils.elements(relPath)) {
- child = new NullLocation(child, name);
- }
-
- return child;
+ public TreeLocation getParent() {
+ return parentLocation;
}
@Override
@@ -61,12 +52,32 @@ abstract class AbstractPropertyLocation<
}
@Override
+ public PropertyState getProperty() {
+ PropertyState property = parentLocation.getPropertyState(name);
+ return canRead(property)
+ ? property
+ : null;
+ }
+
+ @Override
+ public Status getStatus() {
+ return parentLocation.tree.getPropertyStatus(name);
+ }
+
+ @Override
public String getPath() {
return PathUtils.concat(parentLocation.getPath(), name);
}
@Override
- public Tree getTree() {
- return null;
+ public boolean remove() {
+ parentLocation.tree.removeProperty(name);
+ return true;
+ }
+
+ @Override
+ public boolean set(PropertyState property) {
+ parentLocation.tree.setProperty(property);
+ return true;
}
}
\ No newline at end of file
Copied: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/AbstractTreeLocation.java (from r1443368, jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/NullLocation.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/AbstractTreeLocation.java?p2=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/AbstractTreeLocation.java&p1=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/NullLocation.java&r1=1443368&r2=1443375&rev=1443375&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/NullLocation.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/AbstractTreeLocation.java Thu Feb 7 09:49:55 2013
@@ -20,36 +20,12 @@ package org.apache.jackrabbit.oak.core;
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;
import static com.google.common.base.Preconditions.checkArgument;
-/**
- * This {@code TreeLocation} refers to an invalid location in a tree. That is
- * to a location where no item resides.
- */
-final class NullLocation implements TreeLocation {
- public static final NullLocation NULL = new NullLocation();
-
- private final TreeLocation parent;
- private final String name;
-
- public NullLocation(TreeLocation parent, String name) {
- this.parent = parent;
- this.name = name;
- }
-
- private NullLocation() {
- this.parent = this;
- this.name = "";
- }
-
- @Override
- public TreeLocation getParent() {
- return parent;
- }
+abstract class AbstractTreeLocation implements TreeLocation {
@Override
public TreeLocation getChild(String relPath) {
@@ -64,28 +40,7 @@ final class NullLocation implements Tree
}
/**
- * @return {@code false}
- */
- @Override
- public boolean exists() {
- return false;
- }
-
- @Override
- public String getPath() {
- return parent == this ? "" : PathUtils.concat(parent.getPath(), name);
- }
-
- /**
- * @return Always {@code false}.
- */
- @Override
- public boolean remove() {
- return false;
- }
-
- /**
- * @return {@code null}
+ * @return {@code null}
*/
@Override
public Tree getTree() {
@@ -93,26 +48,10 @@ final class NullLocation implements Tree
}
/**
- * @return {@code null}
+ * @return {@code null}
*/
@Override
public PropertyState getProperty() {
return null;
}
-
- /**
- * @return {@code null}
- */
- @Override
- public Status getStatus() {
- return null;
- }
-
- /**
- * @return {@code false}
- */
- @Override
- public boolean set(PropertyState property) {
- return false;
- }
}
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/NullLocation.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/NullLocation.java?rev=1443375&r1=1443374&r2=1443375&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/NullLocation.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/NullLocation.java Thu Feb 7 09:49:55 2013
@@ -19,18 +19,15 @@
package org.apache.jackrabbit.oak.core;
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;
-import static com.google.common.base.Preconditions.checkArgument;
-
/**
* This {@code TreeLocation} refers to an invalid location in a tree. That is
* to a location where no item resides.
*/
-final class NullLocation implements TreeLocation {
+final class NullLocation extends AbstractTreeLocation {
public static final NullLocation NULL = new NullLocation();
private final TreeLocation parent;
@@ -51,18 +48,6 @@ final class NullLocation implements Tree
return parent;
}
- @Override
- public TreeLocation getChild(String relPath) {
- checkArgument(!PathUtils.isAbsolute(relPath), "Not a relative path: " + relPath);
-
- TreeLocation child = this;
- for (String e : PathUtils.elements(relPath)) {
- child = new NullLocation(child, e);
- }
-
- return child;
- }
-
/**
* @return {@code false}
*/
@@ -88,22 +73,6 @@ final class NullLocation implements Tree
* @return {@code null}
*/
@Override
- public Tree getTree() {
- return null;
- }
-
- /**
- * @return {@code null}
- */
- @Override
- public PropertyState getProperty() {
- return null;
- }
-
- /**
- * @return {@code null}
- */
- @Override
public Status getStatus() {
return null;
}
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ReadOnlyTree.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ReadOnlyTree.java?rev=1443375&r1=1443374&r2=1443375&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ReadOnlyTree.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ReadOnlyTree.java Thu Feb 7 09:49:55 2013
@@ -19,6 +19,7 @@
package org.apache.jackrabbit.oak.core;
import java.util.Iterator;
+
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
@@ -27,7 +28,6 @@ import org.apache.jackrabbit.oak.api.Roo
import org.apache.jackrabbit.oak.api.Tree;
import org.apache.jackrabbit.oak.api.TreeLocation;
import org.apache.jackrabbit.oak.api.Type;
-import org.apache.jackrabbit.oak.commons.PathUtils;
import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry;
import org.apache.jackrabbit.oak.spi.state.NodeState;
@@ -247,47 +247,28 @@ public class ReadOnlyTree implements Tre
}
@Override
- public TreeLocation getParent() {
- return tree.parent == null
- ? NullLocation.NULL
- : new NodeLocation(tree.parent);
+ protected TreeLocation createNodeLocation(ReadOnlyTree tree) {
+ return new NodeLocation(tree);
}
@Override
- public TreeLocation getChild(String relPath) {
- checkArgument(!PathUtils.isAbsolute(relPath), "Not a relative path: " + relPath);
- if (relPath.isEmpty()) {
- return this;
- }
+ protected TreeLocation createPropertyLocation(AbstractNodeLocation<ReadOnlyTree> parentLocation, String name) {
+ return new PropertyLocation(parentLocation, name);
+ }
- int slash = PathUtils.getNextSlash(relPath, 0);
- if (slash == -1) {
- ReadOnlyTree child = tree.getChild(relPath);
- if (child != null) {
- return new NodeLocation(child);
- }
-
- PropertyState prop = tree.getProperty(relPath);
- if (prop != null) {
- return new PropertyLocation(this, relPath);
- }
- return new NullLocation(this, relPath);
- }
- else {
- String name = relPath.substring(0, slash);
- String tail = relPath.substring(slash + 1, relPath.length());
-
- ReadOnlyTree child = tree.getChild(name);
- if (child != null) {
- return new NodeLocation(child).getChild(tail);
- }
- return new NullLocation(this, name).getChild(tail);
- }
+ @Override
+ protected ReadOnlyTree getParentTree() {
+ return tree.parent;
}
@Override
- public boolean remove() {
- return false;
+ protected ReadOnlyTree getChildTree(String name) {
+ return tree.getChild(name);
+ }
+
+ @Override
+ protected PropertyState getPropertyState(String name) {
+ return tree.getProperty(name);
}
@Override
@@ -296,30 +277,25 @@ public class ReadOnlyTree implements Tre
}
@Override
- public Status getStatus() {
- return tree.getStatus();
+ public boolean remove() {
+ return false;
}
}
- private final class PropertyLocation extends AbstractPropertyLocation<ReadOnlyTree, NodeLocation> {
+ private final class PropertyLocation extends AbstractPropertyLocation<ReadOnlyTree> {
- private PropertyLocation(NodeLocation parentLocation, String name) {
+ private PropertyLocation(AbstractNodeLocation<ReadOnlyTree> parentLocation, String name) {
super(parentLocation, name);
}
@Override
- public boolean remove() {
- return false;
- }
-
- @Override
public PropertyState getProperty() {
return parentLocation.tree.getProperty(name);
}
@Override
- public Status getStatus() {
- return Status.EXISTING;
+ public boolean remove() {
+ return false;
}
@Override
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=1443375&r1=1443374&r2=1443375&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 Feb 7 09:49:55 2013
@@ -34,7 +34,6 @@ import org.apache.jackrabbit.oak.api.Pro
import org.apache.jackrabbit.oak.api.Tree;
import org.apache.jackrabbit.oak.api.TreeLocation;
import org.apache.jackrabbit.oak.api.Type;
-import org.apache.jackrabbit.oak.commons.PathUtils;
import org.apache.jackrabbit.oak.plugins.memory.MemoryPropertyBuilder;
import org.apache.jackrabbit.oak.plugins.memory.MultiStringPropertyState;
import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
@@ -591,90 +590,47 @@ public class TreeImpl implements Tree {
}
@Override
- public TreeLocation getParent() {
- return tree.parent == null
- ? NullLocation.NULL
- : new NodeLocation(tree.parent);
+ protected NodeLocation createNodeLocation(TreeImpl tree) {
+ return new NodeLocation(tree);
}
@Override
- public TreeLocation getChild(String relPath) {
- checkArgument(!PathUtils.isAbsolute(relPath), "Not a relative path: " + relPath);
- if (relPath.isEmpty()) {
- return this;
- }
-
- int slash = PathUtils.getNextSlash(relPath, 0);
- if (slash == -1) {
- TreeImpl child = tree.internalGetChild(relPath);
- if (child != null) {
- return new NodeLocation(child);
- }
-
- PropertyState prop = tree.internalGetProperty(relPath);
- if (prop != null) {
- return new PropertyLocation(this, relPath);
- }
- return new NullLocation(this, relPath);
- }
- else {
- String name = relPath.substring(0, slash);
- String tail = relPath.substring(slash + 1, relPath.length());
-
- TreeImpl child = tree.internalGetChild(name);
- if (child != null) {
- return new NodeLocation(child).getChild(tail);
- }
- return new NullLocation(this, name).getChild(tail);
- }
+ protected TreeLocation createPropertyLocation(AbstractNodeLocation<TreeImpl> parentLocation, String name) {
+ return new PropertyLocation(parentLocation, name);
}
@Override
- public boolean remove() {
- return tree.remove();
+ protected TreeImpl getParentTree() {
+ return tree.parent;
}
@Override
- public Tree getTree() {
- return canRead(tree) ? tree : null;
- }
- }
-
- private final class PropertyLocation extends AbstractPropertyLocation<TreeImpl, NodeLocation> {
-
- private PropertyLocation(NodeLocation parentLocation, String name) {
- super(parentLocation, name);
+ protected TreeImpl getChildTree(String name) {
+ return tree.internalGetChild(name);
}
@Override
- public PropertyState getProperty() {
- PropertyState property = parentLocation.tree.internalGetProperty(name);
- return canRead(property)
- ? property
- : null;
+ protected PropertyState getPropertyState(String name) {
+ return tree.internalGetProperty(name);
}
@Override
- public Status getStatus() {
- return parentLocation.tree.getPropertyStatus(name);
+ protected boolean canRead(TreeImpl tree) {
+ return TreeImpl.this.canRead(tree);
}
+ }
- @Override
- public boolean set(PropertyState property) {
- parentLocation.tree.setProperty(property);
- return true;
+ private final class PropertyLocation extends AbstractPropertyLocation<TreeImpl> {
+
+ private PropertyLocation(AbstractNodeLocation<TreeImpl> parentLocation, String name) {
+ super(parentLocation, name);
}
- /**
- * Remove the underlying property
- *
- * @return {@code true} on success false otherwise
- */
@Override
- public boolean remove() {
- parentLocation.tree.removeProperty(name);
- return true;
+ protected boolean canRead(PropertyState property) {
+ return TreeImpl.this.canRead(property);
}
+
}
}
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/TreeLocationTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/TreeLocationTest.java?rev=1443375&r1=1443374&r2=1443375&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/TreeLocationTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/TreeLocationTest.java Thu Feb 7 09:49:55 2013
@@ -50,7 +50,7 @@ public class TreeLocationTest {
tree.setProperty("c", 3);
tree.addChild("x");
tree.addChild("y");
- tree.addChild("z");
+ tree.addChild("z").addChild("1").addChild("2").setProperty("p", "v");
root.commit();
// Acquire a fresh new root to avoid problems from lingering state
@@ -108,4 +108,20 @@ public class TreeLocationTest {
assertEquals(a.getProperty(), ab.getParent().getProperty());
}
+
+ @Test
+ public void getDeepLocation() {
+ TreeLocation p = root.getLocation("/z/1/2/p");
+ assertNotNull(p.getProperty());
+ assertEquals("/z/1/2/p", p.getPath());
+
+ TreeLocation n = root.getLocation("/z/1/2/3/4");
+ assertNull(n.getTree());
+ assertNull(n.getProperty());
+ assertEquals("/z/1/2/3/4", n.getPath());
+
+ TreeLocation two = n.getParent().getParent();
+ assertNotNull(two.getTree());
+ assertEquals("/z/1/2", two.getPath());
+ }
}