Operaciones Extendidas
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;
}
}