diff --git a/proposal/sandbox/embed/ProjectHelperImpl2.java b/proposal/sandbox/embed/ProjectHelperImpl2.java index 8f86e0d54..2b4534471 100644 --- a/proposal/sandbox/embed/ProjectHelperImpl2.java +++ b/proposal/sandbox/embed/ProjectHelperImpl2.java @@ -82,6 +82,7 @@ import javax.xml.parsers.SAXParserFactory; 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 @@ public class ProjectHelperImpl2 extends ProjectHelper { */ 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 @@ public class ProjectHelperImpl2 extends ProjectHelper { * 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; diff --git a/proposal/sandbox/embed/SystemPath.java b/proposal/sandbox/embed/SystemPath.java new file mode 100644 index 000000000..0426f48a6 --- /dev/null +++ b/proposal/sandbox/embed/SystemPath.java @@ -0,0 +1,191 @@ +/* + * 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 + * . + */ + +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: + *
+ *  <path id="ant.deps" >
+ *     <fileset ... />
+ *  </path>
+ *
+ *  <systemPath pathRef="ant.deps" />
+ *
+ *  <junit ... />
+ * 
+ * + * This requires that ant-sax2.jar is included in ant/lib. + * + * It has a single property, a reference to a <path> 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 - + + - + @@ -23,6 +29,7 @@ + @@ -36,6 +43,7 @@ +