Objetos con Atributos
Si el objeto que estamos intentato unir no es Serializable ni Referenceable,
todavía podemos unirlo si tiene atributos, la unión de estas uniones con
objetos DirContext
es una característica soportada por el proveedor de servicios. El proveedor de
servicios LDAP de Sun soporta esta característica.
Interoperabilidad
Unir objetos DirContext es especialmente útil para
interoperabilidad con aplicaciones no-Java. Un objeto está representado por un
conjunto de atributos, que pueden ser leídos desde el directorio y usados por
aplicaciones no-Java. Los mismos atributos también pueden ser leídos e
interpretados por un proveedor de servicios JNDI, que, en conjunción con una
factoría de objetos, los convierte en un objeto Java.
Por ejemplo, un objeto podría tener, como algunos de sus valores de
atributos, URLs que el servicio JNDI podría usar para generar un ejemplar de un
objeto Java que la aplicación podría usar. La misma URL podría también ser
utilizada por aplicaciones no-Java.
Unir un Objeto Usando sus Atributos
El siguiente ejemplo muestra una clase Drink
que implementa el interface DirContext. Este ejemplo no usa la
mayoría de los métodos de DirContext y sólo lanza una OperationNotSupportedException.
public class Drink implements DirContext {
String type;
Attributes myAttrs;
public Drink(String d) {
type = d;
myAttrs = new BasicAttributes(true); // Case ignore
Attribute oc = new BasicAttribute("objectclass");
oc.add("extensibleObject");
oc.add("top");
myAttrs.put(oc);
myAttrs.put("drinkType", d);
}
public Attributes getAttributes(String name) throws NamingException {
if (! name.equals("")) {
throw new NameNotFoundException();
}
return (Attributes)myAttrs.clone();
}
public String toString() {
return type;
}
...
}
La clase Drink contiene los atributos "objectclass"
y "drinkType". El atributo "objectclass"
contiene dos valores: "top" y "extensibleObject".
El atributo "drinkType" se selecciona usando el string
pasado a su constructor. Por ejemplo, si el ejemplar se creó usando new
Drink("water"), entonces su atributo "drinkType"
tendrá el valor "water".
El siguiente ejemplo crea un ejemplar de Drink
y llama a Context.bind()
para añadirlo al directorio.
// Create the object to be bound
Drink dr = new Drink("water");
// Perform the bind
ctx.bind("cn=favDrink", dr);
Cuando el objeto es unido, sus atributos se extraen y se almacenan en el
directorio.
Cuando posteriormente se busca el objeto en el directorio, se usará su
correspondiente factoría de objetos para devolver un ejemplar del objeto. La
factoría de objetos está identificada por la propiedad de entono Context.OBJECT_FACTORIES
cuando se creó el contexto inicial para leer el objeto. Los detalles de la
conversión se describen en la lección Factorías
de Objetos.
Hashtable env = ...;
// Add property so that the object factory can be found
env.put(Context.OBJECT_FACTORIES, "DrinkFactory");
// Create the initial context
DirContext ctx = new InitialDirContext(env);
// Read back the object
Drink dr2 = (Drink) ctx.lookup("cn=favDrink");
System.out.println(dr2);
Esto produce la siguiente salida, "water", producida
por Drink.toString():
# java DirObj
water
Desde la perspectiva de la aplicación que usa el JNDI, sólo está tratando
con bind() y lookup(). El proveedor de servicios
tiene cuidado de obtener los atributos del objeto y convertirlos desde/a el
propio objeto real.
Observa que sólo podemos almacenar un objeto DirContext en
el directorio si el proveedor de servicios lo soporta.