org.jboss.cache
Interface Node<K,V>

All Known Subinterfaces:
NodeSPI<K,V>, WorkspaceNode<K,V>
All Known Implementing Classes:
NodeInvocationDelegate, WorkspaceNodeImpl

@ThreadSafe
public interface Node<K,V>

A Node is a named logical grouping of data in the JBoss Cache. A node should be used to contain data for a single data record, for example information about a particular person or account.

One purpose of grouping cache data into separate nodes is to minimize transaction locking interference, and increase concurrency. So for example, when multiple threads or possibly distributed caches are acccessing different accounts simultaneously.

Another is that when making changes to this node, its data might be kept in a single database row or file on disk. (Persisted via the use of a CacheLoader.)

A node has references to its children, parent (each node except the root - defined by Fqn.ROOT - has a single parent) and data contained within the node (as key/value pairs). The data access methods are similar to the collections Map interface, but some are read-only or return copies of the underlying the data.

Since:
2.0.0
Author:
Manik Surtani (manik@jboss.org)
See Also:
Cache

Method Summary
 Node<K,V> addChild(Fqn<?> f)
          Adds a child node with the given Fqn under the current node.
 void clearData()
          Removes all mappings from the node's data map.
 int dataSize()
           
 V get(K key)
          Returns the value to which this node maps the specified key.
 Map<K,V> getData()
          Returns a map containing the data in this Node.
 Fqn getFqn()
          Returns the Fqn which represents the location of this Node in the cache structure.
 Node<K,V> getChild(Fqn<?> f)
          Returns the child node
 Node<K,V> getChild(Object name)
           
 Set<Node<K,V>> getChildren()
          Returns an immutable set of children nodes.
 Set<Object> getChildrenNames()
          Returns an immutable set of children node names.
 Set<K> getKeys()
          Returns a Set containing the data in this Node.
 Node<K,V> getParent()
          Returns the parent node.
 boolean hasChild(Fqn<?> f)
          Returns true if the child node denoted by the relative Fqn passed in exists.
 boolean hasChild(Object o)
          Returns true if the child node denoted by the Object name passed in exists.
 boolean isLockForChildInsertRemove()
          Tests whether this node is configured to be exclusively locked when inserting or removing children.
 boolean isResident()
          Nodes marked resident would be ignored by the eviction algorithms.
 boolean isValid()
          Tests if a node reference is still valid.
 V put(K key, V value)
          Associates the specified value with the specified key for this node.
 void putAll(Map<K,V> map)
          Copies all of the mappings from the specified map to this node's map.
 V putIfAbsent(K key, V value)
          If the specified key is not already associated with a value, associate it with the given value, and returns the Object (if any) that occupied the space, or null.
 void releaseObjectReferences(boolean recursive)
          Method that releases object references of cached objects held in the cache by serializing them to byte buffers.
 V remove(K key)
          Removes the mapping for this key from this node if it is present.
 boolean removeChild(Fqn<?> f)
          Removes a child node specified by the given relative Fqn.
 boolean removeChild(Object childName)
          Removes a child node specified by the given name.
 V replace(K key, V value)
          Replace entry for key only if currently mapped to some value.
 boolean replace(K key, V oldValue, V newValue)
          Replace entry for key only if currently mapped to given value.
 void replaceAll(Map<K,V> map)
          Similar to putAll(java.util.Map) except that it removes any entries that exists in the data map first.
 void setLockForChildInsertRemove(boolean lockForChildInsertRemove)
          Configures the behaviour of how this node is locked when adding/removing children.
 void setResident(boolean resident)
           
 

Method Detail

getParent

Node<K,V> getParent()
Returns the parent node. If this is the root node, this method returns null.

Returns:
the parent node, or null if this is the root node

getChildren

Set<Node<K,V>> getChildren()
Returns an immutable set of children nodes.

Returns:
an immutable Set of child nodes. Empty Set if there aren't any children.

getChildrenNames

Set<Object> getChildrenNames()
Returns an immutable set of children node names.

Returns:
an immutable Set of child node names. Empty Set if there aren't any children.

getData

Map<K,V> getData()
Returns a map containing the data in this Node.

Returns:
a Map containing the data in this Node. If there is no data, an empty Map is returned. The Map returned is always immutable.

getKeys

Set<K> getKeys()
Returns a Set containing the data in this Node.

Returns:
a Set containing the data in this Node. If there is no data, an empty Set is returned. The Set returned is always immutable.

getFqn

Fqn getFqn()
Returns the Fqn which represents the location of this Node in the cache structure. The Fqn returned is absolute.

Returns:
The Fqn which represents the location of this Node in the cache structure. The Fqn returned is absolute.

addChild

Node<K,V> addChild(Fqn<?> f)
Adds a child node with the given Fqn under the current node. Returns the newly created node.

If the child exists returns the child node anyway. Guaranteed to return a non-null node.

The Fqn passed in is relative to the current node. The new child node will have an absolute fqn calculated as follows:

new Fqn(getFqn(), f)
. See Fqn for the operation of this constructor.

Parameters:
f - Fqn of the child node, relative to the current node.
Returns:
the newly created node, or the existing node if one already exists.

removeChild

boolean removeChild(Fqn<?> f)
Removes a child node specified by the given relative Fqn.

If you wish to remove children based on absolute Fqns, use the Cache interface instead.

Parameters:
f - Fqn of the child node, relative to the current node.
Returns:
true if the node was found and removed, false otherwise

removeChild

boolean removeChild(Object childName)
Removes a child node specified by the given name.

Parameters:
childName - name of the child node, directly under the current node.
Returns:
true if the node was found and removed, false otherwise

getChild

Node<K,V> getChild(Fqn<?> f)
Returns the child node

