Author: mbenson Date: Wed Apr 21 16:08:10 2010 New Revision: 936382 URL: http://svn.apache.org/viewvc?rev=936382&view=rev Log: Added the augment task to manipulate existing references via Ant's basic introspection mechanisms.
Added: ant/core/trunk/docs/manual/CoreTasks/augment.html (with props) ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/AugmentReference.java (with props) ant/core/trunk/src/tests/antunit/taskdefs/augment-test.xml (with props) Modified: ant/core/trunk/WHATSNEW ant/core/trunk/docs/manual/coretasklist.html ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/defaults.properties Modified: ant/core/trunk/WHATSNEW URL: http://svn.apache.org/viewvc/ant/core/trunk/WHATSNEW?rev=936382&r1=936381&r2=936382&view=diff ============================================================================== --- ant/core/trunk/WHATSNEW (original) +++ ant/core/trunk/WHATSNEW Wed Apr 21 16:08:10 2010 @@ -141,6 +141,9 @@ Other changes: * <mappedresources> supports new attributes enablemultiplemappings 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 ====================================== Added: ant/core/trunk/docs/manual/CoreTasks/augment.html URL: http://svn.apache.org/viewvc/ant/core/trunk/docs/manual/CoreTasks/augment.html?rev=936382&view=auto ============================================================================== --- ant/core/trunk/docs/manual/CoreTasks/augment.html (added) +++ ant/core/trunk/docs/manual/CoreTasks/augment.html Wed Apr 21 16:08:10 2010 @@ -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> Propchange: ant/core/trunk/docs/manual/CoreTasks/augment.html ------------------------------------------------------------------------------ svn:eol-style = native Modified: ant/core/trunk/docs/manual/coretasklist.html URL: http://svn.apache.org/viewvc/ant/core/trunk/docs/manual/coretasklist.html?rev=936382&r1=936381&r2=936382&view=diff ============================================================================== --- ant/core/trunk/docs/manual/coretasklist.html (original) +++ ant/core/trunk/docs/manual/coretasklist.html Wed Apr 21 16:08:10 2010 @@ -41,6 +41,7 @@ <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/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/basename.html">Basename</a></li> <li><a href="CoreTasks/buildnumber.html">BuildNumber</a></li> Added: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/AugmentReference.java URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/AugmentReference.java?rev=936382&view=auto ============================================================================== --- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/AugmentReference.java (added) +++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/AugmentReference.java Wed Apr 21 16:08:10 2010 @@ -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 + "\""); + } + } +} Propchange: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/AugmentReference.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/defaults.properties URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/defaults.properties?rev=936382&r1=936381&r2=936382&view=diff ============================================================================== --- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/defaults.properties (original) +++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/defaults.properties Wed Apr 21 16:08:10 2010 @@ -20,6 +20,7 @@ antstructure=org.apache.tools.ant.taskde antversion=org.apache.tools.ant.taskdefs.condition.AntVersion apply=org.apache.tools.ant.taskdefs.Transform apt=org.apache.tools.ant.taskdefs.Apt +augment=org.apache.tools.ant.taskdefs.AugmentReference available=org.apache.tools.ant.taskdefs.Available basename=org.apache.tools.ant.taskdefs.Basename buildnumber=org.apache.tools.ant.taskdefs.BuildNumber Added: ant/core/trunk/src/tests/antunit/taskdefs/augment-test.xml URL: http://svn.apache.org/viewvc/ant/core/trunk/src/tests/antunit/taskdefs/augment-test.xml?rev=936382&view=auto ============================================================================== --- ant/core/trunk/src/tests/antunit/taskdefs/augment-test.xml (added) +++ ant/core/trunk/src/tests/antunit/taskdefs/augment-test.xml Wed Apr 21 16:08:10 2010 @@ -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> Propchange: ant/core/trunk/src/tests/antunit/taskdefs/augment-test.xml ------------------------------------------------------------------------------ svn:eol-style = native