/** * File: GroupMembershipNamingService.idl * Content: CORBA specification of the service to handle the Group Membership * Author: LuisM Pena * Date: 3nd December 2000 * Version: 0.30.00 * Last changes: * **/ #ifndef GROUP_MEMBERSHIP_NAMING_SERVICE #define GROUP_MEMBERSHIP_NAMING_SERVICE #include "GroupMembershipService.idl" #include "DomainExceptions.idl" module sensei { module middleware { module gmns { //bringing some declarations into scope ... typedef sensei::middleware::gms::GroupHandler GroupHandler; typedef sensei::middleware::gms::GroupMember GroupMember; /***********************************************************************/ /************************* EXCEPTIONS **********************************/ /***********************************************************************/ /** * Exception thrown after an invalid group handler input **/ exception InvalidGroupHandlerException{}; /** * Exception thrown after an invalid group handler factory input **/ exception InvalidGroupHandlerFactoryException{}; /** * Exception thrown by the GroupHandlerFactory or its creator **/ exception GroupHandlerFactoryException{}; /***********************************************************************/ /************************* GROUP HANDLER FACTORY ***********************/ /***********************************************************************/ /** * Interface to create GroupHandlers **/ interface GroupHandlerFactory { /** * Creates a new handler. **/ GroupHandler create() raises (GroupHandlerFactoryException); }; /***********************************************************************/ /************************* GROUP HANDLER FACTORY CREATOR ***************/ /***********************************************************************/ /** * ValueType that creates GroupHandlerFactories on * demand. This is not a remote object, the intention is to * create the GroupHandler in the local memory belonging to the * group member, and therefore avoid new points of failure. * If the GroupHandler would be created directly by any of the * membership services, the failure of the service would suppose * the failure of the associated GroupMember **/ valuetype GroupHandlerFactoryCreator { /** * Creates a new handler factory for the given member **/ GroupHandlerFactory create(in GroupMember member) raises (GroupHandlerFactoryException); }; /***********************************************************************/ /************************* GROUP MEMBERSHIP BASIC SERVICE **************/ /***********************************************************************/ /** * this interface allows the creation of new groups and the * extension of those groups by adding new members. * This service works on GroupMember basis: the service user wanting * to join a group must suply a member of that group **/ interface GroupMembershipBasicService { /** * Creates a GroupHandlerFactoryCreator **/ GroupHandlerFactoryCreator getFactoryCreator(); /** * Creates a new group. * @param factory A factory creating GroupHandlers on demand **/ GroupHandler createGroup(in GroupHandlerFactory theFactory) raises (InvalidGroupHandlerFactoryException, GroupHandlerFactoryException); /** * Extends a group with an additional member * @param group a valid handler on a existing group. * @returns the group handler created, which can be nil if the member * could not join the group because was considered faulty or because * the groupHandler used is not valid or has been expulsed from the group **/ GroupHandler joinGroup(in GroupHandler group, in GroupHandlerFactory theFactory) raises ( InvalidGroupHandlerException, InvalidGroupHandlerFactoryException, GroupHandlerFactoryException); }; /***********************************************************************/ /************************* REPLICATED SERVER ***************************/ /***********************************************************************/ /** * To be registered in the GroupMembershipNamingService, a client must * supply a GroupHandlerFactory, to create the GroupHandler to be used * to access the group, and a reference to be supplied to clients * accessing the service, unless clients must no access its reference */ interface ReplicatedServer { }; typedef sequence<ReplicatedServer> ReplicatedServersList; /***********************************************************************/ /************************* GROUP MEMBERSHIP NAMING SERVICE *************/ /***********************************************************************/ /** * The Group Member Naming Service is a naming service for reliable * Group Members. It allows to join groups just by specifying the * group name. This service will locate other members in the group, * or will just create the group. * This service is not compatible with the GroupMembershipBasicService, * members added to groups using that service are unknown on this * Naming Service. **/ interface GroupMembershipNamingService { /** * Creates a GroupHandlerFactoryCreator **/ GroupHandlerFactoryCreator getFactoryCreator(); /** * Finds a group with the name specified and includes the member with the given name * The reference can be null if the member is no accesible to clients * @returns the group handler created, or null if this member has been considered by * the group. * @exception MemberStateException if the member defining the service cannot contact * other members and decide surely about the joining **/ GroupHandler findAndJoinGroup(in string groupName, in GroupHandlerFactory theFactory, in string memberName, in ReplicatedServer clientsReference) raises ( sensei::middleware::domains::MemberStateException, InvalidGroupHandlerFactoryException, GroupHandlerFactoryException); /** * Leaves a group. This method is not needed to be called, as the service can * discover by itself that a member has left the group, but it can speed up * other member's joining. **/ void leaveGroup(in string groupName, in GroupHandler member); /** * Returns the know references to a group, which can be still not valid. The list * is empty if there are no servers in the group or the group does not exist **/ ReplicatedServersList getGroup(in string groupName) raises (sensei::middleware::domains::MemberStateException); /** * Returns a specific reference of a member in the group. If * the group does not exist or it contains no such a member, null is returned **/ ReplicatedServer getGroupServer(in string groupName, in string memberName) raises(sensei::middleware::domains::MemberStateException); /** * Returns a reference to a member in the group, warrantied to be valid. Note that it can * get invalidated before the client received it. **/ ReplicatedServer getValidGroupServer(in string groupName) raises(sensei::middleware::domains::MemberStateException); }; }; }; }; #endif