Adding Directory Support
Attribute Retrieval
The DirContext interface contains the following methods (plus their java.lang.String overloads) for retrieving the attributes of an object in a directory:Retrieving object attributes is the most basic of directory operations in the DirContext interface. Most directory context implementation support these methods.
Note that getAttributes(name) is just a shorthand form of writing
Therefore its implementation should only call the longhand form, as follows.getAttributes(name, null);public Attributes getAttributes(Name name) throws NamingException { return getAttributes(name, null); // Same as attrIds == null }The implementation of getAttributes() depends on the attribute model of the underlying directory service. An actual implementation might need to do no more than pass the name and request to the underlying directory service for processing.
The hierarchical directory example uses a similar pattern as that for the Context operations in the hierarchical namespace example. Basically, it first determines whether the request is for this context or for a context or object named relative to this context. If it is for this context, then a copy of the context's attributes is returned. If it is for an immediate child object, then a copy of the object's attributes is returned. Otherwise, the next atomic name is resolved to a DirContext and the request is passed on to that context.
public Attributes getAttributes(Name name, String[] attrIds) throws NamingException { if (name.isEmpty()) { // Ask for the attributes of this context return deepClone(myAttrs); } // Extract the components that belong to this namespace Name nm = getMyComponents(name); String atom = nm.get(0); Object inter = bindings.get(atom); if (nm.size() == 1) { // Atomic name; find object in the internal data structure if (inter == null) { throw new NameNotFoundException(name + " not found"); } if (inter instanceof DirContext) { return ((DirContext)inter).getAttributes("", attrIds); } else { // Fetch the object's attributes from this context Attributes attrs = (Attributes) bindingAttrs.get(atom); if (attrs == null) { return new BasicAttributes(); } else { return deepClone(attrs); } } } else { // Intermediate name; consume the name in this context // and then continue if (!(inter instanceof DirContext)) { throw new NotContextException(atom + " does not name a dircontext"); } return ((DirContext)inter).getAttributes(nm.getSuffix(1), attrIds); } }
Adding Directory Support