Browse Source

Bug #41597; scriptdef should be resource-enabled.

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@533121 13f79535-47bb-0310-9956-ffa450edef68
master
Steve Loughran 18 years ago
parent
commit
b6f25e8e14
6 changed files with 224 additions and 15 deletions
  1. +10
    -0
      WHATSNEW
  2. +8
    -0
      docs/manual/OptionalTasks/scriptdef.html
  3. +30
    -10
      src/main/org/apache/tools/ant/taskdefs/optional/script/ScriptDef.java
  4. +60
    -5
      src/main/org/apache/tools/ant/util/ScriptRunnerBase.java
  5. +17
    -0
      src/main/org/apache/tools/ant/util/ScriptRunnerHelper.java
  6. +99
    -0
      src/tests/antunit/taskdefs/optional/script/scriptdef-test.xml

+ 10
- 0
WHATSNEW View File

@@ -4,6 +4,11 @@ Changes from Ant 1.7.0 TO current SVN version
Changes that could break older environments:
-------------------------------------------

* String resources only have properties single expanded. If you relied on
<string> resources being expanded more than once, it no longer happens.
Bugzilla report 42277.


Fixed bugs:
-----------
* Error in handling of some permissions, most notably the AllPermission on
@@ -103,6 +108,11 @@ Other changes:

* JUnitVersionHelper.getTestCaseClassName is now public. Bugzilla 42231

* <string> resource supports nested text. Bugzilla bug 42276

* <scriptdef> now sources scripts from nested resources/resource collections. This lets you
define scripts in JARs, remote URLs, or any other supported resource. Bugzilla report 41597.


Changes from Ant 1.6.5 to Ant 1.7.0
===================================


+ 8
- 0
docs/manual/OptionalTasks/scriptdef.html View File

@@ -190,6 +190,13 @@ more information on writing scripts, please refer to the
<code>type="antlib:example.org:newtype"</code></td>
<td valign="top" align="center">No</td>
</tr>
<tr>
<td valign="top">any resource or resource collection</td>
<td valign="top">Since Ant1.7.1, this task can load scripts
from any resource supplied as a nested element. when </td>
<td valign="top" align="center">No</td>
</tr>

</table>

<h4>classpath</h4>
@@ -198,6 +205,7 @@ more information on writing scripts, please refer to the
for using this nested element.
</p>


<h3>Examples</h3>

<p>


+ 30
- 10
src/main/org/apache/tools/ant/taskdefs/optional/script/ScriptDef.java View File

@@ -23,6 +23,8 @@ import org.apache.tools.ant.Project;
import org.apache.tools.ant.MagicNames;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.ProjectHelper;
import org.apache.tools.ant.types.Resource;
import org.apache.tools.ant.types.ResourceCollection;
import org.apache.tools.ant.taskdefs.DefBase;

import java.util.Map;
@@ -250,25 +252,34 @@ public class ScriptDef extends DefBase {
}

// find the script repository - it is stored in the project
Map scriptRepository = lookupScriptRepository();
name = ProjectHelper.genComponentName(getURI(), name);
scriptRepository.put(name, this);
AntTypeDefinition def = new AntTypeDefinition();
def.setName(name);
def.setClass(ScriptDefBase.class);
ComponentHelper.getComponentHelper(
getProject()).addDataTypeDefinition(def);
}

/**
* Find or create the script repository - it is stored in the project.
* This method is synchronized on the project under {@link MagicNames#SCRIPT_REPOSITORY}
* @return the current script repository registered as a refrence.
*/
private Map lookupScriptRepository() {
Map scriptRepository = null;
Project p = getProject();
synchronized (p) {
scriptRepository =
(Map) p.getReference(MagicNames.SCRIPT_REPOSITORY);
(Map) p.getReference(MagicNames.SCRIPT_REPOSITORY);
if (scriptRepository == null) {
scriptRepository = new HashMap();
p.addReference(MagicNames.SCRIPT_REPOSITORY,
scriptRepository);
scriptRepository);
}
}

name = ProjectHelper.genComponentName(getURI(), name);
scriptRepository.put(name, this);
AntTypeDefinition def = new AntTypeDefinition();
def.setName(name);
def.setClass(ScriptDefBase.class);
ComponentHelper.getComponentHelper(
getProject()).addDataTypeDefinition(def);
return scriptRepository;
}

/**
@@ -382,5 +393,14 @@ public class ScriptDef extends DefBase {
public void addText(String text) {
helper.addText(text);
}

/**
* Add any source resource.
* @since Ant1.7.1
* @param resource source of script
*/
public void add(ResourceCollection resource) {
helper.add(resource);
}
}


+ 60
- 5
src/main/org/apache/tools/ant/util/ScriptRunnerBase.java View File

@@ -21,10 +21,16 @@ import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;

import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.ProjectComponent;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.Resource;
import org.apache.tools.ant.types.ResourceCollection;

