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.