En esta página: Dos Ejemplos Prácticos
¿Cómo podríamos usar estas facilidades del esquema?
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
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.
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.
|