[Date Prev][Date Next]
[Chronological]
[Thread]
[Top]
Last call for draft-ryan-java-schema-01.txt
The recent comments regarding case-exact matching have been addressed.
The following changes have been made to the schema defined in the
-01 version of the I-D:
1. The following attribute types now have a case-exact EQUALITY
matching rule: javaClassName, javaFactory, javaReferenceAddress.
2. The following attribute types now have a case-exact-IA5 EQUALITY
matching rule and now have IA5-string syntax: javaCodebase,
javaRemoteLocation.
3. Each attribute type now has a new object identifier to avoid any
confusion with attribute types from the -00 version.
4. The full LDAP schema is reproduced in an appendix. The case-exact
matching rule from X.520 is provided for convenience.
(The case-exact-IA5 matching rule is defined in RFC-2252.)
The revised I-D is attached. Please review and send any futher comments
to this discussion list before Wednesday 10 February.
After this review period I'll incorporate any changes and progress the
I-D towards an Informational RFC.
Thanks.
INTERNET-DRAFT V. Ryan
Expires 16 June, 1999 S. Seligman
R. Lee
Sun Microsystems, Inc.
16 Dec, 1998
Schema for Representing Java(tm) Objects in an LDAP Directory
<draft-ryan-java-schema-01.txt>
Status of this Memo
This document is an Internet-Draft. Internet-Drafts are working
documents of the Internet Engineering Task Force (IETF), its areas,
and its working groups. Note that other groups may also distribute
working documents as Internet-Drafts.
Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress."
To view the entire list of current Internet-Drafts, please check the
"1id-abstracts.txt" listing contained in the Internet-Drafts Shadow
Directories on ftp.is.co.za (Africa), ftp.nordu.net (Northern
Europe), ftp.nis.garr.it (Southern Europe), munnari.oz.au (Pacific
Rim), ftp.ietf.org (US East Coast), or ftp.isi.edu (US West Coast).
Abstract
This document defines the schema for representing Java(tm) objects in
an LDAP directory [LDAPv3]. It defines schema elements to represent
a Java serialized object [Serial], a Java RMI remote object [RMI],
and a JNDI reference [JNDI].
1. Introduction
This document assumes that the reader has a general understanding of
the Java programming language [Java]. For brevity we use the term
"Java object" in place of "object in the Java programming language"
throughout this text.
Traditionally, LDAP directories have been used to store data. Users
and programmers think of the directory as a hierarchy of directory
entries, each containing a set of attributes. You look up an entry
from the directory and extract the attribute(s) of interest. For
example, you can look up a person's telephone number from the
directory. Alternatively, you can search the directory for entries
with a particular set of attributes. For example, you can search for
all persons in the directory with the surname "Smith".
For applications written in the Java programming language, a kind of
data that is typically shared are Java objects themselves. For such
applications, it makes sense to be able to use the directory as a
repository for Java objects. The directory provides a centrally
administered, and possibly replicated, service for use by Java
applications distributed across the network.
For example, an application server may use the directory for
"registering" objects representing the services that it manages, so
that a client can later search the directory to locate those services
as it needs.
The motivation for this document is to define a common way for
applications to store and retrieve Java objects from the directory.
Using this common schema, any Java application that needs to read or
store Java objects in the directory can do so in an interoperable
way.
2 Representation of Java Objects
This document defines schema elements to represent three types of
Java objects: a Java serialized object, a Java RMI remote object,
and a JNDI reference.
2.1 Common Representations
A Java object is represented in the LDAP directory by the object
class javaObject. This is the base class from which other Java object
related classes derive: javaSerializedObject, javaRemoteObject, and
javaNamingReference. javaObject is an abstract object class, which
means a javaObject cannot exist in the directory; only auxiliary or
structural subclasses of it can exist in the directory.
The object class javaContainer represents a directory entry dedicated
to storing a Java object. It is a structural object class. In cases
where a subclass of javaObject is mixed in with another structural
object class then javaContainer is not required.
The definitions for the object classes javaObject and javaContainer
are presented in Section 4.
The javaObject class has one mandatory attribute (javaClassName) and
one optional attribute (javaCodebase). javaClassName is used to
store the fully qualified name of the object's Java class (e.g.,
"java.lang.String"). This may be the object's most derived class's
name, but does not have to be. A superclass or interface in some
cases might be most appropriate. javaCodebase is a multivalued
attribute that is used to store the location(s) of the object's class
definition. These attributes' definitions are presented in Section 3.
2.2 Serialized Objects
To "serialize" an object means to convert its state into a byte
stream in such a way that the byte stream can be reverted back into a
copy of the object. A Java object is "serializable" if its class or
any of its superclasses implements either the java.io.Serializable
interface or its subinterface java.io.Externalizable.
"Deserialization" is the process of converting the serialized form of
an object back into a copy of the object.
The Java platform specifies a default way by which serializable
objects are serialized. A Java class can also override this default
serialization and defines its own way of serializing objects of that
class. [Serial] describes object serialization in detail.
When an object is serialized, information that identifies its class
is recorded in the serialized stream. However, the class's definition
("class file") itself is not recorded. It is the responsibility of
the system that is deserializing the object to determine the
mechanism to use for locating and loading the associated class
definitions. For example, the Java application might include in its
classpath a JAR file containing the class definitions of the
serialized object, or load the class definitions using information
from the directory, as explained below.
2.2.1 Representation in the Directory
A serialized object is stored in the directory using the attributes
javaClassName, javaCodebase, and javaSerializedData, as defined in
Section 3. The mandatory attribute, javaSerializedData, contains the
serialized form of the object. Although the serialized form already
contains the class name, the mandatory javaClassName attribute also
records the name so that the class name can be determined without
having to perform deserialization. The optional javaCodebase
attribute is used to store the locations of the class definitions
needed to deserialize the serialized object.
A directory entry containing a serialized object is represented by
the object class javaSerializedObject, which is a subclass of
javaObject. javaSerializedObject is an auxiliary object class, which
means that it needs to be mixed in with a structural object class.
javaSerializedObject's definition is given in Section 4.
2.3 Remote Objects
The Java Remote Method Invocation (RMI) system [RMI] is a mechanism
that enables an object on one Java virtual machine to invoke methods
on an object in another Java virtual machine. Any object whose
methods can be invoked in this way must implement the java.rmi.Remote
interface. When such an object is invoked, its arguments are
marshalled and sent from the local virtual machine to the remote one,
where the arguments are unmarshalled and used. When the method
terminates, the results are marshalled from the remote machine and
sent to the caller's virtual machine.
To make remote objects accessible to other virtual machines, the
program that created them must register each such object with the
"RMI registry." The program supplies to the RMI registry the string
name of the remote object, and the remote object itself. When a
program wants to access a remote object, it asks the RMI registry on
the same machine as the remote object for a reference ("stub") to the
remote object. The remote object is named using an "rmi" URL such as
"rmi://hostname:port/remoteObjectName", where "hostname" and "port"
identify the machine and port on which the RMI registry is running,
and "remoteObjectName" is the string name of the remote object. If
"remoteObjectName" is omitted, then the object being named is the RMI
registry itself. When the program receives the stub for the remote
object, it can invoke methods on the remote object (through the
stub). See [RMI] for details.
2.3.1 Representation in the Directory
A remote object is stored in the directory using the attributes
javaClassName, javaCodebase, and javaRemoteObject, defined in Section
3. The mandatory attribute, javaRemoteLocation, contains the URL of
the remote object. This is the string argument that is passed to the
RMI registry when looking up the remote object. For example, a
remote object registered under the name "AppRemoteObjectX" with the
RMI registry on machine "rserver" might be stored in the directory
with the javaRemoteLocation attribute value
"rmi://rserver/AppRemoteObjectX". The mandatory javaClassName
attribute is used to record the class name of the remote object. The
optional javaCodebase attribute is used to store the locations of the
remote object's class definition.
A directory entry containing a remote object is represented by the
object class javaRemoteObject, which is a subclass of javaObject.
javaRemoteObject is an auxiliary object class, which means that it
needs to be mixed in with a structural object class.
javaRemoteObject's definition is given in Section 4.
2.4 JNDI References
Java Naming and Directory Interface(tm) (JNDI) [JNDI] is a directory
access API specified in the Java programming language. It provides
an object-oriented view of the directory, allowing Java objects to be
added to and retrieved from the directory without requiring the
client to manage data representation issues.
JNDI defines the notion of a "reference" for use when an object
cannot be stored in the directory directly, or when it is
inappropriate or undesirable to do so. An object with an associated
reference is stored in the directory indirectly, by storing its
reference instead.
2.4.1 Contents of a Reference
A JNDI reference is a Java object of class javax.naming.Reference.
It consists of an ordered list of addresses, and class information
about the object being referenced. An address is a Java object of
class javax.naming.RefAddr. Each address contains information on how
to construct the object.
A common use for JNDI references is to represent connections to a
network service such as a database, directory, or file system. Each
address may then identify a "communications endpoint" for that
service, containing information on how to contact the service.
Multiple addresses may arise for various reasons, such as replication
or the object offering interfaces over more than one communication
mechanism.
A reference also contains information to assist in creating an
instance of the object to which the reference refers. It contains
the Java class name of that object, and the class name and location
of the object factory to be used to create the object. The
procedures for creating an object given its reference, and the
reverse, are described in [JNDI].
2.4.2 Representation in the Directory
A JNDI reference is stored in the directory using the attributes
javaClassName, javaCodebase, javaReferenceAddress, and javaFactory,
defined in Section 3. These attributes store information
corresponding to the contents of a reference described above.
javaReferenceAddress is a multivalued optional attribute for storing
reference addresses. javaFactory is the optional attribute for
storing the object factory's fully qualified class name. The
mandatory javaClassName attribute is used to record the class name of
the object. The optional javaCodebase attribute is used to store the
locations of the object factory's and the object's class definitions.
A directory entry containing a JNDI reference is represented by the
object class javaNamingReference, which is a subclass of javaObject.
javaNamingReference is an auxiliary object class, which means that it
needs to be mixed in with a structural object class.
javaNamingReference's definition is given in Section 4.
2.5 Serialized Objects Vs. Remote Objects Vs. References
Although all three object classes, javaSerializedObject,
javaRemoteObject, and javaNamingReference, are used to represent Java
objects, they do so storing different aspects of the Java objects.
A javaRemoteObject and javaNamingReference provide a way of recording
address information about an object which itself is not directly
stored in the directory. For javaSerializedObject, (a copy of) the
object is itself stored in the directory. In other words, you can
think of a javaRemoteObject and javaNamingReference as compact
representations of the information required to access the object,
while a javaSerializedObject is the representation of the object
itself.
A javaNamingReference is a more general form of storing a reference
to a Java object, while a javaRemoteObject is specifically for
storing a reference to a Java RMI object.
A javaRemoteObject and javaNamingReference typically consist of a
small number of human-readable strings. Standard text-based tools
for directory administration may therefore be used to add, read, or
modify reference entries -- if so desired -- quite easily.
Serialized objects are not intended to be read or manipulated
directly by humans.
3 Attribute Type Definitions
The following attribute types are defined in this document:
javaClassName
javaCodebase
javaSerializedData
javaRemoteLocation
javaFactory
javaReferenceAddress
3.1 javaClassName
This attribute stores the Java object's fully qualified class or
interface name (e.g. "java.lang.String"). This attribute's syntax
is 'Directory String' and the case (upper or lower) of the string
is significant.
( 1.3.6.1.4.1.42.2.27.4.1.6
NAME 'javaClassName'
DESC 'Fully qualified Java class or interface name'
EQUALITY caseExactMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
SINGLE-VALUE
)
3.2 javaCodebase
This attribute stores the Java class definition's locations. It
specifies the locations from which to load the class definition for the
class specified by the javaClassName attribute. It could be, for
example, the URL of a JAR file (e.g., "http://webserver/appX/appx.jar"),
or the URL of a file directory (e.g., "file:/pub/appXclasses/"). See [Java].
This attribute can have multiple values. When more than one value has
been specified, each is tried until the class definition has been
successfully loaded.
This attribute's syntax is 'IA5 String' and case is significant.
( 1.3.6.1.4.1.42.2.27.4.1.7
NAME 'javaCodebase'
DESC 'URL specifying the location of class definition'
EQUALITY caseExactIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26
)
3.3 javaSerializedData
This attribute stores the serialized form of a Java object. The
serialized form is described in [Serial].
This attribute's syntax is 'Binary'.
( 1.3.6.1.4.1.42.2.27.4.1.8
NAME 'javaSerializedData
DESC 'Serialized form of a Java object'
SYNTAX 1.3.6.1.4.1.1466.115.121.1.5
SINGLE-VALUE
)
3.4 javaRemoteLocation
This attribute stores the location of the Java RMI remote object.
It is the URL that must be supplied to the RMI registry for looking up
the remote object. See [RMI].
This attribute's syntax is 'IA5 String' and case is significant.
( 1.3.6.1.4.1.42.2.27.4.1.9
NAME 'javaRemoteLocation'
DESC 'Location of a Java RMI remote object'
EQUALITY caseExactIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26
SINGLE-VALUE
)
3.5 javaFactory
This attribute stores the fully qualified class name of the object
factory (e.g. "com.wiz.jndi.WizObjectFactory") that can be used to
create an instance of the object identified by the javaClassName
attribute.
This attribute's syntax is 'Directory String' and case is significant.
( 1.3.6.1.4.1.42.2.27.4.1.10
NAME 'javaFactory'
DESC 'Fully qualified Java class name of a JNDI object factory'
EQUALITY caseExactMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
SINGLE-VALUE
)
3.6 javaReferenceAddress
This attribute represents the sequence of addresses of a JNDI
reference. Each of its values represents one address, a Java object
of type javax.naming.RefAddr. Its value is a concatenation of the
address type and address contents, preceded by a sequence number (the
order of addresses in a JNDI reference is significant). For example:
#0#TypeA#ValA
#1#TypeB#ValB
#2#TypeC##rO0ABXNyABpq...
In more detail, the value is encoded as follows:
The delimiter is the first character of the value. For readability
the character '#' is recommended when it is not otherwise used
anywhere in the value, but any character may be used subject to
restrictions given below.
The first delimiter is followed by the sequence number. The sequence
number of an address is its position in the JNDI reference, with the
first address being numbered 0. It is represented by its shortest
string form, in decimal notation.
The sequence number is followed by a delimiter, then by the address
type, and then by another delimiter. If the address is of Java class
javax.naming.StringRefAddr, then this delimiter is followed by the
value of the address contents (which is a string). Otherwise, this
delimiter is followed immediately by another delimiter, and then by
the Base64 encoding of the serialized form of the entire address.
The delimiter may be any character other than a digit or a character
contained in the address type. In addition, if the address contents
is a string, the delimiter may not be the first character of that string.
This attribute's syntax is 'Directory String' and case is significant.
It can contain multiple values.
( 1.3.6.1.4.1.42.2.27.4.1.11
NAME 'javaReferenceAddress'
DESC 'Addresses associated with a JNDI Reference'
EQUALITY caseExactMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
)
4 Object Class Definitions
The following object classes are defined in this document:
javaContainer
javaObject
javaSerializedObject
javaRemoteObject
javaNamingReference
4.1 javaContainer
This structural object class represents a container for a Java object.
( 1.3.6.1.4.1.42.2.27.4.2.1
NAME 'javaContainer'
DESC 'Container for a Java object'
SUP top
STRUCTURAL
MUST ( cn )
)
4.2 javaObject
This abstract object class represents a Java object.
A javaObject cannot exist in the directory;
only auxiliary or structural subclasses of it can exist in the directory.
( 1.3.6.1.4.1.42.2.27.4.2.4
NAME 'javaObject'
DESC 'Java object representation'
SUP top
ABSTRACT
MUST ( javaClassName )
MAY ( javaCodebase )
)
4.3 javaSerializedObject
This auxiliary object class represents a Java serialized object.
It must be mixed in with a structural object class.
( 1.3.6.1.4.1.42.2.27.4.2.5
NAME 'javaSerializedObject'
DESC 'Java serialized object'
SUP javaObject
AUXILIARY
MUST ( javaSerializedData )
)
4.4 javaRemoteObject
This auxiliary object class represents a Java RMI remote object.
It must be mixed in with a structural object class.
( 1.3.6.1.4.1.42.2.27.4.2.6
NAME 'javaRemoteObject'
DESC 'Java RMI remote object'
SUP javaObject
AUXILIARY
MUST ( javaRemoteLocation )
)
4.5 javaNamingReference
This auxiliary object class represents a JNDI reference.
It must be mixed in with a structural object class.
( 1.3.6.1.4.1.42.2.27.4.2.7
NAME 'javaNamingReference'
DESC 'JNDI reference'
SUP javaObject
AUXILIARY
MAY ( javaReferenceAddress $
javaFactory )
)
5. Security Considerations
Serializing an object and storing it into the directory enables (a
copy of) the object to be examined and used outside the environment in
which it was originally created. The directory entry containing the
serialized object could be read and modified within the constraints
imposed by the access control mechanisms of the directory. If an
object contains sensitive information or information that could be
misused outside of the context in which it was created, the object
should not be stored in the directory. For more details on
security issues relating to serialization in general,
see [Serial].
6. References
[Java] Ken Arnold and James Gosling, "The Java(tm) Programming Language",
Second Edition, ISBN 0-201-31006-6.
[JNDI] The Java(tm) Naming and Directory Interface (tm) Specification,
JavaSoft Division, Sun Microsystems, Inc., Feb 1998.
http://java.sun.com/products/jndi/.
[LDAPv3] M. Wahl, T. Howes, S. Kille, "Lightweight Directory Access Protocol (v3)"
RFC2251, December 1997.
[RMI] Remote Method Invocation,
Java Software, Sun Microsystems, Inc., November 1998.
http://java.sun.com/products/jdk/1.2/docs/guide/rmi
[Serial] Object Serialization Specification,
Java Software, Sun Microsystems, Inc., November 1998.
http://java.sun.com/products/jdk/1.2/docs/guide/serialization
7. Authors' Addresses
Vincent Ryan
Sun Microsystems, Inc.
Mail Stop EDUB03
901 San Antonio Road
Palo Alto, CA 94303
USA
+353 1 819 9151
vincent.ryan@ireland.sun.com
Scott Seligman
Sun Microsystems, Inc.
Mail Stop UCUP02-209
901 San Antonio Road
Palo Alto, CA 94303
USA
+1 408 863 3222
scott.seligman@eng.sun.com
Rosanna Lee
Sun Microsystems, Inc.
Mail Stop UCUP02-206
901 San Antonio Road
Palo Alto, CA 94303
USA
+1 408 863 3221
rosanna.lee@eng.sun.com
8. Appendix - LDAP Schema
-- Attribute types --
( 1.3.6.1.4.1.42.2.27.4.1.6
NAME 'javaClassName'
DESC 'Fully qualified Java class or interface name'
EQUALITY caseExactMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
SINGLE-VALUE
)
( 1.3.6.1.4.1.42.2.27.4.1.7
NAME 'javaCodebase'
DESC 'URL specifying the location of class definition'
EQUALITY caseExactIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26
)
( 1.3.6.1.4.1.42.2.27.4.1.8
NAME 'javaSerializedData
DESC 'Serialized form of a Java object'
SYNTAX 1.3.6.1.4.1.1466.115.121.1.5
SINGLE-VALUE
)
( 1.3.6.1.4.1.42.2.27.4.1.9
NAME 'javaRemoteLocation'
DESC 'Location of a Java RMI remote object'
EQUALITY caseExactIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26
SINGLE-VALUE
)
( 1.3.6.1.4.1.42.2.27.4.1.10
NAME 'javaFactory'
DESC 'Fully qualified Java class name of a JNDI object factory'
EQUALITY caseExactMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
SINGLE-VALUE
)
( 1.3.6.1.4.1.42.2.27.4.1.11
NAME 'javaReferenceAddress'
DESC 'Addresses associated with a JNDI Reference'
EQUALITY caseExactMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
)
-- Object classes --
( 1.3.6.1.4.1.42.2.27.4.2.1
NAME 'javaContainer'
DESC 'Container for a Java object'
SUP top
STRUCTURAL
MUST ( cn )
)
( 1.3.6.1.4.1.42.2.27.4.2.4
NAME 'javaObject'
DESC 'Java object representation'
SUP top
ABSTRACT
MUST ( javaClassName )
MAY ( javaCodebase )
)
( 1.3.6.1.4.1.42.2.27.4.2.5
NAME 'javaSerializedObject'
DESC 'Java serialized object'
SUP javaObject
AUXILIARY
MUST ( javaSerializedData )
)
( 1.3.6.1.4.1.42.2.27.4.2.6
NAME 'javaRemoteObject'
DESC 'Java RMI remote object'
SUP javaObject
AUXILIARY
MUST ( javaRemoteLocation )
)
( 1.3.6.1.4.1.42.2.27.4.2.7
NAME 'javaNamingReference'
DESC 'JNDI reference'
SUP javaObject
AUXILIARY
MAY ( javaReferenceAddress $
javaFactory )
)
-- Matching rule from X.520 --
( 2.5.13.5
NAME 'caseExactMatch'
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
)