git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@275948 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -43,6 +43,16 @@ | |||
| </td> | |||
| <td valign="top" align="center">No</td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">textname</td> | |||
| <td valign="top"> | |||
| The textname attribute value becomes a macrodef | |||
| attribute that | |||
| gets set to the value of the text contents of the macro. | |||
| <em>since ant 1.6.1</em> | |||
| </td> | |||
| <td valign="top" align="center">No</td> | |||
| </tr> | |||
| </table> | |||
| <h3>Parameters specified as nested elements</h3> | |||
| <h4>attribute</h4> | |||
| @@ -88,6 +98,7 @@ | |||
| <td valign="top">description</td> | |||
| <td valign="top"> | |||
| This contains a description of the attribute. | |||
| <em>since ant 1.6.1</em> | |||
| </td> | |||
| <td valign="top" align="center">No</td> | |||
| </tr> | |||
| @@ -127,6 +138,7 @@ | |||
| <td valign="top"> | |||
| This contains a description | |||
| informing the user what the contents of the element are expected to be. | |||
| <em>since ant 1.6.1</em> | |||
| </td> | |||
| <td valign="top" align="center">No</td> | |||
| </tr> | |||
| @@ -196,6 +208,21 @@ | |||
| <linker refid="linker-libs"/> | |||
| </cc-elements> | |||
| </call-cc> | |||
| </pre> | |||
| </blockquote> | |||
| <p> | |||
| The following shows the use of the <code>textname</code> attribute. | |||
| </p> | |||
| <blockquote> | |||
| <pre class="code"> | |||
| <macrodef name="echotest" textname="text"> | |||
| <sequential> | |||
| <echo>@{text}</echo> | |||
| </sequential> | |||
| </macrodef> | |||
| <echotest> | |||
| Hello world | |||
| </echotest> | |||
| </pre> | |||
| </blockquote> | |||
| <hr> | |||
| @@ -101,4 +101,24 @@ | |||
| </MYELEMENT> | |||
| </ignore> | |||
| </target> | |||
| <target name="textname"> | |||
| <macrodef name="echotest" textname="text"> | |||
| <sequential> | |||
| <echo>@{text}</echo> | |||
| </sequential> | |||
| </macrodef> | |||
| <echotest> | |||
| Hello world | |||
| </echotest> | |||
| </target> | |||
| <target name="duplicatetextname"> | |||
| <macrodef name="echotest" textname="text"> | |||
| <attribute name="text"/> | |||
| <sequential> | |||
| <echo>@{text}</echo> | |||
| </sequential> | |||
| </macrodef> | |||
| </target> | |||
| </project> | |||
| @@ -81,6 +81,7 @@ public class MacroDef extends AntlibDefinition { | |||
| private String name; | |||
| private List attributes = new ArrayList(); | |||
| private Map elements = new HashMap(); | |||
| private String textName = null; | |||
| /** | |||
| * Name of the definition | |||
| @@ -90,6 +91,25 @@ public class MacroDef extends AntlibDefinition { | |||
| this.name = name; | |||
| } | |||
| /** | |||
| * Name of the text attribute. | |||
| * @param textName the name of the attribute to use for the | |||
| * text content of the macro. | |||
| * @since ant 1.6.1 | |||
| */ | |||
| public void setTextName(String textName) { | |||
| this.textName = textName; | |||
| } | |||
| /** | |||
| * @return the name of the text content attribute | |||
| * @since ant 1.6.1 | |||
| */ | |||
| public String getTextName() { | |||
| return textName; | |||
| } | |||
| /** | |||
| * This is the sequential nested element of the macrodef. | |||
| * | |||
| @@ -222,6 +242,11 @@ public class MacroDef extends AntlibDefinition { | |||
| throw new BuildException( | |||
| "the attribute nested element needed a \"name\" attribute"); | |||
| } | |||
| if (attribute.getName().equals(textName)) { | |||
| throw new BuildException( | |||
| "the attribute name \"" + attribute.getName() | |||
| + "\" has already been used by the textname attribute"); | |||
| } | |||
| for (int i = 0; i < attributes.size(); ++i) { | |||
| if (((Attribute) attributes.get(i)).getName().equals( | |||
| attribute.getName())) { | |||
| @@ -324,14 +349,16 @@ public class MacroDef extends AntlibDefinition { | |||
| /** | |||
| * @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 | |||
| * @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; | |||
| @@ -383,7 +410,7 @@ public class MacroDef extends AntlibDefinition { | |||
| public static class TemplateElement { | |||
| private String name; | |||
| private boolean optional = false; | |||
| private String description; | |||
| private String description; | |||
| /** | |||
| * The name of the element. | |||
| @@ -424,14 +451,16 @@ public class MacroDef extends AntlibDefinition { | |||
| /** | |||
| * @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 | |||
| * @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; | |||
| @@ -490,6 +519,15 @@ public class MacroDef extends AntlibDefinition { | |||
| if (!name.equals(other.name)) { | |||
| return false; | |||
| } | |||
| if (textName == null) { | |||
| if (other.textName != null) { | |||
| return false; | |||
| } | |||
| } else { | |||
| if (!textName.equals(other.textName)) { | |||
| return false; | |||
| } | |||
| } | |||
| if (getURI() == null || getURI().equals("") | |||
| || getURI().equals(ProjectHelper.ANT_CORE_URI)) { | |||
| if (!(other.getURI() == null || other.getURI().equals("") | |||
| @@ -88,6 +88,7 @@ public class MacroInstance extends Task implements DynamicConfigurator { | |||
| private Map nsElements = null; | |||
| private Map presentElements = new HashMap(); | |||
| private Hashtable localProperties = new Hashtable(); | |||
| private String text = ""; | |||
| /** | |||
| * Called from MacroDef.MyAntTypeDefinition#create() | |||
| @@ -246,6 +247,14 @@ public class MacroInstance extends Task implements DynamicConfigurator { | |||
| return ret.toString(); | |||
| } | |||
| /** | |||
| * Set the text contents for the macro. | |||
| * @param text the text to be added to the macro. | |||
| */ | |||
| public void addText(String text) { | |||
| this.text = text; | |||
| } | |||
| private UnknownElement copy(UnknownElement ue) { | |||
| UnknownElement ret = new UnknownElement(ue.getTag()); | |||
| ret.setNamespace(ue.getNamespace()); | |||
| @@ -331,6 +340,10 @@ public class MacroInstance extends Task implements DynamicConfigurator { | |||
| if (copyKeys.contains("id")) { | |||
| copyKeys.remove("id"); | |||
| } | |||
| if (macroDef.getTextName() != null) { | |||
| localProperties.put(macroDef.getTextName(), text); | |||
| } | |||
| if (copyKeys.size() != 0) { | |||
| throw new BuildException( | |||
| "Unknown attribute" + (copyKeys.size() > 1 ? "s " : " ") | |||
| @@ -115,5 +115,16 @@ public class MacroDefTest extends BuildFileTest { | |||
| "ignore-element-case", | |||
| "nested elementnested element"); | |||
| } | |||
| public void testTextName() { | |||
| expectLogContaining( | |||
| "textname", "Hello world"); | |||
| } | |||
| public void testDuplicateTextName() { | |||
| expectBuildException( | |||
| "duplicatetextname", | |||
| "the attribute text has already been specified"); | |||
| } | |||
| } | |||