I am staggering under the weight of this (in a good way). It looks cool. :) This is exactly the type of thing I had hoped would just occur to us after we got the resources stuff in place. Great work, Steve. :)
-Matt --- [EMAIL PROTECTED] wrote: > 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] > > __________________________________________________ Do You Yahoo!? Tired of spam? Yahoo! Mail has the best spam protection around http://mail.yahoo.com --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]