�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.