public interface NodeBuilder
node states
.
A node builder can be thought of as a mutable version of a node state.
In addition to property and child node access methods like the ones that
are already present in the NodeState interface, the NodeBuilder
interface contains the following key methods:
setProperty
and removeProperty
methods for
modifying propertiesgetChildNode
method for accessing or modifying an existing
subtreesetChildNode
and removeChildNode
methods for adding,
replacing or removing a subtreeexists
method for checking whether the node represented by
a builder exists or is accessiblegetNodeState
method for getting a frozen snapshot of the
modified content treeNodeBuilder rootBuilder = root.builder(); NodeBuilder fooBuilder = rootBuilder.getChildNode("foo"); NodeBuilder barBuilder = fooBuilder.getChildNode("bar"); assert !barBuilder.getBoolean("x"); fooBuilder.getChildNode("bar").setProperty("x", Boolean.TRUE); assert barBuilder.getBoolean("x"); assert barBuilder.exists(); fooBuilder.removeChildNode("bar"); assert !barBuilder.exists();The
getNodeState
method returns a frozen, immutable snapshot of the current
state of the builder. Providing such a snapshot can be somewhat expensive especially
if there are many changes in the builder, so the method should generally only be used
as the last step after all intended changes have been made. Meanwhile the accessors
in the NodeBuilder
interface can be used to provide efficient read access to
the current state of the tree being modified.
The node states constructed by a builder often retain an internal reference to the base state used by the builder. This allows common node state comparisons to perform really.
Modifier and Type | Method and Description |
---|---|
@NotNull NodeBuilder |
child(@NotNull java.lang.String name)
Returns a builder for constructing changes to the named child node.
|
Blob |
createBlob(java.io.InputStream stream) |
boolean |
exists()
Checks whether this builder represents a node that exists.
|
@NotNull NodeState |
getBaseState()
Returns the original base state that this builder is modifying.
|
boolean |
getBoolean(@NotNull java.lang.String name)
Returns the boolean value of the named property.
|
@NotNull NodeBuilder |
getChildNode(@NotNull java.lang.String name)
Returns a builder for constructing changes to the named child node.
|
long |
getChildNodeCount(long max)
Returns the current number of child nodes.
|
@NotNull java.lang.Iterable<java.lang.String> |
getChildNodeNames()
Returns the names of current child nodes.
|
@Nullable java.lang.String |
getName(@NotNull java.lang.String name)
Returns the name value of the named property.
|
@NotNull java.lang.Iterable<java.lang.String> |
getNames(@NotNull java.lang.String name)
Returns the name values of the named property.
|
@NotNull NodeState |
getNodeState()
Returns an immutable node state that matches the current state of
the builder.
|
@NotNull java.lang.Iterable<? extends PropertyState> |
getProperties()
Returns the current properties.
|
@Nullable PropertyState |
getProperty(java.lang.String name)
Returns the current state of the named property, or
null
if the property is not set. |
long |
getPropertyCount()
Returns the current number of properties.
|
@Nullable java.lang.String |
getString(java.lang.String name)
Returns the name value of the named property.
|
boolean |
hasChildNode(@NotNull java.lang.String name)
Checks whether the named child node currently exists.
|
boolean |
hasProperty(java.lang.String name)
Checks whether the named property exists.
|
boolean |
isModified()
Check whether this builder represents a modified node, which has either modified properties
or removed or added child nodes.
|
boolean |
isNew()
Check whether this builder represents a new node, which is not present in the base state.
|
boolean |
isNew(java.lang.String name)
Check whether the named property is new, i.e.
|
boolean |
isReplaced()
Check whether this builder represents a node that used to exist but
was then replaced with other content, for example as a result of
a
setChildNode(String) call. |
boolean |
isReplaced(java.lang.String name)
Check whether the named property exists in the base state but is
replaced with other content, for example as a result of
a
setProperty(PropertyState) call. |
boolean |
moveTo(@NotNull NodeBuilder newParent,
@NotNull java.lang.String newName)
Move this child to a new parent with a new name.
|
boolean |
remove()
Remove this child node from its parent.
|
@NotNull NodeBuilder |
removeProperty(java.lang.String name)
Remove the named property.
|
@NotNull NodeBuilder |
setChildNode(@NotNull java.lang.String name)
Adds the named child node and returns a builder for modifying it.
|
@NotNull NodeBuilder |
setChildNode(@NotNull java.lang.String name,
@NotNull NodeState nodeState)
Adds or replaces a subtree.
|
@NotNull NodeBuilder |
setProperty(@NotNull PropertyState property)
Set a property state
|
<T> @NotNull NodeBuilder |
setProperty(java.lang.String name,
T value)
Set a property state
|
<T> @NotNull NodeBuilder |
setProperty(java.lang.String name,
T value,
Type<T> type)
Set a property state
|
@NotNull @NotNull NodeState getNodeState()
@NotNull @NotNull NodeState getBaseState()
exists
method
returns false
) if this builder represents a new node that
didn't exist in the base content tree.boolean exists()
true
if the node exists, false
otherwiseboolean isNew()
true
for a new nodeboolean isNew(java.lang.String name)
name
- property nametrue
for a new propertyboolean isModified()
true
for a modified nodeboolean isReplaced()
setChildNode(String)
call.true
for a replaced nodeboolean isReplaced(java.lang.String name)
setProperty(PropertyState)
call.name
- property nametrue
for a replaced propertylong getChildNodeCount(long max)
If an implementation does know the exact value, it returns it (even if the value is higher than max). If the implementation does not know the exact value, and the child node count is higher than max, it may return Long.MAX_VALUE. The cost of the operation is at most O(max).
max
- the maximum value@NotNull @NotNull java.lang.Iterable<java.lang.String> getChildNodeNames()
boolean hasChildNode(@NotNull @NotNull java.lang.String name)
name
- child node nametrue
if the named child node exists,
false
otherwise@NotNull @NotNull NodeBuilder child(@NotNull @NotNull java.lang.String name) throws java.lang.IllegalArgumentException
All updates to the returned child builder will implicitly affect
also this builder, as if a
setNode(name, childBuilder.getNodeState())
method call
had been made after each update. Repeated calls to this method with
the same name will return the same child builder instance until an
explicit setChildNode(String, NodeState)
or
remove()
call is made, at which point the link
between this builder and a previously returned child builder for
that child node name will get broken.
name
- name of the child nodejava.lang.IllegalArgumentException
- if the given name string is empty
or contains the forward slash character@NotNull @NotNull NodeBuilder getChildNode(@NotNull @NotNull java.lang.String name) throws java.lang.IllegalArgumentException
IllegalStateException
s to be thrown.name
- name of the child nodejava.lang.IllegalArgumentException
- if the given name string is empty
or contains the forward slash character@NotNull @NotNull NodeBuilder setChildNode(@NotNull @NotNull java.lang.String name) throws java.lang.IllegalArgumentException
name
- name of the child nodejava.lang.IllegalArgumentException
- if the given name string is empty
or contains the forward slash character@NotNull @NotNull NodeBuilder setChildNode(@NotNull @NotNull java.lang.String name, @NotNull @NotNull NodeState nodeState) throws java.lang.IllegalArgumentException
name
- name of the child node containing the new subtreenodeState
- subtreejava.lang.IllegalArgumentException
- if the given name string is empty
or contains the forward slash characterboolean remove()
true
for existing nodes, false
otherwiseboolean moveTo(@NotNull @NotNull NodeBuilder newParent, @NotNull @NotNull java.lang.String newName) throws java.lang.IllegalArgumentException
newParent
as child newName
. Otherwise neither
this builder nor newParent
are modified.
The move succeeds if both, this builder and newParent
exist, there is no child with
newName
at newParent
and newParent
is not in the subtree of this
builder.
The move fails if the this builder or newParent
does not exist or if there is
already a child newName
at newParent
.
For all remaining cases (e.g. moving a builder into its own subtree) it is left to the implementation whether the move succeeds or fails as long as the state of the involved builder stays consistent.
newParent
- builder for the new parent.newName
- name of this child at the new parenttrue
on success, false
otherwisejava.lang.IllegalArgumentException
- if the given name string is empty
or contains the forward slash characterlong getPropertyCount()
@NotNull @NotNull java.lang.Iterable<? extends PropertyState> getProperties()
boolean hasProperty(java.lang.String name)
getProperty(name) != null
, but may be optimized
to avoid having to load the property value.name
- property nametrue
if the named property exists,
false
otherwise@Nullable @Nullable PropertyState getProperty(java.lang.String name)
null
if the property is not set.name
- property nameboolean getBoolean(@NotNull @NotNull java.lang.String name)
PropertyState property = builder.getProperty(name);
return property != null
&& property.getType() == Type.BOOLEAN
&& property.getValue(Type.BOOLEAN);
name
- property namefalse
@Nullable @Nullable java.lang.String getString(java.lang.String name)
PropertyState property = builder.getProperty(name);
if (property != null && property.getType() == Type.STRING) {
return property.getValue(Type.STRING);
} else {
return null;
}
name
- property namenull
@Nullable @Nullable java.lang.String getName(@NotNull @NotNull java.lang.String name)
PropertyState property = builder.getProperty(name);
if (property != null && property.getType() == Type.NAME) {
return property.getValue(Type.NAME);
} else {
return null;
}
name
- property namenull
@NotNull @NotNull java.lang.Iterable<java.lang.String> getNames(@NotNull @NotNull java.lang.String name)
PropertyState property = builder.getProperty(name);
if (property != null && property.getType() == Type.NAMES) {
return property.getValue(Type.NAMES);
} else {
return Collections.emptyList();
}
name
- property name@NotNull @NotNull NodeBuilder setProperty(@NotNull @NotNull PropertyState property) throws java.lang.IllegalArgumentException
property
- The property state to setjava.lang.IllegalArgumentException
- if the property name is empty
or contains the forward slash character@NotNull <T> @NotNull NodeBuilder setProperty(java.lang.String name, @NotNull T value) throws java.lang.IllegalArgumentException
T
- The type of this property. Must be one of String, Blob, byte[], Long, Integer, Double, Boolean, BigDecimal
name
- The name of this propertyvalue
- The value of this propertyjava.lang.IllegalArgumentException
- if T
is not one of the above types, or if the property name is empty or contains the forward slash character@NotNull <T> @NotNull NodeBuilder setProperty(java.lang.String name, @NotNull T value, Type<T> type) throws java.lang.IllegalArgumentException
T
- The type of this property.name
- The name of this propertyvalue
- The value of this propertyjava.lang.IllegalArgumentException
- if the property name is empty
or contains the forward slash character@NotNull @NotNull NodeBuilder removeProperty(java.lang.String name)
name
does not exist.name
- name of the propertyBlob createBlob(java.io.InputStream stream) throws java.io.IOException
java.io.IOException
Copyright © 2010 - 2020 Adobe. All Rights Reserved