Parameters:
f - Fqn of the child node
Returns:
null if the child does not exist.

getChild

Node<K,V> getChild(Object name)
Parameters:
name - name of the child
Returns:
a direct child of the current node.

put

V put(K key,
      V value)
Associates the specified value with the specified key for this node. If this node previously contained a mapping for this key, the old value is replaced by the specified value.

Parameters:
key - key with which the specified value is to be associated.
value - value to be associated with the specified key.
Returns:
Returns the old value contained under this key. Null if key doesn't exist.

putIfAbsent

V putIfAbsent(K key,
              V value)
If the specified key is not already associated with a value, associate it with the given value, and returns the Object (if any) that occupied the space, or null.

Equivalent to calling

   if (!node.getKeys().contains(key))
     return node.put(key, value);
   else
     return node.get(key);
 

except that this is atomic.

Parameters:
key - key with which the specified value is to be associated.
value - value to be associated with the specified key.
Returns:
previous value associated with specified key, or null if there was no mapping for key.

replace

V replace(K key,
          V value)
Replace entry for key only if currently mapped to some value. Acts as
 if ((node.getKeys().contains(key))
 {
     return node.put(key, value);
 }
 else
     return null;
 

except that this is atomic.

Parameters:
key - key with which the specified value is associated.
value - value to be associated with the specified key.
Returns:
previous value associated with specified key, or null if there was no mapping for key.

replace

boolean replace(K key,
                V oldValue,
                V newValue)
Replace entry for key only if currently mapped to given value. Acts as
 if (node.get(key).equals(oldValue))
 {
     node.putAll(key, newValue);
     return true;
 }
 else
     return false;
 

except that this is atomic.

Parameters:
key - key with which the specified value is associated.
oldValue - value expected to be associated with the specified key.
newValue - value to be associated with the specified key.
Returns:
true if the value was replaced

putAll

void putAll(Map<K,V> map)
Copies all of the mappings from the specified map to this node's map. If any data exists, existing keys are overwritten with the keys in the new map. The behavior is equivalent to:
 Node node;
 for (Map.Entry me : map.entrySet())
   node.put(me.getKey(), me.getValue());
 

Parameters:
map - map to copy from

replaceAll

void replaceAll(Map<K,V> map)
Similar to putAll(java.util.Map) except that it removes any entries that exists in the data map first. Note that this happens atomically, under a single lock. This is the analogous to doing a clearData() followed by a putAll(java.util.Map) in the same transaction.

Parameters:
map - map to copy from

get

V get(K key)
Returns the value to which this node maps the specified key. Returns null if the node contains no mapping for this key.

Parameters:
key - key of the data to return
Returns:
the value to which this node maps the specified key, or null if the map contains no mapping for this key

remove

V remove(K key)
Removes the mapping for this key from this node if it is present. Returns the value to which the node previously associated the key, or null if the node contained no mapping for this key

Parameters:
key - key whose mapping is to be removed
Returns:
previous value associated with specified key, or null if there was no mapping for key

clearData

void clearData()
Removes all mappings from the node's data map.


dataSize

int dataSize()
Returns:
the number of elements (key/value pairs) in the node's data map.

hasChild

boolean hasChild(Fqn<?> f)
Returns true if the child node denoted by the relative Fqn passed in exists.

Parameters:
f - Fqn relative to the current node of the child you are testing the existence of.
Returns:
true if the child node denoted by the relative Fqn passed in exists.

hasChild

boolean hasChild(Object o)
Returns true if the child node denoted by the Object name passed in exists.

Parameters:
o - name of the child, relative to the current node
Returns:
true if the child node denoted by the name passed in exists.

isValid

boolean isValid()
Tests if a node reference is still valid. A node reference may become invalid if it has been removed, invalidated or moved, either locally or remotely. If a node is invalid, it should be fetched again from the cache or a valid parent node. Operations on invalid nodes will throw a NodeNotValidException.

Returns:
true if the node is valid.

isResident

boolean isResident()
Nodes marked resident would be ignored by the eviction algorithms. E.g. if the algorithm is "keep LRU 10 nodes" - the resident nodes won't be counted within those 10 nodes, and also won't be evicted when the threshold is reached. N.B. calling this method won't have any effect on node's eviction, e.g. we won't consider this node as being 'used' in a LRU scenario. If the cache is used in a replicated environment then the resident property is NOT replicated across the cluster. Also the property is not transactionable.


setResident

void setResident(boolean resident)
See Also:
isResident()

isLockForChildInsertRemove

boolean isLockForChildInsertRemove()
Tests whether this node is configured to be exclusively locked when inserting or removing children.

The default value for this is what is configured in the LockParentForChildInsertRemove configuration property, programatically reachable by querying Configuration.isLockParentForChildInsertRemove()

This can also be configured on a per-node basis using setLockForChildInsertRemove(boolean)

Returns:
true if the node is configured to be exclusively locked for child insertions and removal, false otherwise.
Since:
2.1.0

setLockForChildInsertRemove

void setLockForChildInsertRemove(boolean lockForChildInsertRemove)
Configures the behaviour of how this node is locked when adding/removing children.

Parameters:
lockForChildInsertRemove - if true, exclusive locks will be obtained when children are added/removed. If false, a shared "read lock" will be obtained instead.
Since:
2.1.0

releaseObjectReferences

void releaseObjectReferences(boolean recursive)
Method that releases object references of cached objects held in the cache by serializing them to byte buffers. Cached objects are lazily deserialized when accessed again, based on the calling thread's context class loader.

This can be expensive, based on the effort required to serialize cached objects.

Parameters:
recursive - if true, child nodes will have their object references released as well.


Copyright © 2008 JBoss, a division of Red Hat. All Rights Reserved.