En esta página: 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.
|