Class CNSService
This class is the Channel Name Server's main client process class.
One instance of this class needs to be instantiated at each Node wishing to interact with a Channel Name Server.
At present only one instance of this service class should be installed at each Node, however, it is envisaged that it may be desirable to be able to use multiple Channel Name servers. This functionality has been partially implemented and eventually multiple instances of this service will be able to be installed. Each instance would be given a separate name.
A default instance of this class can be held. Interaction with this
default instance is facilitated through the static methods of
the CNS class.
Once constructed, an instance of the object can be installed into the
Node's service manager in the same way as any other Service
(see ).
Alternatively, the one of the static install methods may be used
(see ServiceManager,
install(NodeKey, NodeAddressID)).
install(NodeKey, NodeAddressID, String)
- See Also:
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionprivate static classData structure for pending resolve requests.private classThe main process of the service.private classThis class acts as a proxy for the name management methods in its outer class. -
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final StringConstant specifying the default name of this service.static final StringConstant specifying the setting name for CNS address.static final StringConstant specifying the setting name for server's admin channel.static final StringConstant specifying the setting name for setting the service name.private NetChannelLocationprivate Stringprivate final One2OneChannelprivate final AltingChannelInputprivate final ChannelOutputprivate final Any2OneChannelprivate final AltingChannelInputprivate final SharedChannelOutputprivate NetAltingChannelInputprivate booleanprivate booleanprivate final One2OneChannelprivate final AltingChannelInputprivate final ChannelOutputprivate final Any2OneChannelprivate final AltingChannelInputprivate final SharedChannelOutputprivate final CNSServiceprivate HashtableList of all pending resolve requests.private Objectprivate final One2OneChannelChannels used to get replies from the service processprivate final AltingChannelInputprivate final ChannelOutputprivate final Any2OneChannelprivate final AltingChannelInputprivate final SharedChannelOutputprivate final Any2OneChannelChannels used to send requests to the service processprivate final AltingChannelInputprivate final SharedChannelOutputprivate booleanprivate final int(package private) static CNSServiceReference used by static methods of CNS class.private static ObjectObject used for synchronizing around staticServiceRef.private final Any2OneChannelprivate NetChannelOutputprivate final CNSService.UserObject -
Constructor Summary
ConstructorsConstructorDescriptionDefault constructor that does not supply any of the necessary settings for initializing the CNS.CNSService(NodeAddressID cnsAddress) Constructor which takes an address of the Node hosting the Channel Name Server.CNSService(NodeAddressID cnsAddress, boolean start) Constructor which takes an address of the Node hosting the Channel Name Server as well as abooleanindicating whether or not the service should be started.CNSService(NodeAddressID cnsAddress, String adminChannelLabel) Constructor which takes an address of the Node hosting the Channel Name Server as well as the label of the Channel Name Server's admin channel.CNSService(NodeAddressID cnsAddress, String adminChannelLabel, boolean start) Constructor which takes an address of the Node hosting the Channel Name Server, the label of the Channel Name Server's admin channel and abooleanindicating whether the service should be started. -
Method Summary
Modifier and TypeMethodDescriptionprivate voidbooleanderegisterChannelName(String name, NameAccessLevel accessLevel, ChannelNameKey channelKey) This deregisters a Channel name from the Channel Name Server.This returns aServiceUserObjectwhich implements theResolverinterface.booleaninit(ServiceSettings settings) Initializes the this instance of theCNSService.static CNSServiceinstall(NodeKey key, NodeAddressID cnsAddress) Installs and starts a Channel Name Server client service on the local Node.static CNSServiceinstall(NodeKey key, NodeAddressID cnsAddress, String serviceName) Installs and starts a Channel Name Server client service on the local Node.booleanThis returns whether the service is running.leaseChannelName(String name, NameAccessLevel accessLevel, ChannelNameKey channelKey) Leases the channel name within the specified name space from the Channel Name Server.register(NetChannelLocation ownerLocation, String name, NameAccessLevel accessLevel, ChannelNameKey key) This method allows a channel's location to be registered against a name in the Channel Name Server.This method allows a channel (or any instance of a class implementing) to be registered with the Channel Name Server.Networkedregister(Networked owner, String name, ChannelNameKey key) This method allows a channel (or any instance of a class implementing) that has previously been registered with the to be reregistered with the Channel Name Server.Networkedregister(Networked owner, String name, NameAccessLevel accessLevel) This method allows a channel (or any instance of a class implementing) to be registered with the Channel Name Server.Networkedregister(Networked owner, String name, NameAccessLevel accessLevel, ChannelNameKey key) This method allows a channel (or any instance of a class implementing) that has previously been registered to be reregistered with the Channel Name Server.NetworkedThis method resolves a channel name into aNetChannelLocationobject.resolve(String name, NameAccessLevel accessLevel) This method resolves a channel name into aNetChannelLocationobject.booleanstart()This checks to see if the service is already running, if it is not then it starts it.booleanstop()This checks to see if the service is running, if it is then it stops it.
-
Field Details
-
RX_BUFFER_SIZE
private final int RX_BUFFER_SIZE- See Also:
-
cnsChannelLocation
-
fromCNS
-
toCNS
-
running
private boolean running -
processStatusChanging
-
resolveRequestChan
Channels used to send requests to the service process -
resolveRequestChanIn
-
resolveRequestChanOut
-
registerRequestChan
-
registerRequestChanIn
-
registerRequestChanOut
-
deregisterRequestChan
-
deregisterRequestChanIn
-
deregisterRequestChanOut
-
leaseRequestChan
-
leaseRequestChanIn
-
leaseRequestChanOut
-
registerReplyChan
Channels used to get replies from the service process -
registerReplyChanIn
-
registerReplyChanOut
-
deregisterReplyChan
-
deregisterReplyChanIn
-
deregisterReplyChanOut
-
leaseReplyChan
-
leaseReplyChanIn
-
leaseReplyChanOut
-
stopChan
-
pendingResolves
List of all pending resolve requests. -
initialized
private boolean initialized -
holdStaticRef
private boolean holdStaticRef -
cnsServiceName
-
outerObject
-
userProxy
-
CNS_SETTING_NAME_ADDRESS
Constant specifying the setting name for CNS address.- See Also:
-
CNS_SETTING_NAME_SERVICE_NAME
Constant specifying the setting name for setting the service name.- See Also:
-
CNS_SETTING_NAME_ADMIN_CHANNEL_LABEL
Constant specifying the setting name for server's admin channel.- See Also:
-
CNS_DEFAULT_SERVICE_NAME
Constant specifying the default name of this service.- See Also:
-
staticServiceRef
Reference used by static methods of CNS class. -
staticSync
Object used for synchronizing around staticServiceRef.
-
-
Constructor Details
-
CNSService
public CNSService()Default constructor that does not supply any of the necessary settings for initializing the CNS. The
init(ServiceSettings)method must be called if this constructor is used. -
CNSService
Constructor which takes an address of the Node hosting the Channel Name Server.
In order to connect to the Channel Name Server, this service must know the label of the server's admin channel. By default this is given the value of the
CNS.CNS_CHANNEL_LABELconstant. This constructor assumes that this label has been used. It is equivalent to calling the constructor which takes(NodeAddressID, String)parameters.- Parameters:
cnsAddress- the address of channel name server to use.- See Also:
-
CNSService
Constructor which takes an address of the Node hosting the Channel Name Server as well as a
booleanindicating whether or not the service should be started.In order to connect to the Channel Name Server, this service must know the label of the server's admin channel. By default this is given the value of the
CNS.CNS_CHANNEL_LABELconstant. This constructor assumes that this label has been used. It is equivalent to calling the constructor which takes(NodeAddressID, String,boolean)parameters.- Parameters:
cnsAddress- the address of channel name server to use.start- indicates whether the service should be started. Should betrueto start service.- See Also:
-
CNSService
Constructor which takes an address of the Node hosting the Channel Name Server as well as the label of the Channel Name Server's admin channel.
This is equivalent to using the construtor with
(NodeAddressID, String, boolean)parameters with thebooleanequal tofalse.- Parameters:
cnsAddress- the address of channel name server to use.adminChannelLabel- the label of server's admin channel.- See Also:
-
CNSService
Constructor which takes an address of the Node hosting the Channel Name Server, the label of the Channel Name Server's admin channel and a
booleanindicating whether the service should be started.If the service is started, there is no need to initialize and start the service separately.
- Parameters:
cnsAddress- the address of channel name server to use.adminChannelLabel- the label of server's admin channel.start- indicates whether the service should be started. Should betrueto start service.- See Also:
-
-
Method Details
-
init
Initializes the this instance of the
CNSService.If the default constructor was used to construct the instance of this class, then a name of the instance must be supplied along with at least one address of a channel name server. The admin channel label of the server may also be supplied. The keys to use in the
ServiceSettingsare held as constants in this class (CNS_SETTING_NAME_ADDRESS,CNS_SETTING_NAME_SERVICE_NAME,CNS_SETTING_NAME_ADMIN_CHANNEL_LABEL).This need only be called if the no-arg constructor is used.
- Specified by:
initin interfaceService- Parameters:
settings- Aobject that holds the settings for this service.ServiceSettings- Returns:
trueif this request to initialize the service succeeds.
-
clearFields
private void clearFields() -
start
public boolean start()This checks to see if the service is already running, if it is not then it starts it. -
stop
public boolean stop()This checks to see if the service is running, if it is then it stops it. -
isRunning
public boolean isRunning()This returns whether the service is running. If the service is currently starting or stopping, this method will block until the state change is complete. -
getUserObject
This returns aServiceUserObjectwhich implements theResolverinterface. This allows processes to obtain a reference to an installed CNS Service without having admin privileges. ASecurityExceptionmay be thrown if the calling process does not have permission to obtain theServiceUserObject.- Specified by:
getUserObjectin interfaceService- Returns:
- a
Resolverwhich can be used to resolve names using thisCNSService. - Throws:
SecurityException- if the calling process does not have permission to obtain theServiceUserObject.- See Also:
-
install
Installs and starts a Channel Name Server client service on the local Node. The service is installed with the default service name as specified by
CNSService.CNS_DEFAULT_SERVICE_NAME. This method needs to be supplied with the local Node'sNodeKey. This is required in order to obtain access to the Node's service manager.- Parameters:
key- the local Node'sNodeKey.cnsAddress- the address of the Channel Name Server to use.- Returns:
- the
CNSobject installed. - Throws:
ServiceInstallationException- if installation fails.
-
install
Installs and starts a Channel Name Server client service on the local Node. The service is installed with the specified service name. This method needs to be supplied with the local Node's
NodeKey. This is required in order to obtain access to the Node's service manager.- Parameters:
key- the local Node'sNodeKey.cnsAddress- the address of the Channel Name Server to use.name- the name to give the service.- Returns:
- the
CNSobject installed. - Throws:
ServiceInstallationException- if installation fails.- See Also:
-
resolve
This method resolves a channel name into a
NetChannelLocationobject. The name is assumed to be in the global name space (seeNameAccessLevel.GLOBAL_ACCESS_LEVEL).This method is safe to be called by concurrent processes.
-
resolve
This method resolves a channel name into a
NetChannelLocationobject. The name must exist in the specified name space.The name space is specified by passing in a
object. A name space includes itself and any name space higher up in the hierarchy. The global name space is the highest level of name space.NameAccessLevelThis method is safe to be called by concurrent processes.
-
register
This method allows a channel (or any instance of a class implementing
) to be registered with the Channel Name Server. The name will be registered in the global name space.NetworkedA name will stay registered with the Channel Name Server until it has been leased, deregistered or the Node that registered the name has shut down.
This method is safe to be called by concurrent processes.
-
register
This method allows a channel (or any instance of a class implementing
) to be registered with the Channel Name Server.NetworkedThe name will be registered in the specified name space. This is specified by passing in a
object.NameAccessLevelA name will stay registered with the Channel Name Server until it has been leased, deregistered or the Node that registered the name has shut down.
This method is safe to be called by concurrent processes.
- Specified by:
registerin interfaceCNSUser- Parameters:
owner- theNetworkedobject whose location should be registered.name- the name against which to register the channel.accessLevel- the name space in which to register the channel name.- Returns:
- the
ChannelNameKeyneeded for managing the name registration ornullif registration failed. - See Also:
-
register
This method allows a channel (or any instance of a class implementing
) that has previously been registered with the to be reregistered with the Channel Name Server. The name should have been leased (seeNetworked). It is necessaray to supply the key that was obtained when the name was leased. If the channel name has not previously been registered, then the key can be specified asleaseChannelName(String, NameAccessLevel, ChannelNameKey)null.The name will be registered in the in the global name space.
A name will stay registered with the Channel Name Server until it has been leased, deregistered or the Node that registered the name has shut down.
This method is safe to be called by concurrent processes.
- Specified by:
registerin interfaceCNSUser- Parameters:
owner- theNetworkedobject whose location should be registered.name- the name against which to register the channel.accessLevel- the name space in which to register the channel name.- Returns:
- the
ChannelNameKeyneeded for managing the name registration ornullif registration failed.
-
register
public ChannelNameKey register(Networked owner, String name, NameAccessLevel accessLevel, ChannelNameKey key) This method allows a channel (or any instance of a class implementing
) that has previously been registered to be reregistered with the Channel Name Server. The name should have been leased (seeNetworked). It is necessaray to supply the key that was obtained when the name was leased. If the channel name has not previously been registered, then the key can be specified asleaseChannelName(String, NameAccessLevel, ChannelNameKey)null.The name will be registered in the specified name space. This is specified by passing in a
object.NameAccessLevelA name will stay registered with the Channel Name Server until it has been leased, deregistered or the Node that registered the name has shut down.
This method is safe to be called by concurrent processes.
- Specified by:
registerin interfaceCNSUser- Parameters:
owner- theNetworkedobject whose location should be registered.name- the name against which to register the channel.accessLevel- the name space in which to register the channel name.key- theChannelNameKeyreturned when the name was leased.- Returns:
- the
ChannelNameKeyneeded for managing the name registration ornullif registration failed. - See Also:
-
register
public ChannelNameKey register(NetChannelLocation ownerLocation, String name, NameAccessLevel accessLevel, ChannelNameKey key) This method allows a channel's location to be registered against a name in the Channel Name Server. It differs from the other register methods in that it takes a
NetChannelLocationobject instead of aNetworkedobject. This can be obtained from aNetworkedobject by invoking its#getChannelLocation()method (see).Networked.getChannelLocation()The name will be registered in the specified name space. This is specified by passing in a
This method also allows a leased channel name to be registered against an actual location (seeobject.NameAccessLevel).register(Networked, String, NameAccessLevel, ChannelNameKey)A name will stay registered with the Channel Name Server until it has been leased, deregistered or the Node that registered the name has shut down.
This method is safe to be called by concurrent processes.
- Specified by:
registerin interfaceCNSUser- Parameters:
ownerLocation- the location of a channel to be registered against the name.name- the name against which to register the channel.accessLevel- the name space in which to register the channel name.key- theChannelNameKeyreturned when the name was leased.- Returns:
- the
ChannelNameKeyneeded for managing the name registration ornullif registration failed. - See Also:
-
leaseChannelName
public ChannelNameKey leaseChannelName(String name, NameAccessLevel accessLevel, ChannelNameKey channelKey) throws ChannelNameException, NameAccessLevelException Leases the channel name within the specified name space from the Channel Name Server. Once a name has been leased, a channel cannot be registered with that name without supplying the key returned by the call to this method.
Currently, leases are infinite; they never expire. This is likely to change in the future so that leases have to be renewed. Leases can be given up by deregistering the name. Leases will remain even after the obtaining Node has shut down. This allows a channel to move its registered location to another channel on a different Node. There is no danger of another party managing to obtain the name as transfering a registered name into a lease is an atomic action. Although leases are currently infinite, there is no reason why a program cannot renew the lease by recalling this method.
A name may be leased without first registering a channel against it.
This method is safe to be called by concurrent processes.
- Specified by:
leaseChannelNamein interfaceCNSUser- Parameters:
name- the name to lease.accessLevel- the name space in which to lease the name.channelKey- the key to use if the name is currently registered or leased.- Returns:
- a new
ChannelNameKeyneeded for managing the lease ornullif leasing failed. - Throws:
ChannelNameException- if the channel name is invalid.NameAccessLevelException- if the specifed name space is invalid.
-
deregisterChannelName
public boolean deregisterChannelName(String name, NameAccessLevel accessLevel, ChannelNameKey channelKey) This deregisters a Channel name from the Channel Name Server. If the CNS Service is not running, this method will block until it is running. A boolean is returned to indicate whether deregistration was successful. This is also returned if the link to the CNS is lost.
This method is safe to be called by concurrent processes.
- Specified by:
deregisterChannelNamein interfaceCNSUser- Parameters:
name- the name of the channel as a String.channelKey- the ChannelNameKey to use to deregister the Channel name.nameAccessLevel- the nameAccessLevel of the channel.- Returns:
- a boolean indicating success.
-