stevel 2005/05/16 15:40:23 Modified: docs/manual/CoreTypes mapper.html src/etc/testcases/types/mappers define.mapperresult.xml src/main/org/apache/tools/ant/types/optional ScriptCondition.java src/main/org/apache/tools/ant/types defaults.properties src/testcases/org/apache/tools/ant/types/mappers MapperResult.java . WHATSNEW Added: src/etc/testcases/types/mappers scriptmapper.xml src/main/org/apache/tools/ant/types/optional AbstractScriptComponent.java ScriptMapper.java src/testcases/org/apache/tools/ant/types/optional ScriptMapperTest.java Log: <scriptmapper>, with tests and docs. At this point we have near total script coverage of all the core ant extension points. Note the refactoring of scriptcondition to give us a better base for these things. Revision Changes Path 1.27 +100 -0 ant/docs/manual/CoreTypes/mapper.html Index: mapper.html =================================================================== RCS file: /home/cvs/ant/docs/manual/CoreTypes/mapper.html,v retrieving revision 1.26 retrieving revision 1.27 diff -u -r1.26 -r1.27 --- mapper.html 29 Apr 2005 18:58:12 -0000 1.26 +++ mapper.html 16 May 2005 22:40:22 -0000 1.27 @@ -683,6 +683,106 @@ <p>The filtermapper has no corresponding <code><mapper <b>type</b>></code> attribute. </p> + + <!-- --> + <!-- Script Mapper --> + <!-- --> + +<h4><a name="script-mapper">scriptmapper (since ant 1.7)</a></h4> +<p> +This mapper executes a script written in <a href="http://jakarta.apache.org/bsf" target="_top">Apache BSF</a> +supported language, once per file to map.</p> +The script can be declared inline or in a specified file. +</p> +<p> +See the <a href="../OptionalTasks/script.html">Script</a> task for +an explanation of scripts and dependencies. +</p> + + <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">language</td> + <td valign="top"> + Scripting language + </td> + <td align="center" valign="top">Yes</td> + </tr> + <tr> + <td valign="top">src</td> + <td valign="top"> + File containing the script + </td> + <td align="center" valign="top">No</td> + </tr> + </table> + +<p> +Example +</p> +<blockquote><pre> +<scriptmapper language="javascript"> + self.addMappedName(source.toUpperCase()); + self.addMappedName(source.toLowerCase()); +</scriptmapper> +</pre></blockquote> + +<table border="1" cellpadding="2" cellspacing="0"> + <tr> + <td valign="top"><b>Source file name</b></td> + <td valign="top"><b>Target file names</b></td> + </tr> + <tr> + <td valign="center"><code>foo\bar\A.java</code></td> + <td valign="top"><code>FOO\BAR\A.JAVA foo\bar\a.java</code></td> + </tr> +</table> + +<p> +To use this mapper, the scripts need access to the source file, +and the ability to return multiple mappings. Here are the relevant beans and +their methods. The script is called once for every source file, with the +list of mapped names reset after every invocation. + + <table border="1" cellpadding="2" cellspacing="0"> + <tr> + <td valign="top"><b>Script bean</b></td> + <td valign="top"><b>Description</b></td> + </tr> + <tr> + <td valign="top"><code>source: String</code></td> + <td valign="top"> + The file/path to map + </td> + </tr> + <tr> + <td valign="top">self</td> + <td valign="top"> + the scriptmapper itself + </td> + </tr> + <tr> + <td valign="top"><code>self.addMappedName(String name)</code></td> + <td valign="top"> + Add a new mapping + </td> + </tr> + <tr> + <td valign="top"><code>self.clear()</code></td> + <td valign="top"> + Reset the list of files. + </td> + </tr> + </table> + + <p>The scriptmapper has no corresponding + <code><mapper <b>type</b>></code> attribute. + </p> + <hr> <p align="center">Copyright © 2000-2005 The Apache Software Foundation. All rights Reserved.</p> 1.2 +3 -0 ant/src/etc/testcases/types/mappers/define.mapperresult.xml Index: define.mapperresult.xml =================================================================== RCS file: /home/cvs/ant/src/etc/testcases/types/mappers/define.mapperresult.xml,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- define.mapperresult.xml 17 Dec 2004 13:24:38 -0000 1.1 +++ define.mapperresult.xml 16 May 2005 22:40:22 -0000 1.2 @@ -2,4 +2,7 @@ <typedef name="mapperresult" classpath="../../../../../build/testcases" classname="org.apache.tools.ant.types.mappers.MapperResult"/> + + <!-- this is what you get with no result --> + <property name="no-results" value="<NULL>" /> </project> 1.1 ant/src/etc/testcases/types/mappers/scriptmapper.xml Index: scriptmapper.xml =================================================================== <project name="scriptmapper"> <import file="define.mapperresult.xml"/> <target name="testSetSingle"> <mapperresult input="" output="a"> <scriptmapper language="javascript"> self.addMappedName("a"); </scriptmapper> </mapperresult> </target> <target name="testClear"> <mapperresult input="" output="${no-results}"> <scriptmapper language="javascript"> self.addMappedName("a"); self.clear(); </scriptmapper> </mapperresult> </target> <target name="testSetMultiple"> <mapperresult input="" output="a|b"> <scriptmapper language="javascript"> self.addMappedName("a"); self.addMappedName("b"); </scriptmapper> </mapperresult> </target> <target name="testPassthrough"> <mapperresult input="a" output="A|a"> <scriptmapper language="javascript"> //relying on "a" to map to "A" on all locales. self.addMappedName(source.toUpperCase()); self.addMappedName(source.toLowerCase()); </scriptmapper> </mapperresult> </target> </project> 1.3 +4 -36 ant/src/main/org/apache/tools/ant/types/optional/ScriptCondition.java Index: ScriptCondition.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/types/optional/ScriptCondition.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- ScriptCondition.java 18 Jan 2005 09:24:54 -0000 1.2 +++ ScriptCondition.java 16 May 2005 22:40:22 -0000 1.3 @@ -25,49 +25,17 @@ /** * A condition that lets you include script. - * The condition component sets a bean "self", whose attribute "result" + * The condition component sets a bean "self", whose attribute "value" * must be set to true for the condition to succeed, false to fail. * The default is 'false' */ -public class ScriptCondition extends ProjectComponent implements Condition { - - /** - * script runner - */ - private ScriptRunner runner = new ScriptRunner(); +public class ScriptCondition extends AbstractScriptComponent implements Condition { /** * result field */ private boolean value = false; - /** - * Load the script from an external file ; optional. - * - * @param file the file containing the script source. - */ - public void setSrc(File file) { - runner.setSrc(file); - } - - /** - * The script text. - * - * @param text a component of the script text to be added. - */ - public void addText(String text) { - runner.addText(text); - } - - /** - * Defines the language (required). - * - * @param language the scripting language name for the script. - */ - public void setLanguage(String language) { - runner.setLanguage(language); - } - /** * Is this condition true? @@ -78,8 +46,8 @@ * if an error occurs */ public boolean eval() throws BuildException { - runner.bindToComponent(this); - runner.executeScript("ant_condition"); + initScriptRunner(); + executeScript("ant_condition"); return getValue(); } 1.1 ant/src/main/org/apache/tools/ant/types/optional/AbstractScriptComponent.java Index: AbstractScriptComponent.java =================================================================== /** (C) Copyright 2005 Hewlett-Packard Development Company, LP This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA For more information: www.smartfrog.org */ package org.apache.tools.ant.types.optional; import org.apache.tools.ant.ProjectComponent; import org.apache.tools.ant.util.ScriptRunner; import java.io.File; /** * This is a [EMAIL PROTECTED] ProjectComponent} that has script support built in * Use it as a foundation for scriptable things. */ public abstract class AbstractScriptComponent extends ProjectComponent { /** * script runner */ private ScriptRunner runner = new ScriptRunner(); /** * Get our script runner * @return */ public ScriptRunner getRunner() { return runner; } /** * Load the script from an external file ; optional. * * @param file the file containing the script source. */ public void setSrc(File file) { runner.setSrc(file); } /** * The script text. * * @param text a component of the script text to be added. */ public void addText(String text) { runner.addText(text); } /** * Defines the language (required). * * @param language the scripting language name for the script. */ public void setLanguage(String language) { runner.setLanguage(language); } /** * Initialize the script runner. Calls this before running the system */ protected void initScriptRunner() { getRunner().bindToComponent(this); } /** * Run a script * @param execName name of the script */ protected void executeScript(String execName) { getRunner().executeScript(execName); } } 1.1 ant/src/main/org/apache/tools/ant/types/optional/ScriptMapper.java Index: ScriptMapper.java =================================================================== /** (C) Copyright 2005 Hewlett-Packard Development Company, LP This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA For more information: www.smartfrog.org */ package org.apache.tools.ant.types.optional; import org.apache.tools.ant.util.FileNameMapper; import org.apache.tools.ant.util.ScriptRunner; import org.apache.tools.ant.ProjectComponent; import java.util.ArrayList; /** * Script support at map time. * @since Ant1.7 */ public class ScriptMapper extends AbstractScriptComponent implements FileNameMapper { ArrayList files; static final String[] EMPTY_STRING_ARRAY = new String[0]; /** * Sets the from part of the transformation rule. * * @param from a string. */ public void setFrom(String from) { } /** * Sets the to part of the transformation rule. * * @param to a string. */ public void setTo(String to) { } /** * Reset the list of files */ public void clear() { files=new ArrayList(1); } /** * Add a mapped name * @param mapping */ public void addMappedName(String mapping) { files.add(mapping); } /** * Returns an array containing the target filename(s) for the given source * file. * <p/> * <p>if the given rule doesn't apply to the source file, implementation * must return null. SourceFileScanner will then omit the source file in * question.</p> * * @param sourceFileName the name of the source file relative to some given * basedirectory. * @return an array of strings if the rule applies to the source file, or * null if it does not. */ public String[] mapFileName(String sourceFileName) { initScriptRunner(); getRunner().addBean("source", sourceFileName); clear(); executeScript("ant_mapper"); if(files.size()==0) { return null; } else { return (String[])files.toArray(EMPTY_STRING_ARRAY); } } } 1.40 +1 -0 ant/src/main/org/apache/tools/ant/types/defaults.properties Index: defaults.properties =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/types/defaults.properties,v retrieving revision 1.39 retrieving revision 1.40 diff -u -r1.39 -r1.40 --- defaults.properties 10 Mar 2005 23:20:03 -0000 1.39 +++ defaults.properties 16 May 2005 22:40:22 -0000 1.40 @@ -43,3 +43,4 @@ scriptcondition=org.apache.tools.ant.types.optional.ScriptCondition xor=org.apache.tools.ant.taskdefs.condition.Xor parsersupports=org.apache.tools.ant.taskdefs.condition.ParserSupports +scriptmapper=org.apache.tools.ant.types.optional.ScriptMapper 1.2 +6 -1 ant/src/testcases/org/apache/tools/ant/types/mappers/MapperResult.java Index: MapperResult.java =================================================================== RCS file: /home/cvs/ant/src/testcases/org/apache/tools/ant/types/mappers/MapperResult.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- MapperResult.java 17 Dec 2004 13:24:36 -0000 1.1 +++ MapperResult.java 16 May 2005 22:40:22 -0000 1.2 @@ -36,6 +36,11 @@ private String output; private FileNameMapper fileNameMapper; + /** + * The output on an empty string array + */ + private static final String NULL_MAPPER_RESULT = "<NULL>"; + public void setFailMessage(String failMessage) { this.failMessage = failMessage; } @@ -72,7 +77,7 @@ String[] result = fileNameMapper.mapFileName(input); String flattened; if (result == null) { - flattened = "<NULL>"; + flattened = NULL_MAPPER_RESULT; } else { StringBuffer b = new StringBuffer(); for (int i = 0; i < result.length; ++i) { 1.1 ant/src/testcases/org/apache/tools/ant/types/optional/ScriptMapperTest.java Index: ScriptMapperTest.java =================================================================== /* * Copyright 2005 The Apache Software Foundation * * Licensed 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.types.optional; import org.apache.tools.ant.BuildFileTest; /** * Test our script mapping */ public class ScriptMapperTest extends BuildFileTest { public ScriptMapperTest(String name) { super(name); } public void setUp() { configureProject("src/etc/testcases/types/mappers/scriptmapper.xml"); } public void testClear() { executeTarget("testClear"); } public void testSetMultiple() { executeTarget("testSetMultiple"); } public void testPassthrough() { executeTarget("testPassthrough"); } } 1.823 +5 -0 ant/WHATSNEW Index: WHATSNEW =================================================================== RCS file: /home/cvs/ant/WHATSNEW,v retrieving revision 1.822 retrieving revision 1.823 diff -u -r1.822 -r1.823 --- WHATSNEW 16 May 2005 18:59:57 -0000 1.822 +++ WHATSNEW 16 May 2005 22:40:23 -0000 1.823 @@ -98,6 +98,9 @@ * <xmlvalidate> and <schemavalidate> create a new parser for every file in a fileset, and so validate multiple files properly. Bugzilla Report 32791 +* New mapper, <scriptmapper>, supports scripted mapping of source files/strings to + destination strings. + Other changes: -------------- @@ -203,6 +206,8 @@ * project name is now used for *all* targets so one can write consistent import build file. bugzilla report 28444. + + Changes from Ant 1.6.3 to current Ant 1.6 CVS version =====================================================
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]