org.jgroups.blocks

## Class ReplicatedTree

- java.lang.Object
- - org.jgroups.ReceiverAdapter
  - - org.jgroups.blocks.ReplicatedTree

All Implemented Interfaces:
  MembershipListener, MessageListener, Receiver

    public class ReplicatedTree
    extends ReceiverAdapter

A tree-like structure that is replicated across several members. Updates will be multicast to all group members reliably and in the same order.

Author:
  Bela Ban Jan 17 2002, Alfonso Olias-Sanz

### Nested Class Summary

Nested Classes
`static class` `ReplicatedTree.Node`
`static interface` `ReplicatedTree.ReplicatedTreeListener`

### Field Summary

Fields
`protected Log` `log`
`static java.lang.String` `SEPARATOR`

### Constructor Summary

Constructors
Constructor and Description
`ReplicatedTree()`
`ReplicatedTree(JChannel channel)` Expects an already connected channel.
`ReplicatedTree(java.lang.String groupname, java.lang.String props, long state_fetch_timeout)` Creates a channel with the given properties.
`ReplicatedTree(java.lang.String groupname, java.lang.String props, long state_fetch_timeout, boolean jmx)`

### Method Summary

Methods
`void` `_put(java.lang.String fqn, java.util.HashMap data)`
`void` `_put(java.lang.String fqn, java.lang.String key, java.lang.Object value)`
`void` `_remove(java.lang.String fqn)`
`void` `_remove(java.lang.String fqn, java.lang.String key)`
`void` `_removeData(java.lang.String fqn)`
`void` `addReplicatedTreeListener(ReplicatedTree.ReplicatedTreeListener listener)`
`boolean` `exists(java.lang.String fqn)` Checks whether a given node exists in the tree
`void` `fetchState(long timeout)` Fetch the group state from the current coordinator.
`java.lang.Object` `get(java.lang.String fqn, java.lang.String key)` Finds a node given its name and returns the value associated with a given key in its `data` map.
`Channel` `getChannel()` Returns the Channel the DistributedTree is connected to
`java.util.Set` `getChildrenNames(java.lang.String fqn)` Returns all children of a given node
`int` `getGroupMembersNumber()` Returns the number of current members joined to the group
`java.lang.String` `getGroupName()` Returns the name of the group that the DistributedTree is connected to
`java.util.Set` `getKeys(java.lang.String fqn)` Gets the keys of the `data` map.
`Address` `getLocalAddress()`
`java.util.Vector<Address>` `getMembers()`
`byte[]` `getState()` Return a copy of the current cache (tree)
`static void` `main(java.lang.String[] args)`
`java.lang.String` `print(java.lang.String fqn)` Prints a representation of the node defined by `fqn`.
`void` `put(java.lang.String fqn, java.util.HashMap data)` Adds a new node to the tree and sets its data.
`void` `put(java.lang.String fqn, java.lang.String key, java.lang.Object value)` Adds a key and value to a given node.
`void` `receive(Message msg)` Callback.
`void` `remove(java.lang.String fqn)` Removes the node from the tree.
`void` `remove(java.lang.String fqn, java.lang.String key)` Removes `key` from the node's hashmap
`void` `removeReplicatedTreeListener(ReplicatedTree.ReplicatedTreeListener listener)`
`void` `setRemoteCalls(boolean flag)`
`void` `setRootNode(ReplicatedTree.Node n)`
`void` `setState(byte[] new_state)` Set the cache (tree) to this value
`void` `start()`
`void` `stop()`
`java.lang.String` `toString()`
`void` `viewAccepted(View new_view)` Called when a change in membership has occurred.

### Methods inherited from class org.jgroups.ReceiverAdapter

