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 | |||
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 @@ Other changes: | |||
* 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 | |||
===================================================== | |||
@@ -683,6 +683,106 @@ with <code><uptodate></code> and <code><junit></code> output.</p> | |||
<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> | |||
@@ -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> |
@@ -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 | |||
xor=org.apache.tools.ant.taskdefs.condition.Xor | |||
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. | |||
* 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 @@ public class ScriptCondition extends ProjectComponent implements Condition { | |||
* if an error occurs | |||
*/ | |||
public boolean eval() throws BuildException { | |||
runner.bindToComponent(this); | |||
runner.executeScript("ant_condition"); | |||
initScriptRunner(); | |||
executeScript("ant_condition"); | |||
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 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 @@ public class MapperResult extends Task { | |||
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) { | |||
@@ -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"); | |||
} | |||
} |