import java.util.Map;
import java.util.HashMap;
@@ -186,27 +192,76 @@ public abstract class ScriptRunnerBase {
* @param file the file containing the script source.
*/
public void setSrc(File file) {
String filename = file.getPath();
if (!file.exists()) {
throw new BuildException("file " + file.getPath() + " not found.");
throw new BuildException("file " + filename + " not found.");
}
try {
readSource(new FileReader(file), filename);
} catch (FileNotFoundException e) {
//this can only happen if the file got deleted a short moment ago
throw new BuildException("file " + filename + " not found.");
}
}

/**
* Read some source in from the given reader
* @param reader the reader; this is closed afterwards.
* @param name the name to use in error messages
*/
private void readSource(Reader reader, String name) {
BufferedReader in = null;
try {
in = new BufferedReader(new FileReader(file));
in = new BufferedReader(reader);
script += FileUtils.readFully(in);
} catch (IOException ex) {
throw new BuildException(ex);
throw new BuildException("Failed to read "+ name,ex);
} finally {
FileUtils.close(in);
}
}


/**
* Add a resource to the source list.
* @since Ant 1.7.1
* @param sourceResource the resource to load
* @throws BuildException if the resource cannot be read
*/
public void loadResource(Resource sourceResource) {
String name = sourceResource.toLongString();
InputStream in = null;
try {
in = sourceResource.getInputStream();
} catch (IOException e) {
throw new BuildException("Failed to open "+name,e);
} catch (UnsupportedOperationException e) {
throw new BuildException("Failed to open " + name+ " -it is not readable",e);
}
readSource(new InputStreamReader(in), name);
}

/**
* Add all resources in a resource collection to the source list.
* @since Ant 1.7.1
* @param collection the resource to load
* @throws BuildException if a resource cannot be read
*/
public void loadResources(ResourceCollection collection) {
Iterator resources = collection.iterator();
while (resources.hasNext()) {
Resource resource = (Resource) resources.next();
loadResource(resource);
}
}

/**
* Set the script text.
* Set the script text. Properties in the text are not expanded!
*
* @param text a component of the script text to be added.
*/
public void addText(String text) {
this.script += text;
script += text;
}

/**


+ 17
- 0
src/main/org/apache/tools/ant/util/ScriptRunnerHelper.java View File

@@ -21,6 +21,9 @@ import org.apache.tools.ant.ProjectComponent;
import org.apache.tools.ant.types.Path;
import java.io.File;
import org.apache.tools.ant.types.Reference;
import org.apache.tools.ant.types.Resource;
import org.apache.tools.ant.types.ResourceCollection;
import org.apache.tools.ant.types.resources.Union;


/**
@@ -36,6 +39,7 @@ public class ScriptRunnerHelper {
private boolean setBeans = true;
private ProjectComponent projectComponent;
private ClassLoader scriptLoader = null;
private Union resources=new Union();

/**
* Set the project component associated with this helper.
@@ -57,6 +61,9 @@ public class ScriptRunnerHelper {
if (text != null) {
runner.addText(text);
}
if (resources !=null) {
runner.loadResources(resources);
}
if (setBeans) {
runner.bindToComponent(projectComponent);
} else {
@@ -188,4 +195,14 @@ public class ScriptRunnerHelper {
projectComponent.getProject()).createRunner(
manager, language, generateClassLoader());
}

/**
* Add any source resource.
*
* @param resource source of script
* @since Ant1.7.1
*/
public void add(ResourceCollection resource) {
resources.add(resource);
}
}

+ 99
- 0
src/tests/antunit/taskdefs/optional/script/scriptdef-test.xml View File

@@ -0,0 +1,99 @@
<project default="test" xmlns:au="antlib:org.apache.ant.antunit">

<description>
In which we test interesting aspects of scripting.
The targeted language is javascript; this lets us run without
additions on Java6+.
</description>

<target name="test">
<au:antunit>
<fileset file="${ant.file}"/>
<au:plainlistener/>
</au:antunit>
</target>
<target name="tearDown">
</target>

<property name="script.manager" value="auto" />

<string id="script.code">
self.log("Ant version =${ant.version}");
project.setNewProperty("property","live");
</string>

<presetdef name="js">
<scriptdef language="javascript" name="scripttest"
manager="${script.manager}">
<!-- optional property attribute-->
<attribute name="property" />
</scriptdef>
</presetdef>

<property name="prop"
value='self.log("Ant version =${ant.version}");project.setNewProperty("property","live");' />


<presetdef name="assertPropSet">
<au:assertPropertyEquals name="property" value="live" />
</presetdef>


<!--purely to test that everything works -->
<target name="testInline">
<js > self.log("Hello");</js>
<scripttest/>
</target>


<target name="testStringResource">
<js >
<string value='self.log("Ant version =${ant.version}");' />
</js>
<scripttest/>
</target>



<target name="testStringResourceRef">
<js >
<string refid="script.code" />
</js>
<scripttest/>
<assertPropSet />
</target>

<target name="testStringResourceInline">
<js >
<string >
self.log("Ant version =${ant.version}");
project.setNewProperty("property","live");
</string>
</js>
<scripttest/>
<assertPropSet />
</target>


<target name="testPropertyResource">
<js>
<propertyresource name="prop" />
</js>
<scripttest/>
<assertPropSet />
</target>

<target name="testMixedResources">
<js >
<string refid="script.code" />
<propertyresource name="prop" />
<string >
project.setNewProperty("property2","live");
</string>
</js>
<scripttest/>
<assertPropSet name="property2" />
</target>

</project>

Loading…
Cancel
Save