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