FileDocCategorySizeDatePackage
RuntimeConfigurable.javaAPI DocApache Ant 1.7015787Wed Dec 13 06:16:18 GMT 2006org.apache.tools.ant

RuntimeConfigurable

public class RuntimeConfigurable extends Object implements Serializable
Wrapper class that holds the attributes of an element, its children, and any text within it. It then takes care of configuring that element at runtime.

Fields Summary
private static final Hashtable
EMPTY_HASHTABLE
Empty Hashtable.
private String
elementTag
Name of the element to configure.
private List
children
List of child element wrappers.
private transient Object
wrappedObject
The element to configure. It is only used during maybeConfigure.
private transient IntrospectionHelper.Creator
creator
the creator used to make the wrapped object
private transient AttributeList
attributes
XML attributes for the element.
private List
attributeNames
Attribute names and values. While the XML spec doesn't require preserving the order ( AFAIK ), some ant tests do rely on the exact order. The following code is copied from AttributeImpl. We could also just use SAX2 Attributes and convert to SAX1 ( DOM attribute Nodes can also be stored in SAX2 Attributes ) XXX under JDK 1.4 you can just use a LinkedHashMap for this purpose -jglick The only exception to this order is the treatment of refid. A number of datatypes check if refid is set when other attributes are set. This check will not work if the build script has the other attribute before the "refid" attribute, so now (ANT 1.7) the refid attribute will be processed first.
private Map
attributeMap
Map of attribute names to values
private StringBuffer
characters
Text appearing within the element.
private boolean
proxyConfigured
Indicates if the wrapped object has been configured
private String
polyType
the polymorphic type
private String
id
the "id" of this Element if it has one
Constructors Summary
public RuntimeConfigurable(Object proxy, String elementTag)
Sole constructor creating a wrapper for the specified object.

param
proxy The element to configure. Must not be null.
param
elementTag The tag name generating this element.


                                    
         
        setProxy(proxy);
        setElementTag(elementTag);
        // Most likely an UnknownElement
        if (proxy instanceof Task) {
            ((Task) proxy).setRuntimeConfigurableWrapper(this);
        }
    
Methods Summary
public synchronized voidaddChild(org.apache.tools.ant.RuntimeConfigurable child)
Adds a child element to the wrapped element.

param
child The child element wrapper to add to this one. Must not be null.

        children = (children == null) ? new ArrayList() : children;
        children.add(child);
    
public synchronized voidaddText(java.lang.String data)
Adds characters from #PCDATA areas to the wrapped element.

param
data Text to add to the wrapped element. Should not be null.

        if (data.length() == 0) {
            return;
        }
        characters = (characters == null)
            ? new StringBuffer(data) : characters.append(data);
    
public synchronized voidaddText(char[] buf, int start, int count)
Adds characters from #PCDATA areas to the wrapped element.

param
buf A character array of the text within the element. Must not be null.
param
start The start element in the array.
param
count The number of characters to read from the array.

        if (count == 0) {
            return;
        }
        characters = ((characters == null)
            ? new StringBuffer(count) : characters).append(buf, start, count);
    
public voidapplyPreSet(org.apache.tools.ant.RuntimeConfigurable r)
Apply presets, attributes and text are set if not currently set. Nested elements are prepended.

param
r a RuntimeConfigurable value.

        // Attributes
        if (r.attributeMap != null) {
            for (Iterator i = r.attributeMap.keySet().iterator(); i.hasNext();) {
                String name = (String) i.next();
                if (attributeMap == null || attributeMap.get(name) == null) {
                    setAttribute(name, (String) r.attributeMap.get(name));
                }
            }
        }
        // poly type

        polyType = (polyType == null) ? r.polyType : polyType;

        // Children (this is a shadow of UnknownElement#children)
        if (r.children != null) {
            List newChildren = new ArrayList();
            newChildren.addAll(r.children);
            if (children != null) {
                newChildren.addAll(children);
            }
            children = newChildren;
        }

        // Text
        if (r.characters != null) {
            if (characters == null
                || characters.toString().trim().length() == 0) {
                characters = new StringBuffer(r.characters.toString());
            }
        }
    
public synchronized java.util.HashtablegetAttributeMap()
Return the attribute map.

return
Attribute name to attribute value map.
since
Ant 1.6

        return (attributeMap == null)
            ? EMPTY_HASHTABLE : new Hashtable(attributeMap);
    
public synchronized org.xml.sax.AttributeListgetAttributes()
Returns the list of attributes for the wrapped element.

