Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/TreeFactory.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/TreeFactory.java (revision a7dacf32086f90572ee2a86e947878bb66ea520c) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/TreeFactory.java (revision ) @@ -16,11 +16,20 @@ */ package org.apache.jackrabbit.oak.plugins.tree; +import static com.google.common.collect.Iterables.transform; + import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import com.google.common.base.Function; +import org.apache.jackrabbit.oak.api.PropertyState; import org.apache.jackrabbit.oak.api.Tree; +import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeBuilder; +import org.apache.jackrabbit.oak.plugins.tree.impl.AbstractTree; import org.apache.jackrabbit.oak.plugins.tree.impl.ImmutableTree; import org.apache.jackrabbit.oak.plugins.tree.impl.NodeBuilderTree; +import org.apache.jackrabbit.oak.spi.state.AbstractNodeState; +import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry; import org.apache.jackrabbit.oak.spi.state.NodeBuilder; import org.apache.jackrabbit.oak.spi.state.NodeState; @@ -37,6 +46,82 @@ } public static Tree createReadOnlyTree(@Nonnull NodeState rootState) { + if (rootState instanceof TreeBasedNodeState) { + return ((TreeBasedNodeState) rootState).getTree(); + } else { - return new ImmutableTree(rootState); + return new ImmutableTree(rootState); + } + } + + public static NodeState createNodeState(@Nonnull Tree tree) { + if (tree instanceof AbstractTree) { + return ((AbstractTree) tree).getNodeState(); + } else { + return new TreeBasedNodeState(tree); + } + } + + private static class TreeBasedNodeState extends AbstractNodeState { + private final Tree tree; + + TreeBasedNodeState(Tree tree) { + this.tree = tree; + } + + public Tree getTree() { + return tree; + } + + @Override + public boolean exists() { + return tree.exists(); + } + + @Nonnull + @Override + public Iterable getProperties() { + return tree.getProperties(); + } + + @Override + public boolean hasChildNode(@Nonnull String name) { + return tree.hasChild(name); + } + + @Nonnull + @Override + public NodeState getChildNode(@Nonnull String name) throws IllegalArgumentException { + return new TreeBasedNodeState(tree.getChild(name)); + } + + @Nonnull + @Override + public Iterable getChildNodeEntries() { + return transform(tree.getChildren(), new Function() { + @Nullable + @Override + public ChildNodeEntry apply(final Tree tree) { + return new ChildNodeEntry() { + @Nonnull + @Override + public String getName() { + return tree.getName(); + } + + @Nonnull + @Override + public NodeState getNodeState() { + return new TreeBasedNodeState(tree); + } + }; + } + }); + } + + @Nonnull + @Override + public NodeBuilder builder() { + return new MemoryNodeBuilder(this); + } } } \ No newline at end of file