You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by pe...@apache.org on 2005/01/13 14:53:19 UTC
cvs commit: ant/src/main/org/apache/tools/ant/taskdefs MacroDef.java MacroInstance.java
peterreilly 2005/01/13 05:53:19
Modified: src/main/org/apache/tools/ant/taskdefs MacroDef.java
MacroInstance.java
Log:
Add in Jose's <define> nested element for <macrodef>
manual and testcases to follow...
Revision Changes Path
1.27 +75 -5 ant/src/main/org/apache/tools/ant/taskdefs/MacroDef.java
Index: MacroDef.java
===================================================================
RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/MacroDef.java,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -r1.26 -r1.27
--- MacroDef.java 27 May 2004 14:38:46 -0000 1.26
+++ MacroDef.java 13 Jan 2005 13:53:19 -0000 1.27
@@ -226,21 +226,51 @@
}
if (attribute.getName().equals(textName)) {
throw new BuildException(
- "the attribute name \"" + attribute.getName()
+ "the name \"" + attribute.getName()
+ "\" has already been used by the text element");
}
for (int i = 0; i < attributes.size(); ++i) {
- if (((Attribute) attributes.get(i)).getName().equals(
- attribute.getName())) {
+ Attribute att = (Attribute) attributes.get(i);
+ if (att.getName().equals(attribute.getName())) {
throw new BuildException(
- "the attribute " + attribute.getName()
- + " has already been specified");
+ "the name \"" + attribute.getName()
+ + "\" has already been used in "
+ + (att instanceof DefineAttribute ? "a define element"
+ : "another attribute element"));
}
}
attributes.add(attribute);
}
/**
+ * Add a define element.
+ *
+ * @param def a define nested element.
+ */
+ public void addConfiguredDefine(DefineAttribute def) {
+ if (def.getName() == null) {
+ throw new BuildException(
+ "the define nested element needed a \"name\" attribute");
+ }
+ if (def.getName().equals(textName)) {
+ throw new BuildException(
+ "the name \"" + def.getName()
+ + "\" has already been used by the text element");
+ }
+ for (int i = 0; i < attributes.size(); ++i) {
+ Attribute att = (Attribute) attributes.get(i);
+ if (att.getName().equals(def.getName())) {
+ throw new BuildException(
+ "the name \"" + def.getName()
+ + "\" has already been used in "
+ + (att instanceof DefineAttribute ? "another define element"
+ : "an attribute element"));
+ }
+ }
+ attributes.add(def);
+ }
+
+ /**
* Add an element element.
*
* @param element an element nested element.
@@ -388,6 +418,46 @@
*/
public int hashCode() {
return objectHashCode(defaultValue) + objectHashCode(name);
+ }
+ }
+
+ /**
+ * A nested define element for the MacroDef task.
+ * It provides an attribute with a guatanteed unique value on every instantiation of the macro.
+ * @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
+ * @param prefixValue the prefix to use.
+ */
+ public void setPrefix(String prefixValue) {
+ prefix = prefixValue;
+ }
+
+ /**
+ * Set the default value.
+ * This is not allowed for the define nested element.
+ * @param defaultValue not used
+ */
+ public void setDefault(String defaultValue) {
+ throw new BuildException(
+ "Illegal attribute \"default\" for define element");
+ }
+
+ /**
+ * Get the default value for this attibute.
+ * This returns the name "prefix#this classname#<a counter>.
+ * @return the generated name
+ */
+ public String getDefault() {
+ synchronized (DefineAttribute.class) {
+ // Make sure counter is managed globally
+ return prefix + "#" + DefineAttribute.class.getName() + "#" + (++count);
+ }
}
}
1.30 +3 -0 ant/src/main/org/apache/tools/ant/taskdefs/MacroInstance.java
Index: MacroInstance.java
===================================================================
RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/MacroInstance.java,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -r1.29 -r1.30
--- MacroInstance.java 12 Nov 2004 15:14:59 -0000 1.29
+++ MacroInstance.java 13 Jan 2005 13:53:19 -0000 1.30
@@ -335,6 +335,9 @@
if (value == null) {
value = attribute.getDefault();
value = macroSubs(value, localProperties);
+ } else if (attribute instanceof MacroDef.DefineAttribute) {
+ // Do not process given value, will fail as unknown attribute
+ continue;
}
if (value == null) {
throw new BuildException(
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org