conor       2003/07/20 02:34:21

  Modified:    .        build.xml
               src/main/org/apache/tools/ant/taskdefs/optional Script.java
               src/main/org/apache/tools/ant/taskdefs/optional/script
                        ScriptDef.java
               src/main/org/apache/tools/ant/types/optional
                        ScriptFilter.java
               src/testcases/org/apache/tools/ant/taskdefs/optional/script
                        ScriptDefTest.java
  Added:       src/main/org/apache/tools/ant/util ScriptRunner.java
  Log:
  Refactor script related tasks into single ScriptRunner utility.
  
  Revision  Changes    Path
  1.389     +1 -0      ant/build.xml
  
  Index: build.xml
  ===================================================================
  RCS file: /home/cvs/ant/build.xml,v
  retrieving revision 1.388
  retrieving revision 1.389
  diff -u -w -u -r1.388 -r1.389
  --- build.xml 16 Jul 2003 14:39:30 -0000      1.388
  +++ build.xml 20 Jul 2003 09:34:21 -0000      1.389
  @@ -233,6 +233,7 @@
         <filename name="${optional.package}/Script*"/>
         <filename name="${optional.package}/script/**/*"/>
         <filename name="${optional.type.package}/Script*"/>
  +      <filename name="${util.package}/Script*"/>
       </or>
     </selector>
   
  
  
  
  1.23      +16 -80    
ant/src/main/org/apache/tools/ant/taskdefs/optional/Script.java
  
  Index: Script.java
  ===================================================================
  RCS file: 
/home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/optional/Script.java,v
  retrieving revision 1.22
  retrieving revision 1.23
  diff -u -w -u -r1.22 -r1.23
  --- Script.java       18 Jul 2003 12:45:57 -0000      1.22
  +++ Script.java       20 Jul 2003 09:34:21 -0000      1.23
  @@ -1,7 +1,7 @@
   /*
    * The Apache Software License, Version 1.1
    *
  - * Copyright (c) 2000-2002 The Apache Software Foundation.  All rights
  + * Copyright (c) 2000-2003 The Apache Software Foundation.  All rights
    * reserved.
    *
    * Redistribution and use in source and binary forms, with or without
  @@ -54,14 +54,9 @@
   package org.apache.tools.ant.taskdefs.optional;
   
   import java.io.File;
  -import java.io.FileInputStream;
  -import java.io.IOException;
  -import java.util.Enumeration;
  -import java.util.Hashtable;
  -import org.apache.bsf.BSFException;
  -import org.apache.bsf.BSFManager;
   import org.apache.tools.ant.BuildException;
   import org.apache.tools.ant.Task;
  +import org.apache.tools.ant.util.ScriptRunner;
   
   /**
    * Executes a script.
  @@ -70,29 +65,8 @@
    * @author Sam Ruby <a href="mailto:[EMAIL PROTECTED]">[EMAIL PROTECTED]</a>
    */
   public class Script extends Task {
  -    private String language;
  -    private String script = "";
  -    private Hashtable beans = new Hashtable();
  -
  -    /**
  -     * Add a list of named objects to the list to be exported to the script
  -     */
  -    private void addBeans(Hashtable dictionary) {
  -        for (Enumeration e = dictionary.keys(); e.hasMoreElements();) {
  -            String key = (String) e.nextElement();
  -
  -            boolean isValid = key.length() > 0
  -                && Character.isJavaIdentifierStart(key.charAt(0));
  -
  -            for (int i = 1; isValid && i < key.length(); i++) {
  -                isValid = Character.isJavaIdentifierPart(key.charAt(i));
  -            }
  -
  -            if (isValid) {
  -                beans.put(key, dictionary.get(key));
  -            }
  -        }
  -    }
  +    /** Used to run the script */
  +    private ScriptRunner runner = new ScriptRunner();
   
       /**
        * Do the work.
  @@ -100,38 +74,15 @@
        * @exception BuildException if someting goes wrong with the build
        */
       public void execute() throws BuildException {
  -        try {
  -            addBeans(getProject().getProperties());
  -            addBeans(getProject().getUserProperties());
  -            addBeans(getProject().getTargets());
  -            addBeans(getProject().getReferences());
  -
  -            beans.put("project", getProject());
  -
  -            beans.put("self", this);
  -
  -            BSFManager manager = new BSFManager ();
  -
  -            for (Enumeration e = beans.keys(); e.hasMoreElements();) {
  -                String key = (String) e.nextElement();
  -                Object value = beans.get(key);
  -                manager.declareBean(key, value, value.getClass());
  -            }
  +        runner.addBeans(getProject().getProperties());
  +        runner.addBeans(getProject().getUserProperties());
  +        runner.addBeans(getProject().getTargets());
  +        runner.addBeans(getProject().getReferences());
   
  -            // execute the script
  -            manager.exec(language, "<ANT>", 0, 0, script);
  -        } catch (BSFException be) {
  -            Throwable t = be;
  -            Throwable te = be.getTargetException();
  -            if (te != null) {
  -                if  (te instanceof BuildException) {
  -                    throw (BuildException) te;
  -                } else {
  -                    t = te;
  -                }
  -            }
  -            throw new BuildException(t);
  -        }
  +        runner.addBean("project", getProject());
  +        runner.addBean("self", this);
  +
  +        runner.executeScript("<ANT>");
       }
   
       /**
  @@ -140,7 +91,7 @@
        * @param language the scripting language name for the script.
        */
       public void setLanguage(String language) {
  -        this.language = language;
  +        runner.setLanguage(language);
       }
   
       /**
  @@ -150,22 +101,7 @@
        */
       public void setSrc(String fileName) {
           File file = new File(fileName);
  -        if (!file.exists()) {
  -            throw new BuildException("file " + fileName + " not found.");
  -        }
  -
  -        int count = (int) file.length();
  -        byte[] data = new byte[count];
  -
  -        try {
  -            FileInputStream inStream = new FileInputStream(file);
  -            inStream.read(data);
  -            inStream.close();
  -        } catch (IOException e) {
  -            throw new BuildException(e);
  -        }
  -
  -        script += new String(data);
  +        runner.setSrc(file);
       }
   
       /**
  @@ -174,6 +110,6 @@
        * @param text a component of the script text to be added.
        */
       public void addText(String text) {
  -        this.script += text;
  +        runner.addText(text);
       }
   }
  
  
  
  1.5       +45 -42    
