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.