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 ju...@apache.org on 2012/07/12 18:03:35 UTC
svn commit: r1360739 - in /jackrabbit/oak/trunk:
oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/AbstractNameMapper.java
oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeDelegate.java
Author: jukka
Date: Thu Jul 12 16:03:35 2012
New Revision: 1360739
URL: http://svn.apache.org/viewvc?rev=1360739&view=rev
Log:
OAK-182: Support for "invisible" internal content
Prevent mapping of internal :names to JCR names.
Filter out properties and nodes with such names from basic property and node listings.
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/AbstractNameMapper.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeDelegate.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/AbstractNameMapper.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/AbstractNameMapper.java?rev=1360739&r1=1360738&r2=1360739&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/AbstractNameMapper.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/AbstractNameMapper.java Thu Jul 12 16:03:35 2012
@@ -33,6 +33,9 @@ public abstract class AbstractNameMapper
if (pos < 0) {
// no colon
return jcrName.startsWith("{}") ? jcrName.substring(2) : jcrName;
+ } else if (pos == 0) {
+ // Internal name, should not be visible to JCR clients
+ return null;
} else {
if (jcrName.charAt(0) == '{') {
int endpos = jcrName.indexOf('}');
@@ -74,6 +77,10 @@ public abstract class AbstractNameMapper
if (pos < 0) {
// non-prefixed
return oakName;
+ } else if (pos == 0) {
+ // Internal name, should not be visible to JCR clients
+ throw new IllegalStateException(
+ "internal Oak name: " + oakName);
} else {
String pref = oakName.substring(0, pos);
String name = oakName.substring(pos + 1);
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=1360739&r1=1360738&r2=1360739&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 Jul 12 16:03:35 2012
@@ -16,9 +16,7 @@
*/
package org.apache.jackrabbit.oak.jcr;
-import java.util.ArrayList;
import java.util.Collections;
-import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
@@ -28,9 +26,6 @@ import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
import javax.jcr.InvalidItemStateException;
-import org.apache.commons.collections.Predicate;
-import org.apache.commons.collections.iterators.FilterIterator;
-import org.apache.commons.collections.iterators.IteratorChain;
import org.apache.jackrabbit.oak.api.CoreValue;
import org.apache.jackrabbit.oak.api.PropertyState;
import org.apache.jackrabbit.oak.api.Tree;
@@ -38,6 +33,7 @@ import org.apache.jackrabbit.oak.api.Tre
import org.apache.jackrabbit.oak.commons.PathUtils;
import org.apache.jackrabbit.oak.util.Function1;
import org.apache.jackrabbit.oak.util.Iterators;
+import org.apache.jackrabbit.oak.util.Predicate;
/**
* {@code NodeDelegate} serve as internal representations of {@code Node}s.
@@ -117,6 +113,7 @@ public class NodeDelegate extends ItemDe
* @return number of properties of the node
*/
public long getPropertyCount() throws InvalidItemStateException {
+ // TODO: Exclude "invisible" internal properties (OAK-182)
return getTree().getPropertyCount();
}
@@ -154,6 +151,7 @@ public class NodeDelegate extends ItemDe
* @return number of child nodes of the node
*/
public long getChildCount() throws InvalidItemStateException {
+ // TODO: Exclude "invisible" internal child nodes (OAK-182)
return getTree().getChildrenCount();
}
@@ -177,7 +175,6 @@ public class NodeDelegate extends ItemDe
*
* @return child nodes of the node
*/
- @SuppressWarnings("unchecked")
@Nonnull
public Iterator<NodeDelegate> getChildren() throws InvalidItemStateException {
Tree tree = getTree();
@@ -188,8 +185,12 @@ public class NodeDelegate extends ItemDe
} else if (count == 1) {
// Optimise another typical case
Tree child = tree.getChildren().iterator().next();
- NodeDelegate delegate = new NodeDelegate(sessionDelegate, child);
- return Collections.singleton(delegate).iterator();
+ if (!child.getName().startsWith(":")) {
+ NodeDelegate delegate = new NodeDelegate(sessionDelegate, child);
+ return Collections.singleton(delegate).iterator();
+ } else {
+ return Collections.<NodeDelegate>emptySet().iterator();
+ }
} else {
// TODO: Use a proper namespace for this property?
PropertyState order = tree.getProperty("childOrder");
@@ -204,7 +205,7 @@ public class NodeDelegate extends ItemDe
for (CoreValue value : order.getValues()) {
String name = value.getString();
Tree child = tree.getChild(name);
- if (child != null) {
+ if (child != null && !name.startsWith(":")) {
ordered.put(name, new NodeDelegate(sessionDelegate, child));
}
}
@@ -217,21 +218,17 @@ public class NodeDelegate extends ItemDe
// so return a combined iterator that first iterates
// through the ordered subset and then all the remaining
// children in an undefined order
- Predicate predicate = new Predicate() {
- @Override
- public boolean evaluate(Object object) {
- if (object instanceof Tree) {
- Tree tree = (Tree) object;
- return !ordered.containsKey(tree.getName());
- } else {
- return false;
- }
- }
- };
- return new IteratorChain(
+ Iterator<Tree> remaining = Iterators.filter(
+ tree.getChildren().iterator(),
+ new Predicate<Tree>() {
+ @Override
+ public boolean evaluate(Tree tree) {
+ return !ordered.containsKey(tree.getName());
+ }
+ });
+ return Iterators.chain(
ordered.values().iterator(),
- nodeDelegateIterator(new FilterIterator(
- tree.getChildren().iterator(), predicate)));
+ nodeDelegateIterator(remaining));
}
}
}
@@ -305,7 +302,13 @@ public class NodeDelegate extends ItemDe
private Iterator<NodeDelegate> nodeDelegateIterator(
Iterator<Tree> childNodeStates) {
- return Iterators.map(childNodeStates,
+ return Iterators.map(
+ Iterators.filter(childNodeStates, new Predicate<Tree>() {
+ @Override
+ public boolean evaluate(Tree tree) {
+ return !tree.getName().startsWith(":");
+ }
+ }),
new Function1<Tree, NodeDelegate>() {
@Override
public NodeDelegate apply(Tree state) {
@@ -316,7 +319,13 @@ public class NodeDelegate extends ItemDe
private Iterator<PropertyDelegate> propertyDelegateIterator(
Iterator<? extends PropertyState> properties) {
- return Iterators.map(properties,
+ return Iterators.map(
+ Iterators.filter(properties, new Predicate<PropertyState>() {
+ @Override
+ public boolean evaluate(PropertyState property) {
+ return !property.getName().startsWith(":");
+ }
+ }),
new Function1<PropertyState, PropertyDelegate>() {
@Override
public PropertyDelegate apply(PropertyState propertyState) {