`block, suspect`

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait`

### Field Detail

#### SEPARATOR

    public static final java.lang.String SEPARATOR

See Also:
  Constant Field Values

#### log

    protected final Log log

### Constructor Detail

#### ReplicatedTree

    public ReplicatedTree(java.lang.String groupname,
                  java.lang.String props,
                  long state_fetch_timeout)
                   throws java.lang.Exception

Creates a channel with the given properties. Connects to the channel, then creates a PullPushAdapter and starts it

Throws:
  `java.lang.Exception`

#### ReplicatedTree

    public ReplicatedTree(java.lang.String groupname,
                  java.lang.String props,
                  long state_fetch_timeout,
                  boolean jmx)
                   throws java.lang.Exception

Throws:
  `java.lang.Exception`

#### ReplicatedTree

    public ReplicatedTree()

#### ReplicatedTree

    public ReplicatedTree(JChannel channel)
                   throws java.lang.Exception

Expects an already connected channel. Creates a PullPushAdapter and starts it

Throws:
  `java.lang.Exception`

### Method Detail

#### setRemoteCalls

    public void setRemoteCalls(boolean flag)

#### setRootNode

    public void setRootNode(ReplicatedTree.Node n)

#### getLocalAddress

    public Address getLocalAddress()

#### getMembers

    public java.util.Vector<Address> getMembers()

#### fetchState

    public void fetchState(long timeout)
                    throws ChannelClosedException,
                           ChannelNotConnectedException

Fetch the group state from the current coordinator. If successful, this will trigger setState().

Throws:
  `ChannelClosedException`
  `ChannelNotConnectedException`

#### addReplicatedTreeListener

    public void addReplicatedTreeListener(ReplicatedTree.ReplicatedTreeListener listener)

#### removeReplicatedTreeListener

    public void removeReplicatedTreeListener(ReplicatedTree.ReplicatedTreeListener listener)

#### start

    public final void start()
                     throws java.lang.Exception

Throws:
  `java.lang.Exception`

#### stop

    public void stop()

#### put

    public void put(java.lang.String fqn,
           java.util.HashMap data)

Adds a new node to the tree and sets its data. If the node doesn not yet exist, it will be created. Also, parent nodes will be created if not existent. If the node already has data, then the new data will override the old one. If the node already existed, a nodeModified() notification will be generated. Otherwise a nodeCreated() motification will be emitted.

Parameters:
  `fqn` - The fully qualified name of the new node
  `data` - The new data. May be null if no data should be set in the node.

#### put

    public void put(java.lang.String fqn,
           java.lang.String key,
           java.lang.Object value)

Adds a key and value to a given node. If the node doesn't exist, it will be created. If the node already existed, a nodeModified() notification will be generated. Otherwise a nodeCreated() motification will be emitted.

Parameters:
  `fqn` - The fully qualified name of the node
  `key` - The key
  `value` - The value

#### remove

    public void remove(java.lang.String fqn)

Removes the node from the tree.

Parameters:
  `fqn` - The fully qualified name of the node.

#### remove

    public void remove(java.lang.String fqn,
              java.lang.String key)

Removes `key` from the node's hashmap

Parameters:
  `fqn` - The fullly qualified name of the node
  `key` - The key to be removed

#### exists

    public boolean exists(java.lang.String fqn)

Checks whether a given node exists in the tree

Parameters:
  `fqn` - The fully qualified name of the node
Returns:
  boolean Whether or not the node exists

#### getKeys

    public java.util.Set getKeys(java.lang.String fqn)

Gets the keys of the `data` map. Returns all keys as Strings. Returns null if node does not exist.

Parameters:
  `fqn` - The fully qualified name of the node
Returns:
  Set A set of keys (as Strings)

#### get

    public java.lang.Object get(java.lang.String fqn,
                       java.lang.String key)

Finds a node given its name and returns the value associated with a given key in its `data` map. Returns null if the node was not found in the tree or the key was not found in the hashmap.

Parameters:
  `fqn` - The fully qualified name of the node.
  `key` - The key.

#### print

    public java.lang.String print(java.lang.String fqn)

Prints a representation of the node defined by `fqn`. Output includes name, fqn and data.

#### getChildrenNames

    public java.util.Set getChildrenNames(java.lang.String fqn)

Returns all children of a given node

Parameters:
  `fqn` - The fully qualified name of the node
Returns:
  Set A list of child names (as Strings)

#### toString

    public java.lang.String toString()

Overrides:
  `toString` in class `java.lang.Object`

#### getGroupName

    public java.lang.String getGroupName()

Returns the name of the group that the DistributedTree is connected to

Returns:
  String

#### getChannel

    public Channel getChannel()

Returns the Channel the DistributedTree is connected to

Returns:
  Channel

#### getGroupMembersNumber

    public int getGroupMembersNumber()

Returns the number of current members joined to the group

Returns:
  int

#### _put

    public void _put(java.lang.String fqn,
            java.util.HashMap data)

#### _put

    public void _put(java.lang.String fqn,
            java.lang.String key,
            java.lang.Object value)

#### _remove

    public void _remove(java.lang.String fqn)

#### _remove

    public void _remove(java.lang.String fqn,
               java.lang.String key)

#### _removeData

    public void _removeData(java.lang.String fqn)

#### receive

    public void receive(Message msg)

Callback. Process the contents of the message; typically an _add() or _set() request

Specified by:
  `receive` in interface `MessageListener`
Overrides:
  `receive` in class `ReceiverAdapter`

#### getState

    public byte[] getState()

Return a copy of the current cache (tree)

Specified by:
  `getState` in interface `MessageListener`
Overrides:
  `getState` in class `ReceiverAdapter`
Returns:
  byte[]

#### setState

    public void setState(byte[] new_state)

Set the cache (tree) to this value

Specified by:
  `setState` in interface `MessageListener`
Overrides:
  `setState` in class `ReceiverAdapter`

#### viewAccepted

    public void viewAccepted(View new_view)

Description copied from interface: `MembershipListener`
Called when a change in membership has occurred. No long running actions or sending of messages should be done in this callback. If some long running action needs to be performed, it should be done in a separate thread.

Note that on reception of the first view (a new member just joined), the channel will not yet be in the connected state. This only happens when `Channel.connect(String)` returns.

Specified by:
  `viewAccepted` in interface `MembershipListener`
Overrides:
  `viewAccepted` in class `ReceiverAdapter`

#### main

    public static void main(java.lang.String[] args)