git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@936382 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -141,6 +141,9 @@ Other changes: | |||||
| * <mappedresources> supports new attributes enablemultiplemappings | * <mappedresources> supports new attributes enablemultiplemappings | ||||
| and cache. | and cache. | ||||
| * Added the augment task to manipulate existing references via Ant's basic | |||||
| introspection mechanisms. | |||||
| Changes from Ant 1.8.0RC1 TO Ant 1.8.0 | Changes from Ant 1.8.0RC1 TO Ant 1.8.0 | ||||
| ====================================== | ====================================== | ||||
| @@ -0,0 +1,83 @@ | |||||
| <!-- | |||||
| Licensed to the Apache Software Foundation (ASF) under one or more | |||||
| contributor license agreements. See the NOTICE file distributed with | |||||
| this work for additional information regarding copyright ownership. | |||||
| The ASF licenses this file to You under the Apache License, Version 2.0 | |||||
| (the "License"); you may not use this file except in compliance with | |||||
| the License. You may obtain a copy of the License at | |||||
| http://www.apache.org/licenses/LICENSE-2.0 | |||||
| Unless required by applicable law or agreed to in writing, software | |||||
| distributed under the License is distributed on an "AS IS" BASIS, | |||||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| See the License for the specific language governing permissions and | |||||
| limitations under the License. | |||||
| --> | |||||
| <html> | |||||
| <head> | |||||
| <meta http-equiv="Content-Language" content="en-us"> | |||||
| <link rel="stylesheet" type="text/css" href="../stylesheets/style.css"> | |||||
| <title>Augment Task</title> | |||||
| </head> | |||||
| <body> | |||||
| <h2>Augment</h2> | |||||
| <h3>Description</h3> | |||||
| <p>Modify an existing reference by adding nested elements or (re-)assigning properties | |||||
| mapped as XML attributes. This is an unusual task that makes use of Ant's internal | |||||
| processing mechanisms to reload a previously declared reference by means of the 'id' | |||||
| attribute, then treats the declared <code>augment</code> element as though it were the | |||||
| original element. | |||||
| <b>Since Ant 1.8.1</b></p> | |||||
| <h3>Parameters</h3> | |||||
| <table border="1" cellpadding="2" cellspacing="0"> | |||||
| <tr> | |||||
| <td valign="top"><b>Attribute</b></td> | |||||
| <td valign="top"><b>Description</b></td> | |||||
| <td align="center" valign="top"><b>Required</b></td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">id</td> | |||||
| <td valign="top">The id of the reference to augment. If no such reference has | |||||
| been declared a <code>BuildException</code> is generated.</td> | |||||
| <td valign="top" align="center">Yes</td> | |||||
| </tr> | |||||
| </table> | |||||
| <p> | |||||
| Additional permissible attributes are dependent on the reference to be modified. | |||||
| </p> | |||||
| <h3>Parameters specified as nested elements</h3> | |||||
| <p> | |||||
| Permissible nested elements are dependent on the reference to be modified. | |||||
| </p> | |||||
| <h3>Examples</h3> | |||||
| Given | |||||
| <pre> | |||||
| <fileset id="input-fs" dir="${basedir}" /> | |||||
| </pre> | |||||
| <pre> | |||||
| <augment id="input-fs" excludes="foo" /> | |||||
| </pre> | |||||
| <p>Modifies the <code>excludes</code> attribute of <code>input-fs</code>.</p> | |||||
| <pre> | |||||
| <augment id="input-fs"> | |||||
| <filename name="bar" /> | |||||
| </augment> | |||||
| </pre> | |||||
| <p>Adds a <code>filename</code> selector to <code>input-fs</code>.</p> | |||||
| </body> | |||||
| </html> | |||||
| @@ -41,6 +41,7 @@ | |||||
| <li><a href="CoreTasks/antversion.html">AntVersion</a></li> | <li><a href="CoreTasks/antversion.html">AntVersion</a></li> | ||||
| <li><a href="CoreTasks/apply.html">Apply/<i>ExecOn</i></a></li> | <li><a href="CoreTasks/apply.html">Apply/<i>ExecOn</i></a></li> | ||||
| <li><a href="CoreTasks/apt.html">Apt</a></li> | <li><a href="CoreTasks/apt.html">Apt</a></li> | ||||
| <li><a href="CoreTasks/augment.html">Augment</a></li> | |||||
| <li><a href="CoreTasks/available.html">Available</a></li> | <li><a href="CoreTasks/available.html">Available</a></li> | ||||
| <li><a href="CoreTasks/basename.html">Basename</a></li> | <li><a href="CoreTasks/basename.html">Basename</a></li> | ||||
| <li><a href="CoreTasks/buildnumber.html">BuildNumber</a></li> | <li><a href="CoreTasks/buildnumber.html">BuildNumber</a></li> | ||||
| @@ -0,0 +1,72 @@ | |||||
| /* | |||||
| * Licensed to the Apache Software Foundation (ASF) under one or more | |||||
| * contributor license agreements. See the NOTICE file distributed with | |||||
| * this work for additional information regarding copyright ownership. | |||||
| * The ASF licenses this file to You under the Apache License, Version 2.0 | |||||
| * (the "License"); you may not use this file except in compliance with | |||||
| * the License. You may obtain a copy of the License at | |||||
| * | |||||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||||
| * | |||||
| * Unless required by applicable law or agreed to in writing, software | |||||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| * See the License for the specific language governing permissions and | |||||
| * limitations under the License. | |||||
| * | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs; | |||||
| import org.apache.tools.ant.RuntimeConfigurable; | |||||
| import org.apache.tools.ant.Task; | |||||
| import org.apache.tools.ant.TypeAdapter; | |||||
| /** | |||||
| * Ant task to dynamically augment a previously declared reference. | |||||
| * @since Ant 1.8.1 | |||||
| */ | |||||
| public class AugmentReference extends Task implements TypeAdapter { | |||||
| private String id; | |||||
| /** | |||||
| * {@inheritDoc} | |||||
| */ | |||||
| public void checkProxyClass(Class proxyClass) { | |||||
| } | |||||
| /** | |||||
| * {@inheritDoc} | |||||
| */ | |||||
| public synchronized Object getProxy() { | |||||
| if (getProject() == null) { | |||||
| throw new IllegalStateException(getTaskName() + "Project owner unset"); | |||||
| } | |||||
| hijackId(); | |||||
| if (getProject().hasReference(id)) { | |||||
| Object result = getProject().getReference(id); | |||||
| log("project reference " + id + "=" + String.valueOf(result)); | |||||
| return result; | |||||
| } | |||||
| throw new IllegalStateException("Unknown reference \"" + id + "\""); | |||||
| } | |||||
| /** | |||||
| * {@inheritDoc} | |||||
| */ | |||||
| public void setProxy(Object o) { | |||||
| throw new UnsupportedOperationException(); | |||||
| } | |||||
| private synchronized void hijackId() { | |||||
| if (id == null) { | |||||
| RuntimeConfigurable wrapper = getWrapper(); | |||||
| id = wrapper.getId(); | |||||
| if (id == null) { | |||||
| throw new IllegalStateException(getTaskName() + " attribute 'id' unset"); | |||||
| } | |||||
| wrapper.setAttribute("id", null); | |||||
| wrapper.removeAttribute("id"); | |||||
| wrapper.setElementTag("augmented reference \"" + id + "\""); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -20,6 +20,7 @@ antstructure=org.apache.tools.ant.taskdefs.AntStructure | |||||
| antversion=org.apache.tools.ant.taskdefs.condition.AntVersion | antversion=org.apache.tools.ant.taskdefs.condition.AntVersion | ||||
| apply=org.apache.tools.ant.taskdefs.Transform | apply=org.apache.tools.ant.taskdefs.Transform | ||||
| apt=org.apache.tools.ant.taskdefs.Apt | apt=org.apache.tools.ant.taskdefs.Apt | ||||
| augment=org.apache.tools.ant.taskdefs.AugmentReference | |||||
| available=org.apache.tools.ant.taskdefs.Available | available=org.apache.tools.ant.taskdefs.Available | ||||
| basename=org.apache.tools.ant.taskdefs.Basename | basename=org.apache.tools.ant.taskdefs.Basename | ||||
| buildnumber=org.apache.tools.ant.taskdefs.BuildNumber | buildnumber=org.apache.tools.ant.taskdefs.BuildNumber | ||||
| @@ -0,0 +1,74 @@ | |||||
| <?xml version="1.0" encoding="utf-8"?> | |||||
| <!-- | |||||
| Licensed to the Apache Software Foundation (ASF) under one or more | |||||
| contributor license agreements. See the NOTICE file distributed with | |||||
| this work for additional information regarding copyright ownership. | |||||
| The ASF licenses this file to You under the Apache License, Version 2.0 | |||||
| (the "License"); you may not use this file except in compliance with | |||||
| the License. You may obtain a copy of the License at | |||||
| http://www.apache.org/licenses/LICENSE-2.0 | |||||
| Unless required by applicable law or agreed to in writing, software | |||||
| distributed under the License is distributed on an "AS IS" BASIS, | |||||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| See the License for the specific language governing permissions and | |||||
| limitations under the License. | |||||
| --> | |||||
| <project name="augment-test" default="antunit" xmlns:au="antlib:org.apache.ant.antunit"> | |||||
| <import file="../antunit-base.xml"/> | |||||
| <target name="setUp"> | |||||
| <mkdir dir="${input}" /> | |||||
| <touch> | |||||
| <filelist id="filelist" dir="${input}" files="foo,bar,baz" /> | |||||
| </touch> | |||||
| <fileset id="input-fs" dir="${input}" /> | |||||
| <au:assertTrue> | |||||
| <resourcecount refid="input-fs" count="3" /> | |||||
| </au:assertTrue> | |||||
| </target> | |||||
| <target name="test-augment-attribute" depends="setUp"> | |||||
| <augment id="input-fs" excludes="foo" /> | |||||
| <au:assertTrue> | |||||
| <resourcecount refid="input-fs" count="2" /> | |||||
| </au:assertTrue> | |||||
| </target> | |||||
| <target name="test-augment-element" depends="setUp"> | |||||
| <augment id="input-fs"> | |||||
| <filename name="bar" /> | |||||
| </augment> | |||||
| <au:assertTrue> | |||||
| <resourcecount refid="input-fs" count="1" /> | |||||
| </au:assertTrue> | |||||
| </target> | |||||
| <target name="test-noref"> | |||||
| <au:expectfailure expectedMessage="Unknown reference "nosuchreference""> | |||||
| <augment id="nosuchreference" /> | |||||
| </au:expectfailure> | |||||
| </target> | |||||
| <target name="test-id-not-set"> | |||||
| <au:expectfailure expectedMessage="augment attribute 'id' unset"> | |||||
| <augment foo="bar" /> | |||||
| </au:expectfailure> | |||||
| </target> | |||||
| <target name="test-illegal-attribute" depends="setUp"> | |||||
| <au:expectfailure expectedMessage="augmented reference "input-fs" doesn't support the "filesetwillmostlikelyneversupportthisattribute" attribute"> | |||||
| <augment id="input-fs" filesetwillmostlikelyneversupportthisattribute="blah" /> | |||||
| </au:expectfailure> | |||||
| </target> | |||||
| <target name="test-illegal-element" depends="setUp"> | |||||
| <au:expectfailure expectedMessage="augmented reference "input-fs" doesn't support the nested "filesetwillmostlikelyneversupportthiselement" element"> | |||||
| <augment id="input-fs"> | |||||
| <filesetwillmostlikelyneversupportthiselement /> | |||||
| </augment> | |||||
| </au:expectfailure> | |||||
| </target> | |||||
| </project> | |||||