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;
}
|