ant-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From cos...@apache.org
Subject cvs commit: jakarta-ant/proposal/sandbox/embed SystemPath.java ProjectHelperImpl2.java ant-sax2.jar build.xml
Date Tue, 16 Jul 2002 22:17:06 GMT
costin      2002/07/16 15:17:06

  Modified:    proposal/sandbox/embed ProjectHelperImpl2.java ant-sax2.jar
                        build.xml
  Added:       proposal/sandbox/embed SystemPath.java
  Log:
  First version of the <systemPath>.
  
  You need to include ant-sax2.jar in ant/lib, define a <path id='foo'> that includes
  all the jars that you need ( junit.jar, etc ) and then use
   <systemPath pathRef='foo' /> to create the loader and reload all optional tasks.
  
  After this step all optional tasks will work in the same way as if you have
  included the jars from the <path> definition in ant/lib.
  
  I did some basic tests and seems to work fine - note that <taskdef> will
  work as before, i.e. if you explicitely define tasks that need optional
  jars ( or redefine optional task ), you'll have the old behavior ( i.e.
  require things in CLASSPATH ).
  
  I'll try to find what changes are need for <import> and re-do the build
  for ant-sax2, then do more testings.
  
  Revision  Changes    Path
  1.6       +4 -36     jakarta-ant/proposal/sandbox/embed/ProjectHelperImpl2.java
  
  Index: ProjectHelperImpl2.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/proposal/sandbox/embed/ProjectHelperImpl2.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- ProjectHelperImpl2.java	14 Jul 2002 01:15:59 -0000	1.5
  +++ ProjectHelperImpl2.java	16 Jul 2002 22:17:05 -0000	1.6
  @@ -82,6 +82,7 @@
   import javax.xml.parsers.SAXParser;
   import javax.xml.parsers.ParserConfigurationException;
   
  +import org.apache.tools.ant.types.SystemPath;
   /**
    * Sax2 based project reader
    *
  @@ -97,39 +98,6 @@
        */
       private static SAXParserFactory parserFactory = null;
   
  -    /** Will prepare the class loader to allow dynamic modifications
  -        of the classpath. Optional tasks are loaded in a different loader.
  -    */
  -    public void initClassLoader(Project project) {
  -        try {
  -            // reverse loader
  -            AntClassLoader acl=new AntClassLoader( this.getClass().getClassLoader(), true
);
  -            acl.addLoaderPackageRoot( "org.apache.tools.ant.taskdefs.optional");
  -
  -            // XXX find the classpath
  -            String antHome=project.getProperty( "ant.home" );
  -            File optionalJar=new File( antHome + "/lib/optional.jar" );
  -            System.out.println("Optional.jar = " +optionalJar.getAbsolutePath());
  -            acl.addPathElement(optionalJar.getAbsolutePath() );
  -            
  -            // reload all optional tasks in this loader.
  -            Hashtable tasks=project.getTaskDefinitions();
  -            Enumeration keys=tasks.keys();
  -            while( keys.hasMoreElements() ) {
  -                String n=(String)keys.nextElement();
  -                Class c=(Class)tasks.get(n);
  -                if( ! c.getName().startsWith( "org.apache.tools.ant.taskdefs.optional"
))
  -                    continue;
  -                // System.out.println("Reloading " + n + " " + c + " " + c.getClassLoader()
);
  -                c=acl.loadClass( c.getName() );
  -                tasks.put( n, c );
  -                // System.out.println("Loaded " + n + " " + c.getClassLoader() );
  -            }
  -        } catch( Exception ex ) {
  -            ex.printStackTrace();
  -        }
  -    }
  -
       /**
        * Parses the project file, configuring the project as it goes.
        * 
  @@ -137,9 +105,9 @@
        *                           be read
        */
       public void parse(Project project, Object source) throws BuildException {
  -        // re-init class loader for optional.jar
  -        initClassLoader( project );
  -
  +        // Hook our one tasks.
  +        project.addDataTypeDefinition( "systemPath" , SystemPath.class );
  +        
           AntXmlContext context=new AntXmlContext();
           if(source instanceof File) {
               context.buildFile=(File)source;
  
  
  
  1.4       +85 -67    jakarta-ant/proposal/sandbox/embed/ant-sax2.jar
  
  	<<Binary file>>
  
  
  1.4       +10 -2     jakarta-ant/proposal/sandbox/embed/build.xml
  
  Index: build.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/proposal/sandbox/embed/build.xml,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- build.xml	14 Jul 2002 01:15:59 -0000	1.3
  +++ build.xml	16 Jul 2002 22:17:06 -0000	1.4
  @@ -4,13 +4,19 @@
     <property name="debug" value="true"/>
       
     <target name="main">
  -    <copy id="test" file="ProjectHelperImpl2.java"  
  +    <copy file="ProjectHelperImpl2.java"  
             todir="${ant.src}/src/main/org/apache/tools/ant/helper" />
       <copy file="RuntimeConfigurable2.java"  
             todir="${ant.src}/src/main/org/apache/tools/ant" />
  +    <copy file="RuntimeConfigurable2.java"  
  +          todir="${ant.src}/src/main/org/apache/tools/ant" />
  +    <copy file="RuntimeConfigurable2.java"  
  +          todir="${ant.src}/src/main/org/apache/tools/ant" />
       <copy file="PropertyInterceptor.java"  
             todir="${ant.src}/src/main/org/apache/tools/ant" />
  -    <copy file="PropertyHelper.java"  
  +    <copy file="SystemPath.java"  
  +          todir="${ant.src}/src/main/org/apache/tools/ant/types" />
  +    <copy id="test" file="PropertyHelper.java"  
             todir="${ant.src}/src/main/org/apache/tools/ant" />
   
       <echo message="${toString:test}" />
  @@ -23,6 +29,7 @@
         <include name="**/PropertyHelper.java" />
         <include name="**/PropertyInterceptor.java" />
         <include name="**/RuntimeConfigurable2.java" />
  +      <include name="**/SystemPath.java" />
       </javac>
   
       <mkdir dir="${ant.build}/classes/META-INF/services" />
  @@ -36,6 +43,7 @@
         <include name="org/apache/tools/ant/RuntimeConfigurable2*" />
         <include name="org/apache/tools/ant/PropertyHelper*" />
         <include name="org/apache/tools/ant/PropertyInterceptor*" />
  +      <include name="org/apache/tools/ant/types/SystemPath*" />
       </jar>
   
       <copy file="ant-sax2.jar" todir="${ant.home}/lib" />
  
  
  
  1.1                  jakarta-ant/proposal/sandbox/embed/SystemPath.java
  
  Index: SystemPath.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2000-2002 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 "The Jakarta Project", "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 apache@apache.org.
   *
   * 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.types;
  
  import org.apache.tools.ant.*;
  
  import java.io.*;
  import java.util.*;
  import org.xml.sax.Locator;
  import org.xml.sax.InputSource;
  //import org.xml.sax.HandlerBase;
  import org.xml.sax.SAXParseException;
  import org.xml.sax.XMLReader;
  import org.xml.sax.SAXException;
  import org.xml.sax.DocumentHandler;
  import org.xml.sax.Attributes;
  import org.xml.sax.AttributeList;
  import org.xml.sax.helpers.XMLReaderAdapter;
  import org.xml.sax.helpers.DefaultHandler;
  import org.xml.sax.helpers.AttributeListImpl;
  
  import javax.xml.parsers.SAXParserFactory;
  import javax.xml.parsers.SAXParser;
  import javax.xml.parsers.ParserConfigurationException;
  
  /**
   * Specify a system path, to be used to load optional.jar and all
   * related libraries.
   *
   * Using the specified path it'll try to load or reload all optional
   * tasks. The typical use is:
   * <pre>
   *  &lt;path id="ant.deps" &gt;
   *     &lt;fileset ... /&gt;
   *  &lt;/path&gt;
   *
   *  &lt;systemPath pathRef="ant.deps" /&gt;
   *
   *  &lt;junit ... /&gt;
   * </pre>
   *
   * This requires that ant-sax2.jar is included in ant/lib.
   *
   * It has a single property, a reference to a &lt;path&gt; containing all
   * the jars that you need. It'll automatically reload optional.jar
   * tasks in a different (non-delegating) loader.
   *
   * @author Costin Manolache
   */
  public class SystemPath extends DataType {
      public static final String SYSTEM_LOADER_REF="ant.system.loader";
      
      public SystemPath() {
      }
  
      /** Specify which path will be used.
       */
      public void setPathRef( Reference pathRef ) throws BuildException {
          Path path=(Path)pathRef.getReferencedObject(project);
  
          initSystemLoader(path);
  
      }
      
      /** Will prepare the class loader to allow dynamic modifications
       *   of the classpath. Optional tasks are loaded in a different loader.
       */
      private void initSystemLoader(Path path) {
          try {
              if( project.getReference( SYSTEM_LOADER_REF ) != null )
                  return; // already done that.
              
              // reverse loader
              AntClassLoader acl=new AntClassLoader( this.getClass().getClassLoader(), true
);
              acl.addLoaderPackageRoot( "org.apache.tools.ant.taskdefs.optional");
              project.addReference( SYSTEM_LOADER_REF, acl );
              
              
              String list[]=path.list();
              for( int i=0; i<list.length; i++ ) {
                  File f= new File( list[i] );
                  if( f.exists() ) {
                      acl.addPathElement(f.getAbsolutePath());
                  }
              }
              
              // XXX find the classpath
              String antHome=project.getProperty( "ant.home" );
              File optionalJar=new File( antHome + "/lib/optional.jar" );
              if( optionalJar.exists() )
                  acl.addPathElement(optionalJar.getAbsolutePath() );
  
              // reinit the loader for optional, if they were in /lib/
              Hashtable tasks=project.getTaskDefinitions();
  
              //System.out.println("Replacing jars" );
              // reload all optional tasks in this loader.
              // Some tasks weren't defined by the normal init(), since deps were missing.
              String defs = "/org/apache/tools/ant/taskdefs/defaults.properties";
  
              try {
                  Properties props = new Properties();
                  InputStream in = this.getClass().getResourceAsStream(defs);
                  if (in == null) {
                      throw new BuildException("Can't load default task list");
                  }
                  props.load(in);
                  in.close();
                  
                  Enumeration enum = props.propertyNames();
                  while (enum.hasMoreElements()) {
                      String key = (String) enum.nextElement();
                      String value = props.getProperty(key);
                      if( ! value.startsWith( "org.apache.tools.ant.taskdefs.optional" ))
                          continue;
                      // other classes that needs to be replaced ??
                      try {
                          Class taskClass = acl.loadClass(value);
                          project.addTaskDefinition(key, taskClass);
                          //System.out.println("Loaded " + key + " " + taskClass.getClassLoader()
);
                      } catch (NoClassDefFoundError ncdfe) {
                          log("Could not load a dependent class ("
                              + ncdfe.getMessage() + ") for task " + key, Project.MSG_DEBUG);
                      } catch (ClassNotFoundException cnfe) {
                          log("Could not load class (" + value
                              + ") for task " + key, Project.MSG_DEBUG);
                      } catch (Exception ex) {
                          ex.printStackTrace();
                      }
                  }
              } catch (IOException ioe) {
                  throw new BuildException("Can't load default task list");
              }
              
          } catch( Exception ex ) {
              ex.printStackTrace();
          }
      }
  }
  
  
  

--
To unsubscribe, e-mail:   <mailto:ant-dev-unsubscribe@jakarta.apache.org>
For additional commands, e-mail: <mailto:ant-dev-help@jakarta.apache.org>


Mime
View raw message