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]

Reply via email to