Adding Directory Support |
The Essential Components lesson showed how to use JNDI utilities to make a context implementation extensible. When you are building a directory context implementation, you should replace those utilities with the ones described here.Reading Objects
A directory context implementation should use DirectoryManager.getObjectInstance() before returning an object to the user program from one of the following methods: Here is how the hierarchical directory example calls getObjectInstance() in its lookup().// Code that determine "inter" is the object bound to the // atomic name "atom" ... // Get the object's attributes Attributes attrs; if (inter instanceof DirContext) { attrs = ((DirContext)inter).getAttributes(""); } else { // Fetch the object's attributes from this context attrs = (Attributes) bindingAttrs.get(atom); } // Call getObjectInstance() for using any object factories try { return DirectoryManager.getObjectInstance(inter, new CompositeName().add(atom), this, myEnv, attrs); } catch (Exception e) { NamingException ne = new NamingException("getObjectInstance failed"); ne.setRootCause(e); throw ne; }Similarly, when returning the enumeration generated by Context.listBindings() or overloads of DirContext.search() , you should call getObjectInstance() for the object in each Binding or SearchResult in the enumeration.
Here is the definition of the list enumeration's next() method.
public Object next() throws NamingException { String name = (String)names.nextElement(); Object obj = bindings.get(name); try { // Get the attributes Attributes attrs; if (obj instanceof DirContext) { attrs = ((DirContext)obj).getAttributes(""); } else { // Fetch the object's attributes from this context attrs = (Attributes) bindingAttrs.get(name); } obj = DirectoryManager.getObjectInstance( obj, new CompositeName().add(name), HierDirCtx.this, HierDirCtx.this.myEnv, attrs); } catch (Exception e) { NamingException ne = new NamingException("getObjectInstance failed"); ne.setRootCause(e); throw ne; } return new Binding(name, obj); }Storing Objects
A directory context implementation should use DirectoryManager.getStateToBind() before storing an object given by the user program to one of the following methods:Here is how the hierarchical directory example calls getStateToBind() in its bind() and rebind() methods.
DirectoryManager.getStateToBind() returns an instance of DirStateFactory.Result, which is a tuple consisting of the object to bind and the attributes to associate with the object. Upon receiving the result, the context implementation updates its internal bindings table and attributes table.// Code that determined that this is the context in which // to bind the atomic name "atom" to the object "obj" ... // Call getStateToBind for using any state factories DirStateFactory.Result res = DirectoryManager.getStateToBind( obj, new CompositeName().add(atom), this, myEnv, attrs); // Add the object to the internal data structure bindings.put(atom, res.getObject()); // Add the attributes if (res.getAttributes() != null) { bindingAttrs.put(atom, deepClone(res.getAttributes())); }Adding Directory Support: End of Lesson
What's next? Now you can:
- Continue on in this trail to learn how to add pieces to the service provider for supporting URLs.
- Go to the Adding Federation Support lesson to learn how to add federation support to a service provider.
- Go to the Miscellaneous lesson to learn how to add various enhancements to a service provider, such as adding support for referrals and bundling factories.
Adding Directory Support |