ant/src/main/org/apache/tools/ant/taskdefs/optional/script/ScriptDef.java
  
  Index: ScriptDef.java
  ===================================================================
  RCS file: 
/home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/optional/script/ScriptDef.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -w -u -r1.4 -r1.5
  --- ScriptDef.java    19 Jul 2003 11:20:20 -0000      1.4
  +++ ScriptDef.java    20 Jul 2003 09:34:21 -0000      1.5
  @@ -65,9 +65,9 @@
   import java.util.Iterator;
   import java.util.Set;
   import java.util.HashSet;
  +import java.io.File;
   
  -import org.apache.bsf.BSFException;
  -import org.apache.bsf.BSFManager;
  +import org.apache.tools.ant.util.ScriptRunner;
   
   /**
    * Define a task using a script
  @@ -76,15 +76,12 @@
    * @since Ant 1.6
    */
   public class ScriptDef extends Task {
  +    /** Used to run the script */
  +    private ScriptRunner runner = new ScriptRunner();
  +
       /** the name by which this script will be activated */
       private String name;
   
  -    /** the scripting language used by the script */
  -    private String language;
  -
  -    /** the script itself */
  -    private String script = "";
  -
       /** Attributes definitions of this script */
       private List attributes = new ArrayList();
   
  @@ -107,17 +104,15 @@
           this.name = name;
       }
   
  -    public boolean isAttributeSupported(String attributeName) {
  -        return attributeSet.contains(attributeName);
  -    }
  -
       /**
  -     * Set the scripting language used by this script
  +     * Indicates whether the task supports a given attribute name
        *
  -     * @param language the scripting language used by this script.
  +     * @param attributeName the name of the attribute.
  +     *
  +     * @return true if the attribute is supported by the script.
        */
  -    public void setLanguage(String language) {
  -        this.language = language;
  +    public boolean isAttributeSupported(String attributeName) {
  +        return attributeSet.contains(attributeName);
       }
   
       /**
  @@ -211,8 +206,8 @@
                   + "name the script");
           }
   
  -        if (language == null) {
  -            throw new BuildException("scriptdef requires a language 
attribute "
  +        if (runner.getLanguage() == null) {
  +            throw new BuildException("<scriptdef> requires a language 
attribute "
                   + "to specify the script language");
           }
   
  @@ -277,6 +272,12 @@
           project.addTaskDefinition(name, ScriptDefBase.class);
       }
   
  +    /**
  +     * Create a nested element to be configured.
  +     *
  +     * @param elementName the name of the nested element.
  +     * @return object representing the element name.
  +     */
       public Object createNestedElement(String elementName) {
           NestedElement definition
               = (NestedElement) nestedElementMap.get(elementName);
  @@ -336,36 +337,38 @@
        * @param elements a list of nested element values.
        */
       public void executeScript(Map attributes, Map elements) {
  -        try {
  -            BSFManager manager = new BSFManager();
  -            // execute the script
  -            manager.declareBean("attributes", attributes,
  -                attributes.getClass());
  -            manager.declareBean("elements", elements,
  -                elements.getClass());
  -            manager.declareBean("project", getProject(), Project.class);
  -            manager.exec(language, "scriptdef <" + name + ">", 0, 0, script);
  -        } catch (BSFException e) {
  -            Throwable t = e;
  -            Throwable te = e.getTargetException();
  -            if (te != null) {
  -                if (te instanceof BuildException) {
  -                    throw (BuildException) te;
  -                } else {
  -                    t = te;
  +        runner.addBean("attributes", attributes);
  +        runner.addBean("elements", elements);
  +        runner.addBean("project", getProject());
  +        runner.executeScript("scriptdef <" + name + ">");
                   }
  +
  +
  +    /**
  +     * Defines the language (required).
  +     *
  +     * @param language the scripting language name for the script.
  +     */
  +    public void setLanguage(String language) {
  +        runner.setLanguage(language);
               }
  -            throw new BuildException(t);
  -        }
  +
  +    /**
  +     * Load the script from an external file ; optional.
  +     *
  +     * @param file the file containing the script source.
  +     */
  +    public void setSrc(File file) {
  +        runner.setSrc(file);
       }
   
       /**
  -     * Ass the scipt text.
  +     * Set the script text.
        *
  -     * @param text appended to the script text.
  +     * @param text a component of the script text to be added.
        */
       public void addText(String text) {
  -        this.script += text;
  +        runner.addText(text);
       }
   }
   
  
  
  
  1.6       +20 -111   
ant/src/main/org/apache/tools/ant/types/optional/ScriptFilter.java
  
  Index: ScriptFilter.java
  ===================================================================
  RCS file: 
/home/cvs/ant/src/main/org/apache/tools/ant/types/optional/ScriptFilter.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -w -u -r1.5 -r1.6
  --- ScriptFilter.java 18 Jul 2003 12:45:58 -0000      1.5
  +++ ScriptFilter.java 20 Jul 2003 09:34:21 -0000      1.6
  @@ -55,13 +55,8 @@
   
   import org.apache.tools.ant.filters.TokenFilter;
   import java.io.File;
  -import java.io.FileInputStream;
  -import java.io.IOException;
  -import java.util.Enumeration;
  -import java.util.Hashtable;
  -import org.apache.bsf.BSFException;
  -import org.apache.bsf.BSFManager;
   import org.apache.tools.ant.BuildException;
  +import org.apache.tools.ant.util.ScriptRunner;
   
   
   /**
  @@ -74,58 +69,28 @@
    * set self.token in the reply.
    *
    * @author Not Specified.
  + *
  + * @since Ant 1.6
    */
   public class ScriptFilter extends TokenFilter.ChainableReaderFilter {
  -    /** The language - attribute of element */
  -    private String language;
  -    /** The script - inline text or external file */
  -    private String script = "";
  -    /** The beans - see ScriptTask */
  -    private Hashtable beans = new Hashtable();
       /** Has this object been initialized ? */
       private boolean initialized = false;
  -    /** the BSF manager */
  -    private BSFManager manager;
       /** the token used by the script */
       private String token;
   
  +    private ScriptRunner runner = new ScriptRunner();
  +
       /**
        * Defines the language (required).
        *
        * @param language the scripting language name for the script.
        */
       public void setLanguage(String language) {
  -        this.language = language;
  -    }
  -
  -
  -    /**
  -     * Add a list of named objects to the list to be exported to the script
  -     * CAP from taskdefs.optional.Script
  -     */
  -    private void addBeans(Hashtable dictionary) {
  -        for (Enumeration e = dictionary.keys(); e.hasMoreElements();) {
  -            String key = (String) e.nextElement();
  -
  -            boolean isValid = key.length() > 0
  -                && Character.isJavaIdentifierStart(key.charAt(0));
  -
  -            for (int i = 1; isValid && i < key.length(); i++) {
  -                isValid = Character.isJavaIdentifierPart(key.charAt(i));
  +        runner.setLanguage(language);
               }
   
  -            try {
  -                if (isValid) {
  -                    beans.put(key, dictionary.get(key));
  -                }
  -            } catch (Throwable t) {
  -                throw new BuildException(t);
  -                //System.err.println("What the helll");
  -            }
  -        }
  -    }
       /**
  -     * Initialize, mostly CAP from taskdefs.option.Script#execute()
  +     * Initialize.
        *
        * @exception BuildException if someting goes wrong
        */
  @@ -134,42 +99,14 @@
               return;
           }
           initialized = true;
  -        if (language == null) {
  -            throw new BuildException(
  -                "scriptfilter: language is not defined");
  -        }
  -
  -        try {
  -            addBeans(getProject().getProperties());
  -            addBeans(getProject().getUserProperties());
  -            addBeans(getProject().getTargets());
  -            addBeans(getProject().getReferences());
  -
  -            beans.put("project", getProject());
   
  -            beans.put("self", this);
  -
  -            manager = new BSFManager ();
  -
  -            for (Enumeration e = beans.keys(); e.hasMoreElements();) {
  -                String key = (String) e.nextElement();
  -                Object value = beans.get(key);
  -                manager.declareBean(key, value, value.getClass());
  -            }
  -
  -        } catch (BSFException e) {
  -            Throwable t = e;
  -            Throwable te = e.getTargetException();
  -            if (te != null) {
  -                if (te instanceof BuildException) {
  -                    throw (BuildException) te;
  -                } else {
  -                    t = te;
  -                }
  -            }
  -            throw new BuildException(t);
  -        }
  +        runner.addBeans(getProject().getProperties());
  +        runner.addBeans(getProject().getUserProperties());
  +        runner.addBeans(getProject().getTargets());
  +        runner.addBeans(getProject().getReferences());
   
  +        runner.addBean("project", getProject());
  +        runner.addBean("self", this);
       }
   
       /**
  @@ -201,45 +138,17 @@
       public String filter(String token) {
           init();
           setToken(token);
  -        try {
  -            manager.exec(language, "<ANT>", 0, 0, script);
  +        runner.executeScript("<ANT-Filter>");
               return getToken();
  -        } catch (BSFException be) {
  -            Throwable t = be;
  -            Throwable te = be.getTargetException();
  -            if (te != null) {
  -                if  (te instanceof BuildException) {
  -                    throw (BuildException) te;
  -                } else {
  -                    t = te;
  -                }
  -            }
  -            throw new BuildException(t);
  -        }
       }
  +
       /**
        * Load the script from an external file ; optional.
        *
  -     * @param fileName the name of the file containing the script source.
  +     * @param file the file containing the script source.
        */
  -    public void setSrc(String fileName) {
  -        File file = new File(fileName);
  -        if (!file.exists()) {
  -            throw new BuildException("file " + fileName + " not found.");
  -        }
  -
  -        int count = (int) file.length();
  -        byte[] data = new byte[count];
  -
  -        try {
  -            FileInputStream inStream = new FileInputStream(file);
  -            inStream.read(data);
  -            inStream.close();
  -        } catch (IOException e) {
  -            throw new BuildException(e);
  -        }
  -
  -        script += new String(data);
  +    public void setSrc(File file) {
  +        runner.setSrc(file);
       }
   
       /**
  @@ -248,6 +157,6 @@
        * @param text a component of the script text to be added.
        */
       public void addText(String text) {
  -        this.script += text;
  +        runner.addText(text);
       }
   }
  
  
  
  1.1                  ant/src/main/org/apache/tools/ant/util/ScriptRunner.java
  
  Index: ScriptRunner.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "Ant" and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.tools.ant.util;
  
  import java.io.File;
  import java.io.FileInputStream;
  import java.io.IOException;
  import org.apache.bsf.BSFException;
  import org.apache.bsf.BSFManager;
  import org.apache.tools.ant.BuildException;
  import java.util.Map;
  import java.util.HashMap;
  import java.util.Iterator;
  
  /**
   * This class is used to run BSF scripts
   *
   * @author Sam Ruby <a href="mailto:[EMAIL PROTECTED]">[EMAIL PROTECTED]</a>
   * @author Conor MacNeill
   */
  public class ScriptRunner {
      /** Script language */
      private String language;
  
      /** Script content */
      private String script = "";
  
      /** Beans to be provided to the script */
      private Map beans = new HashMap();
  
  
      /**
       * Add a list of named objects to the list to be exported to the script
       *
       * @param dictionary a map of objects to be placed into the script context
       *        indexed by String names.
       */
      public void addBeans(Map dictionary) {
          for (Iterator i = dictionary.keySet().iterator(); i.hasNext();) {
              String key = (String) i.next();
              addBean(key, dictionary.get(key));
          }
      }
  
      /**
       * Add a single object into the script context.
       *
       * @param key the name in the context this object is to stored under.
       * @param bean the object to be stored in the script context.
       */
      public void addBean(String key, Object bean) {
          boolean isValid = key.length() > 0
              && Character.isJavaIdentifierStart(key.charAt(0));
  
          for (int i = 1; isValid && i < key.length(); i++) {
              isValid = Character.isJavaIdentifierPart(key.charAt(i));
          }
  
          if (isValid) {
              beans.put(key, bean);
          }
      }
  
      /**
       * Do the work.
       *
       * @param execName the name that will be passed to BSF for this script
       *        execution.
       *
       * @exception BuildException if someting goes wrong exectuing the script.
       */
      public void executeScript(String execName) throws BuildException {
          if (language == null) {
              throw new BuildException("script language must be specified");
          }
  
          try {
              BSFManager manager = new BSFManager ();
  
              for (Iterator i = beans.keySet().iterator(); i.hasNext();) {
                  String key = (String) i.next();
                  Object value = beans.get(key);
                  manager.declareBean(key, value, value.getClass());
              }
  
              // execute the script
              manager.exec(language, execName, 0, 0, script);
          } catch (BSFException be) {
              Throwable t = be;
              Throwable te = be.getTargetException();
              if (te != null) {
                  if  (te instanceof BuildException) {
                      throw (BuildException) te;
                  } else {
                      t = te;
                  }
              }
              throw new BuildException(t);
          }
      }
  
      /**
       * Defines the language (required).
       *
       * @param language the scripting language name for the script.
       */
      public void setLanguage(String language) {
          this.language = language;
      }
  
      /**
       * Get the script language
       *
       * @return the script language
       */
      public String getLanguage() {
          return language;
      }
  
      /**
       * Load the script from an external file ; optional.
       *
       * @param file the file containing the script source.
       */
      public void setSrc(File file) {
          if (!file.exists()) {
              throw new BuildException("file " + file.getPath() + " not 
found.");
          }
  
          int count = (int) file.length();
          byte[] data = new byte[count];
  
          try {
              FileInputStream inStream = new FileInputStream(file);
              inStream.read(data);
              inStream.close();
          } catch (IOException e) {
              throw new BuildException(e);
          }
  
          script += new String(data);
      }
  
      /**
       * Set the script text.
       *
       * @param text a component of the script text to be added.
       */
      public void addText(String text) {
          this.script += text;
      }
  }
  
  
  
  1.4       +21 -21    
ant/src/testcases/org/apache/tools/ant/taskdefs/optional/script/ScriptDefTest.java
  
  Index: ScriptDefTest.java
  ===================================================================
  RCS file: 
/home/cvs/ant/src/testcases/org/apache/tools/ant/taskdefs/optional/script/ScriptDefTest.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -w -u -r1.3 -r1.4
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to