deprecated
Deprecated since Ant 1.6 in favor of {@link #getAttributeMap}.
return
An AttributeList representing the attributes defined in the XML for this element. May be null.

        return attributes;
    
synchronized org.apache.tools.ant.RuntimeConfigurablegetChild(int index)
Returns the child wrapper at the specified position within the list.

param
index The index of the child to return.
return
The child wrapper at position index within the list.

        return (RuntimeConfigurable) children.get(index);
    
public synchronized java.util.EnumerationgetChildren()
Returns an enumeration of all child wrappers.

return
an enumeration of the child wrappers.
since
Ant 1.6

        return (children == null) ? new CollectionUtils.EmptyEnumeration()
            : Collections.enumeration(children);
    
public synchronized java.lang.StringgetElementTag()
Returns the tag name of the wrapped element.

return
The tag name of the wrapped element. This is unlikely to be null, but may be.

        return elementTag;
    
public synchronized java.lang.StringgetId()
Returns the id for this element.

return
the id.

        return id;
    
public synchronized java.lang.StringgetPolyType()
Get the polymorphic type for this element.

return
the ant component type name, null if not set.

        return polyType;
    
public synchronized java.lang.ObjectgetProxy()
Get the object for which this RuntimeConfigurable holds the configuration information.

return
the object whose configure is held by this instance.

        return wrappedObject;
    
public synchronized java.lang.StringBuffergetText()
Get the text content of this element. Various text chunks are concatenated, there is no way ( currently ) of keeping track of multiple fragments.

return
the text content of this element.
since
Ant 1.6

        return (characters == null) ? new StringBuffer(0) : characters;
    
public voidmaybeConfigure(Project p)
Configures the wrapped element and all its children. The attributes and text for the wrapped element are configured, and then each child is configured and added. Each time the wrapper is configured, the attributes and text for it are reset. If the element has an id attribute, a reference is added to the project as well.

param
p The project containing the wrapped element. Must not be null.
exception
BuildException if the configuration fails, for instance due to invalid attributes or children, or text being added to an element which doesn't accept it.

        maybeConfigure(p, true);
    
public synchronized voidmaybeConfigure(Project p, boolean configureChildren)
Configures the wrapped element. The attributes and text for the wrapped element are configured. Each time the wrapper is configured, the attributes and text for it are reset. If the element has an id attribute, a reference is added to the project as well.

param
p The project containing the wrapped element. Must not be null.
param
configureChildren ignored.
exception
BuildException if the configuration fails, for instance due to invalid attributes , or text being added to an element which doesn't accept it.


        if (proxyConfigured) {
            return;
        }

        // Configure the object
        Object target = (wrappedObject instanceof TypeAdapter)
            ? ((TypeAdapter) wrappedObject).getProxy() : wrappedObject;

        IntrospectionHelper ih =
            IntrospectionHelper.getHelper(p, target.getClass());

        if (attributeNames != null) {
            for (int i = 0; i < attributeNames.size(); i++) {
                String name = (String) attributeNames.get(i);
                String value = (String) attributeMap.get(name);

                // reflect these into the target
                value = p.replaceProperties(value);
                try {
                    ih.setAttribute(p, target, name, value);
                } catch (UnsupportedAttributeException be) {
                    // id attribute must be set externally
                    if (name.equals("id")) {
                        // Do nothing
                    } else  if (getElementTag() == null) {
                        throw be;
                    } else {
                        throw new BuildException(
                            getElementTag() +  " doesn't support the \""
                            + be.getAttribute() + "\" attribute", be);
                    }
                } catch (BuildException be) {
                    if (name.equals("id")) {
                        // Assume that this is an not supported attribute type
                        // thrown for example by a dymanic attribute task
                        // Do nothing
                    } else {
                        throw be;
                    }
                }
            }
        }

        if (characters != null) {
            ProjectHelper.addText(p, wrappedObject, characters.substring(0));
        }

        if (id != null) {
            p.addReference(id, wrappedObject);
        }
        proxyConfigured = true;
    
public voidreconfigure(Project p)
Reconfigure the element, even if it has already been configured.

param
p the project instance for this configuration.

        proxyConfigured = false;
        maybeConfigure(p);
    
public synchronized voidremoveAttribute(java.lang.String name)
Delete an attribute. Not for the faint of heart.

param
name the name of the attribute to be removed.

        attributeNames.remove(name);
        attributeMap.remove(name);
    
public synchronized voidsetAttribute(java.lang.String name, java.lang.String value)
Set an attribute to a given value.

param
name the name of the attribute.
param
value the attribute's value.

        if (name.equalsIgnoreCase(ProjectHelper.ANT_TYPE)) {
            this.polyType = value;
        } else {
            if (attributeNames == null) {
                attributeNames = new ArrayList();
                attributeMap = new HashMap();
            }
            if (name.toLowerCase(Locale.US).equals("refid")) {
                attributeNames.add(0, name);
            } else {
                attributeNames.add(name);
            }
            attributeMap.put(name, value);
            if (name.equals("id")) {
                this.id = value;
            }
        }
    
public synchronized voidsetAttributes(org.xml.sax.AttributeList attributes)
Sets the attributes for the wrapped element.

deprecated
since 1.6.x.
param
attributes List of attributes defined in the XML for this element. May be null.

        this.attributes = new AttributeListImpl(attributes);
        for (int i = 0; i < attributes.getLength(); i++) {
            setAttribute(attributes.getName(i), attributes.getValue(i));
        }
    
synchronized voidsetCreator(IntrospectionHelper.Creator creator)
Sets the creator of the element to be configured used to store the element in the parent.

param
creator the creator object.

        this.creator = creator;
    
public synchronized voidsetElementTag(java.lang.String elementTag)
Set the element tag.

param
elementTag The tag name generating this element.

        this.elementTag = elementTag;
    
public synchronized voidsetPolyType(java.lang.String polyType)
Set the polymorphic type for this element.

param
polyType the ant component type name, null if not set.

        this.polyType = polyType;
    
public synchronized voidsetProxy(java.lang.Object proxy)
Sets the element to configure.

param
proxy The element to configure. Must not be null.

        wrappedObject = proxy;
        proxyConfigured = false;