git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@278273 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -98,6 +98,9 @@ Fixed bugs: | |||||
| * <xmlvalidate> and <schemavalidate> create a new parser for every file in a | * <xmlvalidate> and <schemavalidate> create a new parser for every file in a | ||||
| fileset, and so validate multiple files properly. Bugzilla Report 32791 | 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: | Other changes: | ||||
| -------------- | -------------- | ||||
| @@ -203,6 +206,8 @@ Other changes: | |||||
| * project name is now used for *all* targets so one can write consistent import | * project name is now used for *all* targets so one can write consistent import | ||||
| build file. bugzilla report 28444. | build file. bugzilla report 28444. | ||||
| Changes from Ant 1.6.3 to current Ant 1.6 CVS version | Changes from Ant 1.6.3 to current Ant 1.6 CVS version | ||||
| ===================================================== | ===================================================== | ||||
| @@ -683,6 +683,106 @@ with <code><uptodate></code> and <code><junit></code> output.</p> | |||||
| <p>The filtermapper has no corresponding | <p>The filtermapper has no corresponding | ||||
| <code><mapper <b>type</b>></code> attribute. | <code><mapper <b>type</b>></code> attribute. | ||||
| </p> | </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> | <hr> | ||||
| <p align="center">Copyright © 2000-2005 The Apache Software Foundation. All rights | <p align="center">Copyright © 2000-2005 The Apache Software Foundation. All rights | ||||
| Reserved.</p> | Reserved.</p> | ||||
| @@ -2,4 +2,7 @@ | |||||
| <typedef name="mapperresult" | <typedef name="mapperresult" | ||||
| classpath="../../../../../build/testcases" | classpath="../../../../../build/testcases" | ||||
| classname="org.apache.tools.ant.types.mappers.MapperResult"/> | classname="org.apache.tools.ant.types.mappers.MapperResult"/> | ||||
| <!-- this is what you get with no result --> | |||||
| <property name="no-results" value="<NULL>" /> | |||||
| </project> | </project> | ||||
| @@ -0,0 +1,41 @@ | |||||
| <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> | |||||
| @@ -43,3 +43,4 @@ scriptselector=org.apache.tools.ant.types.optional.ScriptSelector | |||||
| scriptcondition=org.apache.tools.ant.types.optional.ScriptCondition | scriptcondition=org.apache.tools.ant.types.optional.ScriptCondition | ||||
| xor=org.apache.tools.ant.taskdefs.condition.Xor | xor=org.apache.tools.ant.taskdefs.condition.Xor | ||||
| parsersupports=org.apache.tools.ant.taskdefs.condition.ParserSupports | parsersupports=org.apache.tools.ant.taskdefs.condition.ParserSupports | ||||
| scriptmapper=org.apache.tools.ant.types.optional.ScriptMapper | |||||
| @@ -0,0 +1,87 @@ | |||||
| /** (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 {@link 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); | |||||
| } | |||||
| } | |||||
| @@ -25,49 +25,17 @@ import java.io.File; | |||||
| /** | /** | ||||
| * A condition that lets you include script. | * 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. | * must be set to true for the condition to succeed, false to fail. | ||||
| * The default is 'false' | * 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 | * result field | ||||
| */ | */ | ||||
| private boolean value = false; | 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? | * Is this condition true? | ||||
| @@ -78,8 +46,8 @@ public class ScriptCondition extends ProjectComponent implements Condition { | |||||
| * if an error occurs | * if an error occurs | ||||
| */ | */ | ||||
| public boolean eval() throws BuildException { | public boolean eval() throws BuildException { | ||||
| runner.bindToComponent(this); | |||||
| runner.executeScript("ant_condition"); | |||||
| initScriptRunner(); | |||||
| executeScript("ant_condition"); | |||||
| return getValue(); | return getValue(); | ||||
| } | } | ||||
| @@ -0,0 +1,98 @@ | |||||
| /** (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); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -36,6 +36,11 @@ public class MapperResult extends Task { | |||||
| private String output; | private String output; | ||||
| private FileNameMapper fileNameMapper; | private FileNameMapper fileNameMapper; | ||||
| /** | |||||
| * The output on an empty string array | |||||
| */ | |||||
| private static final String NULL_MAPPER_RESULT = "<NULL>"; | |||||
| public void setFailMessage(String failMessage) { | public void setFailMessage(String failMessage) { | ||||
| this.failMessage = failMessage; | this.failMessage = failMessage; | ||||
| } | } | ||||
| @@ -72,7 +77,7 @@ public class MapperResult extends Task { | |||||
| String[] result = fileNameMapper.mapFileName(input); | String[] result = fileNameMapper.mapFileName(input); | ||||
| String flattened; | String flattened; | ||||
| if (result == null) { | if (result == null) { | ||||
| flattened = "<NULL>"; | |||||
| flattened = NULL_MAPPER_RESULT; | |||||
| } else { | } else { | ||||
| StringBuffer b = new StringBuffer(); | StringBuffer b = new StringBuffer(); | ||||
| for (int i = 0; i < result.length; ++i) { | for (int i = 0; i < result.length; ++i) { | ||||
| @@ -0,0 +1,43 @@ | |||||
| /* | |||||
| * 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"); | |||||
| } | |||||
| } | |||||