Programación en castellano Añadir una dirección | Buscador | Cursos | Artículos | Foros | Formación

Sistema de Nombrado en Java (JNDI) y II
Autor: Sun
Traductor: Juan Antonio Palos (Ozito)


En esta página:


Definición de Clases Objeto

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.


Principio Página
© 1999-2002, Programación en castellano, s.l.
Contacto - Datos legales

ReD Internet: Hospedaje Web | envio sms gratis | Salvapantallas | Fondos de Escritorio, famosas | melodias moviles gratis| Gratis