State Factories

 


Custom Object Example

This example illustrates how an arbitrary type (e.g., Person) can be stored and read back from the directory by using custom state and object factories.
// 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");
Although this example uses both a state factory and an object factory, the focus is on the state factory. See the Object Factories lesson for a detailed discussion of object factories.

Sun's LDAP service provider is used for this example. When Context.bind() is invoked on this provider, it uses DirectoryManager.getStateToBind() to retrieve the state of the object to be bound. This example specifies in the jndi.properties file the factories that it uses.

java.naming.factory.initial=com.sun.jndi.ldap.LdapCtxFactory
java.naming.factory.state=PersonStateFactory
java.naming.factory.object=PersonObjectFactory
(See the Beyond the Basics trail for details about environment properties.)

The PersonStateFactory accepts an instance of Person and returns a DirStateFactory.Result instance that contains the attributes representing the Person object.

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

State Factories: End of Lesson

What's next? Now you can:

  • Continue on in this trail to learn how to read Java objects from the directory.
  • Go to the Representation in the Directory lesson to read about the physical representation of Java objects in the directory.

State Factories