| 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:
> - `getAttributes(Name name)`
> - `getAttributes(Name name, String[] attrIDs)`

> 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

> >     getAttributes(name, null);

> Therefore its implementation should only call the longhand form, as follows.

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