using System;
using System.Collections.Generic;
using System.Threading;
using System.Reflection;
namespace grof.protocols.membership{
/// <summary>
/// A group member knows all other group members
/// of a group and has to cache them in a suitable
/// data structure. When a group member wants to send
/// a message to the others, it accesses the group member
/// cache for retrieving the IP address and port number
/// of the group members.
/// <para>The <c>GroupMemberInfoMap</c> caches
/// <c>GroupMemberInfo</c> objects which contain all relevant data
/// of a group member. For each group member name (the name of a
/// group member has to be unique), the <c>GroupMemberInfo</c>
/// object is stored.</para>
///
/// </summary>
public class GroupMemberInfoMap
{
/// <summary>
/// The data structure where the <c>GroupMemberInfo</c>
/// objects are stored. Each entry consists of a key
/// (the group member name) and the relating
/// <c>GroupMemberInfo</c> object.
/// </summary>
private Dictionary<string,GroupMemberInfo> map;
/// <summary>
/// Creates instances of class <c>GroupMemberInfoMap</c>.
/// </summary>
public GroupMemberInfoMap()
{
this.map = new Dictionary<string,GroupMemberInfo>();
}
/// <summary>
/// Stores a <c>GroupMemberInfo</c> object and its
/// relating key.
/// </summary>
/// <param name="memberName">The key representing the member name.</param>
/// <param name="gmInfo">The relating <c>GroupMemberInfo</c> object.</param>
public void Put( string memberName, GroupMemberInfo gmInfo )
{
lock ( this )
{
// throws no exception if duplicate key is added
this.map[memberName] = gmInfo;
}
}
/// <summary>
/// Retrieves the <c>GroupMemberInfo</c> object for
/// the given member name.
/// </summary>
/// <param name="memberName">The key for retrieving
/// the <c>GroupMemberInfo</c> object.</param>
/// <returns>The <c>GroupMemberInfo</c> object.</returns>
public GroupMemberInfo Get( string memberName )
{
lock ( this )
{
return this.map[memberName];
}
}
/// <summary>
/// Removes an entry of the <c>GroupMemberInfoMap</c>
/// instance.
/// </summary>
/// <param name="memberName">The member name of the
/// <c>GroupMemberInfo</c> object which ought to be removed.</param>
/// <returns>true, if entry was removed otherwise false.</returns>
public bool Remove( string memberName )
{
lock ( this )
{
return this.map.Remove( memberName );
}
}
/// <summary>
/// Returns all stored <c>GroupMemberInfo</c> objects as
/// <c>ICollection</c> object.
/// </summary>
/// <returns>The collection of all stored <c>GroupMemberInfo</c>
/// objects.</returns>
public ICollection<GroupMemberInfo> GetGroupMemberInfos()
{
lock( this )
{
return this.map.Values;
}
}
}
}
|