@@ -40,6 +40,7 @@ import org.apache.tools.ant.UnknownElement;
* @since Ant 1.6
*/
public class MacroDef extends AntlibDefinition {
private NestedSequential nestedSequential;
private String name;
private boolean backTrace = true;
@@ -88,7 +89,6 @@ public class MacroDef extends AntlibDefinition {
* @return the nested text element
* @since ant 1.6.1
*/
public Text getText() {
return text;
}
@@ -96,10 +96,10 @@ public class MacroDef extends AntlibDefinition {
/**
* Set the backTrace attribute.
*
* @param backTrace if true and the macro instance generates has
* @param backTrace if true and the macro instance generates
* an error, a backtrace of the location within
* the macro and call to the macro will be outo ut.
* if false, only the location of the call to
* the macro and call to the macro will be outp ut.
* if false, only the location of the call to the
* macro will be shown. Default is true.
* @since ant 1.7
*/
@@ -194,6 +194,8 @@ public class MacroDef extends AntlibDefinition {
}
/**
* Gets this macro's attribute (and define?) list.
*
* @return the nested Attributes
*/
public List getAttributes() {
@@ -201,7 +203,10 @@ public class MacroDef extends AntlibDefinition {
}
/**
* @return the nested elements
* Gets this macro's elements.
*
* @return the map nested elements, keyed by element name, with
* {@link TemplateElement} values.
*/
public Map getElements() {
return elements;
@@ -209,7 +214,8 @@ public class MacroDef extends AntlibDefinition {
/**
* Check if a character is a valid character for an element or
* attribute name
* attribute name.
*
* @param c the character to check
* @return true if the character is a letter or digit or '.' or '-'
* attribute name
@@ -220,8 +226,8 @@ public class MacroDef extends AntlibDefinition {
}
/**
* Check if a string is a valid name for an element or
* attribute
* Check if a string is a valid name for an element or attribute.
*
* @param name the string to check
* @return true if the name consists of valid name characters
*/
@@ -319,7 +325,6 @@ public class MacroDef extends AntlibDefinition {
/**
* Create a new ant type based on the embedded tasks and types.
*
*/
public void execute() {
if (nestedSequential == null) {
@@ -343,54 +348,42 @@ public class MacroDef extends AntlibDefinition {
}
/**
* A nested element for the MacroDef task .
* Base class for a macro's attributes, elements, and text element .
*
* @since ant 1.7
*/
public static class Attribute {
public static class Member {
private String name;
private String defaultValue;
private String description;
/**
* The name of the attribute .
* Sets the name of this member .
*
* @param name the name of the attribute
*/
public void setName(String name) {
if (!isValidName(name)) {
throw new BuildException(
"Illegal name [" + name + "] for attribute ");
"Illegal name [" + name + "] for macro member ");
}
this.name = name.toLowerCase(Locale.US);
}
/**
* @return the name of the attribute
* Gets the name of this macro member.
*
* @return the name of the member.
*/
public String getName() {
return name;
}
/**
* The default value to use if the parameter is not
* used in the templated instance .
* Sets a textual description of this member,
* for build documentation purposes only .
*
* @param defaultValue the default value
*/
public void setDefault(String defaultValue) {
this.defaultValue = defaultValue;
}
/**
* @return the default value, null if not set
*/
public String getDefault() {
return defaultValue;
}
/**
* @param desc Description of the element.
* @since ant 1.6.1
*/
@@ -399,6 +392,8 @@ public class MacroDef extends AntlibDefinition {
}
/**
* Gets the description of this member.
*
* @return the description of the element, or <code>null</code> if
* no description is available.
* @since ant 1.6.1
@@ -408,55 +403,104 @@ public class MacroDef extends AntlibDefinition {
}
/**
* equality method
* equality method.
*
* @param obj an <code>Object</code> value
* @return a <code>boolean</code> value
*/
public boolean equals(Object obj) {
if (obj == null ) {
return fals e;
if (obj == this ) {
return tru e;
}
if (obj.getClass() != getClass( )) {
return false ;
if (obj != null && obj.getClass().equals(getClass() )) {
equals((Member) obj) ;
}
Attribute other = (Attribute) obj;
if (name == null) {
if (other.name != null) {
return false;
}
} else if (!name.equals(other.name)) {
return false;
}
if (defaultValue == null) {
if (other.defaultValue != null) {
return false;
}
} else if (!defaultValue.equals(other.defaultValue)) {
return false;
}
return true;
return false;
}
/**
* Equality method once it has been ascertain the object
* to compare to is not ourselves and is of the same type.
*
* @param m macro member guaranteed to be of the same type as this.
* @return a <code>boolean</code> value
*/
protected boolean equals(Member m) {
return (name == null)? m.name == null: name.equals(m.name);
}
/**
* Gets the hash code of this member, consistent with equals.
* @return a hash code value for this object.
*/
public int hashCode() {
return objectHashCode(defaultValue) + objectHashCode( name);
return objectHashCode(name);
}
}
} // END static class Member
/**
* An attribute for the MacroDef task.
*/
public static class Attribute extends Member {
private String defaultValue;
/**
* The default value to use if the parameter is not
* used in the templated instance.
*
* @param defaultValue the default value
*/
public void setDefault(String defaultValue) {
this.defaultValue = defaultValue;
}
/**
* @return the default value, null if not set
*/
public String getDefault() {
return defaultValue;
}
/** {@inheritDoc}. */
protected boolean equals(Member m) {
Attribute a = (Attribute) m;
return super.equals(m) &&
(defaultValue == null)? a.defaultValue == null:
defaultValue.equals(a.defaultValue);
}
/** {@inheritDoc}. */
public int hashCode() {
return super.hashCode() + objectHashCode(defaultValue);
}
} // END static class Attribute
/**
* A nested define element for the MacroDef task.
* It provides an attribute with a guatanteed unique value on every instantiation of the macro.
*
* It provides an attribute with a guatanteed unique value
* on every instantiation of the macro. This allows to use
* this uniquely named attribute in property names used
* internally by the macro, thus creating unique property
* names and side-stepping Ant's property immutability rules.
* <p>
* Of course, this work around as the side effect of littering
* the global Ant property namespace, so is far for ideal, but
* will have to make do awaiting a better fix...
*
* @since ant 1.7
*/
public static class DefineAttribute extends Attribute {
private static long count = 0;
private String prefix = "";
/**
* Set a prefix for the generated name
* Sets a prefix for the generated name.
*
* @param prefixValue the prefix to use.
*/
public void setPrefix(String prefixValue) {
@@ -464,9 +508,12 @@ public class MacroDef extends AntlibDefinition {
}
/**
* Set the default value.
* Sets the default value.
*
* This is not allowed for the define nested element.
*
* @param defaultValue not used
* @throws BuildException, always
*/
public void setDefault(String defaultValue) {
throw new BuildException(
@@ -474,47 +521,29 @@ public class MacroDef extends AntlibDefinition {
}
/**
* Get the default value for this attibute.
* This returns the name "prefix#this classname#<aCounter>".
* @return the generated name
* Gets the default value for this attibute.
*
* @return the generated <em>unique</em> name, of the form
* "prefix#this classname#<aCounter>".
*/
public String getDefault() {
synchronized (DefineAttribute.class) {
// Make sure counter is managed globally
return prefix + "#" + DefineAttribute.class .getName() + "#" + (++count);
return prefix + "#" + getClass() .getName() + "#" + (++count);
}
}
}
} // END static class DefineAttribute
/**
* A nested text element for the MacroDef task.
*
* @since ant 1.6.1
*/
public static class Text {
private String name;
public static class Text extends Member {
private boolean optional;
private boolean trim;
private String description;
/**
* The name of the attribute.
*
* @param name the name of the attribute
*/
public void setName(String name) {
if (!isValidName(name)) {
throw new BuildException(
"Illegal name [" + name + "] for attribute");
}
this.name = name.toLowerCase(Locale.US);
}
/**
* @return the name of the attribute
*/
public String getName() {
return name;
}
/**
* The optional attribute of the text element.
@@ -526,6 +555,8 @@ public class MacroDef extends AntlibDefinition {
}
/**
* Gets whether this text element is optional or not.
*
* @return true if the text is optional
*/
public boolean getOptional() {
@@ -543,97 +574,34 @@ public class MacroDef extends AntlibDefinition {
}
/**
* Gets whether to trim the raw provided text.
*
* @return true if the text is trim
*/
public boolean getTrim() {
return trim;
}
/**
* @param desc Description of the text.
*/
public void setDescription(String desc) {
description = desc;
/** {@inheritDoc}. */
protected boolean equals(Member m) {
Text t = (Text) m;
return super.equals(m) &&
optional == t.optional &&
trim == t.trim;
}
/**
* @return the description of the text, or <code>null</code> if
* no description is available.
*/
public String getDescription() {
return description;
}
/**
* equality method
*
* @param obj an <code>Object</code> value
* @return a <code>boolean</code> value
*/
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (obj.getClass() != getClass()) {
return false;
}
Text other = (Text) obj;
if (name == null) {
if (other.name != null) {
return false;
}
} else if (!name.equals(other.name)) {
return false;
}
if (optional != other.optional) {
return false;
}
if (trim != other.trim) {
return false;
}
return true;
}
/**
* @return a hash code value for this object.
*/
public int hashCode() {
return objectHashCode(name);
}
}
} // END static class Text
/**
* A nested element for the MacroDef task.
*
*/
public static class TemplateElement {
private String name;
public static class TemplateElement extends Member {
private boolean optional = false;
private boolean implicit = false;
private String description;
/**
* The name of the element.
*
* @param name the name of the element.
*/
public void setName(String name) {
if (!isValidName(name)) {
throw new BuildException(
"Illegal name [" + name + "] for attribute");
}
this.name = name.toLowerCase(Locale.US);
}
/**
* @return the name of the element.
*/
public String getName() {
return name;
}
/**
* is this element optional ?
* Sets whether this element is optional.
*
* @param optional if true this element may be left out, default
* is false.
@@ -643,6 +611,8 @@ public class MacroDef extends AntlibDefinition {
}
/**
* Gets whether this element is optional.
*
* @return the optional attribute
*/
public boolean isOptional() {
@@ -650,7 +620,7 @@ public class MacroDef extends AntlibDefinition {
}
/**
* is this element implicit ?
* Sets whether this element is implicit.
*
* @param implicit if true this element may be left out, default
* is false.
@@ -660,61 +630,30 @@ public class MacroDef extends AntlibDefinition {
}
/**
* Gets whether this element is implicit.
*
* @return the implicit attribute
*/
public boolean isImplicit() {
return implicit;
}
/**
* @param desc Description of the element.
* @since ant 1.6.1
*/
public void setDescription(String desc) {
description = desc;
}
/**
* @return the description of the element, or <code>null</code> if
* no description is available.
* @since ant 1.6.1
*/
public String getDescription() {
return description;
}
/**
* equality method
*
* @param obj an <code>Object</code> value
* @return a <code>boolean</code> value
*/
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (obj.getClass() != getClass()) {
return false;
}
TemplateElement other = (TemplateElement) obj;
if (name == null) {
if (other.name != null) {
return false;
}
} else if (!name.equals(other.name)) {
return false;
}
return optional == other.optional && implicit == other.implicit;
/** {@inheritDoc}. */
protected boolean equals(Member m) {
TemplateElement t = (TemplateElement) m;
return super.equals(m) &&
optional == t.optional &&
implicit == t.implicit;
}
/**
* @return a hash code value for this object.
*/
public int hashCode() {
return objectHashCode(name)
+ (optional ? 1 : 0) + (implicit ? 1 : 0);
return super.hashCode() + (optional ? 1 : 0) + (implicit ? 1 : 0);
}
}
} // END static class TemplateElement
/**
* same or similar equality method for macrodef, ignores project and
@@ -808,7 +747,7 @@ public class MacroDef extends AntlibDefinition {
* is given.
*/
private static class MyAntTypeDefinition extends AntTypeDefinition {
private MacroDef macroDef;
private MacroDef macroDef;
/**
* Creates a new <code>MyAntTypeDefinition</code> instance.
@@ -820,7 +759,7 @@ public class MacroDef extends AntlibDefinition {
}
/**
* c reate an instance of the definition.
* C reate an instance of the definition.
* The instance may be wrapped in a proxy class.
* @param project the current project
* @return the created object
@@ -873,4 +812,5 @@ public class MacroDef extends AntlibDefinition {
return o.hashCode();
}
}
}
}