diff --git a/proposal/embed/src/java/org/apache/tools/ant/taskdefs/Import.java b/proposal/embed/src/java/org/apache/tools/ant/taskdefs/Import.java new file mode 100644 index 000000000..e4d4d9050 --- /dev/null +++ b/proposal/embed/src/java/org/apache/tools/ant/taskdefs/Import.java @@ -0,0 +1,182 @@ +/* + * 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.taskdefs; + +import org.apache.tools.ant.*; +import org.apache.tools.ant.helper.*; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.util.Hashtable; +import java.util.Vector; +import java.util.Enumeration; +import java.util.Locale; +import java.util.Stack; +import org.xml.sax.Locator; +import org.xml.sax.InputSource; +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 org.apache.tools.ant.util.JAXPUtils; + +/** + * Import task. + * + * It must be 'top level'. On execution it'll read another file + * into the same Project. + * + * @author Nicola Ken Barozzi nicolaken@apache.org + * @author Dominique Devienne DDevienne@lgc.com + * @author Costin Manolache + */ +public class Import extends Task { + String file; + + public void setFile( String file ) { + // I don't think we can use File - different rules + // for relative paths. + this.file=file; + } + + /** + * Initialisation routine called after handler creation + * with the element name and attributes. The attributes which + * this handler can deal with are: "default", + * "name", "id" and "basedir". + * + * @param tag Name of the element which caused this handler + * to be created. Should not be null. + * Ignored in this implementation. + * @param attrs Attributes of the element which caused this + * handler to be created. Must not be null. + * + * @exception SAXParseException if an unexpected attribute is + * encountered or if the "default" attribute + * is missing. + */ + public void execute() throws BuildException + { + if (file == null) { + throw new BuildException("import element appears without a file attribute"); + } + + ProjectHelperImpl2.AntXmlContext context; + context=(ProjectHelperImpl2.AntXmlContext)project.getReference("ant.parsing.context"); + + context.importlevel++; + + project.log("importlevel: "+(context.importlevel-1)+" -> "+(context.importlevel), + Project.MSG_DEBUG); + project.log("Importing file "+file+" from "+ + context.buildFile.getAbsolutePath(), + Project.MSG_VERBOSE); + + // Paths are relative to the build file they're imported from, + // *not* the current directory (same as entity includes). + File importedFile = new File(file); + if (!importedFile.isAbsolute()) { + importedFile = new File(context.buildFileParent, file); + } + if (!importedFile.exists()) { + throw new BuildException("Cannot find "+file+" imported from "+ + context.buildFile.getAbsolutePath()); + } + + // Add parent build file to the map to avoid cycles... + String parentFilename = getPath(context.buildFile); + if (!context.importedFiles.containsKey(parentFilename)) { + context.importedFiles.put(parentFilename, context.buildFile); + } + + // Make sure we import the file only once + String importedFilename = getPath(importedFile); + if (context.importedFiles.containsKey(importedFilename)) { + project.log("\nSkipped already imported file:\n "+importedFilename+"\n", + Project.MSG_WARN); + context.importlevel--; + project.log("importlevel: "+context.importlevel+" <- "+ + (context.importlevel+1) ,Project.MSG_DEBUG); + return; + } else { + context.importedFiles.put(importedFilename, importedFile); + } + + context.ignoreProjectTag=true; + context.helper.parse(project, importedFile, new ProjectHelperImpl2.RootHandler(context)); + + context.importlevel--; + project.log("importlevel: "+context.importlevel+" <- "+ + (context.importlevel+1) ,Project.MSG_DEBUG); + } + + private static String getPath(File file) { + try { + return file.getCanonicalPath(); + } + catch (IOException e) { + return file.getAbsolutePath(); + } + } +} diff --git a/proposal/embed/src/java/org/apache/tools/ant/taskdefs/SystemPath.java b/proposal/embed/src/java/org/apache/tools/ant/taskdefs/SystemPath.java new file mode 100644 index 000000000..21a76cbbc --- /dev/null +++ b/proposal/embed/src/java/org/apache/tools/ant/taskdefs/SystemPath.java @@ -0,0 +1,219 @@ +/* + * 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.taskdefs; + +import org.apache.tools.ant.*; +import org.apache.tools.ant.types.*; + +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 Task { + 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. - */ - -package org.apache.tools.ant.taskdefs.optional; - -import org.apache.tools.ant.*; -import org.apache.tools.ant.types.*; - -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; - -import org.apache.commons.jxpath.*; - -// Experimental: need to add code to select the 'root', etc. - -/** - * Enable JXPath dynamic properties - * - * - * @author Costin Manolache - */ -public class JXPath extends Task implements PropertyInterceptor { - JXPathContext jxpathCtx; - - public JXPath() { - } - - public Object getProperty( Project p, String ns, String name ) { - if( ! name.startsWith("jxpath:" ) ) - return null; - System.out.println("JXPath: getProperty " + ns + " " + name ); - name=name.substring( 7 ); - return jxpathCtx.getValue( name ); - } - - - public void execute() { - PropertyHelper phelper=PropertyHelper.getPropertyHelper( project ); - phelper.addPropertyInterceptor( this ); - - jxpathCtx=JXPathContext.newContext( project ); - } - -}