Author: stevel
Date: Fri Apr 27 07:37:56 2007
New Revision: 533121
URL: http://svn.apache.org/viewvc?view=rev&rev=533121
Log:
Bug #41597; scriptdef should be resource-enabled.
Added:
ant/core/trunk/src/tests/antunit/taskdefs/optional/script/
ant/core/trunk/src/tests/antunit/taskdefs/optional/script/scriptdef-test.xml
Modified:
ant/core/trunk/WHATSNEW
ant/core/trunk/docs/manual/OptionalTasks/scriptdef.html
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/script/ScriptDef.java
ant/core/trunk/src/main/org/apache/tools/ant/util/ScriptRunnerBase.java
ant/core/trunk/src/main/org/apache/tools/ant/util/ScriptRunnerHelper.java
Modified: ant/core/trunk/WHATSNEW
URL:
http://svn.apache.org/viewvc/ant/core/trunk/WHATSNEW?view=diff&rev=533121&r1=533120&r2=533121
==============================================================================
--- ant/core/trunk/WHATSNEW (original)
+++ ant/core/trunk/WHATSNEW Fri Apr 27 07:37:56 2007
@@ -4,6 +4,11 @@
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
@@ -102,6 +107,11 @@
* <manifest> checks for validity of attribute names.
* 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
Modified: ant/core/trunk/docs/manual/OptionalTasks/scriptdef.html
URL:
http://svn.apache.org/viewvc/ant/core/trunk/docs/manual/OptionalTasks/scriptdef.html?view=diff&rev=533121&r1=533120&r2=533121
==============================================================================
--- ant/core/trunk/docs/manual/OptionalTasks/scriptdef.html (original)
+++ ant/core/trunk/docs/manual/OptionalTasks/scriptdef.html Fri Apr 27 07:37:56
2007
@@ -190,6 +190,13 @@
<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>
@@ -197,6 +204,7 @@
See the <a href="../OptionalTasks/script.html">script</a> task
for using this nested element.
</p>
+
<h3>Examples</h3>
Modified:
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/script/ScriptDef.java
URL:
http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/script/ScriptDef.java?view=diff&rev=533121&r1=533120&r2=533121
==============================================================================
---
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/script/ScriptDef.java
(original)
+++
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/script/ScriptDef.java
Fri Apr 27 07:37:56 2007
@@ -23,6 +23,8 @@
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 @@
}
// 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 [EMAIL PROTECTED]
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;
}
/**
@@ -381,6 +392,15 @@
*/
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);
}
}
Modified:
ant/core/trunk/src/main/org/apache/tools/ant/util/ScriptRunnerBase.java
URL:
http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/util/ScriptRunnerBase.java?view=diff&rev=533121&r1=533120&r2=533121
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/util/ScriptRunnerBase.java
(original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/util/ScriptRunnerBase.java Fri
Apr 27 07:37:56 2007
@@ -21,10 +21,16 @@
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 @@
* @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;
}
/**
Modified:
ant/core/trunk/src/main/org/apache/tools/ant/util/ScriptRunnerHelper.java
URL:
http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/util/ScriptRunnerHelper.java?view=diff&rev=533121&r1=533120&r2=533121
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/util/ScriptRunnerHelper.java
(original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/util/ScriptRunnerHelper.java
Fri Apr 27 07:37:56 2007
@@ -21,6 +21,9 @@
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 @@
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 @@
if (text != null) {
runner.addText(text);
}
+ if (resources !=null) {
+ runner.loadResources(resources);
+ }
if (setBeans) {
runner.bindToComponent(projectComponent);
} else {
@@ -187,5 +194,15 @@
return new ScriptRunnerCreator(
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);
}
}
Added:
ant/core/trunk/src/tests/antunit/taskdefs/optional/script/scriptdef-test.xml
URL:
http://svn.apache.org/viewvc/ant/core/trunk/src/tests/antunit/taskdefs/optional/script/scriptdef-test.xml?view=auto&rev=533121
==============================================================================
---
ant/core/trunk/src/tests/antunit/taskdefs/optional/script/scriptdef-test.xml
(added)
+++
ant/core/trunk/src/tests/antunit/taskdefs/optional/script/scriptdef-test.xml
Fri Apr 27 07:37:56 2007
@@ -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>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]