Como se mencion� anteriormente en esta lecci�n, el LDAP dfine una operaci�n "extendida", que toma una petici�n como argumento y devuelve una respuesta. La petici�n contine un identificador que identifica la propia petici�n y sus argumentos. La respuesta contiene los resultados de realizar la petici�n. La pareja de operaci�nes petici�n/respuesta "extendidas" se llama una extensi�n. Por ejemplo, puede haber una extensi�n para "Start TLS", que es una petici�n del cliente para que el servidor active el protocolo TLS. Estas extensiones pueden ser est�ndars (defindias por la comunidad LDAP) o propietarias (definidas por un vendedor de directorios particular).
El paquete javax.naming.ldap define el interface ExtendedRequest para representar el argumento de una operaci�n "extendida", y el interfae ExtendedResponse para representar el resultado de una operaci�n. Una respuesta extendida normalmente est� emparejada con una petici�n extendida pero no cesariamente al rev�s. Es decir, podemos tener peticiones extendidas que no tengan su correspondiente respuesta extendida. Una respuesta extendida sin pareja se llama una notificaci�n no solicitada, descrita con detalle en la lecci�n Notificaci�n de Eventos.
Una aplicaci�n no trata normalmente con estos interfaces. En su lugar, trata con clases que los implementan. La aplicaci�n obtiene las clases como parte de un repertorio de operaciones "extendidas" estandarizadas a trav�s del IETF o desde vendedores de directorios para operaciones "extendidas" espec�ficas de un vendedor. Las clases petici�n deber�an tener constructores que acepten argumentos de una forma segura y amigable para el usuario, mientras que las clases respuesta deber�an tener m�todos de acceso para obtener los datos de la respuesta de una forma segura y agradable. Internamete, las clases petici�n/respuesta tratan con valores BER codificados/decodificados.
�Extensiones por Servidores LADP
El soporte para extensiones espec�ficas depende del servidor LDAP.
Aqu� tenemos un sencillo programa para buscar la lista de extensiones que soporta un servidor LDAP:
// Create the initial context
DirContext ctx = new InitialDirContext();
// Read supportedextension from the root DSE
Attributes attrs = ctx.getAttributes(
"ldap://localhost:389", new String[]{"supportedextension"});
Aqu� tenemos la salida producida por este programa cuando se ejecuta en un servidor LDAP:
{supportedextension=supportedextension.
1.3.6.1.4.1.1466.20037
}
�Implementaciones
Normalmente trataremos con clases de implementaci�n que implementen ExtendedRequest y ExtendedResponse en vez de tratar directamente con sus m�todos. Dichas clases de implementaci�n normalmente tienen constructores amigables y m�todos accesores.
Por ejemplo, supongamos que un servidor LDAP soporta una operaci�n "extendida" Get Time. Suministrar�a clases como GetTimeRequest y GetTimeResponse, para que las aplicaciones puedan usar esta caracter�sitca. Una aplicaci�n usar�a estas clases de esta forma:
// Invoke the "extended" operation
GetTimeResponse resp =
(GetTimeResponse) lctx.extendedOperation(new GetTimeRequest());
// Get the "extended" operation's (decoded) response
long time = resp.getTime();
Las clases GetTimeRequest y GetTimeResponse podr�an estar definidas de esta forma:
public class GetTimeRequest implements ExtendedRequest {
// User-friendly constructor
public GetTimeRequest() {
};
// Methods used by service providers
public String getID() {
return GETTIME_REQ_OID;
}
public byte[] getEncodedValue() {
return null; // No value is needed for the Get Time request
}
public ExtendedResponse createExtendedResponse(
String id, byte[] berValue, int offset, int length) throws NamingException {
return new GetTimeResponse(id, berValue, offset, length);
}
}
public class GetTimeResponse implements ExtendedResponse {
long time;
// Called by GetTimeRequest.createExtendedResponse()
GetTimeResponse(String id, byte[] berValue, int offset, int length)
throws NamingException {
// Check the validity of the id
long time = ... // Decode berValue to get the time
}
// These are type-safe and user-friendly methods
public java.util.Date getDate() { return new java.util.Date(time); }
public long getTime() { return time; }
// These are low-level methods
public byte[] getEncodedValue() {
return // berValue saved;
}
public String getID() {
return GETTIME_RESP_OID;
}
}