Submitted by: Matt Foemmel git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@267656 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -17,7 +17,7 @@ if "" == "%JAVAC%" set JAVAC=%JAVA_HOME%\bin\javac | |||||
| echo. | echo. | ||||
| echo ... Bootstrapping Ant Distribution | echo ... Bootstrapping Ant Distribution | ||||
| set CLASSPATH=src\main;classes;lib\xml.jar | |||||
| set CLASSPATH=src\main;classes;%CLASSPATH% | |||||
| if exist %JAVA_HOME%\lib\tools.jar set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\lib\tools.jar | if exist %JAVA_HOME%\lib\tools.jar set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\lib\tools.jar | ||||
| echo JAVA_HOME=%JAVA_HOME% | echo JAVA_HOME=%JAVA_HOME% | ||||
| @@ -40,7 +40,6 @@ echo. | |||||
| echo ... Copying Required Files | echo ... Copying Required Files | ||||
| copy %TOOLS%\ant\taskdefs\*.properties classes\org\apache\tools\ant\taskdefs | copy %TOOLS%\ant\taskdefs\*.properties classes\org\apache\tools\ant\taskdefs | ||||
| copy %TOOLS%\ant\*.properties classes\org\apache\tools\ant | |||||
| echo. | echo. | ||||
| echo ... Building Ant Distribution | echo ... Building Ant Distribution | ||||
| @@ -5,7 +5,7 @@ fi | |||||
| SRCDIR=src/main/org/apache/tools | SRCDIR=src/main/org/apache/tools | ||||
| CLASSDIR=classes | CLASSDIR=classes | ||||
| CLASSPATH=${CLASSPATH}:${JAVA_HOME}/lib/classes.zip:${JAVA_HOME}/lib/tools.jar | CLASSPATH=${CLASSPATH}:${JAVA_HOME}/lib/classes.zip:${JAVA_HOME}/lib/tools.jar | ||||
| CLASSPATH=${CLASSPATH}:lib/xml.jar:src/main:${CLASSDIR} | |||||
| CLASSPATH=${CLASSPATH}:src/main:${CLASSDIR} | |||||
| mkdir -p ${CLASSDIR} | mkdir -p ${CLASSDIR} | ||||
| @@ -17,7 +17,6 @@ javac -d ${CLASSDIR} ${SRCDIR}/ant/*.java | |||||
| javac -d ${CLASSDIR} ${SRCDIR}/ant/taskdefs/*.java | javac -d ${CLASSDIR} ${SRCDIR}/ant/taskdefs/*.java | ||||
| cp src/main/org/apache/tools/ant/taskdefs/defaults.properties ${CLASSDIR}/org/apache/tools/ant/taskdefs | cp src/main/org/apache/tools/ant/taskdefs/defaults.properties ${CLASSDIR}/org/apache/tools/ant/taskdefs | ||||
| cp src/main/org/apache/tools/ant/parser.properties ${CLASSDIR}/org/apache/tools/ant | |||||
| java org.apache.tools.ant.Main main | java org.apache.tools.ant.Main main | ||||
| java org.apache.tools.ant.Main clean | java org.apache.tools.ant.Main clean | ||||
| @@ -1,3 +1,3 @@ | |||||
| @echo off | @echo off | ||||
| REM convience bat file to build with | REM convience bat file to build with | ||||
| java -classpath "%CLASSPATH%;lib\ant.jar;lib\xml.jar" org.apache.tools.ant.Main %1 %2 %3 %4 %5 | |||||
| java -classpath "%CLASSPATH%;lib\ant.jar" org.apache.tools.ant.Main %1 %2 %3 %4 %5 | |||||
| @@ -1,6 +1,6 @@ | |||||
| #!/bin/sh | #!/bin/sh | ||||
| ADDL_CLASSPATH=./lib/ant.jar:./lib/xml.jar | |||||
| ADDL_CLASSPATH=./lib/ant.jar | |||||
| if [ "$CLASSPATH" != "" ] ; then | if [ "$CLASSPATH" != "" ] ; then | ||||
| CLASSPATH=$CLASSPATH:$ADDL_CLASSPATH | CLASSPATH=$CLASSPATH:$ADDL_CLASSPATH | ||||
| @@ -21,7 +21,7 @@ | |||||
| <property name="build.javadocs" value="build/javadocs"/> | <property name="build.javadocs" value="build/javadocs"/> | ||||
| <property name="ant.dist.dir" value="dist"/> | <property name="ant.dist.dir" value="dist"/> | ||||
| <property name="classpath" value="lib/xml.jar"/> | |||||
| <property name="classpath" value=""/> | |||||
| <property name="packages" value="org.apache.tools.*"/> | <property name="packages" value="org.apache.tools.*"/> | ||||
| <property name="manifest" value="src/etc/manifest"/> | <property name="manifest" value="src/etc/manifest"/> | ||||
| @@ -1,98 +0,0 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 1999 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", "Tomcat", 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; | |||||
| import java.io.File; | |||||
| import java.io.IOException; | |||||
| import java.net.URL; | |||||
| import java.lang.reflect.Method; | |||||
| import org.w3c.dom.Document; | |||||
| import org.xml.sax.InputSource; | |||||
| import org.xml.sax.SAXException; | |||||
| /** | |||||
| * Implementation of Parser using Apache Xerces-J. | |||||
| * | |||||
| * @author pier@apache.org | |||||
| */ | |||||
| public class ApacheParser extends Parser { | |||||
| Class DOMParser = null; | |||||
| Method parse; | |||||
| Method getDocument; | |||||
| /** | |||||
| * Parse the specified file and return a DOM Document. | |||||
| */ | |||||
| public Document parse(File buildFile) | |||||
| throws SAXException, IOException { | |||||
| try { | |||||
| if (DOMParser == null) { | |||||
| DOMParser = Class.forName("org.apache.xerces.parsers.DOMParser"); | |||||
| parse = DOMParser.getMethod("parse", new Class[]{String.class}); | |||||
| getDocument = DOMParser.getMethod("getDocument", new Class[]{}); | |||||
| } | |||||
| Object p=DOMParser.newInstance(); | |||||
| URL url=new URL("file","",buildFile.getAbsolutePath()); | |||||
| parse.invoke(p, new Object[]{url.toExternalForm()}); | |||||
| return(org.w3c.dom.Document)getDocument.invoke(p, new Object[]{}); | |||||
| } catch (Exception e) { | |||||
| if (e instanceof IOException) throw (IOException)e; | |||||
| if (e instanceof SAXException) throw (SAXException)e; | |||||
| throw new IOException(e.toString()); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -1,7 +1,7 @@ | |||||
| /* | /* | ||||
| * The Apache Software License, Version 1.1 | * The Apache Software License, Version 1.1 | ||||
| * | * | ||||
| * Copyright (c) 1999 The Apache Software Foundation. All rights | |||||
| * Copyright (c) 1999 The Apache Software Foundation. All rights | |||||
| * reserved. | * reserved. | ||||
| * | * | ||||
| * Redistribution and use in source and binary forms, with or without | * Redistribution and use in source and binary forms, with or without | ||||
| @@ -9,7 +9,7 @@ | |||||
| * are met: | * are met: | ||||
| * | * | ||||
| * 1. Redistributions of source code must retain the above copyright | * 1. Redistributions of source code must retain the above copyright | ||||
| * notice, this list of conditions and the following disclaimer. | |||||
| * notice, this list of conditions and the following disclaimer. | |||||
| * | * | ||||
| * 2. Redistributions in binary form must reproduce the above copyright | * 2. Redistributions in binary form must reproduce the above copyright | ||||
| * notice, this list of conditions and the following disclaimer in | * notice, this list of conditions and the following disclaimer in | ||||
| @@ -17,15 +17,15 @@ | |||||
| * distribution. | * distribution. | ||||
| * | * | ||||
| * 3. The end-user documentation included with the redistribution, if | * 3. The end-user documentation included with the redistribution, if | ||||
| * any, must include the following acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * any, must include the following acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | * Apache Software Foundation (http://www.apache.org/)." | ||||
| * Alternately, this acknowlegement may appear in the software itself, | * Alternately, this acknowlegement may appear in the software itself, | ||||
| * if and wherever such third-party acknowlegements normally appear. | * if and wherever such third-party acknowlegements normally appear. | ||||
| * | * | ||||
| * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software | * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software | ||||
| * Foundation" must not be used to endorse or promote products derived | * Foundation" must not be used to endorse or promote products derived | ||||
| * from this software without prior written permission. For written | |||||
| * from this software without prior written permission. For written | |||||
| * permission, please contact apache@apache.org. | * permission, please contact apache@apache.org. | ||||
| * | * | ||||
| * 5. Products derived from this software may not be called "Apache" | * 5. Products derived from this software may not be called "Apache" | ||||
| @@ -50,7 +50,7 @@ | |||||
| * individuals on behalf of the Apache Software Foundation. For more | * individuals on behalf of the Apache Software Foundation. For more | ||||
| * information on the Apache Software Foundation, please see | * information on the Apache Software Foundation, please see | ||||
| * <http://www.apache.org/>. | * <http://www.apache.org/>. | ||||
| */ | |||||
| */ | |||||
| package org.apache.tools.ant; | package org.apache.tools.ant; | ||||
| @@ -65,10 +65,13 @@ public class BuildException extends RuntimeException { | |||||
| /** Exception that might have caused this one. */ | /** Exception that might have caused this one. */ | ||||
| private Exception cause; | private Exception cause; | ||||
| /** Location in the build file where the exception occured */ | |||||
| private Location location = Location.UNKNOWN_LOCATION; | |||||
| /** | /** | ||||
| * Constructs a build exception with no descriptive information. | * Constructs a build exception with no descriptive information. | ||||
| */ | */ | ||||
| public BuildException() { | public BuildException() { | ||||
| super(); | super(); | ||||
| } | } | ||||
| @@ -77,7 +80,7 @@ public class BuildException extends RuntimeException { | |||||
| * Constructs an exception with the given descriptive message. | * Constructs an exception with the given descriptive message. | ||||
| * @param msg Description of or information about the exception. | * @param msg Description of or information about the exception. | ||||
| */ | */ | ||||
| public BuildException(String msg) { | public BuildException(String msg) { | ||||
| super(msg); | super(msg); | ||||
| } | } | ||||
| @@ -93,14 +96,60 @@ public class BuildException extends RuntimeException { | |||||
| super(msg); | super(msg); | ||||
| this.cause = cause; | this.cause = cause; | ||||
| } | } | ||||
| /** | |||||
| * Constructs an exception with the given message and exception as | |||||
| * a root cause and a location in a file. | |||||
| * @param msg Description of or information about the exception. | |||||
| * @param cause Exception that might have cause this one. | |||||
| * @param location Location in the project file where the error occured. | |||||
| */ | |||||
| public BuildException(String msg, Exception cause, Location location) { | |||||
| this(msg, cause); | |||||
| this.location = location; | |||||
| } | |||||
| /** | /** | ||||
| * Constructs an exception with the given exception as a root cause. | * Constructs an exception with the given exception as a root cause. | ||||
| * @param cause Exception that might have caused this one. | * @param cause Exception that might have caused this one. | ||||
| */ | */ | ||||
| public BuildException(Exception cause) { | public BuildException(Exception cause) { | ||||
| super(cause.toString()); | super(cause.toString()); | ||||
| this.cause = cause; | this.cause = cause; | ||||
| } | } | ||||
| /** | |||||
| * Constructs an exception with the given descriptive message and a location | |||||
| * in a file. | |||||
| * @param msg Description of or information about the exception. | |||||
| * @param location Location in the project file where the error occured. | |||||
| */ | |||||
| public BuildException(String msg, Location location) { | |||||
| super(msg); | |||||
| this.location = location; | |||||
| } | |||||
| /** | |||||
| * Returns the nested exception. | |||||
| */ | |||||
| public Exception getException() { | |||||
| return cause; | |||||
| } | |||||
| /** | |||||
| * Returns the location of the error and the error message. | |||||
| */ | |||||
| public String toString() { | |||||
| return location.toString() + getMessage(); | |||||
| } | |||||
| /** | |||||
| * Sets the file location where the error occured. | |||||
| */ | |||||
| public void setLocation(Location location) { | |||||
| this.location = location; | |||||
| } | |||||
| } | } | ||||
| @@ -141,7 +141,7 @@ public class Main { | |||||
| /* Interestingly enough, we get to here when a user | /* Interestingly enough, we get to here when a user | ||||
| * uses -Dname=value. However, in some cases, the JDK | * uses -Dname=value. However, in some cases, the JDK | ||||
| * goes ahead * and parses this out to args | |||||
| * goes ahead * and parses this out to args | |||||
| * {"-Dname", "value"} | * {"-Dname", "value"} | ||||
| * so instead of parsing on "=", we just make the "-D" | * so instead of parsing on "=", we just make the "-D" | ||||
| * characters go away and skip one argument forward. | * characters go away and skip one argument forward. | ||||
| @@ -189,7 +189,7 @@ public class Main { | |||||
| // ok, so if we've made it here, let's run the damn build allready | // ok, so if we've made it here, let's run the damn build allready | ||||
| runBuild(); | runBuild(); | ||||
| return; | return; | ||||
| } | } | ||||
| @@ -216,15 +216,23 @@ public class Main { | |||||
| project.setUserProperty(arg, value); | project.setUserProperty(arg, value); | ||||
| } | } | ||||
| project.setUserProperty( "ant.file" , buildFile.getAbsolutePath() ); | project.setUserProperty( "ant.file" , buildFile.getAbsolutePath() ); | ||||
| // first use the ProjectHelper to create the project object | // first use the ProjectHelper to create the project object | ||||
| // from the given build file. | // from the given build file. | ||||
| try { | try { | ||||
| try { | |||||
| Class.forName("javax.xml.parsers.SAXParserFactory"); | |||||
| } catch (ClassNotFoundException cnfe) { | |||||
| throw new BuildException(cnfe); | |||||
| } | |||||
| ProjectHelper.configureProject(project, buildFile); | ProjectHelper.configureProject(project, buildFile); | ||||
| } catch (BuildException be) { | } catch (BuildException be) { | ||||
| String msg = "BUILD CONFIG ERROR: "; | |||||
| System.out.println(msg + be.getMessage()); | |||||
| be.printStackTrace(); | |||||
| System.out.println("\nBUILD CONFIG ERROR\n"); | |||||
| if (be.getException() == null) { | |||||
| System.out.println(be.toString()); | |||||
| } else { | |||||
| be.getException().printStackTrace(); | |||||
| } | |||||
| System.exit(1); | System.exit(1); | ||||
| } | } | ||||
| @@ -240,8 +248,8 @@ public class Main { | |||||
| project.executeTarget((String) en.nextElement()); | project.executeTarget((String) en.nextElement()); | ||||
| } | } | ||||
| } catch (BuildException be) { | } catch (BuildException be) { | ||||
| String msg = "BUILD FATAL ERROR: "; | |||||
| System.out.println(msg + be.getMessage()); | |||||
| String msg = "\nBUILD FATAL ERROR\n\n"; | |||||
| System.out.println(msg + be.toString()); | |||||
| if (msgOutputLevel > Project.MSG_INFO) { | if (msgOutputLevel > Project.MSG_INFO) { | ||||
| be.printStackTrace(); | be.printStackTrace(); | ||||
| } | } | ||||
| @@ -1,111 +0,0 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 1999 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", "Tomcat", 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; | |||||
| import java.io.File; | |||||
| import java.io.InputStream; | |||||
| import java.io.IOException; | |||||
| import java.util.Properties; | |||||
| import org.w3c.dom.Document; | |||||
| import org.xml.sax.SAXException; | |||||
| /** | |||||
| * Dummy parser abstraction class for ANT to be used until the Java API for | |||||
| * XML Parsing are released. | |||||
| * | |||||
| * @author pier@apache.org | |||||
| */ | |||||
| public abstract class Parser { | |||||
| // The properties file to be loaded | |||||
| private static String properties="org/apache/tools/ant/parser.properties"; | |||||
| /** | |||||
| * Create a working instance of a parser | |||||
| */ | |||||
| public static Parser getParser(Project project) | |||||
| throws BuildException { | |||||
| InputStream in=project.getClass().getResourceAsStream("parser.properties"); | |||||
| if (in==null) throw new BuildException("Cannot find properties file"); | |||||
| String name; | |||||
| try { | |||||
| Properties prop=new Properties(); | |||||
| prop.load(in); | |||||
| name=prop.getProperty("parser"); | |||||
| if (name==null) throw new BuildException("Parser name not found"); | |||||
| } catch(IOException e) { | |||||
| throw new BuildException("Cannot load properties file"); | |||||
| } | |||||
| try { | |||||
| return((Parser)Class.forName(name).newInstance()); | |||||
| } catch (ClassNotFoundException e) { | |||||
| throw new BuildException("Class "+name+" cannot be found"); | |||||
| } catch (InstantiationException e) { | |||||
| throw new BuildException("Class "+name+" cannot be instantiated"); | |||||
| } catch (IllegalAccessException e) { | |||||
| throw new BuildException("Class "+name+" cannot be accessed"); | |||||
| } catch (ClassCastException e) { | |||||
| throw new BuildException("Class "+name+" doesn't extend Parser"); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Parse the specified file and return a DOM Document. | |||||
| */ | |||||
| public abstract Document parse(File f) | |||||
| throws SAXException, IOException; | |||||
| } | |||||
| @@ -55,13 +55,13 @@ | |||||
| package org.apache.tools.ant; | package org.apache.tools.ant; | ||||
| import java.beans.*; | import java.beans.*; | ||||
| import java.io.File; | |||||
| import java.io.IOException; | |||||
| import java.io.*; | |||||
| import java.lang.reflect.*; | import java.lang.reflect.*; | ||||
| import java.util.*; | import java.util.*; | ||||
| import org.xml.sax.SAXException; | |||||
| import org.xml.sax.*; | |||||
| import org.w3c.dom.*; | import org.w3c.dom.*; | ||||
| import org.apache.tools.ant.taskdefs.*; | import org.apache.tools.ant.taskdefs.*; | ||||
| import javax.xml.parsers.*; | |||||
| /** | /** | ||||
| * Configures a Project (complete with Targets and Tasks) based on | * Configures a Project (complete with Targets and Tasks) based on | ||||
| @@ -72,228 +72,332 @@ import org.apache.tools.ant.taskdefs.*; | |||||
| public class ProjectHelper { | public class ProjectHelper { | ||||
| public static void configureProject(Project project, File buildFile) | |||||
| throws BuildException | |||||
| { | |||||
| private static SAXParserFactory parserFactory = null; | |||||
| // XXX | |||||
| // need to get rid of the DOM layer and use SAX | |||||
| private org.xml.sax.Parser parser; | |||||
| private Project project; | |||||
| private File buildFile; | |||||
| private Locator locator; | |||||
| Document doc; | |||||
| /** | |||||
| * Configures the Project with the contents of the specified XML file. | |||||
| */ | |||||
| public static void configureProject(Project project, File buildFile) throws BuildException { | |||||
| new ProjectHelper(project, buildFile).parse(); | |||||
| } | |||||
| /** | |||||
| * Constructs a new Ant parser for the specified XML file. | |||||
| */ | |||||
| private ProjectHelper(Project project, File buildFile) { | |||||
| this.project = project; | |||||
| this.buildFile = buildFile; | |||||
| } | |||||
| /** | |||||
| * Parses the project file. | |||||
| */ | |||||
| private void parse() throws BuildException { | |||||
| try { | try { | ||||
| doc=Parser.getParser(project).parse(buildFile); | |||||
| } catch (IOException ioe) { | |||||
| String msg = "Can't open config file: " + buildFile + | |||||
| " due to: " + ioe; | |||||
| throw new BuildException(msg); | |||||
| } catch (SAXException se) { | |||||
| String msg = "Can't open config file: " + buildFile + | |||||
| " due to: " + se; | |||||
| throw new BuildException(msg); | |||||
| parser = getParserFactory().newSAXParser().getParser(); | |||||
| parser.setDocumentHandler(new RootHandler()); | |||||
| parser.parse(new InputSource(new FileReader(buildFile))); | |||||
| } | |||||
| catch(ParserConfigurationException exc) { | |||||
| throw new BuildException("Parser has not been configured correctly", exc); | |||||
| } | |||||
| catch(SAXParseException exc) { | |||||
| Location location = | |||||
| new Location(buildFile.toString(), exc.getLineNumber(), exc.getColumnNumber()); | |||||
| throw new BuildException(exc.getMessage(), exc.getException(), location); | |||||
| } | |||||
| catch(SAXException exc) { | |||||
| throw new BuildException(exc.getMessage(), exc.getException()); | |||||
| } | } | ||||
| catch(FileNotFoundException exc) { | |||||
| throw new BuildException("File \"" + buildFile.toString() + "\" not found"); | |||||
| } | |||||
| catch(IOException exc) { | |||||
| throw new BuildException("Error reading project file", exc); | |||||
| } | |||||
| } | |||||
| Element root = doc.getDocumentElement(); | |||||
| /** | |||||
| * The common superclass for all sax event handlers in Ant. Basically | |||||
| * throws an exception in each method, so subclasses should override | |||||
| * what they can handle. | |||||
| * | |||||
| * Each type of xml element (task, target, etc) in ant will | |||||
| * have its own subclass of AbstractHandler. | |||||
| * | |||||
| * In the constructor, this class takes over the handling of sax | |||||
| * events from the parent handler, and returns | |||||
| * control back to the parent in the endElement method. | |||||
| */ | |||||
| private class AbstractHandler extends HandlerBase { | |||||
| protected DocumentHandler parentHandler; | |||||
| // sanity check, make sure that we have the right element | |||||
| // as we aren't validating the input | |||||
| public AbstractHandler(DocumentHandler parentHandler) { | |||||
| this.parentHandler = parentHandler; | |||||
| if (!root.getTagName().equals("project")) { | |||||
| String msg = "Config file is not of expected XML type"; | |||||
| throw new BuildException(msg); | |||||
| // Start handling SAX events | |||||
| parser.setDocumentHandler(this); | |||||
| } | |||||
| public void startElement(String tag, AttributeList attrs) throws SAXParseException { | |||||
| throw new SAXParseException("Unexpected element \"" + tag + "\"", locator); | |||||
| } | } | ||||
| project.setDefaultTarget(root.getAttribute("default")); | |||||
| public void characters(char[] buf, int start, int end) throws SAXParseException { | |||||
| String s = new String(buf, start, end).trim(); | |||||
| String name = root.getAttribute("name"); | |||||
| project.setName(name); | |||||
| if (name != null) project.addReference(name, project); | |||||
| if (s.length() > 0) { | |||||
| throw new SAXParseException("Unexpected text \"" + s + "\"", locator); | |||||
| } | |||||
| } | |||||
| String id = root.getAttribute("id"); | |||||
| if (id != null) project.addReference(id, project); | |||||
| public void endElement(String name) throws SAXException { | |||||
| String baseDir = project.getProperty("basedir"); | |||||
| if (baseDir == null) { | |||||
| baseDir = root.getAttribute("basedir"); | |||||
| if (baseDir.equals("")) { | |||||
| // Using clunky JDK1.1 methods here | |||||
| baseDir = new File(buildFile.getAbsolutePath()).getParent(); | |||||
| // Let parent resume handling SAX events | |||||
| parser.setDocumentHandler(parentHandler); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Handler for the root element. It's only child must be the "project" element. | |||||
| */ | |||||
| private class RootHandler extends HandlerBase { | |||||
| public void startElement(String tag, AttributeList attrs) throws SAXParseException { | |||||
| if (tag.equals("project")) { | |||||
| new ProjectHandler(this).init(tag, attrs); | |||||
| } else { | |||||
| throw new SAXParseException("Config file is not of expected XML type", locator); | |||||
| } | } | ||||
| } | } | ||||
| project.setBasedir(baseDir); | |||||
| // set up any properties that may be in the config file | |||||
| public void setDocumentLocator(Locator locator) { | |||||
| ProjectHelper.this.locator = locator; | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Handler for the top level "project" element. | |||||
| */ | |||||
| private class ProjectHandler extends AbstractHandler { | |||||
| public ProjectHandler(DocumentHandler parentHandler) { | |||||
| super(parentHandler); | |||||
| } | |||||
| public void init(String tag, AttributeList attrs) throws SAXParseException { | |||||
| String def = null; | |||||
| String name = null; | |||||
| String id = null; | |||||
| String baseDir = new File(buildFile.getAbsolutePath()).getParent(); | |||||
| for (int i = 0; i < attrs.getLength(); i++) { | |||||
| String key = attrs.getName(i); | |||||
| String value = attrs.getValue(i); | |||||
| if (key.equals("default")) { | |||||
| def = value; | |||||
| } else if (key.equals("name")) { | |||||
| name = value; | |||||
| } else if (key.equals("id")) { | |||||
| id = value; | |||||
| } else if (key.equals("basedir")) { | |||||
| baseDir = value; | |||||
| } else { | |||||
| throw new SAXParseException("Unexpected attribute \"" + attrs.getName(i) + "\"", locator); | |||||
| } | |||||
| } | |||||
| project.setDefaultTarget(def); | |||||
| // configureProperties(project, root); | |||||
| project.setName(name); | |||||
| if (name != null) project.addReference(name, project); | |||||
| // set up any task defs that may be in the config file | |||||
| if (id != null) project.addReference(id, project); | |||||
| // configureTaskDefs(project, root); | |||||
| if (project.getProperty("basedir") != null) { | |||||
| project.setBasedir(project.getProperty("basedir")); | |||||
| } else { | |||||
| project.setBasedir(baseDir); | |||||
| } | |||||
| // set up the taskdefs, properties, and targets into the project | |||||
| configureProject(project, root); | |||||
| } | |||||
| public void startElement(String name, AttributeList attrs) throws SAXParseException { | |||||
| if (name.equals("taskdef")) { | |||||
| handleTaskdef(name, attrs); | |||||
| } else if (name.equals("property")) { | |||||
| handleProperty(name, attrs); | |||||
| } else if (name.equals("target")) { | |||||
| handleTarget(name, attrs); | |||||
| } else { | |||||
| throw new SAXParseException("Unexpected element \"" + name + "\"", locator); | |||||
| } | |||||
| } | |||||
| private void handleTaskdef(String name, AttributeList attrs) throws SAXParseException { | |||||
| new TaskHandler(this, null).init(name, attrs); | |||||
| } | |||||
| private void handleProperty(String name, AttributeList attrs) throws SAXParseException { | |||||
| new TaskHandler(this, null).init(name, attrs); | |||||
| } | |||||
| private void handleTarget(String tag, AttributeList attrs) throws SAXParseException { | |||||
| new TargetHandler(this).init(tag, attrs); | |||||
| } | |||||
| } | } | ||||
| private static void configureProject(Project project, Element root) | |||||
| throws BuildException | |||||
| { | |||||
| // configure taskdefs | |||||
| NodeList list = root.getElementsByTagName("taskdef"); | |||||
| for (int i = 0; i < list.getLength(); i++) { | |||||
| Task taskdef = new Taskdef(); | |||||
| configure(project, taskdef, (Element)list.item(i)); | |||||
| taskdef.setProject(project); | |||||
| taskdef.init(); | |||||
| } | |||||
| // configure properties | |||||
| list = root.getElementsByTagName("property"); | |||||
| for (int i = 0; i < list.getLength(); i++) { | |||||
| Task property = new Property(); | |||||
| configure(project, property, (Element)list.item(i)); | |||||
| property.setProject(project); | |||||
| property.init(); | |||||
| } | |||||
| // configure targets | |||||
| list = root.getElementsByTagName("target"); | |||||
| for (int i = 0; i < list.getLength(); i++) { | |||||
| Element element = (Element)list.item(i); | |||||
| String targetName = element.getAttribute("name"); | |||||
| String targetDep = element.getAttribute("depends"); | |||||
| String targetCond = element.getAttribute("if"); | |||||
| String targetId = element.getAttribute("id"); | |||||
| // all targets must have a name | |||||
| if (targetName.equals("")) { | |||||
| String msg = "target element appears without a name attribute"; | |||||
| throw new BuildException(msg); | |||||
| /** | |||||
| * Handler for "target" elements. | |||||
| */ | |||||
| private class TargetHandler extends AbstractHandler { | |||||
| private Target target; | |||||
| public TargetHandler(DocumentHandler parentHandler) { | |||||
| super(parentHandler); | |||||
| } | |||||
| public void init(String tag, AttributeList attrs) throws SAXParseException { | |||||
| String name = null; | |||||
| String depends = ""; | |||||
| String cond = null; | |||||
| String id = null; | |||||
| for (int i = 0; i < attrs.getLength(); i++) { | |||||
| String key = attrs.getName(i); | |||||
| String value = attrs.getValue(i); | |||||
| if (key.equals("name")) { | |||||
| name = value; | |||||
| } else if (key.equals("depends")) { | |||||
| depends = value; | |||||
| } else if (key.equals("if")) { | |||||
| cond = value; | |||||
| } else if (key.equals("id")) { | |||||
| id = value; | |||||
| } else { | |||||
| throw new SAXParseException("Unexpected attribute \"" + key + "\"", locator); | |||||
| } | |||||
| } | } | ||||
| Target target = new Target(); | |||||
| target.setName(targetName); | |||||
| target.setCondition(targetCond); | |||||
| project.addTarget(targetName, target); | |||||
| if (name == null) { | |||||
| throw new SAXParseException("target element appears without a name attribute", locator); | |||||
| } | |||||
| if (targetId != null && !targetId.equals("")) | |||||
| project.addReference(targetId,target); | |||||
| target = new Target(); | |||||
| target.setName(name); | |||||
| target.setCondition(cond); | |||||
| project.addTarget(name, target); | |||||
| if (id != null && !id.equals("")) | |||||
| project.addReference(id, target); | |||||
| // take care of dependencies | // take care of dependencies | ||||
| if (targetDep.length() > 0) { | |||||
| StringTokenizer tok = | |||||
| new StringTokenizer(targetDep, ",", false); | |||||
| if (depends.length() > 0) { | |||||
| StringTokenizer tok = | |||||
| new StringTokenizer(depends, ",", false); | |||||
| while (tok.hasMoreTokens()) { | while (tok.hasMoreTokens()) { | ||||
| target.addDependency(tok.nextToken().trim()); | target.addDependency(tok.nextToken().trim()); | ||||
| } | } | ||||
| } | } | ||||
| } | |||||
| // populate target with tasks | |||||
| configureTasks(project, target, element); | |||||
| public void startElement(String name, AttributeList attrs) throws SAXParseException { | |||||
| new TaskHandler(this, target).init(name, attrs); | |||||
| } | } | ||||
| } | } | ||||
| private static void configureTasks(Project project, | |||||
| Target target, | |||||
| Element targetElement) | |||||
| throws BuildException | |||||
| { | |||||
| NodeList list = targetElement.getChildNodes(); | |||||
| for (int i = 0; i < list.getLength(); i++) { | |||||
| Node node = list.item(i); | |||||
| // right now, all we are interested in is element nodes | |||||
| // not quite sure what to do with others except drop 'em | |||||
| if (node.getNodeType() == Node.ELEMENT_NODE) { | |||||
| Element element = (Element)node; | |||||
| String taskType = element.getTagName(); | |||||
| /** | |||||
| * Handler for all task elements. | |||||
| */ | |||||
| private class TaskHandler extends AbstractHandler { | |||||
| private Target target; | |||||
| private Task task; | |||||
| // XXX | |||||
| // put in some sanity checking | |||||
| public TaskHandler(DocumentHandler parentHandler, Target target) { | |||||
| super(parentHandler); | |||||
| Task task = project.createTask(taskType); | |||||
| this.target = target; | |||||
| } | |||||
| // get the attributes of this element and reflect them | |||||
| // into the task | |||||
| public void init(String tag, AttributeList attrs) throws SAXParseException { | |||||
| task = project.createTask(tag); | |||||
| configure(task, attrs); | |||||
| task.setLocation(new Location(buildFile.toString(), locator.getLineNumber(), locator.getColumnNumber())); | |||||
| task.init(); | |||||
| configure(project, task, element); | |||||
| task.init(); | |||||
| // Top level tasks don't have associated targets | |||||
| if (target != null) { | |||||
| task.setTarget(target); | task.setTarget(target); | ||||
| target.addTask(task); | target.addTask(task); | ||||
| } | |||||
| } | |||||
| processNestedProperties(project, task, element); | |||||
| public void characters(char[] buf, int start, int end) throws SAXParseException { | |||||
| String text = new String(buf, start, end).trim(); | |||||
| if (text.length() == 0) return; | |||||
| try { | |||||
| Method addProp = task.getClass().getMethod("addText", new Class[]{String.class}); | |||||
| Object child = addProp.invoke(task, new Object[] {text}); | |||||
| } catch(NoSuchMethodException exc) { | |||||
| throw new SAXParseException(task.getClass() + " does not support nested text elements", locator); | |||||
| } catch(InvocationTargetException exc) { | |||||
| throw new SAXParseException("Error invoking \"addText\" method", locator, exc); | |||||
| } catch(IllegalAccessException exc) { | |||||
| throw new SAXParseException("Unable to access \"addText\" method", locator, exc); | |||||
| } | } | ||||
| } | } | ||||
| public void startElement(String name, AttributeList attrs) throws SAXParseException { | |||||
| new NestedPropertyHandler(this, task).init(name, attrs); | |||||
| } | |||||
| } | } | ||||
| private static void processNestedProperties(Project project, | |||||
| Object target, | |||||
| Element targetElement) | |||||
| throws BuildException | |||||
| { | |||||
| Class targetClass = target.getClass(); | |||||
| NodeList list = targetElement.getChildNodes(); | |||||
| for (int i = 0; i < list.getLength(); i++) { | |||||
| Node node = list.item(i); | |||||
| // right now, all we are interested in is element nodes | |||||
| // not quite sure what to do with others except drop 'em | |||||
| if (node.getNodeType() == Node.TEXT_NODE) { | |||||
| String text = ((Text)node).getData(); | |||||
| try { | |||||
| Method addProp = targetClass.getMethod( | |||||
| "addText", new Class[]{"".getClass()}); | |||||
| Object child = addProp.invoke(target, new Object[] {text}); | |||||
| } catch (NoSuchMethodException nsme) { | |||||
| if (text.trim().length() > 0) | |||||
| throw new BuildException(targetClass + | |||||
| " does not support nested text elements"); | |||||
| } catch (InvocationTargetException ite) { | |||||
| throw new BuildException(ite.getMessage()); | |||||
| } catch (IllegalAccessException iae) { | |||||
| throw new BuildException(iae.getMessage()); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Handler for all nested properties. | |||||
| */ | |||||
| private class NestedPropertyHandler extends AbstractHandler { | |||||
| private DocumentHandler parentHandler; | |||||
| if (node.getNodeType() == Node.ELEMENT_NODE) { | |||||
| Element element = (Element)node; | |||||
| String propType = element.getTagName(); | |||||
| String methodName = "create" + | |||||
| Character.toUpperCase(propType.charAt(0)) + | |||||
| propType.substring(1); | |||||
| try { | |||||
| Method addProp = | |||||
| targetClass.getMethod(methodName, new Class[]{}); | |||||
| Object child = addProp.invoke(target, new Object[] {}); | |||||
| configure(project, child, element); | |||||
| processNestedProperties(project, child, element); | |||||
| } catch (NoSuchMethodException nsme) { | |||||
| throw new BuildException(targetClass + | |||||
| " does not support nested " + propType + " properties"); | |||||
| } catch (InvocationTargetException ite) { | |||||
| throw new BuildException(ite.getMessage()); | |||||
| } catch (IllegalAccessException iae) { | |||||
| throw new BuildException(iae.getMessage()); | |||||
| } | |||||
| private Object target; | |||||
| private Object child; | |||||
| public NestedPropertyHandler(DocumentHandler parentHandler, Object target) { | |||||
| super(parentHandler); | |||||
| this.target = target; | |||||
| } | |||||
| public void init(String propType, AttributeList attrs) throws SAXParseException { | |||||
| Class targetClass = target.getClass(); | |||||
| String methodName = "create" + Character.toUpperCase(propType.charAt(0)) + propType.substring(1); | |||||
| try { | |||||
| Method addProp = targetClass.getMethod(methodName, new Class[]{}); | |||||
| child = addProp.invoke(target, new Object[] {}); | |||||
| configure(child, attrs); | |||||
| } catch(NoSuchMethodException exc) { | |||||
| throw new SAXParseException(targetClass + " does not support nested " + propType + " properties", locator); | |||||
| } catch(InvocationTargetException exc) { | |||||
| throw new SAXParseException(exc.getMessage(), locator); | |||||
| } catch(IllegalAccessException exc) { | |||||
| throw new SAXParseException(exc.getMessage(), locator); | |||||
| } | } | ||||
| } | } | ||||
| } | |||||
| private static void configure(Project project, | |||||
| Object target, | |||||
| Element element) | |||||
| throws BuildException | |||||
| { | |||||
| NamedNodeMap nodeMap = element.getAttributes(); | |||||
| public void startElement(String name, AttributeList attrs) throws SAXParseException { | |||||
| new NestedPropertyHandler(this, child).init(name, attrs); | |||||
| } | |||||
| } | |||||
| private void configure(Object target, AttributeList attrs) throws BuildException { | |||||
| if( target instanceof TaskAdapter ) | if( target instanceof TaskAdapter ) | ||||
| target=((TaskAdapter)target).getProxy(); | target=((TaskAdapter)target).getProxy(); | ||||
| @@ -332,48 +436,40 @@ public class ProjectHelper { | |||||
| } | } | ||||
| } | } | ||||
| for (int i = 0; i < nodeMap.getLength(); i++) { | |||||
| Node node = nodeMap.item(i); | |||||
| // these should only be attribs, we won't see anything | |||||
| // else here. | |||||
| if (node.getNodeType() == Node.ATTRIBUTE_NODE) { | |||||
| Attr attr = (Attr)node; | |||||
| // reflect these into the target | |||||
| for (int i = 0; i < attrs.getLength(); i++) { | |||||
| // reflect these into the target | |||||
| Method setMethod = (Method)propertySetters.get(attr.getName()); | |||||
| if (setMethod == null) { | |||||
| if (attr.getName().equals("id")) { | |||||
| project.addReference(attr.getValue(), target); | |||||
| continue; | |||||
| } | |||||
| String msg = "Configuration property \"" + attr.getName() + | |||||
| "\" does not have a setMethod in " + target.getClass(); | |||||
| throw new BuildException(msg); | |||||
| Method setMethod = (Method)propertySetters.get(attrs.getName(i)); | |||||
| if (setMethod == null) { | |||||
| if (attrs.getName(i).equals("id")) { | |||||
| project.addReference(attrs.getValue(i), target); | |||||
| continue; | |||||
| } | } | ||||
| String value=replaceProperties( attr.getValue(), project.getProperties() ); | |||||
| try { | |||||
| setMethod.invoke(target, new String[] {value}); | |||||
| } catch (IllegalAccessException iae) { | |||||
| String msg = "Error setting value for attrib: " + | |||||
| attr.getName(); | |||||
| iae.printStackTrace(); | |||||
| throw new BuildException(msg); | |||||
| } catch (InvocationTargetException ie) { | |||||
| String msg = "Error setting value for attrib: " + | |||||
| attr.getName() + " in " + target.getClass().getName(); | |||||
| ie.printStackTrace(); | |||||
| ie.getTargetException().printStackTrace(); | |||||
| throw new BuildException(msg); | |||||
| } | |||||
| String msg = "Class " + target.getClass() + | |||||
| " doesn't support the \"" + attrs.getName(i) + "\" property"; | |||||
| throw new BuildException(msg); | |||||
| } | |||||
| String value=replaceProperties(attrs.getValue(i), project.getProperties() ); | |||||
| try { | |||||
| setMethod.invoke(target, new String[] {value}); | |||||
| } catch (IllegalAccessException iae) { | |||||
| String msg = "Error setting value for attrib: " + | |||||
| attrs.getName(i); | |||||
| iae.printStackTrace(); | |||||
| throw new BuildException(msg); | |||||
| } catch (InvocationTargetException ie) { | |||||
| String msg = "Error setting value for attrib: " + | |||||
| attrs.getName(i) + " in " + target.getClass().getName(); | |||||
| ie.printStackTrace(); | |||||
| ie.getTargetException().printStackTrace(); | |||||
| throw new BuildException(msg); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| /** Replace ${NAME} with the property value | /** Replace ${NAME} with the property value | ||||
| */ | */ | ||||
| public static String replaceProperties( String value, Hashtable keys ) | public static String replaceProperties( String value, Hashtable keys ) | ||||
| @@ -411,13 +507,12 @@ public class ProjectHelper { | |||||
| // System.out.println("Before replace: " + value); | // System.out.println("Before replace: " + value); | ||||
| return sb.toString(); | return sb.toString(); | ||||
| } | } | ||||
| } | |||||
| private static SAXParserFactory getParserFactory() { | |||||
| if (parserFactory == null) { | |||||
| parserFactory = SAXParserFactory.newInstance(); | |||||
| } | |||||
| return parserFactory; | |||||
| } | |||||
| } | |||||
| @@ -1,81 +0,0 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 1999 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", "Tomcat", 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; | |||||
| import java.io.File; | |||||
| import java.io.IOException; | |||||
| import com.sun.xml.parser.Resolver; | |||||
| import com.sun.xml.tree.XmlDocument; | |||||
| import org.w3c.dom.Document; | |||||
| import org.xml.sax.InputSource; | |||||
| import org.xml.sax.SAXException; | |||||
| /** | |||||
| * Implementation of Parser using Sun ProjectX. | |||||
| * | |||||
| * @author pier@apache.org | |||||
| */ | |||||
| public class SunParser extends Parser { | |||||
| /** | |||||
| * Parse the specified file and return a DOM Document. | |||||
| */ | |||||
| public Document parse(File buildFile) | |||||
| throws SAXException, IOException { | |||||
| InputSource input = Resolver.createInputSource(buildFile); | |||||
| return XmlDocument.createXmlDocument(input, false); | |||||
| } | |||||
| } | |||||
| @@ -117,7 +117,13 @@ public class Target { | |||||
| Enumeration enum = tasks.elements(); | Enumeration enum = tasks.elements(); | ||||
| while (enum.hasMoreElements()) { | while (enum.hasMoreElements()) { | ||||
| Task task = (Task) enum.nextElement(); | Task task = (Task) enum.nextElement(); | ||||
| task.execute(); | |||||
| try { | |||||
| task.execute(); | |||||
| } catch(BuildException exc) { | |||||
| exc.setLocation(task.getLocation()); | |||||
| throw exc; | |||||
| } | |||||
| } | } | ||||
| } else { | } else { | ||||
| project.log("Skipped because property '" + this.condition + "' not set.", this.name, Project.MSG_VERBOSE); | project.log("Skipped because property '" + this.condition + "' not set.", this.name, Project.MSG_VERBOSE); | ||||
| @@ -57,13 +57,14 @@ package org.apache.tools.ant; | |||||
| /** | /** | ||||
| * Base class for all tasks. | * Base class for all tasks. | ||||
| */ | */ | ||||
| public abstract class Task { | public abstract class Task { | ||||
| protected Project project = null; | protected Project project = null; | ||||
| protected Target target = null; | protected Target target = null; | ||||
| protected String description=null; | protected String description=null; | ||||
| protected Location location = Location.UNKNOWN_LOCATION; | |||||
| /** | /** | ||||
| * Sets the project object of this task. This method is used by | * Sets the project object of this task. This method is used by | ||||
| * project when a task is added to it so that the task has | * project when a task is added to it so that the task has | ||||
| @@ -87,7 +88,7 @@ public abstract class Task { | |||||
| /** Sets a description of the current action. It will be usefull in commenting | /** Sets a description of the current action. It will be usefull in commenting | ||||
| * what we are doing. | * what we are doing. | ||||
| */ | |||||
| */ | |||||
| public void setDescription( String desc ) { | public void setDescription( String desc ) { | ||||
| description=desc; | description=desc; | ||||
| } | } | ||||
| @@ -95,7 +96,7 @@ public abstract class Task { | |||||
| public String getDescription() { | public String getDescription() { | ||||
| return description; | return description; | ||||
| } | } | ||||
| /** | /** | ||||
| * Called by the project to let the task initialize properly. Normally it does nothing. | * Called by the project to let the task initialize properly. Normally it does nothing. | ||||
| * | * | ||||
| @@ -110,5 +111,18 @@ public abstract class Task { | |||||
| */ | */ | ||||
| public void execute() throws BuildException {}; | public void execute() throws BuildException {}; | ||||
| /** | |||||
| * Returns the file location where this task was defined. | |||||
| */ | |||||
| public Location getLocation() { | |||||
| return location; | |||||
| } | |||||
| /** | |||||
| * Sets the file location where this task was defined. | |||||
| */ | |||||
| public void setLocation(Location location) { | |||||
| this.location = location; | |||||
| } | |||||
| } | } | ||||
| @@ -1 +0,0 @@ | |||||
| parser=org.apache.tools.ant.SunParser | |||||