Todas la entradas LDAP en el directorio son "tipadas". Es decir, toda entrada pertenece a una clase objeto que identifia el tipo que dato representado por la entrada. La clase especifica los atributos obligatorios y opcionales que se pueden asociar con una entrada de esta clase.
Las clases objeto para todos los objetos del directorio forman un �rbol de clases. Las clases "top" y "alias" est�n en la ra�z del �rbol. Por ejemplo, la clase "organizationalPerson" es una subclase de la clase "Person", que a su vez es una subclase de "top". cuando creamos una nueva entrada LDAP, siempre debemos especificar todas las clases objeto a las que pertenece la nueva entrada. Como muchos directorios no soportan subclasificaci�n de clases objeto, siempre deber�amos incluir todas las superclases de la entrada. Por ejemplo, para un objeto "organizationalPerson", deberiamos listar en sus clases objeto las clases "organizationalPerson", "person", y "top".
Hay disponibles tres tipos de clases objeto:
- Estructural. Indica los atributos que la entrada podr�a tener y donde podr�an ocurrir cada uno de ellos en el DIT.
- Auxiliar. Indica los atributos que la entrada podr�a tener.
- Abstracto. Indica una especificaci�n "parcial" en el �rbol de clases del objeto; s�lo las subclases estructurales o auxiliares podr�an aparecer como entradas en el directorio.
En el �rbol de esquema, el nombre "ClassDefinition" est� unido a un objeto de un contexto plano DirContext que representa las definiciones de la clase del esquema. Por ejemplo, si un directorio soporta una clase "person", entonces el contexto "ClassDefinition" tendr� una uni�n con el nombre "person" que est� unido a un objeto DirContext. Todo objeto en el contexto "ClassDefinition" tiene atributos obligatorios y opcionales mostrados en la siguiente tabla. S�lo "NUMERICOID" es obligatorio.
| Identificaci�n de Atributo | Descripci�n del Valor del Atributo |
|---|---|
| NUMERICOID (obligatorio) | (OID) Identificador de Objeto �nico |
| NAME | Nombre de la clase del objeto |
| DESC | Descripci�n de la clase del objeto |
| OBSOLETE | "true" si est� obsoleto; "false" o ausente de activo. |
| SUP | Nombres de las clases objetos superiores de las que desciende la clase objeto. |
| ABSTRACT | "true" si la clase es abstracta; "false" o ausente si no lo es. |
| STRUCTURAL | "true" si la clase es estructural; "false" o ausente si no lo es. |
| AUXILIARY | "true" si la clase es auxiliar; "false" o ausente si no lo es. |
| MUST | Lista los nombres de tipos de atributos que deben estar presentes. |
| MAY | Lista los nombres de tipos de atributos que podr�an estar presentes. |
Estos atributos corresponden a la definici�n de "ObjectClassDescription" de la RFC 2252. Todos los valores de atributos est�n representados por la clase java.lang.String. Algunos directorios no publican todos los datos del esquema. Por ejemplo el Netscape Directory Server v4.1 no publica si una clase objeto es abstracta, estructural o auxiliar. En dichos casos, los objetos del esquema no describen completamente las definiciones de las clases de objetos.
�Recuperar el Objeto Esquema de una Clase Objeto
Para recuperar el objeto esquema de una clase objeto, la buscamos en el �rbol de esquema. Por ejemplo, podemos obtener el objeto esquema que representa a la clase objeto "person" usando el siguiente c�digo.
// Get the schema tree root
DirContext schema = ctx.getSchema("");
// Get the schema object for "person"
DirContext personSchema = (DirContext)schema.lookup("ClassDefinition/person");
Si obtenemos los atributos del objeto esquema personSchema, veremos lo siguiente:
NUMERICOID: 2.5.6.6 NAME: person MAY: description, seealso, telephonenumber, userpassword MUST: objectclass, sn, cn DESC: Standard ObjectClass SUP: top
Adem�s de usar lookup(), podemos usar otros m�todos como list() o search() para recuperar los objetos esquema del �rbol de esquema.
�Obtener las Clases Objeto de una Entrada
Dando un DirContext que representa una entrada LDAP, podemos obtener las clases objeto de la entrada llamando a DirContext.getSchemaClassDefinition() sobre �l.
Abajo hay un ejemplo que enumera las definiciones de clases objeto de la entrada "cn=Ted Geisel, ou=People". getSchemaClassDefinition() devuelve un contexto que contiene las definiciones de las clases objeto de la entrada. Usando este contexto, podemos buscar una definici�n individual, enumerar todas las definiciones, o realizar otras operaciones DirContext.
// Create the initial context
DirContext ctx = new InitialDirContext(env);
// Get context containing class definitions for the "cn=Ted Geisel" entry
DirContext tedClasses = ctx.getSchemaClassDefinition("cn=Ted Geisel, ou=People");
// Enumerate the class definitions
NamingEnumeration enum = tedClasses.search("", null);
while (enum.hasMore()) {
System.out.println(enum.next());
}
�A�adir una Nueva Clase Objeto
|
Antes de continuar:
Para actualizar el esquema, debemos autentificarnos como el administrador de directorio. Este es el nombre que suministramos al programa de administraci�n de directorio cuando lo configuramos por primera vez. Por ejemplo, si configuramos "cn=Directory Manager" como el administrador, necesitamos hacer algo como esto para crear el contexto inicial: env.put(Context.SECURITY_PRINCIPAL, "cn=Directory Manager"); env.put(Context.SECURITY_CREDENTIALS, "secret99"); Bugs en Netscape v4.0: El Netscape Directory Server v4.0 y versiones anteriores no soportan entradas de esquema que cumplan con la RFC 2252. Espec�ficamente, contrario a la RFC 2252, el servidor de Netscape requiere que las OIDs (como aquellas para SUP y SYNTAX) est�n delimitadas por comillas simples y las listas MUST/MAY deben estar encerradas entre par�ntesis. Por defecto, el proveedor de servicio LDAP produce entradas de esquema que cumplen con la RFC 2252 pero no son aceptables por el servidor de Netscape. Para producir entradas de esquema que pueda aceptar el servidor Netscape v4.0, debemos a�adir la siguiente propiedad de entorno antes de crear el contexto inicial:
env.put("com.sun.jndi.ldap.netscape.schemaBugs", "true");
Bugs en Netscape v4.1: El Netscape Directory Server v4.1 ha corregido algunos de los problemas de manejo de esquea encontrados en la versi�n 4.0, por eso no deber�amos usar la propiedad "com.sun.jndi.ldap.netscape.schemaBugs" con la versi�n 4.1. Sin embargo la versi�n 4.1 del servidor todav�a requiere que las listas MUST/MAY est�n encerradas entre par�ntesis. El proveedor LDAP de Sun usa comillas en lugar de par�ntesis para especificaciones de MUST/MAY de un s�lo �tem. Podemos atajar este problema creando un atributo "MUST"/"MAY" de un s�lo valor y luego a�adirle un valor superfluo, como "objectclass", cuando estamos modificando o creando una definici�n de clase objeto que tiene una lista MUST/MAY de un s�lo �tem. |
A�adir una nueva clase objeto al esquema es como a�adir una nueva entrada al directorio. Esto es as� porque el �rbol de esquema y los objetos esquema son objetos DirContext.
Abajo hay un ejemplo que a�ade una nueva clase objeto ("fooObjectClas") al esquema. Primero declara los atributos que describen la nueva clase objeto y luego a�ade la definici�n de la clase objeto al esquema usando DirContext.createSubcontext():
// Specify attributes for the schema object
Attributes attrs = new BasicAttributes(true); // Ignore case
attrs.put("NUMERICOID", "1.3.6.1.4.1.42.2.27.4.2.3.1.1.1");
attrs.put("NAME", "fooObjectClass");
attrs.put("DESC", "for JNDITutorial example only");
attrs.put("SUP", "top");
attrs.put("STRUCTURAL", "true");
Attribute must = new BasicAttribute("MUST", "cn");
must.add("objectclass");
attrs.put(must);
// Get the schema tree root
DirContext schema = ctx.getSchema("");
// Add the new schema object for "fooObjectClass"
DirContext newClass = schema.createSubcontext("ClassDefinition/fooObjectClass", attrs);
�Modificar una Clase Objeto
No podemos modificar una clase objeto existente. Primero debemos borrar la definici�n de la clase objeto que queremos editar y luego a�adir la versi�n actualizada.
�Borrar una Clase Objeto
|
Antes de continuar:
Ve a la secci�n A�adir una Nueva Clase Objeto para ver la notas sobre la actualizaci�n del esquema. |
Borrar una clase objeto existente del esquema es como borrar una entrada del directorio. Aqu� tenemos un ejemplo que elimina la clase objeto "fooObjectClass" del esquema usando DirContext.destroySubcontext():
// Get the schema tree root
DirContext schema = ctx.getSchema("");
// Remove the schema object for "fooObjectClass"
schema.destroySubcontext("ClassDefinition/fooObjectClass");
Algunos servidores podr�an no permitirnos borrar una clase objeto que est� siendo usada por entradas del directorio. Podr�amos evitar esta restricci�n desactivando el chequeo de esquema.