diff options
author | Matt Benson <mbenson@apache.org> | 2022-02-24 20:45:08 -0600 |
---|---|---|
committer | Matt Benson <mbenson@apache.org> | 2022-02-24 20:45:08 -0600 |
commit | f1570a246ee9c78f96e8ca3374e1f7fb0e185a98 (patch) | |
tree | 516803a64d20b0205241475d7f9f142aad711866 | |
parent | 137218fd6a4f7ff18a1eb26e173505d35c5be7d9 (diff) | |
download | ant-f1570a246ee9c78f96e8ca3374e1f7fb0e185a98.tar.gz |
support default value for scriptdef attribute
-rw-r--r-- | manual/Tasks/scriptdef.html | 5 | ||||
-rw-r--r-- | src/main/org/apache/tools/ant/taskdefs/optional/script/ScriptDef.java | 70 | ||||
-rw-r--r-- | src/tests/antunit/taskdefs/optional/script/scriptdef-test.xml | 25 |
3 files changed, 97 insertions, 3 deletions
diff --git a/manual/Tasks/scriptdef.html b/manual/Tasks/scriptdef.html index 680f1a864..a741fba35 100644 --- a/manual/Tasks/scriptdef.html +++ b/manual/Tasks/scriptdef.html @@ -147,6 +147,11 @@ the <a href="script.html"><code><script></code></a> task.</p> <td>the name of the attribute</td> <td>Yes</td> </tr> + <tr> + <td>default</td> + <td>the default value of the attribute</td> + <td>No</td> + </tr> </table> <h4>element</h4> diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/script/ScriptDef.java b/src/main/org/apache/tools/ant/taskdefs/optional/script/ScriptDef.java index 9f97b9615..f1c5d4e80 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/script/ScriptDef.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/script/ScriptDef.java @@ -21,10 +21,12 @@ import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; import org.apache.tools.ant.AntTypeDefinition; import org.apache.tools.ant.BuildException; @@ -104,14 +106,53 @@ public class ScriptDef extends DefBase { /** The attribute name */ private String name; + /** The attribute's default value */ + private String defaultValue; + /** - * Sets the attribute name + * Sets the attribute name. * * @param name the attribute name */ public void setName(String name) { this.name = name.toLowerCase(Locale.ENGLISH); } + + /** + * Get the name of this {@link Attribute}. + * + * @return {@link String} + */ + String getName() { + return name; + } + + /** + * Set the default value of this {@link Attribute}. + * + * @param defaultValue {@link String} + */ + public void setDefault(String defaultValue) { + this.defaultValue = defaultValue; + } + + /** + * Get the default value of this {@link Attribute}, {@code null} if + * unset. + * + * @return {@link String} + */ + String getDefault() { + return defaultValue; + } + + /** + * Learn whether this {@link Attribute} has a default value set. + * @return {@code boolean} + */ + boolean hasDefault() { + return defaultValue != null; + } } /** @@ -340,7 +381,8 @@ public class ScriptDef extends DefBase { public void executeScript(Map<String, String> attributes, Map<String, List<Object>> elements, ScriptDefBase instance) { ScriptRunnerBase runner = helper.getScriptRunner(); - runner.addBean("attributes", attributes); + + runner.addBean("attributes", withDefault(attributes)); runner.addBean("elements", elements); runner.addBean("project", getProject()); if (instance != null) { @@ -422,4 +464,28 @@ public class ScriptDef extends DefBase { public void add(ResourceCollection resource) { helper.add(resource); } + + private Map<String, String> withDefault(Map<String, String> attributes) { + /* + * The following is checked in ScriptDefBase but some other caller to + * #executeScript() could pass in anything they like + */ + final Set<String> unsupported = + attributeSet.stream().filter(a -> !this.isAttributeSupported(a)).map(s -> '@' + s) + .collect(Collectors.toSet()); + + if (!unsupported.isEmpty()) { + throw new BuildException("Found unsupported attributes " + unsupported); + } + if (this.attributes.isEmpty()) { + return attributes; + } + final Map<String, String> result = + this.attributes.stream().filter(Attribute::hasDefault).collect(Collectors + .toMap(Attribute::getName, Attribute::getDefault, (l, r) -> r, LinkedHashMap::new)); + + result.putAll(attributes); + + return result; + } } diff --git a/src/tests/antunit/taskdefs/optional/script/scriptdef-test.xml b/src/tests/antunit/taskdefs/optional/script/scriptdef-test.xml index e2a771883..3c76278cd 100644 --- a/src/tests/antunit/taskdefs/optional/script/scriptdef-test.xml +++ b/src/tests/antunit/taskdefs/optional/script/scriptdef-test.xml @@ -60,6 +60,7 @@ <scriptdef language="javascript" name="scripttest" manager="${script.manager}"> <!-- optional property attribute--> <attribute name="property" /> + <attribute name="propertywithdefault" default="prop_dv" /> </scriptdef> </presetdef> @@ -69,7 +70,6 @@ <au:assertPropertyEquals name="property" value="live" /> </presetdef> - <!--purely to test that everything works --> <target name="testInline" if="prereqs-ok"> <js>self.log("Hello");</js> @@ -132,4 +132,27 @@ <quickfail /> </au:expectfailure> </target> + + <target name="testAttribute" if="prereqs-ok"> + <js> + project.setNewProperty(attributes.get('property'), 'live'); + </js> + <scripttest property="property" /> + <assertPropSet /> + </target> + + <target name="testAttributeDefaultValue" if="prereqs-ok"> + <js> + project.setNewProperty(attributes.get('propertywithdefault'), 'live'); + </js> + <scripttest /> + <assertPropSet name="prop_dv" /> + </target> + + <target name="testInvalidAttribute" if="prereqs-ok"> + <js /> + <au:expectfailure message="Found unsupported attributes"> + <scripttest foo="bar" /> + </au:expectfailure> + </target> </project> |