El ejemplo de objeto personalizado
ilustra cómo un ejemplar de una clase definida por el usuario, Person
es almacenado y recuperado desde el directorio. Cuando se buscan los atributos
de un objeto Person desde el directorio, el método Context.lookup()
convierte estos atributos en un ejemplar de Person.
Person john2 = (Person) ctx.lookup("cn=John Smith");
Esto es posible porque.
El proveedor de servicio utilizado (LDAP de Sun) llama a DirectoryManager.getObjectInstance() y suministra al método el objeto (un objeto contexto LDAP) y los atributos que
el proveedor lee desde el directorio de la entrada "cn=John
Smith".
PersonObjectFactory.getObjectInstance() devuelve un ejemplar
de Person.
PersonObjectFactory.getObjectInstance() primero verifica que el
objeto está pensado para su factoría. Lo hace chequeando que el atributo "objectclass"
tiene un valor de "person". Si esta verificación
falla, el método devuelve null. De otro modo, construye un
ejemplar de Person suministrandole al constructor los valores
obtenidos de las otras entradas de atriutos, como "surname"
y "commonname".
Aquí tenemos la definición de PersonObjectFactory.getObjectInstance().
public Object getObjectInstance(
Object obj, Name name, Context ctx, Hashtable env, Attributes attrs)
throws Exception {
// Only interested in Attributes with "person" objectclass
// System.out.println("object factory: " + attrs);
Attribute oc = (attrs != null ? attrs.get("objectclass") : null);
if (oc != null && oc.contains("person")) {
Attribute attr;
String passwd = null;
// Extract the password
attr = attrs.get("userPassword");
if (attr != null) {
passwd = new String((byte[])attr.get());
}
Person per = new Person(
(String)attrs.get("sn").get(),
(String)attrs.get("cn").get(),
passwd,
(attr=attrs.get("telephoneNumber")) != null ? (String)attr.get() : null,
(attr=attrs.get("seealso")) != null ? (String)attr.get() : null,
(attr=attrs.get("description")) != null ? (String)attr.get() : null);
return per;
}
return null;
}