Programación en castellano Añadir una dirección | Buscador | Cursos | Artículos | Foros | Formación

Sistema de Nombrado en Java (JNDI) [Parte I]
Autor: Sun
Traductor: Juan Antonio Palos (Ozito)


En esta página:


Objetos Referenciables y Referencias

Podemos pensar en el estado serializado de un objeto como una copia del objeto en una representación diferente. Algunas veces no es apropiado almacenar esta representación en el directorio. Esto es porque el estado serializado podría ser demasiado grande o podría ser inadecuado para nuestras necesidades (por ejemplo, la aplicación podría necesitar más información que la que puede suministrarse desde la forma serializada). O, podríamos necesitar el objeto en una forma diferente.

Por razones como estas, el JNDI define una referencia para usarla cuando la forma de un objeto serializado no puede almacenarse en el directorio. Almacenamos indirectamente un objeto con una referencia asociada en el directorio almacenando su referencia. Podría se útil pensar en la distinción entre un objeto serializado y una referencia JNDI como entre una copia de un objeto Java y una referencia a un objeto Java.

¿Qué hay en una Referencia?

Una referencia está representada por la clase Reference.

Una Reference consta de una lista ordenada de direcciones e información de clases sobre el objeto que está siendo referenciado. Cada dirección está representada por una subclase de RefAddr y contiene información sobre cómo construir el objeto.

Las referencias se usan normalmente para representar conexiones a un servicio de red como una base de datos, un directorio o un sistema de ficheros. Cada dirección podría identificar para ese servicio un punto final de comunicación que contiene información sobre cómo contactar con el servicio. Se podrían alcanzr múltiples direcciones por varias razones, como la necesidad de reaplicación o múltiples puntos de acceso (es decir, el objeto ofrece interfaces sobre más de un mecanismo de comunicación).

Una referencia también contiene información para ayudar en la creacción de un ejemplar el objeto al que se refiere la referencia. Contiene el nombre de la clase Java de ese objeto, así como el nombre de la clase y la localización de la factoría de objetos a utilizar para crearlo.

Objetos Referenciables

Un objeto cuya clase implementa el interface Referenceable tiene asociada una referencia. El interface Referenceable tiene un método, getReference(), que devuelve la referencia al objeto.

El siguiente ejemplo muestra una clase Fruit que implementa el interface Referenceable.

public class Fruit implements Referenceable {
    String fruit;
    
    public Fruit(String f) {
	fruit = f;
    }
    
    public Reference getReference() throws NamingException {
	return new Reference(
	    Fruit.class.getName(),
	    new StringRefAddr("fruit", fruit),
	    FruitFactory.class.getName(),
	    null);          // Factory location
    }

    public String toString() {
	return fruit;
    }
}

La referencia de un ejemplar Fruit consta de una sóla dirección (de la clase StringRefAddr).

Esta dirección contiene el tipo de fruta con el que fue creado este ejemplar.

Por ejemplo, si el ejemplar fue creado usando new Fruit("orange"), entonces su tipo de dirección sería "fruit" y el contenido de su diección sería "orange". La referencia contiene dos informaciones más: el nombre totalmente cualificado de la clase Fruit (en este caso, simplemente "Fruit") y el nombre totalmente cualificado de la clase factoría de objetos que puede usarse para crear ejemplares de Fruit (en este caso, "FruitFactory").

Las factorías de objetos de describen en la lección Factorias de Objetos.

Unir un Objeto Referenciable

Podríamos recordar la clase Fruit del ejemplo de Añadir una Unión que Tiene Atributos. El siguiente ejemplo es una simplificación de aquél.

Después de crear un ejemplar de Fruit, llamamos a Context.bind(), DirContext.bind(), Context.rebind(), o DirContext.rebind() para añadirlo al directorio.

// Create the object to be bound
Fruit fruit = new Fruit("orange");
...

// Perform bind
ctx.bind("cn=favorite", fruit);

La implementación del proveedor de servicio de bind()/rebind() primero extrae la referencia del objeto que está siendo unido (usando Referenceable.getReference()) y luego almacena esa referencia en el directorio. Cuando posteriormente se busca ese objeto en el directorio, su factoría de objetos correspondiente convertirá la referencia en un ejemplar del objeto (los detalles de la conversión se cubren en la lección Factorias de Ojetos).

// Read the object back
Fruit f2 = (Fruit) ctx.lookup("cn=favorite");
System.out.println(f2);

Esto produce la siguiente salida, "orange", producida por Fruit.toString()

# java RefObj
orange

Desde la perspectiva de la aplicación que usa JNDI, sólo está tratando con bind() y lookup(). El proveedor de servicio tiene cuidado de obtener la referencia desde el objeto y convertirlo a/desde el propio objeto real.

Observa que podemos almacenar en el directorio un objeto Referenceable sólo si el proveedor de servicios lo soporta. El proveedor de servicios LDAP de Sun soporta almacenamiento de objetos References y Referenceables.

Unir una Referencia

Unir un objeto Referenceable es más elegante que unir directamente una Reference. Esto es porque podemos simplemente unir el objeto en vez de primero obtener su referencia. Sin embargo, también podemos unir una Reference directamente. Puedes ir a la sección Objetos Remotos para ver un ejemplo de unión de una Reference.


Principio Página
© 1999-2002, Programación en castellano, s.l.
Contacto - Datos legales

ReD Internet: Hospedaje Web | envio sms gratis | Salvapantallas | Fondos de Escritorio, famosas | melodias moviles gratis| Gratis