Sistema de Nombrado en Java (JNDI) y II

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

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR