opendap/src/main/java/opendap/dap/DAS.java
private void resolveAliases(AttributeTable at) throws MalformedAliasException, UnresolvedAliasException, NoSuchAttributeException
    {
        // Cache the current (parent) Attribute table. This value is
        // null if this method is called from parse();
        AttributeTable cacheAT = currentAT;
        try {

        // Set the current AttributeTable to the one that we are searching.
        currentAT = at;

        if (Debug.isSet("DAS")) {
		    DAPNode.log.debug("DAS.resolveAliases(at=" + at + ")");
	    }

        //getall of the Attributes from the table.
        Enumeration aNames = at.getNames();
        while (aNames.hasMoreElements()) {

            String aName = (String) aNames.nextElement();
            if (Debug.isSet("DAS")) {
		DAPNode.log.debug("DAS.resolveAliases(at=" + at + ") - aName: " + aName);
	    }

            opendap.dap.Attribute thisA = currentAT.getAttribute(aName);

            if (Debug.isSet("DAS")) {
		DAPNode.log.debug("thisA.getClass().getName(): " + thisA.getClass().getName());
	    }

            if (thisA.isAlias()) {
                //Is Alias? Resolve it!
                resolveAlias((Alias) thisA);
                if (Debug.isSet("DAS")) {
		DAPNode.log.debug("Resolved Alias: '" + thisA.getEncodedName() + "'\n");
	    }
            } else if (thisA.isContainer()) {
                //Is AttributeTable (container)? Search it!

                resolveAliases(thisA.getContainer());

            }
        }
    } finally {
        // Restore the previous currentAT state.
        currentAT = cacheAT;
}

    }
private void resolveAliases(AttributeTable at) throws MalformedAliasException, UnresolvedAliasException, NoSuchAttributeException
    {
        // Cache the current (parent) Attribute table. This value is
        // null if this method is called from parse();
        AttributeTable cacheAT = currentAT;
        try {

        // Set the current AttributeTable to the one that we are searching.
        currentAT = at;

        if (Debug.isSet("DAS")) {
		    DAPNode.log.debug("DAS.resolveAliases(at=" + at + ")");
	    }

        //getall of the Attributes from the table.
        Enumeration aNames = at.getNames();
        while (aNames.hasMoreElements()) {

            String aName = (String) aNames.nextElement();
            if (Debug.isSet("DAS")) {
		DAPNode.log.debug("DAS.resolveAliases(at=" + at + ") - aName: " + aName);
	    }

            opendap.dap.Attribute thisA = currentAT.getAttribute(aName);

            if (Debug.isSet("DAS")) {
		DAPNode.log.debug("thisA.getClass().getName(): " + thisA.getClass().getName());
	    }

            if (thisA.isAlias()) {
                //Is Alias? Resolve it!
                resolveAlias((Alias) thisA);
                if (Debug.isSet("DAS")) {
		DAPNode.log.debug("Resolved Alias: '" + thisA.getEncodedName() + "'\n");
	    }
            } else if (thisA.isContainer()) {
                //Is AttributeTable (container)? Search it!

                resolveAliases(thisA.getContainer());

            }
        }
    } finally {
        // Restore the previous currentAT state.
        currentAT = cacheAT;
}

    }
This method recursively searchs through the passed <code>AttributeTable</code> parameter
at for Alias members. When an Alias is found the method attempts to
resolve it to a specific Attribute.
<p/>
This method gets called is invoked by <code>reolveAliases(BaseType bt)</code>, and is
used to search for Aliases in AttributeTables found in a BaseTypes Attributes.
<p/>
This method manipulates the global variable <code>currentBT</code>.

@param at The <code>AttributeTable</code> in which to search for and resolve Alias members