Class ImmutableTree
java.lang.Object
org.apache.jackrabbit.oak.plugins.tree.impl.AbstractTree
org.apache.jackrabbit.oak.plugins.tree.impl.ImmutableTree
- All Implemented Interfaces:
Tree
,ReadOnly
,TreeTypeAware
Immutable implementation of the
Tree
interface in order to provide
the much feature rich API functionality for a given NodeState
.
Tree hierarchy
Due to the nature of thisTree
implementation creating a proper
hierarchical view of the tree structure is the responsibility of the caller.
It is recommended to start with the state of the
root node
and build up the hierarchy by calling
ImmutableTree(ImmutableTree, String, org.apache.jackrabbit.oak.spi.state.NodeState)
for every subsequent child state. Note, that this implementation will not
perform any kind of validation of the passed state and methods like isRoot()
,
getName()
or getPath()
will just make use of the hierarchy that has been
create by that sequence. In order to create a disconnected individual tree in cases where
the hierarchy information is not (yet) need or known it is suggested to use
ImmutableTree(ImmutableTree.ParentProvider, String, org.apache.jackrabbit.oak.spi.state.NodeState)
an specify an appropriate ParentProvider
implementation.
ParentProvider
Apart from create the tree hierarchy in traversal mode this tree implementation allows to instantiate disconnected trees that depending on the use may never or on demand retrieve hierarchy information. The following default implementations of this internal interface are present:ImmutableTree.DefaultParentProvider
: used with the default usage where the parent tree is passed to the constructorImmutableTree.ParentProvider.ROOT_PROVIDER
: the default parent provider for the root tree. All children will getImmutableTree.DefaultParentProvider
ImmutableTree.ParentProvider.UNSUPPORTED
: throwsUnsupportedOperationException
upon hierarchy related methods likeAbstractTree.getParent()
,getPath()
Filtering 'hidden' items
ThisTree
implementation reflects the item hierarchy as exposed by the
underlying NodeState
. In contrast to the mutable implementations it
does not filter out 'hidden' items as identified by
org.apache.jackrabbit.oak.spi.state.NodeStateUtils#isHidden(String)
.
Equality and hash code
In contrast toAbstractMutableTree
the ImmutableTree
implements
Object.equals(Object)
and Object.hashCode()
: Two ImmutableTree
s
are consider equal if their name and the underlying NodeState
s are equal. Note
however, that according to the contract defined in NodeState
these
objects are not expected to be used as hash keys.-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic final class
static interface
Nested classes/interfaces inherited from interface org.apache.jackrabbit.oak.api.Tree
Tree.Status
-
Field Summary
Fields inherited from interface org.apache.jackrabbit.oak.api.Tree
EMPTY_ARRAY
-
Constructor Summary
ConstructorsConstructorDescriptionImmutableTree
(@NotNull ImmutableTree.ParentProvider parentProvider, @NotNull String name, @NotNull NodeState state) ImmutableTree
(@NotNull ImmutableTree parent, @NotNull String name, @NotNull NodeState state) ImmutableTree
(@NotNull NodeState rootState) -
Method Summary
Modifier and TypeMethodDescription@NotNull Tree
Add a child with the givenname
.protected @NotNull ImmutableTree
createChild
(@NotNull String name) Factory method for creating child treesboolean
@NotNull ImmutableTree
Get a possibly non existing child of thisTree
.protected @NotNull String[]
@NotNull String
getName()
protected @NotNull NodeBuilder
protected @Nullable AbstractTree
@NotNull String
getPath()
@Nullable TreeType
getType()
int
hashCode()
protected boolean
Determine whether an item should be hidden.boolean
isRoot()
boolean
orderBefore
(@Nullable String name) Orders thisTree
before the sibling tree with the givenname
.boolean
remove()
Remove this tree instance.void
removeProperty
(@NotNull String name) Remove the property with the given name.void
setOrderableChildren
(boolean enable) Changes the nature of this tree such that the order of the children is kept stable.<T> void
setProperty
(@NotNull String name, T value) Set a property state<T> void
setProperty
(@NotNull String name, T value, @NotNull Type<T> type) Set a property statevoid
setProperty
(@NotNull PropertyState property) Set a property statevoid
Methods inherited from class org.apache.jackrabbit.oak.plugins.tree.impl.AbstractTree
buildPath, exists, getChildNames, getChildren, getChildrenCount, getNodeState, getParent, getProperties, getProperty, getPropertyCount, getPropertyStatus, getStatus, hasChild, hasOrderableChildren, hasProperty, toString
-
Constructor Details
-
ImmutableTree
-
ImmutableTree
public ImmutableTree(@NotNull @NotNull ImmutableTree parent, @NotNull @NotNull String name, @NotNull @NotNull NodeState state) -
ImmutableTree
public ImmutableTree(@NotNull @NotNull ImmutableTree.ParentProvider parentProvider, @NotNull @NotNull String name, @NotNull @NotNull NodeState state)
-
-
Method Details
-
getType
- Specified by:
getType
in interfaceTreeTypeAware
-
setType
- Specified by:
setType
in interfaceTreeTypeAware
-
createChild
Description copied from class:AbstractTree
Factory method for creating child trees- Specified by:
createChild
in classAbstractTree
- Parameters:
name
- name of the child tree- Returns:
- child tree of this tree with the given
name
-
isRoot
public boolean isRoot()- Specified by:
isRoot
in interfaceTree
- Overrides:
isRoot
in classAbstractTree
- Returns:
true
iff this is the root
-
getParentOrNull
- Specified by:
getParentOrNull
in classAbstractTree
- Returns:
- the parent of this tree or
null
for the root
-
getNodeBuilder
- Specified by:
getNodeBuilder
in classAbstractTree
- Returns:
- The
NodeBuilder
for the underlying node state
-
isHidden
Description copied from class:AbstractTree
Determine whether an item should be hidden. I.e. not exposed through this tree.- Overrides:
isHidden
in classAbstractTree
- Parameters:
name
- name of an item- Returns:
true
if the item is hidden,false
otherwise.
-
getInternalNodeNames
- Overrides:
getInternalNodeNames
in classAbstractTree
-
getName
-
getPath
- Specified by:
getPath
in interfaceTree
- Overrides:
getPath
in classAbstractTree
- Returns:
- the absolute path of this
Tree
instance from itsRoot
.
-
getChild
@NotNull public @NotNull ImmutableTree getChild(@NotNull @NotNull String name) throws IllegalArgumentException Description copied from interface:Tree
Get a possibly non existing child of thisTree
.- Specified by:
getChild
in interfaceTree
- Overrides:
getChild
in classAbstractTree
- Parameters:
name
- The name of the child to retrieve.- Returns:
- The child with the given
name
. - Throws:
IllegalArgumentException
- if the given name is invalid
-
remove
public boolean remove()Description copied from interface:Tree
Remove this tree instance. This operation never succeeds for the root tree. -
addChild
Description copied from interface:Tree
Add a child with the givenname
. Does nothing if such a child already exists. -
setOrderableChildren
public void setOrderableChildren(boolean enable) Description copied from interface:Tree
Changes the nature of this tree such that the order of the children is kept stable. The expected behavior is as follows:- Calling
setOrderableChildren(true)
on a tree the first time will stabilize the order of existing children. Any subsequentTree.addChild(String)
call is guaranteed to insert the new tree and the end of the child list. - Calling
setOrderableChildren(true)
on a tree that already has its children ordered has no effect. - Calling
setOrderableChildren(false)
on a tree that doesn't have ordered children has not effect - Calling
setOrderableChildren(false)
on a tree with ordered children will remove the necessity to keep the child list stable. The order of children uponTree.getChildren()
is subsequently undefined.
Calling
Tree.orderBefore(String)
on a tree, implicitly enables orderable children on the parent tree.- Specified by:
setOrderableChildren
in interfaceTree
- Parameters:
enable
- Enable (or disable) orderable children for this tree.
- Calling
-
orderBefore
Description copied from interface:Tree
Orders thisTree
before the sibling tree with the givenname
. Calling this method for the first time on thisTree
or any of its siblings will persist the current order of siblings and maintain it from this point on.- Specified by:
orderBefore
in interfaceTree
- Parameters:
name
- the name of the sibling node where this tree is ordered before. This tree will become the last sibling ifname
isnull
.- Returns:
false
if there is no sibling with the givenname
or no reordering was performed;true
otherwise.
-
setProperty
Description copied from interface:Tree
Set a property state- Specified by:
setProperty
in interfaceTree
- Parameters:
property
- The property state to set
-
setProperty
Description copied from interface:Tree
Set a property state- Specified by:
setProperty
in interfaceTree
- Type Parameters:
T
- The type of this property. Must be one ofString, Blob, byte[], Long, Integer, Double, Boolean, BigDecimal
- Parameters:
name
- The name of this property. A valid name does not start with a colon, is not empty and does not contain a forward slash.value
- The value of this property
-
setProperty
public <T> void setProperty(@NotNull @NotNull String name, @NotNull T value, @NotNull @NotNull Type<T> type) Description copied from interface:Tree
Set a property state- Specified by:
setProperty
in interfaceTree
- Type Parameters:
T
- The type of this property.- Parameters:
name
- The name of this property. A valid name does not start with a colon, is not empty and does not contain a forward slash.value
- The value of this propertytype
- The type of this property.
-
removeProperty
Description copied from interface:Tree
Remove the property with the given name. This method has no effect if a property of the givenname
does not exist.- Specified by:
removeProperty
in interfaceTree
- Parameters:
name
- The name of the property
-
hashCode
public int hashCode() -
equals
-