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:


Dos Ejemplos Prácticos

¿Cómo podríamos usar estas facilidades del esquema?
Esta sección muestra dos ejemplos que usan el esquema. El primero es un programa que crea una nueva entrada en el directorio. Usa el esquema para encontar los atributos necesarios para la nueva entrada. El segundo ejemplo es más ambicioso. Crea una entrada que podría usar nuevas clases objeto, que a sú vez, podrían usar nuevas definiciones de tipos de atributos.

Usando el Esquema Existente

El siguiente ejemplo se llama UseSchema. Acepta como argumento de la línea de comandos el nombre de la entrada a crear. Por ejemplo, para crear una nueva entrada llamada "cn=TestPerson" en el subárbol "ou=People" , introducimos en la línea de comandos:

# java UseSchema "cn=TestPerson, ou=People"

El programa empieza preguntándonos por la lista de clases objeto para la nueva entrada. Después de introducir la lista de nombres de las clases objeto, terminamos la lista pulsando Return. Trabajando con esta lista de nombres, el programa usa el esquema para determinar la lista de atributos obligatorios y opcionales necesarios para crear la nueva entrada. Este proceso de determinación está implementado por el método getAttributeLists():

static Vector[] getAttributeLists(DirContext schema, Vector objectClasses) 
    throws NamingException {
    Vector mandatory = new Vector();
    Vector optional = new Vector();

    for (int i = 0; i < objectClasses.size(); i++) {
        String oc = (String)objectClasses.elementAt(i);
        Attributes ocAttrs = 
  	    schema.getAttributes("ClassDefinition/" + oc);
	Attribute must = ocAttrs.get("MUST");
	Attribute may = ocAttrs.get("MAY");

	if (must != null) {
	    addAttrNameToList(mandatory, must.getAll());
	}
	if (may != null) {
	    addAttrNameToList(optional, may.getAll());
	}
    }
    return new Vector[] {mandatory, optional};
}

Observa que para completarlo, deberíamos modificar este ejemplo para que busque recursivamente los padres de las clases objeto e incluirlas en nuestra lista de clases objeto a procesar. Esto es porque algunos servidores podrían seguir reglas de subclasificación y listar sólo los atributos de las clases objetos más derivadas. Algunos servidores listan todos los atributos de las clases objeto, incluyendo aquellos heredados de sus superclases.

El programa busca el nombre de cada clase objeto en la porción "ClassDefinition" del árbol de esquema y extrae los atributos "MUST"/"MAY". Estos contienen listas de nombres de atributos que una entrada de la clase objeto debe y podría tener.

Después de construir la lista de nombres de atributos obligatorios y opcionales, el programa usa getAttributeValues() para pedirnos que introduzcamos los valores para cada atributo. (Pulsamos Return si no queremos introducir un valor para un atributo). El programa usa el esquema de definición de cada atributo para obtener su síntaxis y luego usa esa síntaxis como parte del prompt del usuario:

Attributes attrSchema = schema.getAttributes("AttributeDefinition/" + name);
Attribute syntax = attrSchema.get("SYNTAX");

En la práctica, esto no es muy útil porque la síntaxis es una OID y muy pocos usuarios reconocerán los que representa. Sin embargo, podríamos usar el esquema de definición de atributo de formas más útiles, como mostrar su descripción y buscar la síntaxis para obtener su descripción.

Después de obtener los atributos de la nueva entrada, el programa llama a DirContext.createSubcontext() para crear la nueva entrada.

Mejorar el Esquema Existente

Antes de continuar:

Ver las notas de la sección Definición de Clases Objeto para ver como actualizar el esquema.

En el ejemplo UseSchema, sólo podemos introducir clases objeto definidas en el esquema. Si introducimos una clase objeto que no existe en el esquema, el programa lanzará una NameNotFoundException.

El siguiente ejemplo,AugmentSchema, nos permite crear clases objeto que no se han definido todavía. Ejecutamos el programa suministrando el nombre de la entrada a crear como un argumento de la línea de comandos:

# java AugmentSchema "cn=TestPerson, ou=People"

Al igual que el programa UseSchema, luego introducimos la lista de clases objeto de la nueva entrada. Con el programa AugmentSchema, podríamos introducir clases objeto que no están definidas. Después de obtener la lista, el programa usa checkDefinition() para comprobar si las clases objeto están definidas. Este método acepta como argumentos la raíz del árbol del esquema, la lista de nombres de clases objeto a comprobar, el tipo de objeto esquema (por ejemplo, "ClassDefinition" o "AttributeDefinition"), y la lista de atributos necesarios para definir un objeto esquema de ese tipo. Aquí está el código del método checkDefinition():

static void checkDefinition(DirContext schema, Vector names,
    String schemaType, String[]schemaAttrIDs) throws NamingException, IOException {
        DirContext root = (DirContext)schema.lookup(schemaType);
        for (int i = 0; i < names.size(); i++) {
  	    String name = (String)names.elementAt(i);
	    try {
		// Check if the definition already exists in the schema
		root.lookup(name);
    	    } catch (NameNotFoundException e) {
 	        // Get the definition from the user
	        Attributes schemaAttrs = getDefinition(schemaType, name, schemaAttrIDs);

	        // Add the definition to the schema
	        root.createSubcontext(name, schemaAttrs);
            }
	}
    }
}

Por cada clase objeto que no tenga una definición de esquema, el programa crea una nueva definición preguntándonos los atributos necesarios para definirla en el esquema, como su OID, el nombre y sus lista de atributos obligatorios y opcionales. Entonces el programa crea una definición de clase objeto llamando a createSubcontext() sobre el árbol esquema.

Nota:

Cuando se usa el Netscape Directory Server v4.1 necesitamos asegurarnos de que los atributos "MUST"/"MAY" de la clase tienen más de un valor atributo. Puedes ver más detalles en la sección Definición de Clases Objeto.

Después de hacer esto para todas las clases de la lista, el programa obtiene la lista de atributos obligatorios y opcionales de la clase objeto desde el esquema. Entonces chequea está lista para asegurarse de que tiene sus definiciones de atributos en el esquema, usando de nuevo checkDefinition(). Por cada atributo que no tiene definición de esquema, el programa la crea preguntándonos por los atributos necesarios para definirlo en el esquema, como su OID, el nombre y la síntaxis. Luego el programa crea una definición de atributo llamando a createSubcontext() sobre el árbol de esquema.

El programa solicita los datos para los atributos de la nueva entrada y usa createSubcontext() para crear la nueva entrada.


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