The Common Object Services (COS) Name Server is the name server for
storing Common Object Request Broker Architecture (CORBA) object
references. It can be accessed from CORBA applications by using the COS
Naming package (org.omg.CORBA.CosNaming).
The JNDI/COS naming service provider implements the
javax.naming.Context interface on top of the COS Naming package
in order to allow applications to use JNDI to access the COS Name Server.
JNDI can also be used to access other naming and directory services,
in addition to the COS Name Server, thereby offering the CORBA
application one interface for accessing different naming and directory
services.
This document describes the features of the COS naming service provider
and contains details of how JNDI is mapped to the COS naming package.
Conformance
The COS naming service provider for JNDI uses
JavaTM IDL, the Java programming language mapping
to the industry standard Object Management Group Interface
Definition Language (OMG IDL).
In particular, it uses the
COS Naming Service.
The complete specification for COS Naming can be obtained from
OMG.
The following JNDI environment properties are relevant for the
COS naming service provider. See the
JNDI documentation
for a
description of how properties are initialized using the environment
properties, system properties, applet parameters, and resource files.
java.naming.factory.initial
This property is used to select the COS naming service provider; it's
not actually used by the provider itself. It specifies the class name
of the initial context factory for the provider.
This property must be set if you are using the
COS naming service as the initial context. The only exception is
if you supply only URLs to the initial context, in which case,
you don't need to specify this property. See
Names and URLs for details.
If the URL scheme is either "iiop" or "iiopname", then the host and
port fields of the URL are used to initialize the ORB. An
"iiopname" URL must conform to the now obsolete
INS
specification (98-10-11).
It has the form:
iiopname://[<addr_list>][/<cosnaming_name>]
The "iiop" URL scheme is supported for backward compatibility
with an older version
of the INS specification. It has the form:
iiop://[<host>[:<port>]][/<cosnaming_name>]
For both "iiop" and "iiopname" URLs, if <host> is not specified,
then it defaults to "localhost" for an application and the applet's host for
an applet. If <port> is not specified, then it defaults to 9999
for "iiopname",
and 900 for "iiop". The root naming context is obtained by invoking the
following method on the ORB:
orb.resolve_initial_references("NameService");
If <cosnaming_name> is nonempty, then
the root naming context is the
naming context named by cosnaming_name.
If the URL scheme is not one of "iiop", "iiopname", "IOR", "corbaname",
or "corbaloc", then the URL must name a location that contains the stringified
IOR of the root naming context.
For example, if the property contains "file:/nsdir/ior", then the file
/nsdir/ior must contain a stringified IOR. The URL scheme can be any
for which there is a corresponding URL protocol handler (
java.net.URLStreamHandler). See the
java.net.URL class for details.
The stringified IOR is read from the data stream corresponding to the
URL by using a character encoding of ISO Latin-1. The stringified IOR
is the first line in the stream that contains the prefix "IOR:". For
example, if the URL scheme is "http", then the headers in the stream are
skipped and the first line that contains the prefix "IOR:" is returned as
the IOR.
This property specifies the ORB that the program is using.
When the JNDI COS naming service provider needs to use an ORB, for
example, to look up the "NameService" initial reference or to
turn a stringified IOR into an object reference, it will use
this ORB.
In an application you can set this property as follows:
This property specifies the applet that the program
is using. It is used to initialize the ORB to be used by the
COS naming service provider. Its parameters are used for setting
JNDI-related properties; see the
JNDI documentation
for details.
public class MyApplet extends Applet {
public someInitMethod() {
Hashtable env = new Hashtable(5, 0.75f);
env.put("java.naming.applet", this);
...
}
...
}
java.naming.factory.state
A colon-separated list of the fully qualified class names
of state factory classes used to get an object's state for storing
given the object itself. You can use this mechanism to transform
an object into forms that can be stored into a COS name server.
The COS name server supports storing CORBA objects.
A state factory that transforms a java.rmi.Remote into
a CORBA object is supplied by default. This factory
is useful for applications that use
RMI-IIOP.
You can supply other factories to affect the transformation of other objects
into CORBA objects for storing.
See
javax.naming.spi.NamingManager.getStateToBind() for details.
java.naming.factory.object
A colon-separated list of the fully qualified class names
of object factory classes for transforming a CORBA object.
You can use this mechanism to transform an object into forms expected
by the application. For example, a specialized object factory could
do the appropriate narrowing to return an object of the expected type. See
javax.naming.spi.NamingManager.getObjectInstance() for details.
java.naming.batchsize
Specifies the batch size to use in
CosNaming::BindingIterator.next_n
when getting the results of a list()/listBindings().
The default is "100."
For example, the following sets the batch size to be 24.
You can specify CORBA related properties such as those with the
"org.omg.CORBA." prefix as properties. Properties
of type String are used to initialize the ORB.
ORB Initialization
The properties that affect which ORB is used and how the
ORB is initialized are:
java.naming.corba.orb
java.naming.applet
java.naming.provider.url
org.omg.CORBA.* and other ORB-specific properties of type String
The following algorithm is used to determine which ORB is used:
If java.naming.corba.orb has been set, then its value (an ORB) is
used.
Otherwise, the provider will internally initialize and use an ORB as follows:
a) Any org.omg.CORBA.* properties and properties of
type String are extracted and used as part
of the Properties argument to the ORB.init()
method. You can use this mechanism to specify, for example, the ORB
implementation or host to use.
b) If java.naming.provider.url has been set and it
contains a URL of scheme "iiop" or "iiopname", then the host and port
number specified in the URL are used as part of the
Properties argument to the ORB.init() method,
overriding any org.omg.CORBA.ORBInitialHost and
org.omg.CORBA.ORBInitialPort
properties set up in (a).
c) The Properties instance constructed in (a) and (b)
are passed to ORB.init() along with the Applet
instance in java.naming.applet property, or an empty
String[] if java.naming.applet was not supplied.
If the properties employed in steps (a), (b) and (c) contain
no relevant information for initializing the ORB, then the Java IDL
implementation's defaults are used. Typically that means port 900 on
the local host for an application, and port 900 on the applet host for
an applet are used.
Note that when the ORB is initialized using ORB.init(), its
arguments are checked in the following order: (from
org.omg.CORBA.ORB javadoc)
Check in Applet parameter or application string array,
if any
Check in properties parameter, if any
Check in the System properties (currently applications
only)
Fall back on a hardcoded default behavior (use the Java IDL implementation)
Root Naming Context Initialization
The root naming context is initialized either using the
java.naming.provider.url property or by a
resolve_initial_references()
call on the ORB. If the java.naming.provider.url property is set
but contains neither an "iiop" or "iiopname" URL, then it is assumed to contain
a stringified IOR, a "corbaname" or "corbaloc" URL of an IOR,
or a URL containing the location of a stringified
IOR. The IOR is used to obtain the root naming context and must
be that of a CORBA object of type
CosNaming::NamingContext.
If the java.naming.provider.url has not been set,
then the root naming context is
obtained by invoking the following method on the ORB:
orb.resolve_initial_references("NameService");
Names and URLs
String Names
String names accepted by the java.naming.Context methods
are
JNDI composite names
in which each component is the stringified form
of a CosNaming::NameComponent.
A CosNaming::Name
contains a sequence of CosNaming::NameComponent. The stringified
form of a component is the concatenation of the component's id, the kind
separator character ('.'), and the component's kind. The occurrence of
any meta characters ('.', '/', or '\') in either the id or kind is escaped
using the escape character ('\').
The stringified form of a CosNaming::Name is defined in Section
3.5 of the INS
specification (99-12-03).
The
JNDI composite name syntax
is very similar to, but not identical
to, the INS syntax. There are minor differences with respect to the
treatment of escape and quote characters. If you want to use names
with the precise INS syntax, then you should use the overloads that accept a
Name argument instead of a String argument. The
Name argument should be a value returned by
nameParser.parse(), where nameParser is a value obtained
from the COS naming service provider. See the Name
Parsing section.
URL String Names
The URL form of a CosNaming::Name is defined in the INS
specification.
and <obj_addr_list> is a list of addresses as defined in a
"corbaloc" URL and <key_string> is a key string as defined
in a "corbaloc" URL.
<cosnaming_name>
is the stringified form of an INS name (see
Name Parsing).
For backward compatibility with older versions of the INS, the following
URL schemes are also supported.
iiopname://[<addr_list>][/<cosnaming_name>]
where <addr_list> specifies a list of host/port pairs.
If <port> is not specified,
then it defaults to 9999. <cosnaming_name>
is the stringified form of an INS name.
iiop://<host>[:<port>][/<cosnaming_name>]
If <port>
is not supplied, then it defaults to 900. <cosnaming_name>
is the stringified form of an INS name.
When you supply an "iiop" or "iiopname" URL to the initial context in this way,
the ORB supplied to the initial context is used
if its string_to_object() method supports the
99-12-03 INS specification.
Otherwise, the ORB is ignored and the server and port designations in
the URL are used to create an ORB.
The value of the java.naming.factory.initial
property is ignored for the purposes of resolving the URL.
Note that this rule is not used
when you supply a "corbaname" URL to the initial context.
For a "corbaname" URL, the ORB supplied to the initial context is used
because the ORB is needed to resolve the "corbaname" URL.
Name Objects
The Name argument to a Context method is treated as a
sequence of strings, each representing a stringified
CosNaming::NameComponent.
The COS naming service provider supports names in the syntax specified
in the INS specification. In short, the syntax is that components are
left-to-right slash ('/') separated and case-sensitive. The id and
kind of each component are separated by the period character ('.').
Here is a code fragment that uses the name parser from the COS naming
service provider to eventually do a lookup using an INS name.
String insName = ...;
InitialContext ctx = new InitialContext(env); // env contains init properties
NameParser parser = ctx.getNameParser(""); // parser for INS names
Name name = parser.parse(insName); // get parsed INS name
Object obj = ctx.lookup(name); // do lookup
API Mapping
The COS name server supports only naming operations. The COS naming
service provider maps the javax.naming.Context methods to use the
appropriate COS Naming calls.
addToEnvironment()
Records change to environment property but does not reinitialize
ORB.
bind()
Binds an object to the specified name.
If the object being bound is an
org.omg.CosNaming.NamingContext, then
CosNaming::NamingContext.bind_context is used. If it is an
org.omg.CORBA.Object, then CosNaming::NamingContext.bind
is used.
The binding of any other type of object is not supported unless the
object can be converted into an org.omg.CORBA.Object using
the state factory mechanism described next.
Before the bind is performed on the naming server, the COS naming
service provider uses javax.naming.spi.NamingManager.getStateToBind()
to allow the object to be transformed into a
org.omg.CORBA.Object. The getStateToBind() method uses
the state factories available to the COS naming service provider.
If the state factory accepts a java.rmi.Remote object, then it
is responsible for obtaining the object's RMI-IIOP stub and connecting
it to the ORB associated with the context. The connected stub is
the object that will be bound in the naming server.
By default, the COS naming service provider supplies and uses
a state factory that transforms an object implementing
the java.rmi.Remote interface to an org.omg.CORBA.Object
following the requirements described above. This factory
uses the utilities in the javax.rmi.CORBA package.
You can supply additional state factories
to transform objects into CORBA objects.
close()
Releases any internal data structures used.
composeName()
Concatenates the supplied name to the prefix.
createSubcontext()
Uses CosNaming::NamingContext.bind_new_context to create and bind
a new context.
destroySubcontext()
Uses CosNaming::NamingContext.destroy to destroy the named context.
Then uses CosNaming::NamingContext.unbind to remove the binding.
getEnvironment()
Returns the environment of this context.
getNameInNamespace()
Returns the INS name of this context relative to the root of the
Cos Naming namespace.
getNameParser()
Returns a name parser for parsing INS names.
lookup()
lookupLink()
Uses CosNaming::NamingContext.resolve to lookup the name.
It returns a CORBA object reference except when the reference is
that of a CosNaming::NamingContext, in which case a
Context object is returned instead.
NamingManager.getObjectInstance()
is called before the object is returned in case the application
or user has supplied object factories.
list()
listBindings()
Uses CosNaming::NamingContext.resolve to get the object reference
for the context,
and then uses CosNaming::BindingIterator and helper classes to iterate
through the context.
The objects bound to the names are obtained by calling
CosNaming::NamingContext.resolve on them.
NamingManager.getObjectInstance()
is called before the object is returned in case the application
or user has supplied object factories.
removeFromEnvironment()
Removes the specified property from the environment but
does not otherwise update the context.
rebind()
If the object being bound is an
org.omg.CosNaming.NamingContext, then
CosNaming::NamingContext.rebind_context is used. If it is an
org.omg.CORBA.Object, then CosNaming::NamingContext.rebind is
used. See bind() for details on the use of state factories
to transform the argument into an org.omg.CORBA.Object.
rename()
This method is implemented using bind() followed by
unbind(). It is not atomic.
unbind()
Uses CosNaming::NamingContext.unbind to unbind the object.
Converting CORBA Programs to use JNDI
This section explains how to modify your Java IDL program to use JNDI.
The explanation uses the Java IDL sample programs
helloClient.java and helloServer.java.
Generate the stubs from the IDL file.
# idltojava -fclient -fserver hello.idl
This creates the client (helloClient.java) and server
(helloServer.java) skeletons, and a directory containing common code
(e.g. HelloApp/*.java).
Fill in the code for the client and server programs.
Modify (or copy the client and server files) to use JNDI instead
of COS Naming directly.
Replace how you get the initial reference to "NameService"
with InitialContext, supplying the initial context
the ORB being used by the current application.
Hashtable env = new Hashtable(5, 0.75f);
env.put("java.naming.corba.orb", orb);
Context ic = new InitialContext(env);
Replace the call to resolve() to use lookup().
Delete:
// resolve the Object Reference in Naming
NameComponent nc = new NameComponent("Hello", "");
NameComponent path[] = {nc};
hello helloRef = helloHelper.narrow(ncRef.resolve(path));
Add:
// resolve the Object Reference using JNDI
hello helloRef =
helloHelper.narrow((org.omg.CORBA.Object)ic.lookup("Hello"));
Security Considerations
When a security manager has been installed,
you must grant to the application using JNDI and the
COS naming service provider the following permissions:
For each host/port identified in the
java.naming.factory.initial property,
in URL string names supplied to context methods, in ORB
initialization parameters and properties, and in object references.