En esta página: Ejemplo de Objeto Personalizado Este ejemplo ilustra cómo un tipo arbitrario (por ejemplo, Person) puede almacenarse y ser leído desde un directorio usando estados personalizados y factorías de objetos. // Create the object to be bound Person john = new Person("Smith", "John Smith"); // Perform the bind ctx.rebind("cn=John Smith", john); // Read back the object Person john2 = (Person) ctx.lookup("cn=John Smith"); Aunque este ejemplo usa tanto una factoría de estado como una factoría de objetos, nos enfocaremos en la factoría de estado. Puedes ir a la lección Factorías de Objetos para ver una explicación más detallada sobre este tipo de factorías. En este ejemplo se usa el proveedor de servicios LDAP de Sun. Cuando se llama a Context.bind() sobre este proveedor, usa DirectoryManager.getStateToBind() para recuperar el estado del objeto a unir. Este ejemplo especifica en el fichero jndi.properties las factorías que usa. java.naming.factory.initial=com.sun.jndi.ldap.LdapCtxFactory java.naming.factory.state=PersonStateFactory java.naming.factory.object=PersonObjectFactory La PersonStateFactory acepta un ejemplar de Person y devuelve un ejemplar de DirStateFactory.Result que contiene los atributos que representan al objeto Person. public DirStateFactory.Result getStateToBind( Object obj, Name name, Context ctx, Hashtable env, Attributes inAttrs) throws NamingException { // Only interested in Person objects if (obj instanceof Person) { Attributes outAttrs; if (inAttrs == null) { outAttrs = new BasicAttributes(true); } else { outAttrs = (Attributes)inAttrs.clone(); } // Set up the object class if (outAttrs.get("objectclass") == null) { BasicAttribute oc = new BasicAttribute("objectclass", "person"); oc.add("top"); outAttrs.put(oc); } Person per = (Person)obj; // Mandatory attributes if (per.surname != null) { outAttrs.put("sn", per.surname); } else { throw new SchemaViolationException("Person must have surname"); } if (per.commonName != null) { outAttrs.put("cn", per.commonName); } else { throw new SchemaViolationException("Person must have common name"); } // Optional attributes if (per.passwd != null) { outAttrs.put("userPassword", per.passwd); } if (per.phone != null) { outAttrs.put("telephoneNumber", per.phone); } if (per.seeAlso != null) { outAttrs.put("seeAlso", per.seeAlso); } if (per.desc != null) { outAttrs.put("description", per.desc); } //System.out.println("state factory: " + outAttrs); return new DirStateFactory.Result(null, outAttrs); } return null; }
|