git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@270827 13f79535-47bb-0310-9956-ffa450edef68master
@@ -1,6 +1,170 @@ | |||||
<project default="jars"> | |||||
<target name="jars"> | |||||
<echo message="Mutant is being retructured - returning shortly"/> | |||||
</target> | |||||
</project> | |||||
<project default="main" name="mutant"> | |||||
<property name="src.dir" value="src"/> | |||||
<property name="lib.dir" value="lib"/> | |||||
<property name="java.dir" value="${src.dir}/java"/> | |||||
<property name="bin.dir" value="bin"/> | |||||
<property name="dist.dir" value="dist"/> | |||||
<property name="javadocs.dir" value="${dist.dir}/javadocs"/> | |||||
<property name="distlib.dir" value="${dist.dir}/lib"/> | |||||
<property name="debug" value="true"/> | |||||
<path id="classpath.parser"> | |||||
<fileset dir="${lib.dir}/parser" includes="*.jar"/> | |||||
</path> | |||||
<path id="classpath.common"> | |||||
<pathelement location="${distlib.dir}/init.jar"/> | |||||
</path> | |||||
<path id="classpath.antcore"> | |||||
<path refid="classpath.common"/> | |||||
<pathelement location="${distlib.dir}/common/common.jar"/> | |||||
<path refid="classpath.parser"/> | |||||
</path> | |||||
<path id="classpath.cli"> | |||||
<path refid="classpath.antcore"/> | |||||
<pathelement location="${distlib.dir}/antcore/antcore.jar"/> | |||||
</path> | |||||
<path id="classpath.start"> | |||||
<pathelement location="${distlib.dir}/init.jar"/> | |||||
</path> | |||||
<target name="buildsetup"> | |||||
<available file="../checkstyle" property="checkstyle.available"/> | |||||
<mkdir dir="${bin.dir}"/> | |||||
<mkdir dir="${distlib.dir}"/> | |||||
<copy todir="${distlib.dir}"> | |||||
<fileset dir="${lib.dir}"/> | |||||
</copy> | |||||
</target> | |||||
<target name="init" depends="buildsetup"> | |||||
<mkdir dir="${bin.dir}/init"/> | |||||
<depend destdir="${bin.dir}/init" srcdir="${java.dir}/init"/> | |||||
<javac destdir="${bin.dir}/init" srcdir="${java.dir}/init" debug="${debug}"/> | |||||
<jar basedir="${bin.dir}/init" jarfile="${distlib.dir}/init.jar"/> | |||||
</target> | |||||
<target name="common" depends="init"> | |||||
<mkdir dir="${bin.dir}/common"/> | |||||
<mkdir dir="${distlib.dir}/common"/> | |||||
<depend destdir="${bin.dir}/common" srcdir="${java.dir}/common"> | |||||
<classpath refid="classpath.common"/> | |||||
</depend> | |||||
<javac destdir="${bin.dir}/common" srcdir="${java.dir}/common" debug="${debug}"> | |||||
<classpath refid="classpath.common"/> | |||||
</javac> | |||||
<jar basedir="${bin.dir}/common" jarfile="${distlib.dir}/common/common.jar"/> | |||||
</target> | |||||
<target name="antcore" depends="common"> | |||||
<mkdir dir="${bin.dir}/antcore"/> | |||||
<mkdir dir="${distlib.dir}/antcore"/> | |||||
<depend destdir="${bin.dir}/antcore" srcdir="${java.dir}/antcore"> | |||||
<classpath refid="classpath.antcore"/> | |||||
</depend> | |||||
<javac destdir="${bin.dir}/antcore" srcdir="${java.dir}/antcore" debug="${debug}"> | |||||
<classpath refid="classpath.antcore"/> | |||||
</javac> | |||||
<jar basedir="${bin.dir}/antcore" jarfile="${distlib.dir}/antcore/antcore.jar"/> | |||||
</target> | |||||
<target name="cli" depends="antcore, start"> | |||||
<mkdir dir="${bin.dir}/cli"/> | |||||
<mkdir dir="${distlib.dir}/cli"/> | |||||
<depend destdir="${bin.dir}/cli" srcdir="${java.dir}/cli"> | |||||
<classpath refid="classpath.cli"/> | |||||
</depend> | |||||
<javac destdir="${bin.dir}/cli" srcdir="${java.dir}/cli" debug="${debug}"> | |||||
<classpath refid="classpath.cli"/> | |||||
</javac> | |||||
<jar basedir="${bin.dir}/cli" jarfile="${distlib.dir}/cli/cli.jar"/> | |||||
</target> | |||||
<target name="start" depends="init"> | |||||
<mkdir dir="${bin.dir}/start"/> | |||||
<depend destdir="${bin.dir}/start" srcdir="${java.dir}/start"> | |||||
<classpath refid="classpath.start"/> | |||||
</depend> | |||||
<javac destdir="${bin.dir}/start" srcdir="${java.dir}/start" debug="${debug}"> | |||||
<classpath refid="classpath.start"/> | |||||
</javac> | |||||
<jar basedir="${bin.dir}/start" jarfile="${distlib.dir}/start.jar"> | |||||
<manifest> | |||||
<attribute name="Main-Class" value="org.apache.ant.start.Main"/> | |||||
<attribute name="Class-Path" value="init.jar"/> | |||||
</manifest> | |||||
</jar> | |||||
</target> | |||||
<target name="clean"> | |||||
<delete dir="${bin.dir}"/> | |||||
<delete dir="${dist.dir}"/> | |||||
</target> | |||||
<target name="antlibs" depends="common"> | |||||
<antcall target="build-lib" inheritall="false"> | |||||
<param name="libset" value="io"/> | |||||
</antcall> | |||||
</target> | |||||
<target name="build-lib"> | |||||
<mkdir dir="${bin.dir}/antlibs/${libset}"/> | |||||
<mkdir dir="${distlib.dir}/antlibs"/> | |||||
<path id="classpath.antlibs"> | |||||
<path refid="classpath.common"/> | |||||
<pathelement location="${distlib.dir}/common/common.jar"/> | |||||
</path> | |||||
<depend destdir="${bin.dir}/antlibs/${libset}" srcdir="${java.dir}/antlibs/${libset}/code"> | |||||
<classpath refid="classpath.antlibs"/> | |||||
</depend> | |||||
<javac destdir="${bin.dir}/antlibs/${libset}" srcdir="${java.dir}/antlibs/${libset}/code" debug="${debug}"> | |||||
<classpath refid="classpath.antlibs"/> | |||||
</javac> | |||||
<jar basedir="${bin.dir}/antlibs/${libset}" jarfile="${distlib.dir}/antlibs/${libset}.tsk"> | |||||
<metainf dir="${java.dir}/antlibs/${libset}" | |||||
includes="antlib.xml"/> | |||||
</jar> | |||||
</target> | |||||
<target name="main" depends="cli, antlibs, checkstyle"/> | |||||
<target name="checkstyle" if="checkstyle.available"> | |||||
<property name="checkstyle.bin" value="../checkstyle"/> | |||||
<path id="checkstyle.path"> | |||||
<fileset dir="${checkstyle.bin}"/> | |||||
</path> | |||||
<taskdef name="checkstyle" reverseloader="true" | |||||
classname="com.puppycrawl.tools.checkstyle.CheckStyleTask"> | |||||
<classpath refid="checkstyle.path"/> | |||||
</taskdef> | |||||
<mkdir dir="${bin.dir}/checkstyle"/> | |||||
<checkstyle maxlinelen="80" | |||||
memberpattern="[a-z].*" | |||||
parampattern="[a-z].*" | |||||
staticpattern="[a-z].*" | |||||
ignoreCastWhitespace="true"> | |||||
<fileset dir="${java.dir}" includes="**/*.java"/> | |||||
</checkstyle> | |||||
</target> | |||||
<target name="javadocs"> | |||||
<mkdir dir="${javadocs.dir}"/> | |||||
<javadoc packagenames="org.apache.*" | |||||
useexternalfile="yes" | |||||
sourcepath="${java.dir}/antcore:${java.dir}/init:${java.dir}/common:${java.dir}/cli:${java.dir}/start" | |||||
destdir="${javadocs.dir}" | |||||
author="true" private ="true" | |||||
version="true" | |||||
windowtitle="Mutant API" | |||||
doctitle="Mutant"> | |||||
<group title="Apache Ant Core" packages="org.apache.ant.antcore*" /> | |||||
</javadoc> | |||||
</target> | |||||
</project> |
@@ -0,0 +1,115 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.antcore.antlib; | |||||
/** | |||||
* This class represents a definition in an AntLibrary. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 19 January 2002 | |||||
*/ | |||||
public class AntLibDefinition { | |||||
/** The tpye of element being defined int his definition */ | |||||
private int definitionType; | |||||
/** The default name for the defintion */ | |||||
private String definitionName; | |||||
/** The classname associated with the object */ | |||||
private String definitionClassName; | |||||
/** | |||||
* Create a definition | |||||
* | |||||
* @param definitionName the default name of this definition when it is | |||||
* imported | |||||
* @param definitionClassName the name of the class which is being | |||||
* defined | |||||
* @param definitionType the type of the definition (taskdef, typedef, | |||||
* etc) | |||||
*/ | |||||
public AntLibDefinition(int definitionType, String definitionName, | |||||
String definitionClassName) { | |||||
this.definitionName = definitionName; | |||||
this.definitionType = definitionType; | |||||
this.definitionClassName = definitionClassName; | |||||
} | |||||
/** | |||||
* Get the type of this definition | |||||
* | |||||
* @return the definition type | |||||
* @see AntLibrary for values | |||||
*/ | |||||
public int getDefinitionType() { | |||||
return definitionType; | |||||
} | |||||
/** | |||||
* Get the default name for this definition | |||||
* | |||||
* @return the default name for this definition | |||||
*/ | |||||
public String getDefinitionName() { | |||||
return definitionName; | |||||
} | |||||
/** | |||||
* Get the classname being defined | |||||
* | |||||
* @return the classname of this definition | |||||
*/ | |||||
public String getClassName() { | |||||
return definitionClassName; | |||||
} | |||||
} | |||||
@@ -0,0 +1,195 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.antcore.antlib; | |||||
import org.apache.ant.antcore.util.ConfigException; | |||||
import org.apache.ant.antcore.xml.ElementHandler; | |||||
import org.xml.sax.Attributes; | |||||
import org.xml.sax.SAXParseException; | |||||
/** | |||||
* XML Element Handler for Ant library definitions | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 13 January 2002 | |||||
*/ | |||||
public class AntLibHandler extends ElementHandler { | |||||
/** The library identifier attribute name */ | |||||
public final static String LIBID_ATTR = "libid"; | |||||
/** The home attribute name */ | |||||
public final static String HOME_ATTR = "home"; | |||||
/** | |||||
* The name of the attribute which indicates if Ant's XML parser is to | |||||
* be made available | |||||
*/ | |||||
public final static String REQXML_ATTR = "reqxml"; | |||||
/** The extends attribute name */ | |||||
public final static String EXTENDS_ATTR = "extends"; | |||||
/** The name of the attribute which indicates tools jar is required */ | |||||
public final static String REQTOOLS_ATTR = "reqtools"; | |||||
/** The extends attribute name */ | |||||
public final static String ISOLATED_ATTR = "isolated"; | |||||
/** The list of allowed Attributes */ | |||||
public final static String[] ALLOWED_ATTRIBUTES | |||||
= {LIBID_ATTR, HOME_ATTR, REQXML_ATTR, REQTOOLS_ATTR, | |||||
EXTENDS_ATTR, ISOLATED_ATTR}; | |||||
/** The Ant Library definition being parsed. */ | |||||
private AntLibrarySpec antLibrarySpec; | |||||
/** | |||||
* Gets the parsed antLibrary specification | |||||
* | |||||
* @return the parsed antLibrary | |||||
*/ | |||||
public AntLibrarySpec getAntLibrarySpec() { | |||||
return antLibrarySpec; | |||||
} | |||||
/** | |||||
* Process the antlib element | |||||
* | |||||
* @param elementName the name of the element | |||||
* @exception SAXParseException if there is a problem parsing the | |||||
* element | |||||
*/ | |||||
public void processElement(String elementName) | |||||
throws SAXParseException { | |||||
antLibrarySpec = new AntLibrarySpec(); | |||||
if (getAttribute(LIBID_ATTR) == null) { | |||||
throw new SAXParseException("antlib must have an libid sttribute", | |||||
getLocator()); | |||||
} | |||||
antLibrarySpec.setLibraryId(getAttribute(LIBID_ATTR)); | |||||
antLibrarySpec.setHome(getAttribute(HOME_ATTR)); | |||||
antLibrarySpec.setExtendsLibraryId(getAttribute(EXTENDS_ATTR)); | |||||
antLibrarySpec.setIsolated(getBooleanAttribute(ISOLATED_ATTR)); | |||||
antLibrarySpec.setAntXML(getBooleanAttribute(REQXML_ATTR)); | |||||
antLibrarySpec.setToolsJarRequired(getBooleanAttribute(REQTOOLS_ATTR)); | |||||
} | |||||
/** | |||||
* Start a new element in the antlibrary. | |||||
* | |||||
* @param uri The Namespace URI. | |||||
* @param localName The local name (without prefix). | |||||
* @param qualifiedName The qualified name (with prefix) | |||||
* @param attributes The attributes attached to the element. | |||||
* @throws SAXParseException if there is a parsing problem. | |||||
*/ | |||||
public void startElement(String uri, String localName, String qualifiedName, | |||||
Attributes attributes) | |||||
throws SAXParseException { | |||||
try { | |||||
if (qualifiedName.equals("taskdef") | |||||
|| qualifiedName.equals("typedef")) { | |||||
DefinitionHandler defnHandler | |||||
= new DefinitionHandler(qualifiedName); | |||||
defnHandler.start(getParseContext(), getXMLReader(), | |||||
this, getLocator(), attributes, getElementSource(), | |||||
qualifiedName); | |||||
antLibrarySpec.addDefinition(defnHandler.getDefinitionType(), | |||||
defnHandler.getName(), defnHandler.getClassName()); | |||||
} else if (qualifiedName.equals("converter")) { | |||||
ConverterHandler converterHandler | |||||
= new ConverterHandler(); | |||||
converterHandler.start(getParseContext(), getXMLReader(), | |||||
this, getLocator(), attributes, getElementSource(), | |||||
qualifiedName); | |||||
antLibrarySpec.addConverter(converterHandler.getClassName()); | |||||
} | |||||
else { | |||||
super.startElement(uri, localName, qualifiedName, attributes); | |||||
} | |||||
} catch (ConfigException e) { | |||||
throw new SAXParseException(e.getMessage(), getLocator()); | |||||
} | |||||
} | |||||
/** | |||||
* Validate that the given attribute and value are valid. | |||||
* | |||||
* @param attributeName The name of the attributes | |||||
* @param attributeValue The value of the attributes | |||||
* @exception SAXParseException if the attribute is not allowed on the | |||||
* element. | |||||
*/ | |||||
protected void validateAttribute(String attributeName, | |||||
String attributeValue) | |||||
throws SAXParseException { | |||||
for (int i = 0; i < ALLOWED_ATTRIBUTES.length; ++i) { | |||||
if (attributeName.equals(ALLOWED_ATTRIBUTES[i])) { | |||||
return; | |||||
} | |||||
} | |||||
throwInvalidAttribute(attributeName); | |||||
} | |||||
/** | |||||
* Get an attribute as a boolean value | |||||
* | |||||
* @param attributeName the name of the attribute | |||||
* @return the attribute value as a boolean | |||||
*/ | |||||
private boolean getBooleanAttribute(String attributeName) { | |||||
String value = getAttribute(attributeName); | |||||
return value != null && (value.equalsIgnoreCase("true") | |||||
|| value.equalsIgnoreCase("yes")); | |||||
} | |||||
} | |||||
@@ -0,0 +1,208 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.antcore.antlib; | |||||
import java.net.URL; | |||||
import java.net.URLClassLoader; | |||||
import java.util.ArrayList; | |||||
import java.util.Iterator; | |||||
import java.util.List; | |||||
import java.util.Map; | |||||
/** | |||||
* This class represents the Ant library. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 14 January 2002 | |||||
*/ | |||||
public class AntLibrary { | |||||
/** constant indicating a taskdef definition */ | |||||
public final static int TASKDEF = 1; | |||||
/** constant indicating a typedef definition */ | |||||
public final static int TYPEDEF = 2; | |||||
/** | |||||
* This is the globally unique name of this library. It uses the same | |||||
* conventions as the Java package space - i.e. reverse order DNS names | |||||
* This name is used when importing tasks from this library | |||||
*/ | |||||
private String libraryId; | |||||
/** | |||||
* The URLs to use when contructing a classloader for the components in | |||||
* this library. | |||||
*/ | |||||
private List libraryURLs = new ArrayList(); | |||||
/** The list of converter classnames defined in this library */ | |||||
private List converterClassNames = new ArrayList(); | |||||
/** The parent classloader to use when contructing classloaders */ | |||||
private ClassLoader parentLoader; | |||||
/** The library which this library extends, if any */ | |||||
private AntLibrary extendsLibrary; | |||||
/** Indicates if each Task Instance should use its own classloader */ | |||||
private boolean isolated = false; | |||||
/** The classloader for this library if it can be reused */ | |||||
private ClassLoader loader = null; | |||||
/** The definitions in the library */ | |||||
private Map definitions = null; | |||||
/** | |||||
* Constructor for the AntLibrary object | |||||
* | |||||
* @param spec the specification from which this library is created. | |||||
*/ | |||||
public AntLibrary(AntLibrarySpec spec) { | |||||
this.libraryId = spec.getLibraryId(); | |||||
this.definitions = spec.getDefinitions(); | |||||
this.isolated = spec.isIsolated(); | |||||
this.converterClassNames.addAll(spec.getConverterClassNames()); | |||||
} | |||||
/** | |||||
* Sets the Library which this library extends | |||||
* | |||||
* @param extendsLibrary The new ExtendsLibrary value | |||||
*/ | |||||
public void setExtendsLibrary(AntLibrary extendsLibrary) { | |||||
this.extendsLibrary = extendsLibrary; | |||||
} | |||||
/** | |||||
* Sets the ParentLoader of the AntLibrary | |||||
* | |||||
* @param parentLoader The new ParentLoader value | |||||
*/ | |||||
public void setParentLoader(ClassLoader parentLoader) { | |||||
this.parentLoader = parentLoader; | |||||
} | |||||
/** | |||||
* Gets the libraryId of the AntLibrary | |||||
* | |||||
* @return the libraryId value | |||||
*/ | |||||
public String getLibraryId() { | |||||
return libraryId; | |||||
} | |||||
/** | |||||
* Gets the ClassLoader of the AntLibrary | |||||
* | |||||
* @return The ClassLoader value | |||||
*/ | |||||
public ClassLoader getClassLoader() { | |||||
if (isolated) { | |||||
return createLoader(); | |||||
} else if (loader == null) { | |||||
loader = createLoader(); | |||||
} | |||||
return loader; | |||||
} | |||||
/** | |||||
* Gets the definitions (taskdefs and typedefs) of the AntLibrary | |||||
* | |||||
* @return the definitions map | |||||
*/ | |||||
public Map getDefinitions() { | |||||
return definitions; | |||||
} | |||||
/** | |||||
* Gets an the converter class names of the AntLibrary | |||||
* | |||||
* @return an iterator over a list of String class names | |||||
*/ | |||||
public Iterator getConverterClassNames() { | |||||
return converterClassNames.iterator(); | |||||
} | |||||
/** | |||||
* Indicate whether this library has any converters defined | |||||
* | |||||
* @return true if any converters have been defined | |||||
*/ | |||||
public boolean hasConverters() { | |||||
return !converterClassNames.isEmpty(); | |||||
} | |||||
/** | |||||
* Add a library to path to this AntLibrary definition | |||||
* | |||||
* @param libraryURL the URL to the library to be added | |||||
*/ | |||||
public void addLibraryURL(URL libraryURL) { | |||||
libraryURLs.add(libraryURL); | |||||
} | |||||
/** | |||||
* Create classloader which can be used to load the classes of this ant | |||||
* library | |||||
* | |||||
* @return the classloader for this ant library | |||||
*/ | |||||
private ClassLoader createLoader() { | |||||
ClassLoader ourParent | |||||
= extendsLibrary == null ? parentLoader | |||||
: extendsLibrary.getClassLoader(); | |||||
return new URLClassLoader((URL[])libraryURLs.toArray(new URL[0]), | |||||
ourParent); | |||||
} | |||||
} | |||||
@@ -0,0 +1,292 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.antcore.antlib; | |||||
import java.net.URL; | |||||
import java.util.HashMap; | |||||
import java.util.Map; | |||||
import java.util.List; | |||||
import java.util.ArrayList; | |||||
import org.apache.ant.antcore.util.ConfigException; | |||||
/** | |||||
* This class represents the specification of an Ant library. It is merely | |||||
* the internal representation of the antlib XML definition. An instance of | |||||
* this class is used to contruct an AntLibrary instance. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 13 January 2002 | |||||
*/ | |||||
public class AntLibrarySpec { | |||||
/** | |||||
* This is the globally unique name of this library. It uses the same | |||||
* conventions as the Java package space - i.e. reverse order DNS names | |||||
* This name is used when importing tasks from this library | |||||
*/ | |||||
private String libraryId; | |||||
/** | |||||
* This string identifies the location where the library is maintained. | |||||
* It is usually a URL to the location from which the library may be | |||||
* downloaded or purchased | |||||
*/ | |||||
private String libraryHome; | |||||
/** The list of converter classnames defined in this library */ | |||||
private List converterClassNames = new ArrayList(); | |||||
/** | |||||
* This is the optional id of another Ant library upon which this | |||||
* library depends. | |||||
*/ | |||||
private String extendsLibraryId; | |||||
/** This is the URL from which this library has been loaded */ | |||||
private URL libraryURL; | |||||
/** This is the list of definitions */ | |||||
private Map definitions = new HashMap(); | |||||
/** Indicates if each Task Instance should use its own classloader */ | |||||
private boolean isolated = false; | |||||
/** Flag which indicates if tools.jar is required */ | |||||
private boolean toolsJarRequired = false; | |||||
/** | |||||
* This flag indicates that this task processes XML and wishes to use | |||||
* the XML parser packaged with Ant | |||||
*/ | |||||
private boolean requiresAntXMLParser = false; | |||||
/** | |||||
* Set the library that this library extends, if any | |||||
* | |||||
* @param extendsLibraryId The new ExtendsLibraryId value | |||||
*/ | |||||
public void setExtendsLibraryId(String extendsLibraryId) { | |||||
this.extendsLibraryId = extendsLibraryId; | |||||
} | |||||
/** | |||||
* Indicate that this library requires a separate classloader per task | |||||
* instance | |||||
* | |||||
* @param isolated The new Isolated value | |||||
*/ | |||||
public void setIsolated(boolean isolated) { | |||||
this.isolated = isolated; | |||||
} | |||||
/** | |||||
* Sets the home of the AntLibrary | |||||
* | |||||
* @param home The new home value | |||||
*/ | |||||
public void setHome(String home) { | |||||
this.libraryHome = libraryHome; | |||||
} | |||||
/** | |||||
* Sets the libraryId of the AntLibrary | |||||
* | |||||
* @param libraryId The new libraryId value | |||||
*/ | |||||
public void setLibraryId(String libraryId) { | |||||
this.libraryId = libraryId; | |||||
} | |||||
/** | |||||
* Indicate that this library uses the Sun tools.jar | |||||
* | |||||
* @param toolsJarRequired The new ToolsJarRequired value | |||||
*/ | |||||
public void setToolsJarRequired(boolean toolsJarRequired) { | |||||
this.toolsJarRequired = toolsJarRequired; | |||||
} | |||||
/** | |||||
* Sets the libraryURL of the AntLibrary | |||||
* | |||||
* @param libraryURL The new libraryURL value | |||||
*/ | |||||
public void setLibraryURL(URL libraryURL) { | |||||
this.libraryURL = libraryURL; | |||||
} | |||||
/** | |||||
* Indicates that this library uses Ant's XML parser libraries | |||||
* | |||||
* @param requiresAntXMLParser true if this library uses Ant's XML | |||||
* parser libraries | |||||
*/ | |||||
public void setAntXML(boolean requiresAntXMLParser) { | |||||
this.requiresAntXMLParser = requiresAntXMLParser; | |||||
} | |||||
/** | |||||
* Get the list of converter classnames defined in this library spec | |||||
* | |||||
* @return the converter classnames list | |||||
*/ | |||||
public List getConverterClassNames() { | |||||
return converterClassNames; | |||||
} | |||||
/** | |||||
* Indicate whether this AntLibrary requires the Sun tools.jar | |||||
* | |||||
* @return The ToolsJarRequired value | |||||
*/ | |||||
public boolean isToolsJarRequired() { | |||||
return toolsJarRequired; | |||||
} | |||||
/** | |||||
* Get the id of the library that this library extends if any. | |||||
* | |||||
* @return The ExtendsLibraryId value | |||||
*/ | |||||
public String getExtendsLibraryId() { | |||||
return extendsLibraryId; | |||||
} | |||||
/** | |||||
* Indicate if this library required an classloader per instance | |||||
* | |||||
* @return true if a separate classloader should be used per instance. | |||||
*/ | |||||
public boolean isIsolated() { | |||||
return isolated; | |||||
} | |||||
/** | |||||
* Gets the libraryId of the AntLibrary | |||||
* | |||||
* @return The libraryId value | |||||
*/ | |||||
public String getLibraryId() { | |||||
return libraryId; | |||||
} | |||||
/** | |||||
* Gets the libraryURL of the AntLibrary | |||||
* | |||||
* @return The libraryURL value | |||||
*/ | |||||
public URL getLibraryURL() { | |||||
return libraryURL; | |||||
} | |||||
/** | |||||
* Gets the definitions of the AntLibrarySpec | |||||
* | |||||
* @return the definitions map | |||||
*/ | |||||
public Map getDefinitions() { | |||||
return definitions; | |||||
} | |||||
/** | |||||
* Add a converter to this library sec | |||||
* | |||||
* @param className the name of the converter class | |||||
*/ | |||||
public void addConverter(String className) { | |||||
converterClassNames.add(className); | |||||
} | |||||
/** | |||||
* Indicates if this library requires Ant's XML parser | |||||
* | |||||
* @return true if this library requires Ant's XML parser | |||||
*/ | |||||
public boolean usesAntXML() { | |||||
return requiresAntXMLParser; | |||||
} | |||||
/** | |||||
* Adds a definition to the Ant Library | |||||
* | |||||
* @param name the name of the library definition | |||||
* @param classname the name of the class implementing the element | |||||
* @param definitionTypeName the name of the definition type. This is | |||||
* converted to its symbolic value | |||||
* @exception ConfigException if the definition has already been defined | |||||
*/ | |||||
public void addDefinition(String definitionTypeName, String name, | |||||
String classname) | |||||
throws ConfigException { | |||||
if (definitions.containsKey(name)) { | |||||
throw new ConfigException("More than one definition " | |||||
+ "in library for " + name); | |||||
} | |||||
int definitionType = 0; | |||||
if (definitionTypeName.equals("typedef")) { | |||||
definitionType = AntLibrary.TYPEDEF; | |||||
} else if (definitionTypeName.equals("taskdef")) { | |||||
definitionType = AntLibrary.TASKDEF; | |||||
} else { | |||||
throw new ConfigException("Unknown type of definition " | |||||
+ definitionTypeName); | |||||
} | |||||
definitions.put(name, | |||||
new AntLibDefinition(definitionType, name, classname)); | |||||
} | |||||
} | |||||
@@ -0,0 +1,109 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.antcore.antlib; | |||||
import org.apache.ant.antcore.xml.ElementHandler; | |||||
import org.xml.sax.SAXParseException; | |||||
/** | |||||
* Handler for converter definition within an Ant Library | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public class ConverterHandler extends ElementHandler { | |||||
/** The classname attribute name */ | |||||
public final static String CLASSNAME_ATTR = "classname"; | |||||
/** | |||||
* Gets the className of the Converter | |||||
* | |||||
* @return the className value | |||||
*/ | |||||
public String getClassName() { | |||||
return getAttribute(CLASSNAME_ATTR); | |||||
} | |||||
/** | |||||
* Process the definition element | |||||
* | |||||
* @param elementName the name of the element | |||||
* @exception SAXParseException if there is a problem parsing the | |||||
* element | |||||
*/ | |||||
public void processElement(String elementName) | |||||
throws SAXParseException { | |||||
if (getClassName() == null) { | |||||
throw new SAXParseException(CLASSNAME_ATTR + " must be " | |||||
+ "specified for a converter", getLocator()); | |||||
} | |||||
} | |||||
/** | |||||
* Validate that the given attribute and value are valid. | |||||
* | |||||
* @param attributeName The name of the attributes | |||||
* @param attributeValue The value of the attributes | |||||
* @exception SAXParseException if the attribute is not allowed on the | |||||
* element. | |||||
*/ | |||||
protected void validateAttribute(String attributeName, | |||||
String attributeValue) | |||||
throws SAXParseException { | |||||
if (!attributeName.equals(CLASSNAME_ATTR)) { | |||||
throwInvalidAttribute(attributeName); | |||||
} | |||||
} | |||||
} | |||||
@@ -0,0 +1,144 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.antcore.antlib; | |||||
import org.apache.ant.antcore.xml.ElementHandler; | |||||
import org.xml.sax.SAXParseException; | |||||
/** | |||||
* Handler for definition within an Ant Library | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 13 January 2002 | |||||
*/ | |||||
public class DefinitionHandler extends ElementHandler { | |||||
/** The name attribute name */ | |||||
public final static String NAME_ATTR = "name"; | |||||
/** The classname attribute name */ | |||||
public final static String CLASSNAME_ATTR = "classname"; | |||||
/** the type of the definition */ | |||||
private String definitionType; | |||||
/** | |||||
* Create a definition handler to handle a specific type of definition | |||||
* | |||||
* @param definitionType the type of the definition being handled | |||||
*/ | |||||
public DefinitionHandler(String definitionType) { | |||||
this.definitionType = definitionType; | |||||
} | |||||
/** | |||||
* Get the type of definition being handled | |||||
* | |||||
* @return the type of the definition | |||||
*/ | |||||
public String getDefinitionType() { | |||||
return definitionType; | |||||
} | |||||
/** | |||||
* Gets the name of the TaskdefHandler | |||||
* | |||||
* @return the name value | |||||
*/ | |||||
public String getName() { | |||||
return getAttribute(NAME_ATTR); | |||||
} | |||||
/** | |||||
* Gets the className of the TaskdefHandler | |||||
* | |||||
* @return the className value | |||||
*/ | |||||
public String getClassName() { | |||||
return getAttribute(CLASSNAME_ATTR); | |||||
} | |||||
/** | |||||
* Process the definition element | |||||
* | |||||
* @param elementName the name of the element | |||||
* @exception SAXParseException if there is a problem parsing the | |||||
* element | |||||
*/ | |||||
public void processElement(String elementName) | |||||
throws SAXParseException { | |||||
if (getName() == null || getClassName() == null) { | |||||
throw new SAXParseException("name and classname must be " | |||||
+ "specified for a " + definitionType, getLocator()); | |||||
} | |||||
} | |||||
/** | |||||
* Validate that the given attribute and value are valid. | |||||
* | |||||
* @param attributeName The name of the attributes | |||||
* @param attributeValue The value of the attributes | |||||
* @exception SAXParseException if the attribute is not allowed on the | |||||
* element. | |||||
*/ | |||||
protected void validateAttribute(String attributeName, | |||||
String attributeValue) | |||||
throws SAXParseException { | |||||
if (!attributeName.equals(NAME_ATTR) && | |||||
!attributeName.equals(CLASSNAME_ATTR)) { | |||||
throwInvalidAttribute(attributeName); | |||||
} | |||||
} | |||||
} | |||||
@@ -0,0 +1,198 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.antcore.config; | |||||
import java.io.File; | |||||
import java.net.MalformedURLException; | |||||
import java.net.URL; | |||||
import java.util.ArrayList; | |||||
import java.util.HashMap; | |||||
import java.util.Iterator; | |||||
import java.util.List; | |||||
import java.util.Map; | |||||
import org.apache.ant.common.util.PathTokenizer; | |||||
import org.apache.ant.antcore.util.ConfigException; | |||||
import org.apache.ant.init.InitUtils; | |||||
/** | |||||
* An AntConfig is the java class representation of the antconfig.xml files | |||||
* used to configure Ant. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 20 January 2002 | |||||
*/ | |||||
public class AntConfig { | |||||
/** The list of additional directories to be searched for Ant libraries */ | |||||
private List taskDirLocations = new ArrayList(); | |||||
/** | |||||
* A list of additional paths for each ant library, indexed on the | |||||
* library id | |||||
*/ | |||||
private Map libPaths = new HashMap(); | |||||
/** | |||||
* Get the task dir locations. | |||||
* | |||||
* @return an iterator over the task dir locations | |||||
*/ | |||||
public Iterator getTaskDirLocations() { | |||||
return taskDirLocations.iterator(); | |||||
} | |||||
/** | |||||
* Get the list of additional path components for a given path | |||||
* | |||||
* @param libraryId the identifier for the library | |||||
* @return the list of URLs for the additional paths for the given | |||||
* library | |||||
*/ | |||||
public List getLibraryPathList(String libraryId) { | |||||
List libraryPathList = (List)libPaths.get(libraryId); | |||||
if (libraryPathList == null) { | |||||
libraryPathList = new ArrayList(); | |||||
libPaths.put(libraryId, libraryPathList); | |||||
} | |||||
return libraryPathList; | |||||
} | |||||
/** | |||||
* Gets the libraryIds of the AntConfig | |||||
* | |||||
* @return an interator over the library identifiers for which there is | |||||
* additional path information | |||||
*/ | |||||
public Iterator getLibraryIds() { | |||||
return libPaths.keySet().iterator(); | |||||
} | |||||
/** | |||||
* Add an additional set of paths for the given library. | |||||
* | |||||
* @param libraryId The library id for which the additional class path | |||||
* is being specified | |||||
* @param libraryPath the classpath style string for the library's | |||||
* additonal paths | |||||
* @exception ConfigException if the appropriate URLs cannot be formed. | |||||
*/ | |||||
public void addLibPath(String libraryId, String libraryPath) | |||||
throws ConfigException { | |||||
try { | |||||
List libraryPathList = getLibraryPathList(libraryId); | |||||
PathTokenizer p = new PathTokenizer(libraryPath); | |||||
while (p.hasMoreTokens()) { | |||||
String pathElement = p.nextToken(); | |||||
File pathElementFile = new File(pathElement); | |||||
URL pathElementURL = InitUtils.getFileURL(pathElementFile); | |||||
libraryPathList.add(pathElementURL); | |||||
} | |||||
} catch (MalformedURLException e) { | |||||
throw new ConfigException("Unable to process libraryPath '" | |||||
+ libraryPath + "' for library '" + libraryId + "'", e); | |||||
} | |||||
} | |||||
/** | |||||
* Add an additional URL for the library's classpath | |||||
* | |||||
* @param libraryId the library's unique Id | |||||
* @param libraryURL a string which points to the additonal path | |||||
* @exception ConfigException if the URL could not be formed | |||||
*/ | |||||
public void addLibURL(String libraryId, String libraryURL) | |||||
throws ConfigException { | |||||
try { | |||||
List libraryPathList = getLibraryPathList(libraryId); | |||||
libraryPathList.add(new URL(libraryURL)); | |||||
} catch (MalformedURLException e) { | |||||
throw new ConfigException("Unable to process libraryURL '" | |||||
+ libraryURL + "' for library '" + libraryId + "'", e); | |||||
} | |||||
} | |||||
/** | |||||
* Merge in another ocnfiguration. The configuration being merged in | |||||
* takes precedence | |||||
* | |||||
* @param otherConfig the other AntConfig to be merged. | |||||
*/ | |||||
public void merge(AntConfig otherConfig) { | |||||
// merge by | |||||
List currentTaskDirs = taskDirLocations; | |||||
taskDirLocations = new ArrayList(); | |||||
taskDirLocations.addAll(otherConfig.taskDirLocations); | |||||
taskDirLocations.addAll(currentTaskDirs); | |||||
Iterator i = otherConfig.libPaths.keySet().iterator(); | |||||
while (i.hasNext()) { | |||||
String libraryId = (String)i.next(); | |||||
List currentList = getLibraryPathList(libraryId); | |||||
List combined = new ArrayList(); | |||||
combined.addAll(otherConfig.getLibraryPathList(libraryId)); | |||||
combined.addAll(currentList); | |||||
libPaths.put(libraryId, combined); | |||||
} | |||||
} | |||||
/** | |||||
* Add a new task directory to be searched for additional Ant libraries | |||||
* | |||||
* @param taskDirLocation the location (can be a file or a URL) where | |||||
* the libraries may be loaded from. | |||||
*/ | |||||
public void addTaskDir(String taskDirLocation) { | |||||
taskDirLocations.add(taskDirLocation); | |||||
} | |||||
} | |||||
@@ -0,0 +1,141 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.antcore.config; | |||||
import org.apache.ant.antcore.util.ConfigException; | |||||
import org.apache.ant.antcore.xml.ElementHandler; | |||||
import org.xml.sax.Attributes; | |||||
import org.xml.sax.SAXParseException; | |||||
/** | |||||
* XML Element Handler for Ant config files | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 20 January 2002 | |||||
*/ | |||||
public class AntConfigHandler extends ElementHandler { | |||||
/** | |||||
* The config object which is contructed from the XML representation of | |||||
* the config | |||||
*/ | |||||
private AntConfig config; | |||||
/** | |||||
* Get the Ant Config read in by this handler | |||||
* | |||||
* @return the AntConfig instance | |||||
*/ | |||||
public AntConfig getAntConfig() { | |||||
return config; | |||||
} | |||||
/** | |||||
* Process the antlib element | |||||
* | |||||
* @param elementName the name of the element | |||||
* @exception SAXParseException if there is a problem parsing the | |||||
* element | |||||
*/ | |||||
public void processElement(String elementName) | |||||
throws SAXParseException { | |||||
config = new AntConfig(); | |||||
} | |||||
/** | |||||
* Start a new element in the ant config. | |||||
* | |||||
* @param uri The Namespace URI. | |||||
* @param localName The local name (without prefix). | |||||
* @param qualifiedName The qualified name (with prefix) | |||||
* @param attributes The attributes attached to the element. | |||||
* @throws SAXParseException if there is a parsing problem. | |||||
*/ | |||||
public void startElement(String uri, String localName, String qualifiedName, | |||||
Attributes attributes) | |||||
throws SAXParseException { | |||||
try { | |||||
if (qualifiedName.equals("taskdir")) { | |||||
TaskDirHandler taskDirHandler | |||||
= new TaskDirHandler(); | |||||
taskDirHandler.start(getParseContext(), getXMLReader(), | |||||
this, getLocator(), attributes, getElementSource(), | |||||
qualifiedName); | |||||
config.addTaskDir(taskDirHandler.getTaskDirLocation()); | |||||
} else if (qualifiedName.equals("libpath")) { | |||||
LibPathHandler libPathHandler | |||||
= new LibPathHandler(); | |||||
libPathHandler.start(getParseContext(), getXMLReader(), | |||||
this, getLocator(), attributes, getElementSource(), | |||||
qualifiedName); | |||||
if (libPathHandler.getLibraryPath() != null) { | |||||
config.addLibPath(libPathHandler.getLibraryId(), | |||||
libPathHandler.getLibraryPath()); | |||||
} else { | |||||
config.addLibURL(libPathHandler.getLibraryId(), | |||||
libPathHandler.getLibraryURL()); | |||||
} | |||||
} else { | |||||
super.startElement(uri, localName, qualifiedName, attributes); | |||||
} | |||||
} catch (ConfigException e) { | |||||
throw new SAXParseException("Unable to process config", | |||||
getLocator(), e); | |||||
} | |||||
} | |||||
} | |||||
@@ -0,0 +1,141 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.antcore.config; | |||||
import org.apache.ant.antcore.xml.ElementHandler; | |||||
import org.xml.sax.SAXParseException; | |||||
/** | |||||
* An XML Handler for the libpath element in an Ant config file | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 20 January 2002 | |||||
*/ | |||||
public class LibPathHandler extends ElementHandler { | |||||
/** The library identifier attribute name */ | |||||
public final static String LIBID_ATTR = "libid"; | |||||
/** The path attribute name */ | |||||
public final static String PATH_ATTR = "path"; | |||||
/** The path attribute name */ | |||||
public final static String URL_ATTR = "url"; | |||||
/** | |||||
* Get the libraryId for which the additional path is being defined | |||||
* | |||||
* @return the library's unique id | |||||
*/ | |||||
public String getLibraryId() { | |||||
return getAttribute(LIBID_ATTR); | |||||
} | |||||
/** | |||||
* Get the additional path being defined fro the library | |||||
* | |||||
* @return the libraryPath value, may be null | |||||
*/ | |||||
public String getLibraryPath() { | |||||
return getAttribute(PATH_ATTR); | |||||
} | |||||
/** | |||||
* Get the URL (as a string) containing the additional path for the | |||||
* library. | |||||
* | |||||
* @return the libraryURL value | |||||
*/ | |||||
public String getLibraryURL() { | |||||
return getAttribute(URL_ATTR); | |||||
} | |||||
/** | |||||
* Process the libpath element | |||||
* | |||||
* @param elementName the name of the element | |||||
* @exception SAXParseException if there is a problem parsing the | |||||
* element | |||||
*/ | |||||
public void processElement(String elementName) | |||||
throws SAXParseException { | |||||
if (getLibraryId() == null | |||||
|| (getLibraryPath() == null && getLibraryURL() == null) | |||||
|| (getLibraryPath() != null && getLibraryURL() != null)) { | |||||
throw new SAXParseException("The " + LIBID_ATTR | |||||
+ " attribute and only one of " | |||||
+ PATH_ATTR + " or " + URL_ATTR | |||||
+ " attributes must be specified for a libpath element", | |||||
getLocator()); | |||||
} | |||||
} | |||||
/** | |||||
* Validate that the given attribute and value are valid. | |||||
* | |||||
* @param attributeName The name of the attributes | |||||
* @param attributeValue The value of the attributes | |||||
* @exception SAXParseException if the attribute is not allowed on the | |||||
* element. | |||||
*/ | |||||
protected void validateAttribute(String attributeName, | |||||
String attributeValue) | |||||
throws SAXParseException { | |||||
if (!attributeName.equals(LIBID_ATTR) && | |||||
!attributeName.equals(PATH_ATTR) && | |||||
!attributeName.equals(URL_ATTR)) { | |||||
throwInvalidAttribute(attributeName); | |||||
} | |||||
} | |||||
} | |||||
@@ -0,0 +1,110 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.antcore.config; | |||||
import org.apache.ant.antcore.xml.ElementHandler; | |||||
import org.xml.sax.SAXParseException; | |||||
/** | |||||
* An XML handler to handle the taskdir element of an AntConfig file. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 20 January 2002 | |||||
*/ | |||||
public class TaskDirHandler extends ElementHandler { | |||||
/** The location attribute name */ | |||||
public final static String LOCATION_ATTR = "location"; | |||||
/** | |||||
* Get the location of the additional search directory | |||||
* | |||||
* @return the additional directory to be searched for Ant libraries. | |||||
*/ | |||||
public String getTaskDirLocation() { | |||||
return getAttribute(LOCATION_ATTR); | |||||
} | |||||
/** | |||||
* Process the taskdir element | |||||
* | |||||
* @param elementName the name of the element | |||||
* @exception SAXParseException if there is a problem parsing the | |||||
* element | |||||
*/ | |||||
public void processElement(String elementName) | |||||
throws SAXParseException { | |||||
if (getLocation() == null) { | |||||
throw new SAXParseException(LOCATION_ATTR | |||||
+ " must be specified for a taskdir element", getLocator()); | |||||
} | |||||
} | |||||
/** | |||||
* Validate that the given attribute and value are valid. | |||||
* | |||||
* @param attributeName The name of the attributes | |||||
* @param attributeValue The value of the attributes | |||||
* @exception SAXParseException if the attribute is not allowed on the | |||||
* element. | |||||
*/ | |||||
protected void validateAttribute(String attributeName, | |||||
String attributeValue) | |||||
throws SAXParseException { | |||||
if (!attributeName.equals(LOCATION_ATTR)) { | |||||
throwInvalidAttribute(attributeName); | |||||
} | |||||
} | |||||
} | |||||
@@ -0,0 +1,182 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.antcore.event; | |||||
import java.util.EventObject; | |||||
import org.apache.ant.antcore.model.ModelElement; | |||||
/** | |||||
* A BuildEvent indicates the occurence of a significant event in the build. | |||||
* All build events come from an ExecutionFrame or an ExecutionManager. | |||||
* There are a number of different types of event and they will generally be | |||||
* associated with some build element from the build model. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 15 January 2002 | |||||
*/ | |||||
public class BuildEvent extends EventObject { | |||||
/** Build Started Event type */ | |||||
public final static int BUILD_STARTED = 1; | |||||
/** Build Finished Event Type */ | |||||
public final static int BUILD_FINISHED = 2; | |||||
/** Start of target event type */ | |||||
public final static int TARGET_STARTED = 3; | |||||
/** Target finished event type */ | |||||
public final static int TARGET_FINISHED = 4; | |||||
/** Start of task event type */ | |||||
public final static int TASK_STARTED = 5; | |||||
/** end of task event type */ | |||||
public final static int TASK_FINISHED = 6; | |||||
/** message event type */ | |||||
public final static int MESSAGE = 7; | |||||
/** The type of this event */ | |||||
private int eventType; | |||||
/** The cause of this event if appropriate */ | |||||
private Throwable cause = null; | |||||
/** message associated wuth this event */ | |||||
private String message = null; | |||||
/** The priority of this message */ | |||||
private int messagePriority; | |||||
/** | |||||
* Create a build event. | |||||
* | |||||
* @param eventType the type of the buildEvent. | |||||
* @param modelElement the element with which this event is associated | |||||
*/ | |||||
public BuildEvent(ModelElement modelElement, int eventType) { | |||||
super(modelElement); | |||||
this.eventType = eventType; | |||||
} | |||||
/** | |||||
* Create a build event with an associated exception. | |||||
* | |||||
* @param eventType the type of the buildEvent. | |||||
* @param cause An exception if associated with the event | |||||
* @param modelElement the element with which this event is associated | |||||
*/ | |||||
public BuildEvent(ModelElement modelElement, int eventType, | |||||
Throwable cause) { | |||||
this(modelElement, eventType); | |||||
this.cause = cause; | |||||
} | |||||
/** | |||||
* Create a build event for a message | |||||
* | |||||
* @param modelElement the build element with which the event is | |||||
* associated. | |||||
* @param message the message associated with this event | |||||
* @param priority the message priority | |||||
*/ | |||||
public BuildEvent(ModelElement modelElement, String message, | |||||
int priority) { | |||||
this(modelElement, MESSAGE); | |||||
this.message = message; | |||||
this.messagePriority = priority; | |||||
} | |||||
/** | |||||
* Get the type of this event | |||||
* | |||||
* @return the event type | |||||
*/ | |||||
public int getEventType() { | |||||
return eventType; | |||||
} | |||||
/** | |||||
* Get the build element involved in this event. | |||||
* | |||||
* @return the build element to which this event is associated. | |||||
*/ | |||||
public ModelElement getModelElement() { | |||||
return (ModelElement)getSource(); | |||||
} | |||||
/** | |||||
* Returns the logging message. This field will only be set for | |||||
* "messageLogged" events. | |||||
* | |||||
* @return the message value | |||||
*/ | |||||
public String getMessage() { | |||||
return message; | |||||
} | |||||
/** | |||||
* Returns the priority of the logging message. This field will only be | |||||
* set for "messageLogged" events. | |||||
* | |||||
* @return the priority value | |||||
*/ | |||||
public int getPriority() { | |||||
return messagePriority; | |||||
} | |||||
/** | |||||
* Returns the exception that was thrown, if any. This field will only | |||||
* be set for "taskFinished", "targetFinished", and "buildFinished" | |||||
* events. | |||||
* | |||||
* @return the cause value | |||||
*/ | |||||
public Throwable getCause() { | |||||
return cause; | |||||
} | |||||
} | |||||
@@ -0,0 +1,197 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.antcore.event; | |||||
import java.util.ArrayList; | |||||
import java.util.Iterator; | |||||
import java.util.List; | |||||
import org.apache.ant.antcore.model.ModelElement; | |||||
/** | |||||
* BuildEventSupport is used by classes which which to send build events to | |||||
* the BuildListeners | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 15 January 2002 | |||||
*/ | |||||
public class BuildEventSupport { | |||||
/** | |||||
* The listeners attached to the object which contains this support | |||||
* object | |||||
*/ | |||||
private List listeners = new ArrayList(); | |||||
/** | |||||
* Gets the listeners of the BuildEventSupport | |||||
* | |||||
* @return the listeners value | |||||
*/ | |||||
public Iterator getListeners() { | |||||
return listeners.iterator(); | |||||
} | |||||
/** | |||||
* Add a listener | |||||
* | |||||
* @param listener the listener to be added | |||||
*/ | |||||
public void addBuildListener(BuildListener listener) { | |||||
listeners.add(listener); | |||||
} | |||||
/** | |||||
* Remove a listener | |||||
* | |||||
* @param listener the listener to be removed | |||||
*/ | |||||
public void removeBuildListener(BuildListener listener) { | |||||
listeners.remove(listener); | |||||
} | |||||
/** | |||||
* Forward the given event to the subscibed listeners | |||||
* | |||||
* @param event the event to be forwarded to the listeners | |||||
*/ | |||||
public void forwardEvent(BuildEvent event) { | |||||
for (Iterator i = listeners.iterator(); i.hasNext(); ) { | |||||
BuildListener listener = (BuildListener)i.next(); | |||||
listener.processBuildEvent(event); | |||||
} | |||||
} | |||||
/** | |||||
* Fire a build started event | |||||
* | |||||
* @param element the build element with which the event is associated | |||||
*/ | |||||
public void fireBuildStarted(ModelElement element) { | |||||
BuildEvent event = new BuildEvent(element, BuildEvent.BUILD_STARTED); | |||||
forwardEvent(event); | |||||
} | |||||
/** | |||||
* Fir a build finished event | |||||
* | |||||
* @param element the build element with which the event is associated | |||||
* @param cause an exception if there was a failure in the build | |||||
*/ | |||||
public void fireBuildFinished(ModelElement element, | |||||
Throwable cause) { | |||||
BuildEvent event = new BuildEvent(element, BuildEvent.BUILD_FINISHED, | |||||
cause); | |||||
forwardEvent(event); | |||||
} | |||||
/** | |||||
* fire a target started event | |||||
* | |||||
* @param element the build element with which the event is associated | |||||
*/ | |||||
public void fireTargetStarted(ModelElement element) { | |||||
BuildEvent event = new BuildEvent(element, BuildEvent.TARGET_STARTED); | |||||
forwardEvent(event); | |||||
} | |||||
/** | |||||
* fire a target finished event | |||||
* | |||||
* @param element the build element with which the event is associated | |||||
* @param cause an exception if there was a failure in the target's task | |||||
*/ | |||||
public void fireTargetFinished(ModelElement element, | |||||
Throwable cause) { | |||||
BuildEvent event = new BuildEvent(element, BuildEvent.TARGET_FINISHED, | |||||
cause); | |||||
forwardEvent(event); | |||||
} | |||||
/** | |||||
* fire a task started event | |||||
* | |||||
* @param element the build element with which the event is associated | |||||
*/ | |||||
public void fireTaskStarted(ModelElement element) { | |||||
BuildEvent event = new BuildEvent(element, BuildEvent.TASK_STARTED); | |||||
forwardEvent(event); | |||||
} | |||||
/** | |||||
* fire a task finished event | |||||
* | |||||
* @param element the build element with which the event is associated | |||||
* @param cause an exception if there was a failure in the task | |||||
*/ | |||||
public void fireTaskFinished(ModelElement element, | |||||
Throwable cause) { | |||||
BuildEvent event = new BuildEvent(element, BuildEvent.TASK_FINISHED, | |||||
cause); | |||||
forwardEvent(event); | |||||
} | |||||
/** | |||||
* Send a message event | |||||
* | |||||
* @param element the build element with which the event is associated | |||||
* @param message the message to be sent | |||||
* @param priority the priority of the message | |||||
*/ | |||||
public void fireMessageLogged(ModelElement element, | |||||
String message, int priority) { | |||||
BuildEvent event = new BuildEvent(element, message, priority); | |||||
forwardEvent(event); | |||||
} | |||||
} | |||||
@@ -0,0 +1,74 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.antcore.event; | |||||
import java.util.EventListener; | |||||
/** | |||||
* Classes that implement this interface will be notified when things | |||||
* happend during a build. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 15 January 2002 | |||||
* @see BuildEvent | |||||
*/ | |||||
public interface BuildListener extends EventListener { | |||||
/** | |||||
* Process an incoming build event | |||||
* | |||||
* @param event the event to be processed. | |||||
*/ | |||||
void processBuildEvent(BuildEvent event); | |||||
} | |||||
@@ -0,0 +1,132 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.antcore.execution; | |||||
import java.lang.reflect.Method; | |||||
import java.util.Map; | |||||
/** | |||||
* Introspects a class and builds a reflector for setting values on | |||||
* instances of the class | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 19 January 2002 | |||||
*/ | |||||
public class ClassIntrospector { | |||||
/** The reflector that this introspector populates */ | |||||
private Reflector reflector; | |||||
/** | |||||
* Create a introspector for the bean | |||||
* | |||||
* @param bean the class which is introspected | |||||
* @param converters a collection of converters for converting values | |||||
* from strings | |||||
*/ | |||||
public ClassIntrospector(final Class bean, Map converters) { | |||||
reflector = new Reflector(); | |||||
Method[] methods = bean.getMethods(); | |||||
for (int i = 0; i < methods.length; i++) { | |||||
final Method m = methods[i]; | |||||
final String name = m.getName(); | |||||
Class returnType = m.getReturnType(); | |||||
Class[] args = m.getParameterTypes(); | |||||
if (name.equals("addText") | |||||
&& returnType.equals(Void.TYPE) | |||||
&& args.length == 1 | |||||
&& args[0].equals(String.class)) { | |||||
reflector.setAddTextMethod(m); | |||||
} else if (name.startsWith("set") | |||||
&& name.length() > 3 | |||||
&& returnType.equals(Void.TYPE) | |||||
&& args.length == 1 | |||||
&& !args[0].isArray()) { | |||||
reflector.addAttributeMethod(m, getPropertyName(name, "set"), | |||||
converters); | |||||
} else if (name.startsWith("add") | |||||
&& name.length() > 3 | |||||
&& returnType.equals(Void.TYPE) | |||||
&& args.length == 1 | |||||
&& !args[0].equals(String.class) | |||||
&& !args[0].isArray() | |||||
&& !args[0].isPrimitive()) { | |||||
reflector.addElementMethod(m, getPropertyName(name, "add")); | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* Gets the reflector associed with the class we are introspecting | |||||
* | |||||
* @return the reflector | |||||
*/ | |||||
public Reflector getReflector() { | |||||
return reflector; | |||||
} | |||||
/** | |||||
* extract the name of a property from a method name - subtracting a | |||||
* given prefix. | |||||
* | |||||
* @param methodName the name of the method | |||||
* @param prefix the prefix to be ignored | |||||
* @return the property name | |||||
*/ | |||||
private String getPropertyName(String methodName, String prefix) { | |||||
int start = prefix.length(); | |||||
return methodName.substring(start).toLowerCase(); | |||||
} | |||||
} | |||||
@@ -0,0 +1,134 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.antcore.execution; | |||||
import java.io.File; | |||||
import java.net.URL; | |||||
import org.apache.ant.common.context.AntContext; | |||||
import org.apache.ant.common.util.AntException; | |||||
import org.apache.ant.common.util.FileUtils; | |||||
import org.apache.ant.antcore.event.BuildEventSupport; | |||||
import org.apache.ant.antcore.model.ModelElement; | |||||
/** | |||||
* This is the core's implementation of the AntContext for all core objects. | |||||
* Specific subclasses handle types and tasks | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 20 January 2002 | |||||
*/ | |||||
public class ExecutionContext extends AntContext { | |||||
/** The ExecutionFrame containing this context */ | |||||
private ExecutionFrame executionFrame; | |||||
/** the event support instance used to manage build events */ | |||||
private BuildEventSupport eventSupport; | |||||
/** the model in the build model with which this context is associated */ | |||||
private ModelElement modelElement; | |||||
/** General file utilities */ | |||||
private FileUtils fileUtils = new FileUtils(); | |||||
/** | |||||
* Set the model element associated with this context | |||||
* | |||||
* @param modelElement the model element associated with this context | |||||
*/ | |||||
public void setModelElement(ModelElement modelElement) { | |||||
this.modelElement = modelElement; | |||||
} | |||||
/** | |||||
* Initilaise this context's environment | |||||
* | |||||
* @param executionFrame the frame containing this context | |||||
* @param eventSupport the event support instance used to send build | |||||
* events | |||||
*/ | |||||
public void initEnvironment(ExecutionFrame executionFrame, | |||||
BuildEventSupport eventSupport) { | |||||
this.executionFrame = executionFrame; | |||||
this.eventSupport = eventSupport; | |||||
} | |||||
/** | |||||
* Log a message as a build event | |||||
* | |||||
* @param message the message to be logged | |||||
* @param level the priority level of the message | |||||
*/ | |||||
public void log(String message, int level) { | |||||
eventSupport.fireMessageLogged(modelElement, message, level); | |||||
} | |||||
/** | |||||
* Resolve a file according to the base directory of the project | |||||
* associated with this context | |||||
* | |||||
* @param fileName the file name to be resolved. | |||||
* @return the file resolved to the project's base dir | |||||
* @exception AntException if the file cannot be resolved | |||||
*/ | |||||
public File resolveFile(String fileName) throws AntException { | |||||
URL baseURL = executionFrame.getBaseURL(); | |||||
if (!baseURL.getProtocol().equals("file")) { | |||||
throw new ExecutionException("Cannot resolve name " + fileName | |||||
+ " to a file because the project basedir is not a file: " | |||||
+ baseURL); | |||||
} | |||||
return fileUtils.resolveFile(fileUtils.normalize(baseURL.getFile()), | |||||
fileName); | |||||
} | |||||
} | |||||
@@ -0,0 +1,136 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.antcore.execution; | |||||
import org.apache.ant.common.util.AntException; | |||||
import org.apache.ant.common.util.Location; | |||||
/** | |||||
* An ExecutionException indicates a problem while executing tasks in a | |||||
* build | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 20 January 2002 | |||||
*/ | |||||
public class ExecutionException extends AntException { | |||||
/** | |||||
* Constructs an exception with the given descriptive message. | |||||
* | |||||
* @param msg Description of or information about the exception. | |||||
*/ | |||||
public ExecutionException(String msg) { | |||||
super(msg); | |||||
} | |||||
/** | |||||
* 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 ExecutionException(String msg, Location location) { | |||||
super(msg, location); | |||||
} | |||||
/** | |||||
* Constructs an exception with the given message and exception as a | |||||
* root cause. | |||||
* | |||||
* @param msg Description of or information about the exception. | |||||
* @param cause Throwable that might have cause this one. | |||||
*/ | |||||
public ExecutionException(String msg, Throwable cause) { | |||||
super(msg, 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 ExecutionException(String msg, Throwable cause, Location location) { | |||||
super(msg, cause, location); | |||||
} | |||||
/** | |||||
* Constructs an exception with the given exception as a root cause. | |||||
* | |||||
* @param cause Exception that might have caused this one. | |||||
*/ | |||||
public ExecutionException(Throwable cause) { | |||||
super(cause); | |||||
} | |||||
/** | |||||
* Constructs an exception with the given exception as a root cause and | |||||
* a location in a file. | |||||
* | |||||
* @param cause Exception that might have cause this one. | |||||
* @param location Location in the project file where the error occured. | |||||
*/ | |||||
public ExecutionException(Throwable cause, Location location) { | |||||
super(cause, location); | |||||
} | |||||
} | |||||
@@ -0,0 +1,417 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.antcore.execution; | |||||
import java.io.File; | |||||
import java.io.FileNotFoundException; | |||||
import java.net.MalformedURLException; | |||||
import java.net.URL; | |||||
import java.util.ArrayList; | |||||
import java.util.HashMap; | |||||
import java.util.HashSet; | |||||
import java.util.Iterator; | |||||
import java.util.List; | |||||
import java.util.Map; | |||||
import java.util.Set; | |||||
import org.apache.ant.common.util.AntException; | |||||
import org.apache.ant.antcore.antlib.AntLibHandler; | |||||
import org.apache.ant.antcore.antlib.AntLibrary; | |||||
import org.apache.ant.antcore.antlib.AntLibrarySpec; | |||||
import org.apache.ant.antcore.config.AntConfig; | |||||
import org.apache.ant.antcore.config.AntConfigHandler; | |||||
import org.apache.ant.antcore.event.BuildEventSupport; | |||||
import org.apache.ant.antcore.event.BuildListener; | |||||
import org.apache.ant.antcore.model.Project; | |||||
import org.apache.ant.antcore.util.CircularDependencyChecker; | |||||
import org.apache.ant.antcore.util.CircularDependencyException; | |||||
import org.apache.ant.antcore.util.ConfigException; | |||||
import org.apache.ant.antcore.xml.ParseContext; | |||||
import org.apache.ant.antcore.xml.XMLParseException; | |||||
import org.apache.ant.init.InitUtils; | |||||
import org.apache.ant.init.InitConfig; | |||||
import org.apache.ant.init.LoaderUtils; | |||||
/** | |||||
* The ExecutionManager is used to manage the execution of a build. The | |||||
* Execution manager is responsible for loading the Ant task libraries, | |||||
* creating ExecutionFrames for each project that is part of the build and | |||||
* then executing the tasks within those Execution Frames. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 12 January 2002 | |||||
*/ | |||||
public class ExecutionManager { | |||||
/** The AntLibraries built from Ant's Populated Task Libraries. */ | |||||
private Map antLibraries = new HashMap(); | |||||
/** BuildEvent support used to fire events and manage listeners */ | |||||
private BuildEventSupport eventSupport = new BuildEventSupport(); | |||||
/** The Execution Frame for the top level project being executed */ | |||||
private ExecutionFrame mainFrame; | |||||
/** | |||||
* Create an ExecutionManager. When an ExecutionManager is created, it | |||||
* loads the ant libraries which are installed in the Ant lib/task | |||||
* directory. | |||||
* | |||||
* @param initConfig Ant's configuration - classloaders etc | |||||
* @exception ConfigException if there is a problem with one of Ant's | |||||
* tasks | |||||
*/ | |||||
public ExecutionManager(InitConfig initConfig) | |||||
throws ConfigException { | |||||
Map librarySpecs = new HashMap(); | |||||
AntConfig userConfig = getAntConfig(initConfig.getUserConfigArea()); | |||||
AntConfig systemConfig = getAntConfig(initConfig.getSystemConfigArea()); | |||||
AntConfig config = systemConfig; | |||||
if (config == null) { | |||||
config = userConfig; | |||||
} else if (userConfig != null) { | |||||
config.merge(userConfig); | |||||
} | |||||
try { | |||||
// start by loading the task libraries | |||||
URL taskBaseURL = new URL(initConfig.getLibraryURL(), "antlibs"); | |||||
addAntLibraries(librarySpecs, taskBaseURL); | |||||
if (config != null) { | |||||
// Now add in any found in the dirs specified in | |||||
// the config files | |||||
for (Iterator i = config.getTaskDirLocations(); i.hasNext(); ) { | |||||
// try file first | |||||
String taskDirString = (String)i.next(); | |||||
File taskDir = new File(taskDirString); | |||||
if (!taskDir.exists()) { | |||||
URL taskDirURL = new URL(taskDirString); | |||||
addAntLibraries(librarySpecs, taskDirURL); | |||||
} else { | |||||
addAntLibraries(librarySpecs, | |||||
InitUtils.getFileURL(taskDir)); | |||||
} | |||||
} | |||||
} | |||||
configLibraries(initConfig, librarySpecs); | |||||
if (config != null) { | |||||
// now add any additional library Paths specified by the config | |||||
for (Iterator i = config.getLibraryIds(); i.hasNext(); ) { | |||||
String libraryId = (String)i.next(); | |||||
if (antLibraries.containsKey(libraryId)) { | |||||
AntLibrary antLib | |||||
= (AntLibrary)antLibraries.get(libraryId); | |||||
List pathList = config.getLibraryPathList(libraryId); | |||||
for (Iterator j = pathList.iterator(); j.hasNext(); ) { | |||||
URL pathElementURL = (URL)j.next(); | |||||
antLib.addLibraryURL(pathElementURL); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
mainFrame = new ExecutionFrame(antLibraries); | |||||
} catch (MalformedURLException e) { | |||||
throw new ConfigException("Unable to load Ant libraries", e); | |||||
} | |||||
} | |||||
/** | |||||
* Run a build, executing each of the targets on the given project | |||||
* | |||||
* @param project The project model on which to run the build | |||||
* @param targets The list of target names | |||||
*/ | |||||
public void runBuild(Project project, List targets) { | |||||
Throwable buildFailureCause = null; | |||||
try { | |||||
// start by validating the project we have been given. | |||||
project.validate(null); | |||||
mainFrame.setProject(project); | |||||
eventSupport.fireBuildStarted(project); | |||||
mainFrame.runBuild(targets); | |||||
} catch (RuntimeException e) { | |||||
buildFailureCause = e; | |||||
throw e; | |||||
} catch (AntException e) { | |||||
buildFailureCause = e; | |||||
} finally { | |||||
eventSupport.fireBuildFinished(project, buildFailureCause); | |||||
} | |||||
} | |||||
/** | |||||
* Add a build listener to the build | |||||
* | |||||
* @param listener the listener to be added to the build | |||||
*/ | |||||
public void addBuildListener(BuildListener listener) { | |||||
eventSupport.addBuildListener(listener); | |||||
mainFrame.addBuildListener(listener); | |||||
} | |||||
/** | |||||
* Remove a build listener from the execution | |||||
* | |||||
* @param listener the listener to be removed | |||||
*/ | |||||
public void removeBuildListener(BuildListener listener) { | |||||
eventSupport.removeBuildListener(listener); | |||||
mainFrame.removeBuildListener(listener); | |||||
} | |||||
/** | |||||
* Get the AntConfig from the given config area if it is available | |||||
* | |||||
* @param configArea the config area from which the config may be read | |||||
* @return the AntConfig instance representing the config info read in | |||||
* from the config area. May be null if the AntConfig is not | |||||
* present | |||||
* @exception ConfigException if the URL for the config file cannotbe | |||||
* formed. | |||||
*/ | |||||
private AntConfig getAntConfig(URL configArea) throws ConfigException { | |||||
try { | |||||
URL configFileURL = new URL(configArea, "antconfig.xml"); | |||||
ParseContext context = new ParseContext(); | |||||
AntConfigHandler configHandler = new AntConfigHandler(); | |||||
context.parse(configFileURL, "antconfig", configHandler); | |||||
return configHandler.getAntConfig(); | |||||
} catch (MalformedURLException e) { | |||||
throw new ConfigException("Unable to form URL to read config from " | |||||
+ configArea, e); | |||||
} catch (XMLParseException e) { | |||||
if (!(e.getCause() instanceof FileNotFoundException)) { | |||||
throw new ConfigException("Unable to parse config file from " | |||||
+ configArea, e); | |||||
} | |||||
// ignore missing config files | |||||
return null; | |||||
} | |||||
} | |||||
/** | |||||
* Add all the Ant libraries that can be found at the given URL | |||||
* | |||||
* @param librarySpecs A map to which additional library specifications | |||||
* are added. | |||||
* @param taskBaseURL the URL from which Ant libraries are to be loaded | |||||
* @exception MalformedURLException if the URL for the individual | |||||
* library components cannot be formed | |||||
* @exception ConfigException if the library specs cannot be parsed | |||||
*/ | |||||
private void addAntLibraries(Map librarySpecs, URL taskBaseURL) | |||||
throws MalformedURLException, ConfigException { | |||||
URL[] taskURLs = LoaderUtils.getLoaderURLs(taskBaseURL, null, | |||||
new String[]{".tsk", ".jar", ".zip"}); | |||||
if (taskURLs == null) { | |||||
return; | |||||
} | |||||
// parse each task library to get its library definition | |||||
for (int i = 0; i < taskURLs.length; ++i) { | |||||
URL libURL = new URL("jar:" + taskURLs[i] | |||||
+ "!/META-INF/antlib.xml"); | |||||
try { | |||||
AntLibrarySpec antLibrarySpec = parseLibraryDef(libURL); | |||||
if (antLibrarySpec != null) { | |||||
String libraryId = antLibrarySpec.getLibraryId(); | |||||
if (librarySpecs.containsKey(libraryId)) { | |||||
throw new ConfigException("Found more than one " | |||||
+ "copy of library with id = " + libraryId + | |||||
" (" + taskURLs[i] + ")"); | |||||
} | |||||
antLibrarySpec.setLibraryURL(taskURLs[i]); | |||||
librarySpecs.put(libraryId, antLibrarySpec); | |||||
} | |||||
} catch (XMLParseException e) { | |||||
Throwable t = e.getCause(); | |||||
// ignore file not found exceptions - means the | |||||
// jar does not provide META-INF/antlib.xml | |||||
if (!(t instanceof FileNotFoundException)) { | |||||
throw new ConfigException("Unable to parse Ant library " | |||||
+ taskURLs[i], e); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* Configures the Ant Libraries. Configuration of an Ant Library | |||||
* involves resolving any dependencies between libraries and then | |||||
* creating the class loaders for the library | |||||
* | |||||
* @param initConfig the Ant initialized config | |||||
* @param librarySpecs the loaded specifications of the Ant libraries | |||||
* @exception ConfigException if a library cannot be configured from the | |||||
* given specification | |||||
*/ | |||||
private void configLibraries(InitConfig initConfig, Map librarySpecs) | |||||
throws ConfigException { | |||||
Set configured = new HashSet(); | |||||
CircularDependencyChecker configuring | |||||
= new CircularDependencyChecker("configuring Ant libraries"); | |||||
for (Iterator i = librarySpecs.keySet().iterator(); i.hasNext(); ) { | |||||
String libraryId = (String)i.next(); | |||||
if (!configured.contains(libraryId)) { | |||||
configLibrary(initConfig, librarySpecs, libraryId, | |||||
configured, configuring); | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* Configure a library from a specification and the Ant init config. | |||||
* | |||||
* @param initConfig Ant's init config passed in from the front end. | |||||
* @param librarySpecs the library specs from which this library is to | |||||
* be configured. | |||||
* @param libraryId the global identifier for the library | |||||
* @param configured the set of libraries which have been configured | |||||
* already | |||||
* @param configuring A circualr dependency chcker for library | |||||
* dependencies. | |||||
* @exception ConfigException if the library cannot be configured. | |||||
*/ | |||||
private void configLibrary(InitConfig initConfig, Map librarySpecs, | |||||
String libraryId, Set configured, | |||||
CircularDependencyChecker configuring) | |||||
throws ConfigException { | |||||
try { | |||||
configuring.visitNode(libraryId); | |||||
AntLibrarySpec librarySpec | |||||
= (AntLibrarySpec)librarySpecs.get(libraryId); | |||||
String extendsId = librarySpec.getExtendsLibraryId(); | |||||
if (extendsId != null) { | |||||
if (!configured.contains(extendsId)) { | |||||
if (!librarySpecs.containsKey(extendsId)) { | |||||
throw new ConfigException("Could not find library, " | |||||
+ extendsId + ", upon which library " | |||||
+ libraryId + " depends"); | |||||
} | |||||
configLibrary(initConfig, librarySpecs, extendsId, | |||||
configured, configuring); | |||||
} | |||||
} | |||||
// now create the library for the specification | |||||
AntLibrary antLibrary = new AntLibrary(librarySpec); | |||||
// determine the URLs required for this task. These are the | |||||
// task URL itself, the XML parser URLs if required, the | |||||
// tools jar URL if required | |||||
List urlsList = new ArrayList(); | |||||
if (librarySpec.getLibraryURL() != null) { | |||||
urlsList.add(librarySpec.getLibraryURL()); | |||||
} | |||||
if (librarySpec.isToolsJarRequired() | |||||
&& initConfig.getToolsJarURL() != null) { | |||||
urlsList.add(initConfig.getToolsJarURL()); | |||||
} | |||||
URL[] parserURLs = initConfig.getParserURLs(); | |||||
if (librarySpec.usesAntXML()) { | |||||
for (int i = 0; i < parserURLs.length; ++i) { | |||||
urlsList.add(parserURLs[i]); | |||||
} | |||||
} | |||||
for (Iterator i = urlsList.iterator(); i.hasNext(); ) { | |||||
antLibrary.addLibraryURL((URL)i.next()); | |||||
} | |||||
if (extendsId != null) { | |||||
AntLibrary extendsLibrary | |||||
= (AntLibrary)antLibraries.get(extendsId); | |||||
antLibrary.setExtendsLibrary(extendsLibrary); | |||||
} | |||||
antLibrary.setParentLoader(initConfig.getCommonLoader()); | |||||
antLibraries.put(libraryId, antLibrary); | |||||
configuring.leaveNode(libraryId); | |||||
} catch (CircularDependencyException e) { | |||||
throw new ConfigException(e); | |||||
} | |||||
} | |||||
/** | |||||
* Read an Ant library definition from a URL | |||||
* | |||||
* @param antlibURL the URL of the library definition | |||||
* @return the AntLibrary specification read from the library XML | |||||
* definition | |||||
* @exception XMLParseException if the library cannot be parsed | |||||
*/ | |||||
private AntLibrarySpec parseLibraryDef(URL antlibURL) | |||||
throws XMLParseException { | |||||
ParseContext context = new ParseContext(); | |||||
AntLibHandler libHandler = new AntLibHandler(); | |||||
context.parse(antlibURL, "antlib", libHandler); | |||||
return libHandler.getAntLibrarySpec(); | |||||
} | |||||
} | |||||
@@ -0,0 +1,344 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.antcore.execution; | |||||
import java.lang.reflect.Constructor; | |||||
import java.lang.reflect.InvocationTargetException; | |||||
import java.lang.reflect.Method; | |||||
import java.util.HashMap; | |||||
import java.util.Map; | |||||
import org.apache.ant.common.converter.ConversionException; | |||||
import org.apache.ant.common.converter.Converter; | |||||
import org.apache.ant.common.task.TaskException; | |||||
/** | |||||
* A reflector is used to set attributes and add nested elements to an | |||||
* instance of an object using reflection. It is the result of class | |||||
* introspection. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 19 January 2002 | |||||
*/ | |||||
public class Reflector { | |||||
/** | |||||
* AttributeSetter classes are created at introspection time for each | |||||
* setter method a class provides and for which a conversion from a | |||||
* String value is available. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 19 January 2002 | |||||
*/ | |||||
private interface AttributeSetter { | |||||
/** | |||||
* Set the attribute value on an object | |||||
* | |||||
* @param obj the object on which the set method is to be invoked | |||||
* @param value the string representation of the value | |||||
* @exception InvocationTargetException if the method cannot be | |||||
* invoked | |||||
* @exception IllegalAccessException if the method cannot be invoked | |||||
* @exception ExecutionException if the conversion of the value | |||||
* fails | |||||
* @exception ConversionException if the string value cannot be | |||||
* converted to the required type | |||||
*/ | |||||
void set(Object obj, String value) | |||||
throws InvocationTargetException, IllegalAccessException, | |||||
ExecutionException, ConversionException; | |||||
} | |||||
/** | |||||
* An element adder is used to add an instance of an element to an of an | |||||
* object. The object being added will have been fully configured by Ant | |||||
* prior to calling this method. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 19 January 2002 | |||||
*/ | |||||
private interface ElementAdder { | |||||
/** | |||||
* Add an object to the this container object | |||||
* | |||||
* @param container the object to which the element is the be added | |||||
* @param obj an instance of the nested element | |||||
* @exception InvocationTargetException if the method cannot be | |||||
* invoked | |||||
* @exception IllegalAccessException if the method cannot be invoked | |||||
*/ | |||||
void add(Object container, Object obj) | |||||
throws InvocationTargetException, IllegalAccessException; | |||||
} | |||||
/** The method used to add content to the element */ | |||||
private Method addTextMethod; | |||||
/** the list of attribute setters indexed by their property name */ | |||||
private Map attributeSetters = new HashMap(); | |||||
/** | |||||
* A list of the Java class or interface accetpted by each element adder | |||||
* indexed by the element name | |||||
*/ | |||||
private Map elementTypes = new HashMap(); | |||||
/** the list of element adders indexed by their element names */ | |||||
private Map elementAdders = new HashMap(); | |||||
/** | |||||
* Set an attribute value on an object | |||||
* | |||||
* @param obj the object on which the value is being set | |||||
* @param attributeName the name of the attribute | |||||
* @param value the string represenation of the attribute's value | |||||
* @exception ExecutionException if the object does not support the | |||||
* attribute | |||||
* @exception TaskException if the object has a problem setting the | |||||
* value | |||||
*/ | |||||
public void setAttribute(Object obj, String attributeName, | |||||
String value) | |||||
throws ExecutionException, TaskException { | |||||
AttributeSetter as | |||||
= (AttributeSetter)attributeSetters.get(attributeName); | |||||
if (as == null) { | |||||
throw new ExecutionException("Class " + obj.getClass().getName() + | |||||
" doesn't support the \"" + attributeName + "\" attribute"); | |||||
} | |||||
try { | |||||
as.set(obj, value); | |||||
} catch (IllegalAccessException e) { | |||||
// impossible as getMethods should only return public methods | |||||
throw new ExecutionException(e); | |||||
} catch (ConversionException e) { | |||||
throw new ExecutionException(e); | |||||
} catch (InvocationTargetException ite) { | |||||
Throwable t = ite.getTargetException(); | |||||
if (t instanceof TaskException) { | |||||
throw (TaskException)t; | |||||
} | |||||
throw new ExecutionException(t); | |||||
} | |||||
} | |||||
/** | |||||
* Set the method used to add content to the element | |||||
* | |||||
* @param addTextMethod the new addTextMethod value | |||||
*/ | |||||
public void setAddTextMethod(Method addTextMethod) { | |||||
this.addTextMethod = addTextMethod; | |||||
} | |||||
/** | |||||
* Get the type of the given nested element | |||||
* | |||||
* @param elementName the nested element whose type is desired | |||||
* @return the class instance representing the type of the element adder | |||||
*/ | |||||
public Class getType(String elementName) { | |||||
return (Class)elementTypes.get(elementName); | |||||
} | |||||
/** | |||||
* Adds PCDATA to the element | |||||
* | |||||
* @param obj the instance whose content is being provided | |||||
* @param text the required content | |||||
* @exception ExecutionException if the object does not support content | |||||
* @exception TaskException if the object has a problem setting the | |||||
* content | |||||
*/ | |||||
public void addText(Object obj, String text) | |||||
throws ExecutionException, TaskException { | |||||
if (addTextMethod == null) { | |||||
throw new ExecutionException("Class " + obj.getClass().getName() + | |||||
" doesn't support content"); | |||||
} | |||||
try { | |||||
addTextMethod.invoke(obj, new String[]{text}); | |||||
} catch (IllegalAccessException ie) { | |||||
// impossible as getMethods should only return public methods | |||||
throw new ExecutionException(ie); | |||||
} catch (InvocationTargetException ite) { | |||||
Throwable t = ite.getTargetException(); | |||||
if (t instanceof TaskException) { | |||||
throw (TaskException)t; | |||||
} | |||||
throw new ExecutionException(t); | |||||
} | |||||
} | |||||
/** | |||||
* Add an element to the given object | |||||
* | |||||
* @param obj The object to which the element is being added | |||||
* @param elementName the name of the element | |||||
* @param value the object to be added - the nested element | |||||
* @exception ExecutionException if the object does not support content | |||||
* @exception TaskException if the object has a problem setting the | |||||
* content | |||||
*/ | |||||
public void addElement(Object obj, String elementName, Object value) | |||||
throws ExecutionException, TaskException { | |||||
ElementAdder ea = (ElementAdder)elementAdders.get(elementName); | |||||
if (ea == null) { | |||||
throw new ExecutionException("Class " + obj.getClass().getName() + | |||||
" doesn't support the \"" + elementName + "\" nested element"); | |||||
} | |||||
try { | |||||
ea.add(obj, value); | |||||
} catch (IllegalAccessException ie) { | |||||
// impossible as getMethods should only return public methods | |||||
throw new ExecutionException(ie); | |||||
} catch (InvocationTargetException ite) { | |||||
Throwable t = ite.getTargetException(); | |||||
if (t instanceof TaskException) { | |||||
throw (TaskException)t; | |||||
} | |||||
throw new ExecutionException(t); | |||||
} | |||||
} | |||||
/** | |||||
* Determine if the class associated with this reflector supports a | |||||
* particular nested element | |||||
* | |||||
* @param elementName the name of the element | |||||
* @return true if the class supports addition of that element | |||||
*/ | |||||
public boolean supportsNestedElement(String elementName) { | |||||
return elementAdders.containsKey(elementName); | |||||
} | |||||
/** | |||||
* Add a method to the reflector for setting an attribute value | |||||
* | |||||
* @param m the method, obtained by introspection. | |||||
* @param propertyName the property name the method will set. | |||||
* @param converters A map of converter classes used to convert strings | |||||
* to different types. | |||||
*/ | |||||
public void addAttributeMethod(final Method m, String propertyName, | |||||
Map converters) { | |||||
final Class type = m.getParameterTypes()[0]; | |||||
if (converters != null && converters.containsKey(type)) { | |||||
// we have a converter to use to convert the String | |||||
// value into something the set method expects. | |||||
final Converter converter = (Converter)converters.get(type); | |||||
attributeSetters.put(propertyName, | |||||
new AttributeSetter() { | |||||
public void set(Object obj, String value) | |||||
throws InvocationTargetException, ExecutionException, | |||||
IllegalAccessException, ConversionException { | |||||
Object convertedValue = converter.convert(value, type); | |||||
m.invoke(obj, new Object[]{convertedValue}); | |||||
} | |||||
}); | |||||
} else if (type.equals(String.class)) { | |||||
attributeSetters.put(propertyName, | |||||
new AttributeSetter() { | |||||
public void set(Object parent, String value) | |||||
throws InvocationTargetException, | |||||
IllegalAccessException { | |||||
m.invoke(parent, new String[]{value}); | |||||
} | |||||
}); | |||||
} else { | |||||
try { | |||||
final Constructor c = | |||||
type.getConstructor(new Class[]{java.lang.String.class}); | |||||
attributeSetters.put(propertyName, | |||||
new AttributeSetter() { | |||||
public void set(Object parent, String value) | |||||
throws InvocationTargetException, | |||||
IllegalAccessException, ExecutionException { | |||||
try { | |||||
Object newValue | |||||
= c.newInstance(new String[]{value}); | |||||
m.invoke(parent, new Object[]{newValue}); | |||||
} catch (InstantiationException ie) { | |||||
throw new ExecutionException(ie); | |||||
} | |||||
} | |||||
}); | |||||
} catch (NoSuchMethodException nme) { | |||||
// ignore | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* Add an element adder method to the list of element adders in the | |||||
* reflector | |||||
* | |||||
* @param m the adder method | |||||
* @param elementName The name of the element for which this adder works | |||||
*/ | |||||
public void addElementMethod(final Method m, String elementName) { | |||||
final Class type = m.getParameterTypes()[0]; | |||||
elementTypes.put(elementName, type); | |||||
elementAdders.put(elementName, | |||||
new ElementAdder() { | |||||
public void add(Object container, Object obj) | |||||
throws InvocationTargetException, IllegalAccessException { | |||||
m.invoke(container, new Object[]{obj}); | |||||
} | |||||
}); | |||||
} | |||||
} | |||||
@@ -0,0 +1,114 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.antcore.execution; | |||||
import java.lang.reflect.Method; | |||||
import org.apache.ant.common.task.AbstractTask; | |||||
import org.apache.ant.common.task.TaskException; | |||||
/** | |||||
* Use introspection to "adapt" an arbitrary Bean (not extending Task, but | |||||
* with similar patterns). | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 16 January 2002 | |||||
*/ | |||||
public class TaskAdapter extends AbstractTask { | |||||
/** The real object that is performing the work */ | |||||
private Object worker; | |||||
/** the execute method of the real object */ | |||||
private Method executeMethod = null; | |||||
/** | |||||
* Create an adapter for an arbitraty bean | |||||
* | |||||
* @param taskType the name of the task | |||||
* @param worker an instance of the actual object that does the work | |||||
* @exception ExecutionException if the worker object does not support | |||||
* an execute method | |||||
*/ | |||||
public TaskAdapter(String taskType, Object worker) | |||||
throws ExecutionException { | |||||
this.worker = worker; | |||||
try { | |||||
Class workerClass = worker.getClass(); | |||||
executeMethod = workerClass.getMethod("execute", new Class[0]); | |||||
if (executeMethod == null) { | |||||
throw new ExecutionException("No execute method in the class" | |||||
+ " for the <" + taskType + "> task."); | |||||
} | |||||
} catch (NoSuchMethodException e) { | |||||
throw new ExecutionException(e); | |||||
} | |||||
} | |||||
/** | |||||
* Standard Task execute method. This invokes the execute method of the | |||||
* worker instance | |||||
* | |||||
* @exception TaskException if there is an exception in the | |||||
* worker's execute method | |||||
*/ | |||||
public void execute() throws TaskException { | |||||
try { | |||||
executeMethod.invoke(worker, null); | |||||
} catch (Exception ex) { | |||||
throw new TaskException(ex); | |||||
} | |||||
} | |||||
} | |||||
@@ -0,0 +1,127 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.antcore.execution; | |||||
import org.apache.ant.common.task.Task; | |||||
import org.apache.ant.common.task.TaskException; | |||||
import org.apache.ant.antcore.model.ModelElement; | |||||
/** | |||||
* This is the core's implementation of the AntContext for Tasks. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 17 January 2002 | |||||
*/ | |||||
public class TaskContext extends ExecutionContext { | |||||
/** The task being managed by this context */ | |||||
private Task task; | |||||
/** | |||||
* the loader used to load this task. Note that this is not necessarily | |||||
* the loader which is used to load the Task class as loading may have | |||||
* been delegated to a parent loader. | |||||
*/ | |||||
private ClassLoader loader; | |||||
/** | |||||
* Get the task associated with this context | |||||
* | |||||
* @return the task instance | |||||
*/ | |||||
public Task getTask() { | |||||
return task; | |||||
} | |||||
/** | |||||
* Gets the loader for this task | |||||
* | |||||
* @return the task's loader | |||||
*/ | |||||
public ClassLoader getLoader() { | |||||
return loader; | |||||
} | |||||
/** | |||||
* Associate a task with this context | |||||
* | |||||
* @param task the task to be manager | |||||
* @param loader the classloader | |||||
* @param modelElement the model element associated with this context | |||||
*/ | |||||
public void init(ClassLoader loader, Task task, ModelElement modelElement) { | |||||
this.task = task; | |||||
this.loader = loader; | |||||
setModelElement(modelElement); | |||||
task.init(this); | |||||
} | |||||
/** | |||||
* execute this context's task | |||||
* | |||||
* @exception TaskException if the task cannot execute properly | |||||
*/ | |||||
public void execute() throws TaskException { | |||||
task.execute(); | |||||
} | |||||
/** | |||||
* Destroy this context. The context can be reused for another task | |||||
* after this one | |||||
*/ | |||||
public void destroy() { | |||||
task.destroy(); | |||||
task = null; | |||||
loader = null; | |||||
} | |||||
} | |||||
@@ -0,0 +1,91 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.antcore.execution; | |||||
import org.apache.ant.common.task.DataType; | |||||
import org.apache.ant.antcore.model.ModelElement; | |||||
/** | |||||
* This is the core's implementation of the AntContext for Types | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 20 January 2002 | |||||
*/ | |||||
public class TypeContext extends ExecutionContext { | |||||
/** The task being managed by this context */ | |||||
private DataType typeInstance; | |||||
/** | |||||
* get the DataType instance associated with this context. | |||||
* | |||||
* @return the DataType instance | |||||
*/ | |||||
public DataType getInstance() { | |||||
return typeInstance; | |||||
} | |||||
/** | |||||
* Initilaise the context and associate it with the given DataType | |||||
* instance | |||||
* | |||||
* @param typeInstance the DataType instance | |||||
* @param modelElement the model element associated with this context | |||||
*/ | |||||
public void init(DataType typeInstance, ModelElement modelElement) { | |||||
this.typeInstance = typeInstance; | |||||
setModelElement(modelElement); | |||||
typeInstance.init(this); | |||||
} | |||||
} | |||||
@@ -0,0 +1,170 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.antcore.model; | |||||
import java.util.ArrayList; | |||||
import java.util.HashMap; | |||||
import java.util.Iterator; | |||||
import java.util.List; | |||||
import java.util.Map; | |||||
import org.apache.ant.common.util.Location; | |||||
/** | |||||
* A BuildElement is a holder configuration information for an element of | |||||
* the build. BuildElements may be grouped into a hierarchy to capture any | |||||
* level of element nesting. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 20 January 2002 | |||||
*/ | |||||
public class BuildElement extends ModelElement { | |||||
/** The attributes of this build element */ | |||||
private Map attributes = new HashMap(); | |||||
/** The element's name or type */ | |||||
private String type; | |||||
/** The nested task elements that make up this task element. */ | |||||
private List nestedElements = new ArrayList(); | |||||
/** The content (text) of this element */ | |||||
private String text = ""; | |||||
/** | |||||
* Create a Build Element of the given type | |||||
* | |||||
* @param location the location of the element | |||||
* @param type the element's type | |||||
*/ | |||||
public BuildElement(Location location, String type) { | |||||
super(location); | |||||
this.type = type; | |||||
} | |||||
/** | |||||
* Get the text of this element | |||||
* | |||||
* @return the elements's text. | |||||
*/ | |||||
public String getText() { | |||||
return text; | |||||
} | |||||
/** | |||||
* Get an iterator over this element's nested elements | |||||
* | |||||
* @return an iterator which provides BuildElement instances | |||||
*/ | |||||
public Iterator getNestedElements() { | |||||
return nestedElements.iterator(); | |||||
} | |||||
/** | |||||
* Get the type of this element | |||||
* | |||||
* @return the element's type | |||||
*/ | |||||
public String getType() { | |||||
return type; | |||||
} | |||||
/** | |||||
* Get an iterator over the elements's attributes | |||||
* | |||||
* @return an iterator which provide's attribute names | |||||
*/ | |||||
public Iterator getAttributeNames() { | |||||
return attributes.keySet().iterator(); | |||||
} | |||||
/** | |||||
* Get the value of an attribute. | |||||
* | |||||
* @param attributeName the name of the attribute | |||||
* @return the value of the attribute or null if there is no such | |||||
* attribute. | |||||
*/ | |||||
public String getAttributeValue(String attributeName) { | |||||
return (String)attributes.get(attributeName); | |||||
} | |||||
/** | |||||
* Add text to this element. | |||||
* | |||||
* @param text the element text to add. | |||||
*/ | |||||
public void addText(String text) { | |||||
this.text += text; | |||||
} | |||||
/** | |||||
* Add a nested element to this element | |||||
* | |||||
* @param nestedElement the build element to be added. | |||||
*/ | |||||
public void addNestedElement(BuildElement nestedElement) { | |||||
nestedElements.add(nestedElement); | |||||
} | |||||
/** | |||||
* Add an attribute to this element | |||||
* | |||||
* @param attributeName the name of the attribute | |||||
* @param attributeValue the attribute's value. | |||||
*/ | |||||
public void addAttribute(String attributeName, String attributeValue) { | |||||
attributes.put(attributeName, attributeValue); | |||||
} | |||||
} | |||||
@@ -0,0 +1,176 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.antcore.model; | |||||
import java.util.HashMap; | |||||
import java.util.Iterator; | |||||
import java.util.Map; | |||||
import org.apache.ant.common.util.Location; | |||||
/** | |||||
* A ModelElement is an element of a build model. A location may be | |||||
* associated with the model element for error reporting and debugging | |||||
* purposes. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 11 January 2002 | |||||
*/ | |||||
public abstract class ModelElement { | |||||
/** The aspects defined for this element. */ | |||||
private Map aspectMaps; | |||||
/** The location of this element */ | |||||
private Location location; | |||||
/** A comment associated with this element, if any */ | |||||
private String comment; | |||||
/** | |||||
* Create a model element giving its location. | |||||
* | |||||
* @param location identifies where this element is defined | |||||
*/ | |||||
public ModelElement(Location location) { | |||||
this.location = location; | |||||
} | |||||
/** | |||||
* Set a comment associated with this element | |||||
* | |||||
* @param comment the comment to be associated with this element. | |||||
*/ | |||||
public void setComment(String comment) { | |||||
this.comment = comment; | |||||
} | |||||
/** | |||||
* Set the aspects of this element | |||||
* | |||||
* @param aspects a Map of apects that relate to this model element. | |||||
*/ | |||||
public void setAspects(Map aspects) { | |||||
aspectMaps = new HashMap(); | |||||
for (Iterator i = aspects.keySet().iterator(); i.hasNext(); ) { | |||||
String aspectName = (String)i.next(); | |||||
int separator = aspectName.indexOf(":"); | |||||
if (separator != -1) { | |||||
String prefix = aspectName.substring(0, separator); | |||||
String name = aspectName.substring(separator + 1); | |||||
if (prefix.length() != 0 && name.length() != 0) { | |||||
Map prefixMap = (Map)aspectMaps.get(prefix); | |||||
if (prefixMap == null) { | |||||
prefixMap = new HashMap(); | |||||
aspectMaps.put(prefix, prefixMap); | |||||
} | |||||
prefixMap.put(name, aspects.get(aspectName)); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* Get the location of the source where this element is defined | |||||
* | |||||
* @return the element's location | |||||
*/ | |||||
public Location getLocation() { | |||||
return location; | |||||
} | |||||
/** | |||||
* Get the comment associated with this element. | |||||
* | |||||
* @return the element's comment which may be null. | |||||
*/ | |||||
public String getComment() { | |||||
return comment; | |||||
} | |||||
/** | |||||
* Get an iterator on the aspects which have been given values on this | |||||
* element | |||||
* | |||||
* @return an iterator of Strings , being the aspects which have been | |||||
* given values on this element. | |||||
*/ | |||||
public Iterator getAspectNames() { | |||||
return aspectMaps.keySet().iterator(); | |||||
} | |||||
/** | |||||
* Get the set of attribute values related to the given aspect | |||||
* | |||||
* @param aspectPrefix the aspect identifier | |||||
* @return a map of the attribute values for the given aspect. | |||||
*/ | |||||
public Map getAspectAttributes(String aspectPrefix) { | |||||
return (Map)aspectMaps.get(aspectPrefix); | |||||
} | |||||
/** | |||||
* Get the value of a single aspect attribute | |||||
* | |||||
* @param aspectPrefix the prefix which identifies the aspectr | |||||
* @param keyName the attribute name | |||||
* @return the aspect value | |||||
*/ | |||||
public String getAspectValue(String aspectPrefix, String keyName) { | |||||
Map aspectAttributes = getAspectAttributes(aspectPrefix); | |||||
if (aspectAttributes == null) { | |||||
return null; | |||||
} | |||||
return (String)aspectAttributes.get(keyName); | |||||
} | |||||
} | |||||
@@ -0,0 +1,131 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.antcore.model; | |||||
import org.apache.ant.common.util.AntException; | |||||
import org.apache.ant.common.util.Location; | |||||
/** | |||||
* A model exception is thrown when an operation is attempted which would | |||||
* violate the integrity of the Project/Target/Task object model | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 16 January 2002 | |||||
*/ | |||||
public class ModelException extends AntException { | |||||
/** | |||||
* Constructs an exception with the given descriptive message. | |||||
* | |||||
* @param msg Description of or information about the exception. | |||||
*/ | |||||
public ModelException(String msg) { | |||||
super(msg); | |||||
} | |||||
/** | |||||
* 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 ModelException(String msg, Location location) { | |||||
super(msg, location); | |||||
} | |||||
/** | |||||
* Constructs an exception with the given message and exception as a | |||||
* root cause. | |||||
* | |||||
* @param msg Description of or information about the exception. | |||||
* @param cause Throwable that might have cause this one. | |||||
*/ | |||||
public ModelException(String msg, Throwable cause) { | |||||
super(msg, 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 ModelException(String msg, Throwable cause, | |||||
Location location) { | |||||
super(msg, cause, location); | |||||
} | |||||
/** | |||||
* Constructs an exception with the given exception as a root cause. | |||||
* | |||||
* @param cause Exception that might have caused this one. | |||||
*/ | |||||
public ModelException(Throwable cause) { | |||||
super(cause); | |||||
} | |||||
/** | |||||
* Constructs an exception with the given exception as a root cause and | |||||
* a location in a file. | |||||
* | |||||
* @param cause Exception that might have cause this one. | |||||
* @param location Location in the project file where the error occured. | |||||
*/ | |||||
public ModelException(Throwable cause, Location location) { | |||||
super(cause, location); | |||||
} | |||||
} | |||||
@@ -0,0 +1,520 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.antcore.model; | |||||
import java.net.URL; | |||||
import java.util.ArrayList; | |||||
import java.util.HashMap; | |||||
import java.util.HashSet; | |||||
import java.util.Iterator; | |||||
import java.util.List; | |||||
import java.util.Map; | |||||
import java.util.Set; | |||||
import java.util.StringTokenizer; | |||||
import org.apache.ant.common.util.Location; | |||||
import org.apache.ant.antcore.util.CircularDependencyChecker; | |||||
import org.apache.ant.antcore.util.CircularDependencyException; | |||||
import org.apache.ant.antcore.util.ConfigException; | |||||
/** | |||||
* A project is a collection of targets and global tasks. A project may | |||||
* reference objects in other projects using named references of the form | |||||
* refname:object | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 9 January 2002 | |||||
*/ | |||||
public class Project extends ModelElement { | |||||
/** | |||||
* The delimiter used to separate reference names in target names, data | |||||
* values, etc | |||||
*/ | |||||
public final static String REF_DELIMITER = ":"; | |||||
/** The default target in this project. */ | |||||
private String defaultTarget = null; | |||||
/** | |||||
* The base URL of this project. Relative locations are relative to this | |||||
* base. | |||||
*/ | |||||
private String base; | |||||
/** | |||||
* The name of this project when referenced by a script within this | |||||
* project. | |||||
*/ | |||||
private String name; | |||||
/** | |||||
* These are the targets which belong to the project. They will have | |||||
* interdependencies which are used to determine which targets need to | |||||
* be executed before a given target. | |||||
*/ | |||||
private Map targets = new HashMap(); | |||||
/** | |||||
* The global tasks for this project. These are the tasks that will get | |||||
* executed whenever an execution context is associated with this | |||||
* project. | |||||
*/ | |||||
private List tasks = new ArrayList(); | |||||
/** | |||||
* The projects referenced into this project. Each referenced project is | |||||
* given a name which is used to identify access to that project's | |||||
* elements. | |||||
*/ | |||||
private Map referencedProjects = new HashMap(); | |||||
/** The URL where the project is defined. */ | |||||
private URL sourceURL; | |||||
/** | |||||
* Create a Project | |||||
* | |||||
* @param sourceURL the URL where the project is defined. | |||||
* @param location the location of this element within the source. | |||||
*/ | |||||
public Project(URL sourceURL, Location location) { | |||||
super(location); | |||||
this.sourceURL = sourceURL; | |||||
} | |||||
/** | |||||
* Set the defautl target of this project. | |||||
* | |||||
* @param defaultTarget the name of the defaultTarget of this project. | |||||
*/ | |||||
public void setDefaultTarget(String defaultTarget) { | |||||
this.defaultTarget = defaultTarget; | |||||
} | |||||
/** | |||||
* Set the base URL for this project. | |||||
* | |||||
* @param base the baseURL for this project. | |||||
*/ | |||||
public void setBase(String base) { | |||||
this.base = base; | |||||
} | |||||
/** | |||||
* Set the name of this project. | |||||
* | |||||
* @param name the name for this project. | |||||
*/ | |||||
public void setName(String name) { | |||||
this.name = name; | |||||
} | |||||
/** | |||||
* Get the URL where this project is defined | |||||
* | |||||
* @return the project source URL | |||||
*/ | |||||
public URL getSourceURL() { | |||||
return sourceURL; | |||||
} | |||||
/** | |||||
* Get the Project's default Target, if any | |||||
* | |||||
* @return the project's defautl target or null if there is no default. | |||||
*/ | |||||
public String getDefaultTarget() { | |||||
return defaultTarget; | |||||
} | |||||
/** | |||||
* Get the base URL for this project. | |||||
* | |||||
* @return the baseURL for this project as a string. | |||||
*/ | |||||
public String getBase() { | |||||
return base; | |||||
} | |||||
/** | |||||
* Get the targets in this project. | |||||
* | |||||
* @return an iterator returning Target objects. | |||||
*/ | |||||
public Iterator getTargets() { | |||||
return targets.values().iterator(); | |||||
} | |||||
/** | |||||
* Get the target with the given name | |||||
* | |||||
* @param targetName the name of the desired target. | |||||
* @return the target with the given name or null if there is no such | |||||
* target. | |||||
*/ | |||||
public Target getTarget(String targetName) { | |||||
return (Target)targets.get(targetName); | |||||
} | |||||
/** | |||||
* Get the names of the referenced projects. | |||||
* | |||||
* @return an iterator which returns the name sof the referenced | |||||
* projects. | |||||
*/ | |||||
public Iterator getReferencedProjectNames() { | |||||
return referencedProjects.keySet().iterator(); | |||||
} | |||||
/** | |||||
* Get a referenced project by name | |||||
* | |||||
* @param alias the name under which the project was referenced. | |||||
* @return the project asscociated with the given reference alias or | |||||
* null if there is no such project. | |||||
*/ | |||||
public Project getReferencedProject(String alias) { | |||||
return (Project)referencedProjects.get(alias); | |||||
} | |||||
/** | |||||
* Get the initialisation tasks for this project | |||||
* | |||||
* @return an iterator over the set of tasks for this project. | |||||
*/ | |||||
public Iterator getTasks() { | |||||
return tasks.iterator(); | |||||
} | |||||
/** | |||||
* Get a target by its reference name - references may span multiple | |||||
* references. | |||||
* | |||||
* @param fullTargetName The name of the target relative to this project | |||||
* @return the Target object with the given name | |||||
*/ | |||||
public Target getRefTarget(String fullTargetName) { | |||||
Project containingProject = getRefProject(fullTargetName); | |||||
if (containingProject == this) { | |||||
return getTarget(fullTargetName); | |||||
} | |||||
int index = fullTargetName.lastIndexOf(REF_DELIMITER); | |||||
String targetName | |||||
= fullTargetName.substring(index + REF_DELIMITER.length()); | |||||
return containingProject.getTarget(targetName); | |||||
} | |||||
/** | |||||
* Get the project which directly contains the target specified by its | |||||
* full name. | |||||
* | |||||
* @param fullTargetName the full name of the target for which the | |||||
* containing project is required. | |||||
* @return The RefProject value | |||||
*/ | |||||
public Project getRefProject(String fullTargetName) { | |||||
int index = fullTargetName.lastIndexOf(REF_DELIMITER); | |||||
if (index == -1) { | |||||
return this; | |||||
} | |||||
Project currentProject = this; | |||||
String relativeName = fullTargetName.substring(0, index); | |||||
StringTokenizer tokenizer | |||||
= new StringTokenizer(relativeName, REF_DELIMITER); | |||||
while (tokenizer.hasMoreTokens()) { | |||||
String refName = tokenizer.nextToken(); | |||||
currentProject = currentProject.getReferencedProject(refName); | |||||
if (currentProject == null) { | |||||
return null; | |||||
} | |||||
} | |||||
return currentProject; | |||||
} | |||||
/** | |||||
* get the list of dependent targets which must be evaluated for the | |||||
* given target. | |||||
* | |||||
* @param fullTargetName the full name (in reference space) of the | |||||
* target | |||||
* @return the flattened list of targets | |||||
* @exception ConfigException if the given target could not be found | |||||
*/ | |||||
public List getTargetDependencies(String fullTargetName) | |||||
throws ConfigException { | |||||
try { | |||||
List flattenedList = new ArrayList(); | |||||
flattenDependency(flattenedList, fullTargetName); | |||||
flattenedList.add(fullTargetName); | |||||
return flattenedList; | |||||
} catch (ConfigException e) { | |||||
throw new ConfigException(fullTargetName | |||||
+ " does not exist in project"); | |||||
} | |||||
} | |||||
/** | |||||
* Add a target to the project. | |||||
* | |||||
* @param target the Target to be added | |||||
* @throws ModelException if a target with the same name already exists. | |||||
*/ | |||||
public void addTarget(Target target) throws ModelException { | |||||
if (targets.containsKey(target.getName())) { | |||||
throw new ModelException("A target with name '" | |||||
+ target.getName() + | |||||
"' has already been defined in this project", | |||||
target.getLocation()); | |||||
} | |||||
targets.put(target.getName(), target); | |||||
} | |||||
/** | |||||
* Add a task to the list of global tasks for this project. | |||||
* | |||||
* @param task a task to be executed when an execution context is | |||||
* associated with the Project (a non-target task) | |||||
*/ | |||||
public void addTask(BuildElement task) { | |||||
tasks.add(task); | |||||
} | |||||
/** | |||||
* Reference a project using the given name. | |||||
* | |||||
* @param referenceName the name under which the project will be | |||||
* referenced. | |||||
* @param project the referenced project. | |||||
* @throws ModelException if an existing project has already been | |||||
* referenced with that name. | |||||
*/ | |||||
public void referenceProject(String referenceName, Project project) | |||||
throws ModelException { | |||||
if (referencedProjects.containsKey(referenceName)) { | |||||
throw new ModelException("A project has already been " | |||||
+ "introduced with name '" + referenceName + "'"); | |||||
} | |||||
referencedProjects.put(referenceName, project); | |||||
} | |||||
/** | |||||
* Validate that this build element is configured correctly | |||||
* | |||||
* @param globalName The name of this project in the reference name | |||||
* space | |||||
* @exception ModelException if the element is invalid | |||||
*/ | |||||
public void validate(String globalName) throws ModelException { | |||||
if (defaultTarget == null) { | |||||
throw new ModelException("Project must have a default " | |||||
+ "attribute", getLocation()); | |||||
} | |||||
Set keys = referencedProjects.keySet(); | |||||
for (Iterator i = keys.iterator(); i.hasNext(); ) { | |||||
String refName = (String)i.next(); | |||||
Project referencedProject | |||||
= (Project)referencedProjects.get(refName); | |||||
String refGlobalName = refName; | |||||
if (globalName != null) { | |||||
refGlobalName = globalName + REF_DELIMITER + refName; | |||||
} | |||||
referencedProject.validate(refGlobalName); | |||||
} | |||||
// we now check whether all of dependencies for our targets | |||||
// exist in the model | |||||
// visited contains the targets we have already visited and verified | |||||
Set visited = new HashSet(); | |||||
// checker records the targets we are currently visiting | |||||
CircularDependencyChecker checker | |||||
= new CircularDependencyChecker("checking target dependencies"); | |||||
// dependency order is purely recorded for debug purposes | |||||
List dependencyOrder = new ArrayList(); | |||||
for (Iterator i = getTargets(); i.hasNext(); ) { | |||||
Target target = (Target)i.next(); | |||||
target.validate(); | |||||
fillinDependencyOrder(globalName, target, dependencyOrder, | |||||
visited, checker); | |||||
} | |||||
} | |||||
/** | |||||
* Determine target dependency order within this porject and verify that | |||||
* references to targets in other projects are valid | |||||
* | |||||
* @param globalName The global name of this project | |||||
* @param target The target being examined | |||||
* @param dependencyOrder The dependency order of targets | |||||
* @param visited Set of targets in this project already visited. | |||||
* @param checker A circular dependency checker | |||||
* @exception ModelException if the dependencies of the project's | |||||
* targets are not valid. | |||||
*/ | |||||
public void fillinDependencyOrder(String globalName, Target target, | |||||
List dependencyOrder, Set visited, | |||||
CircularDependencyChecker checker) | |||||
throws ModelException { | |||||
if (visited.contains(target.getName())) { | |||||
return; | |||||
} | |||||
try { | |||||
String targetName = target.getName(); | |||||
String targetGlobalName = targetName; | |||||
if (globalName != null) { | |||||
targetGlobalName = globalName + REF_DELIMITER + targetName; | |||||
} | |||||
checker.visitNode(targetGlobalName); | |||||
for (Iterator i = target.getDependencies(); i.hasNext(); ) { | |||||
String dependency = (String)i.next(); | |||||
boolean localTarget = (dependency.indexOf(REF_DELIMITER) == -1); | |||||
Target dependencyTarget | |||||
= localTarget ? getTarget(dependency) | |||||
: getRefTarget(dependency); | |||||
if (dependencyTarget == null) { | |||||
StringBuffer sb = new StringBuffer("Target '"); | |||||
if (globalName != null) { | |||||
sb.append(globalName + REF_DELIMITER); | |||||
} | |||||
sb.append(dependency); | |||||
sb.append("' does not exist in this project. "); | |||||
throw new ModelException(new String(sb), | |||||
target.getLocation()); | |||||
} | |||||
if (localTarget) { | |||||
// need to check the targets we depend on | |||||
fillinDependencyOrder(globalName, dependencyTarget, | |||||
dependencyOrder, visited, checker); | |||||
} | |||||
} | |||||
visited.add(targetName); | |||||
checker.leaveNode(targetGlobalName); | |||||
dependencyOrder.add(targetName); | |||||
} catch (CircularDependencyException e) { | |||||
throw new ModelException(e.getMessage(), | |||||
target.getLocation()); | |||||
} | |||||
} | |||||
/** | |||||
* Given a fully qualified target name, this method simply returns the | |||||
* fully qualified name of the project | |||||
* | |||||
* @param fullTargetName the full qualified target name | |||||
* @return the full name of the containing project | |||||
*/ | |||||
private String getFullProjectName(String fullTargetName) { | |||||
int index = fullTargetName.lastIndexOf(REF_DELIMITER); | |||||
if (index == -1) { | |||||
return null; | |||||
} | |||||
return fullTargetName.substring(0, index); | |||||
} | |||||
/** | |||||
* Flatten the dependencies to the given target | |||||
* | |||||
* @param flattenedList the List of targets that must be executed before | |||||
* the given target | |||||
* @param fullTargetName the fully qualified name of the target | |||||
* @exception ConfigException if the given target does not exist in the | |||||
* project hierarchy | |||||
*/ | |||||
private void flattenDependency(List flattenedList, String fullTargetName) | |||||
throws ConfigException { | |||||
if (flattenedList.contains(fullTargetName)) { | |||||
return; | |||||
} | |||||
Project containingProject = getRefProject(fullTargetName); | |||||
String fullProjectName = getFullProjectName(fullTargetName); | |||||
Target target = getRefTarget(fullTargetName); | |||||
if (target == null) { | |||||
throw new ConfigException("Target " + fullTargetName | |||||
+ " does not exist"); | |||||
} | |||||
for (Iterator i = target.getDependencies(); i.hasNext(); ) { | |||||
String localDependencyName = (String)i.next(); | |||||
String fullDependencyName | |||||
= fullProjectName == null ? localDependencyName | |||||
: fullProjectName + REF_DELIMITER + localDependencyName; | |||||
flattenDependency(flattenedList, fullDependencyName); | |||||
flattenedList.add(fullDependencyName); | |||||
} | |||||
} | |||||
} | |||||
@@ -0,0 +1,168 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.antcore.model; | |||||
import java.util.ArrayList; | |||||
import java.util.Iterator; | |||||
import java.util.List; | |||||
import org.apache.ant.common.util.Location; | |||||
/** | |||||
* A Target is a collection of tasks. It may have dependencies on other | |||||
* targets | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 12 January 2002 | |||||
*/ | |||||
public class Target extends ModelElement { | |||||
/** This target's dependencies on other targets, if any */ | |||||
private List dependencies = new ArrayList(); | |||||
/** This target's list of tasks */ | |||||
private List tasks = new ArrayList(); | |||||
/** The target's name. */ | |||||
private String name; | |||||
/** The Target's description */ | |||||
private String description; | |||||
/** | |||||
* Construct the target, given its name | |||||
* | |||||
* @param location the location of the element | |||||
* @param name the target's name. | |||||
*/ | |||||
public Target(Location location, String name) { | |||||
super(location); | |||||
this.name = name; | |||||
} | |||||
/** | |||||
* Sets the Target's description | |||||
* | |||||
* @param description The new description value | |||||
*/ | |||||
public void setDescription(String description) { | |||||
this.description = description; | |||||
} | |||||
/** | |||||
* Get this target's name. | |||||
* | |||||
* @return the target's name. | |||||
*/ | |||||
public String getName() { | |||||
return name; | |||||
} | |||||
/** | |||||
* Gets the Target's description | |||||
* | |||||
* @return The description value | |||||
*/ | |||||
public String getDescription() { | |||||
return description; | |||||
} | |||||
/** | |||||
* Get this target's dependencies. | |||||
* | |||||
* @return an iterator over the target's dependencies. | |||||
*/ | |||||
public Iterator getDependencies() { | |||||
return dependencies.iterator(); | |||||
} | |||||
/** | |||||
* Get the tasks for this target | |||||
* | |||||
* @return an iterator over the set of tasks for this target. | |||||
*/ | |||||
public Iterator getTasks() { | |||||
return tasks.iterator(); | |||||
} | |||||
/** | |||||
* Add a task to this target | |||||
* | |||||
* @param task the task to be added to the target. | |||||
*/ | |||||
public void addTask(BuildElement task) { | |||||
tasks.add(task); | |||||
} | |||||
/** | |||||
* Add a dependency to this target | |||||
* | |||||
* @param dependency the name of a target upon which this target depends | |||||
*/ | |||||
public void addDependency(String dependency) { | |||||
dependencies.add(dependency); | |||||
} | |||||
/** | |||||
* Validate that this build element is configured correctly | |||||
* | |||||
* @exception ModelException if the element is invalid | |||||
*/ | |||||
public void validate() throws ModelException { | |||||
if (name == null) { | |||||
throw new ModelException("Target must have a name", | |||||
getLocation()); | |||||
} | |||||
} | |||||
} | |||||
@@ -0,0 +1,133 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.antcore.util; | |||||
import java.util.Stack; | |||||
/** | |||||
* Checks for circular dependencies when visiting nodes of an object | |||||
* hierarchy | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 14 January 2002 | |||||
*/ | |||||
public class CircularDependencyChecker { | |||||
/** | |||||
* The activity being undertaken which checking for circular | |||||
* redundancies. This is used for reporting exceptions | |||||
*/ | |||||
private String activity; | |||||
/** The nodes which we are currently visiting */ | |||||
private Stack nodes = new Stack(); | |||||
/** | |||||
* Constructor for the CircularDependencyChecker object | |||||
* | |||||
* @param activity the activity being undertaken | |||||
*/ | |||||
public CircularDependencyChecker(String activity) { | |||||
this.activity = activity; | |||||
} | |||||
/** | |||||
* Visit a Node to check its relationships to other nodes | |||||
* | |||||
* @param node an object which is being visited and analyzed | |||||
* @exception CircularDependencyException if this node is alreay being | |||||
* visited. | |||||
*/ | |||||
public void visitNode(Object node) throws CircularDependencyException { | |||||
if (nodes.contains(node)) { | |||||
throw new CircularDependencyException(getDescription(node)); | |||||
} | |||||
nodes.push(node); | |||||
} | |||||
/** | |||||
* Complete the examination of the node and leave. | |||||
* | |||||
* @param node an object for which the examination of relationships has | |||||
* been completed | |||||
* @exception CircularDependencyException if the given node was not | |||||
* expected. | |||||
*/ | |||||
public void leaveNode(Object node) throws CircularDependencyException { | |||||
if (!nodes.pop().equals(node)) { | |||||
throw new CircularDependencyException("Internal error: popped " + | |||||
"element was unexpected"); | |||||
} | |||||
} | |||||
/** | |||||
* Gets the description of the circular dependency | |||||
* | |||||
* @param endNode the node which was revisited and where the circular | |||||
* dependency was detected | |||||
* @return the description of the circular dependency | |||||
*/ | |||||
private String getDescription(Object endNode) { | |||||
StringBuffer sb = new StringBuffer("Circular dependency while " | |||||
+ activity + ": "); | |||||
sb.append(endNode); | |||||
Object o = null; | |||||
do { | |||||
o = nodes.pop(); | |||||
sb.append(" <- "); | |||||
sb.append(o.toString()); | |||||
} while (!(o.equals(endNode))); | |||||
return new String(sb); | |||||
} | |||||
} | |||||
@@ -0,0 +1,137 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.antcore.util; | |||||
import org.apache.ant.common.util.AntException; | |||||
import org.apache.ant.common.util.Location; | |||||
/** | |||||
* A CircularDependencyException indicates that a circular dependency has | |||||
* been detected | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 9 January 2002 | |||||
*/ | |||||
public class CircularDependencyException extends AntException { | |||||
/** | |||||
* Constructs an exception with the given descriptive message. | |||||
* | |||||
* @param msg Description of or information about the exception. | |||||
*/ | |||||
public CircularDependencyException(String msg) { | |||||
super(msg); | |||||
} | |||||
/** | |||||
* 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 CircularDependencyException(String msg, Location location) { | |||||
super(msg, location); | |||||
} | |||||
/** | |||||
* Constructs an exception with the given message and exception as a | |||||
* root cause. | |||||
* | |||||
* @param msg Description of or information about the exception. | |||||
* @param cause Throwable that might have cause this one. | |||||
*/ | |||||
public CircularDependencyException(String msg, Throwable cause) { | |||||
super(msg, 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 CircularDependencyException(String msg, Throwable cause, | |||||
Location location) { | |||||
super(msg, cause, location); | |||||
} | |||||
/** | |||||
* Constructs an exception with the given exception as a root cause. | |||||
* | |||||
* @param cause Exception that might have caused this one. | |||||
*/ | |||||
public CircularDependencyException(Throwable cause) { | |||||
super(cause); | |||||
} | |||||
/** | |||||
* Constructs an exception with the given exception as a root cause and | |||||
* a location in a file. | |||||
* | |||||
* @param cause Exception that might have cause this one. | |||||
* @param location Location in the project file where the error occured. | |||||
*/ | |||||
public CircularDependencyException(Throwable cause, Location location) { | |||||
super(cause, location); | |||||
} | |||||
} | |||||
@@ -0,0 +1,136 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.antcore.util; | |||||
import org.apache.ant.common.util.AntException; | |||||
import org.apache.ant.common.util.Location; | |||||
/** | |||||
* A ConfigException indicates a problem with Ant's configuration or the | |||||
* commandline used to start Ant. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 9 January 2002 | |||||
*/ | |||||
public class ConfigException extends AntException { | |||||
/** | |||||
* Constructs an exception with the given descriptive message. | |||||
* | |||||
* @param msg Description of or information about the exception. | |||||
*/ | |||||
public ConfigException(String msg) { | |||||
super(msg); | |||||
} | |||||
/** | |||||
* 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 ConfigException(String msg, Location location) { | |||||
super(msg, location); | |||||
} | |||||
/** | |||||
* Constructs an exception with the given message and exception as a | |||||
* root cause. | |||||
* | |||||
* @param msg Description of or information about the exception. | |||||
* @param cause Throwable that might have cause this one. | |||||
*/ | |||||
public ConfigException(String msg, Throwable cause) { | |||||
super(msg, 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 ConfigException(String msg, Throwable cause, Location location) { | |||||
super(msg, cause, location); | |||||
} | |||||
/** | |||||
* Constructs an exception with the given exception as a root cause. | |||||
* | |||||
* @param cause Exception that might have caused this one. | |||||
*/ | |||||
public ConfigException(Throwable cause) { | |||||
super(cause); | |||||
} | |||||
/** | |||||
* Constructs an exception with the given exception as a root cause and | |||||
* a location in a file. | |||||
* | |||||
* @param cause Exception that might have cause this one. | |||||
* @param location Location in the project file where the error occured. | |||||
*/ | |||||
public ConfigException(Throwable cause, Location location) { | |||||
super(cause, location); | |||||
} | |||||
} | |||||
@@ -0,0 +1,357 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.antcore.xml; | |||||
import java.net.URL; | |||||
import java.util.HashMap; | |||||
import java.util.Iterator; | |||||
import java.util.Map; | |||||
import org.apache.ant.common.util.Location; | |||||
import org.xml.sax.Attributes; | |||||
import org.xml.sax.ContentHandler; | |||||
import org.xml.sax.Locator; | |||||
import org.xml.sax.SAXParseException; | |||||
import org.xml.sax.XMLReader; | |||||
import org.xml.sax.helpers.DefaultHandler; | |||||
/** | |||||
* An Element Handler is a handler which handles a single element by | |||||
* becoming the handler for the parser while processing the element. Any sub | |||||
* elements must be delegated to separate handlers. When this element is | |||||
* finished, control returns to the parent handler. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 9 January 2002 | |||||
*/ | |||||
public abstract class ElementHandler extends DefaultHandler { | |||||
/** The parsing context for parsing this element */ | |||||
private ParseContext context; | |||||
/** | |||||
* Locator used to identify where in the build source particular | |||||
* elements occur. | |||||
*/ | |||||
private Locator locator; | |||||
/** The actual XML parser used to parse the build source */ | |||||
private XMLReader reader; | |||||
/** The parent element handler */ | |||||
private ContentHandler parent; | |||||
/** The URL from which we are reading source */ | |||||
private URL source; | |||||
/** The name of this element */ | |||||
private String elementName; | |||||
/** The attributes read from this element */ | |||||
private Map elementAttributes; | |||||
/** The aspect attributes read from the element definition */ | |||||
private Map aspects; | |||||
/** The content of this element */ | |||||
private String content; | |||||
/** | |||||
* Get the source which contains this element | |||||
* | |||||
* @return the URL from which this element is being read | |||||
*/ | |||||
public URL getElementSource() { | |||||
return source; | |||||
} | |||||
/** | |||||
* Gets the attributeValue attribute of the ElementHandler object | |||||
* | |||||
* @param attributeName th name of the attribute | |||||
* @return The corresponding attribute value or null if the attribute wa | |||||
* snot defined. | |||||
*/ | |||||
public String getAttribute(String attributeName) { | |||||
return (String)elementAttributes.get(attributeName); | |||||
} | |||||
/** | |||||
* Get an iterator to this elements attributes | |||||
* | |||||
* @return an iterator over the attribute names | |||||
*/ | |||||
public Iterator getAttributes() { | |||||
return elementAttributes.keySet().iterator(); | |||||
} | |||||
/** | |||||
* Get the aspect attributes of this element. | |||||
* | |||||
* @return The aspect attributes. | |||||
*/ | |||||
public Map getAspects() { | |||||
return aspects; | |||||
} | |||||
/** | |||||
* Gets the content of the element | |||||
* | |||||
* @return The content value | |||||
*/ | |||||
public String getContent() { | |||||
return content; | |||||
} | |||||
/** | |||||
* Start this element handler. | |||||
* | |||||
* @param parent the element handler for the element which contains this | |||||
* one. | |||||
* @param locator the locator is used to get location information from | |||||
* elements. | |||||
* @param attributes the element's attributes. | |||||
* @param source the URL from which the XML source is being parsed. | |||||
* @param xmlReader the parser being used | |||||
* @param context the parser context for this element | |||||
* @param elementName the actual element Name for this element in the | |||||
* XML | |||||
* @exception SAXParseException if there is a problem parsing the | |||||
* element | |||||
*/ | |||||
public final void start(ParseContext context, XMLReader xmlReader, | |||||
ContentHandler parent, Locator locator, | |||||
Attributes attributes, URL source, | |||||
String elementName) | |||||
throws SAXParseException { | |||||
this.context = context; | |||||
this.reader = xmlReader; | |||||
this.parent = parent; | |||||
this.locator = locator; | |||||
this.source = source; | |||||
this.elementName = elementName; | |||||
processAttributes(attributes); | |||||
processElement(elementName); | |||||
reader.setContentHandler(this); | |||||
} | |||||
/** | |||||
* By default an element handler does not support nested elements. This | |||||
* method will always throw an exception. Subclasses should override | |||||
* this method to support their own nested elements | |||||
* | |||||
* @param uri The Namespace URI. | |||||
* @param localName The local name (without prefix). | |||||
* @param qualifiedName The qualified name (with prefix) | |||||
* @param attributes The attributes attached to the element. | |||||
* @throws SAXParseException if there is a problem parsng the subelement | |||||
*/ | |||||
public void startElement(String uri, String localName, String qualifiedName, | |||||
Attributes attributes) | |||||
throws SAXParseException { | |||||
// everything is a task | |||||
throw new SAXParseException("<" + elementName + "> does not support a <" | |||||
+ qualifiedName + "> nested element", getLocator()); | |||||
} | |||||
/** | |||||
* Handle the end of this element by making the parent element handler | |||||
* the current content handler | |||||
* | |||||
* @param localName The local name (without prefix). | |||||
* @param namespaceURI The Namespace URI. | |||||
* @param qName the qualified name of the element | |||||
*/ | |||||
public final void endElement(String namespaceURI, String localName, | |||||
String qName) { | |||||
finish(); | |||||
reader.setContentHandler(parent); | |||||
} | |||||
/** | |||||
* Record content of this element | |||||
* | |||||
* @param buf the buffer containing the content to be added | |||||
* @param start start position in the buffer | |||||
* @param end end position in the buffer | |||||
* @exception SAXParseException if there is a parsing error. | |||||
* @see org.xml.sax.ContentHandler.characters() | |||||
*/ | |||||
public void characters(char[] buf, int start, int end) | |||||
throws SAXParseException { | |||||
if (content == null) { | |||||
content = ""; | |||||
} | |||||
content += new String(buf, start, end); | |||||
} | |||||
/** | |||||
* Get the current parsing location | |||||
* | |||||
* @return a location instance representing the current parse position | |||||
*/ | |||||
protected Location getLocation() { | |||||
return new Location(locator.getSystemId(), locator.getLineNumber(), | |||||
locator.getColumnNumber()); | |||||
} | |||||
/** | |||||
* Get the XML Reader being used to parse the XML. | |||||
* | |||||
* @return the XML Reader. | |||||
*/ | |||||
protected XMLReader getXMLReader() { | |||||
return reader; | |||||
} | |||||
/** | |||||
* Get the parsing context | |||||
* | |||||
* @return the parsing context of this element | |||||
*/ | |||||
protected ParseContext getParseContext() { | |||||
return context; | |||||
} | |||||
/** | |||||
* Get the locator used to locate elements in the XML source as they are | |||||
* parsed. | |||||
* | |||||
* @return the locator object which can be used to determine an elements | |||||
* location within the XML source | |||||
*/ | |||||
protected Locator getLocator() { | |||||
return locator; | |||||
} | |||||
/** | |||||
* Process the element. | |||||
* | |||||
* @param elementName the name of the element | |||||
* @exception SAXParseException if there is a problem parsing the | |||||
* element | |||||
*/ | |||||
protected abstract void processElement(String elementName) | |||||
throws SAXParseException; | |||||
/** | |||||
* Process all of the attributes of the element into maps, one for | |||||
* aspects and one for other attributes | |||||
* | |||||
* @param attributes The SAX attributes collection for the element | |||||
* @exception SAXParseException if there is a problem reading the | |||||
* attributes | |||||
*/ | |||||
protected final void processAttributes(Attributes attributes) | |||||
throws SAXParseException { | |||||
aspects = new HashMap(); | |||||
elementAttributes = new HashMap(); | |||||
for (int i = 0; i < attributes.getLength(); ++i) { | |||||
String attributeName = attributes.getQName(i); | |||||
String attributeValue = attributes.getValue(i); | |||||
if (attributeName.indexOf(":") != -1) { | |||||
aspects.put(attributeName, attributeValue); | |||||
} else { | |||||
validateAttribute(attributeName, attributeValue); | |||||
elementAttributes.put(attributeName, attributeValue); | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* Validate that the given attribute and value are valid. By default all | |||||
* attributes are considered invalid. This method should be overrider by | |||||
* subclasses to allow specific attributes | |||||
* | |||||
* @param attributeName The name of the attributes | |||||
* @param attributeValue The value of the attributes | |||||
* @exception SAXParseException if the attribute is not allowed on the | |||||
* element. | |||||
*/ | |||||
protected void validateAttribute(String attributeName, | |||||
String attributeValue) | |||||
throws SAXParseException { | |||||
throwInvalidAttribute(attributeName); | |||||
} | |||||
/** | |||||
* Throws an invalid attribute exception | |||||
* | |||||
* @param attributeName The name of the invalid attribute | |||||
* @exception SAXParseException always - indicating attribute is invalid | |||||
*/ | |||||
protected final void throwInvalidAttribute(String attributeName) | |||||
throws SAXParseException { | |||||
throw new SAXParseException("The attribute '" + attributeName | |||||
+ "' is not " + "supported by the <" + elementName | |||||
+ "> element", getLocator()); | |||||
} | |||||
/** | |||||
* This method is called when this element is finished being processed. | |||||
* This is a template method allowing subclasses to complete any | |||||
* necessary processing. | |||||
*/ | |||||
protected void finish() { | |||||
} | |||||
} | |||||
@@ -0,0 +1,146 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.antcore.xml; | |||||
import java.io.IOException; | |||||
import java.net.URL; | |||||
import javax.xml.parsers.ParserConfigurationException; | |||||
import javax.xml.parsers.SAXParser; | |||||
import javax.xml.parsers.SAXParserFactory; | |||||
import org.apache.ant.common.util.Location; | |||||
import org.apache.ant.antcore.util.CircularDependencyChecker; | |||||
import org.apache.ant.antcore.util.CircularDependencyException; | |||||
import org.xml.sax.SAXException; | |||||
import org.xml.sax.SAXParseException; | |||||
import org.xml.sax.XMLReader; | |||||
/** | |||||
* Holds the current parsing context. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 9 January 2002 | |||||
*/ | |||||
public class ParseContext { | |||||
/** | |||||
* Used to check if we are trying to parse a build file within its own | |||||
* context. | |||||
*/ | |||||
private CircularDependencyChecker checker | |||||
= new CircularDependencyChecker("parsing XML"); | |||||
/** The factory used to create SAX parsers. */ | |||||
private SAXParserFactory parserFactory = SAXParserFactory.newInstance(); | |||||
/** | |||||
* Parse a URL using the given root handler | |||||
* | |||||
* @param source The URL to the source to be parsed | |||||
* @param rootElementName The required root element name | |||||
* @param rootElementHandler The handler for the root element | |||||
* @exception XMLParseException if the element cannot be parsed | |||||
*/ | |||||
public void parse(URL source, String rootElementName, | |||||
ElementHandler rootElementHandler) | |||||
throws XMLParseException { | |||||
parse(source, new String[]{rootElementName}, rootElementHandler); | |||||
} | |||||
/** | |||||
* Parse a URL using the given root handler | |||||
* | |||||
* @param source The URL to the source to be parsed | |||||
* @param rootElementNames The allowable root element names | |||||
* @param rootElementHandler The handler for the root element | |||||
* @exception XMLParseException if the element cannot be parsed | |||||
*/ | |||||
public void parse(URL source, String[] rootElementNames, | |||||
ElementHandler rootElementHandler) | |||||
throws XMLParseException { | |||||
try { | |||||
checker.visitNode(source); | |||||
// create a parser for this source | |||||
SAXParser saxParser = parserFactory.newSAXParser(); | |||||
XMLReader xmlReader = saxParser.getXMLReader(); | |||||
// create a root handler for this | |||||
RootHandler rootHandler = new RootHandler(this, source, xmlReader, | |||||
rootElementNames, rootElementHandler); | |||||
saxParser.parse(source.toString(), rootHandler); | |||||
checker.leaveNode(source); | |||||
} catch (ParserConfigurationException e) { | |||||
throw new XMLParseException(e); | |||||
} catch (SAXParseException e) { | |||||
Location location = new Location(e.getSystemId(), | |||||
e.getLineNumber(), e.getColumnNumber()); | |||||
if (e.getException() != null) { | |||||
throw new XMLParseException("XML Parsing Exception", | |||||
e.getException(), location); | |||||
} else { | |||||
throw new XMLParseException("XML Parsing Exception", | |||||
e, location); | |||||
} | |||||
} catch (SAXException e) { | |||||
throw new XMLParseException(e); | |||||
} catch (IOException e) { | |||||
throw new XMLParseException(e); | |||||
} catch (CircularDependencyException e) { | |||||
throw new XMLParseException(e); | |||||
} | |||||
} | |||||
} | |||||
@@ -0,0 +1,154 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.antcore.xml; | |||||
import java.net.URL; | |||||
import org.xml.sax.Attributes; | |||||
import org.xml.sax.Locator; | |||||
import org.xml.sax.SAXParseException; | |||||
import org.xml.sax.XMLReader; | |||||
import org.xml.sax.helpers.DefaultHandler; | |||||
/** | |||||
* Handle the root of an XML parse. This class recognizes the root document | |||||
* element and then passes control to the handler for that root element. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 9 January 2002 | |||||
*/ | |||||
public class RootHandler extends DefaultHandler { | |||||
/** The parsing context for this document */ | |||||
private ParseContext context; | |||||
/** | |||||
* Locator used to identify where in the build source particular | |||||
* elements occur. | |||||
*/ | |||||
private Locator locator; | |||||
/** The actual XML parser used to parse the build source */ | |||||
private XMLReader reader; | |||||
/** The URL from which the XML source is being read. */ | |||||
private URL sourceURL; | |||||
/** The allowed names of the root element in this document */ | |||||
private String[] allowedRootNames; | |||||
/** The handler for the root element */ | |||||
private ElementHandler rootElementHandler; | |||||
/** | |||||
* Handler to handle the document root. | |||||
* | |||||
* @param context The Parser context for this parse operation | |||||
* @param sourceURL URL of the source containing the XML definition | |||||
* @param reader XML parser | |||||
* @param allowedRootNames An array of allowed element names | |||||
* @param rootElementHandler The element handler for the root element | |||||
*/ | |||||
public RootHandler(ParseContext context, URL sourceURL, XMLReader reader, | |||||
String[] allowedRootNames, | |||||
ElementHandler rootElementHandler) { | |||||
this.context = context; | |||||
this.sourceURL = sourceURL; | |||||
this.reader = reader; | |||||
this.allowedRootNames = allowedRootNames; | |||||
this.rootElementHandler = rootElementHandler; | |||||
} | |||||
/** | |||||
* Set the locator to use when parsing elements. This is passed onto | |||||
* child elements. | |||||
* | |||||
* @param locator the locator for locating elements in the build source. | |||||
*/ | |||||
public void setDocumentLocator(Locator locator) { | |||||
this.locator = locator; | |||||
} | |||||
/** | |||||
* Start a new element in the root. This must be a project element All | |||||
* other elements are invalid. | |||||
* | |||||
* @param uri The Namespace URI. | |||||
* @param localName The local name (without prefix). | |||||
* @param qualifiedName The qualified name (with prefix) | |||||
* @param attributes The attributes attached to the element. | |||||
* @throws SAXParseException if there is a parsing problem. | |||||
*/ | |||||
public void startElement(String uri, String localName, String qualifiedName, | |||||
Attributes attributes) | |||||
throws SAXParseException { | |||||
boolean allowed = false; | |||||
for (int i = 0; i < allowedRootNames.length; ++i) { | |||||
if (qualifiedName.equals(allowedRootNames[i])) { | |||||
allowed = true; | |||||
break; | |||||
} | |||||
} | |||||
if (allowed) { | |||||
rootElementHandler.start(context, reader, this, | |||||
locator, attributes, sourceURL, qualifiedName); | |||||
} else { | |||||
throw new SAXParseException("<" + qualifiedName | |||||
+ "> element was not expected as the root element", locator); | |||||
} | |||||
} | |||||
} | |||||
@@ -0,0 +1,130 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.antcore.xml; | |||||
import org.apache.ant.common.util.AntException; | |||||
import org.apache.ant.common.util.Location; | |||||
/** | |||||
* An XMLParseException is thrown when there is an error parsing the XML | |||||
* representation of an Ant build file. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 11 January 2002 | |||||
*/ | |||||
public class XMLParseException extends AntException { | |||||
/** | |||||
* Constructs an exception with the given descriptive message. | |||||
* | |||||
* @param msg Description of or information about the exception. | |||||
*/ | |||||
public XMLParseException(String msg) { | |||||
super(msg); | |||||
} | |||||
/** | |||||
* 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 XMLParseException(String msg, Location location) { | |||||
super(msg, location); | |||||
} | |||||
/** | |||||
* Constructs an exception with the given message and exception as a | |||||
* root cause. | |||||
* | |||||
* @param msg Description of or information about the exception. | |||||
* @param cause Throwable that might have cause this one. | |||||
*/ | |||||
public XMLParseException(String msg, Throwable cause) { | |||||
super(msg, 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 XMLParseException(String msg, Throwable cause, Location location) { | |||||
super(msg, cause, location); | |||||
} | |||||
/** | |||||
* Constructs an exception with the given exception as a root cause. | |||||
* | |||||
* @param cause Exception that might have caused this one. | |||||
*/ | |||||
public XMLParseException(Throwable cause) { | |||||
super(cause); | |||||
} | |||||
/** | |||||
* Constructs an exception with the given exception as a root cause and | |||||
* a location in a file. | |||||
* | |||||
* @param cause Exception that might have cause this one. | |||||
* @param location Location in the project file where the error occured. | |||||
*/ | |||||
public XMLParseException(Throwable cause, Location location) { | |||||
super(cause, location); | |||||
} | |||||
} | |||||
@@ -0,0 +1,6 @@ | |||||
<antlib libid="ant.file" | |||||
home="http://jakarta.apache.org/ant" | |||||
reqxml="true" reqtools="true" extends="ant.io" | |||||
isolated="true"> | |||||
<taskdef name="copy" classname="org.apache.ant.file.copy"/> | |||||
</antlib> |
@@ -0,0 +1,8 @@ | |||||
<antlib libid="ant.io" | |||||
home="http://jakarta.apache.org/ant" | |||||
isolated="true"> | |||||
<typedef name="thread" classname="java.lang.Thread"/> | |||||
<taskdef name="echo" classname="org.apache.ant.taskdef.io.Echo"/> | |||||
<converter classname="org.apache.ant.taskdef.io.FileConverter"/> | |||||
</antlib> |
@@ -0,0 +1,163 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.taskdef.io; | |||||
import java.io.File; | |||||
import java.io.FileWriter; | |||||
import java.io.IOException; | |||||
import org.apache.ant.common.task.AbstractTask; | |||||
import org.apache.ant.common.task.TaskException; | |||||
import org.apache.ant.common.util.MessageLevel; | |||||
/** | |||||
* Basic Echo Tast for testing | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 16 January 2002 | |||||
*/ | |||||
public class Echo extends AbstractTask { | |||||
/** The message to be echoed */ | |||||
private String message = ""; | |||||
/** the file to which output is sent if any */ | |||||
private File file = null; | |||||
/** indicates if the fileoutput is to be appended to an existing file */ | |||||
private boolean append = false; | |||||
// by default, messages are always displayed | |||||
/** the log level to be used when echoing - defaults to Warning level */ | |||||
private int logLevel = MessageLevel.MSG_WARN; | |||||
/** | |||||
* Sets the message variable. | |||||
* | |||||
* @param msg Sets the value for the message variable. | |||||
*/ | |||||
public void setMessage(String msg) { | |||||
this.message = msg; | |||||
} | |||||
/** | |||||
* Set the file to which output is to be sent | |||||
* | |||||
* @param file the new file value | |||||
*/ | |||||
public void setFile(File file) { | |||||
this.file = file; | |||||
} | |||||
/** | |||||
* Indicate if output is to be appended to the file | |||||
* | |||||
* @param append true if output should be appended | |||||
*/ | |||||
public void setAppend(boolean append) { | |||||
this.append = append; | |||||
} | |||||
/** | |||||
* Does the work. | |||||
* | |||||
* @throws TaskException if cannot output message | |||||
*/ | |||||
public void execute() throws TaskException { | |||||
if (file == null) { | |||||
log(message, logLevel); | |||||
} else { | |||||
FileWriter out = null; | |||||
try { | |||||
out = new FileWriter(file.getAbsolutePath(), append); | |||||
out.write(message, 0, message.length()); | |||||
} catch (IOException ioe) { | |||||
throw new TaskException(ioe); | |||||
} finally { | |||||
if (out != null) { | |||||
try { | |||||
out.close(); | |||||
} catch (IOException ioex) { | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* Set a multiline message. | |||||
* | |||||
* @param msg the message | |||||
*/ | |||||
public void addText(String msg) { | |||||
message += msg; | |||||
} | |||||
/** | |||||
* testing only | |||||
* | |||||
* @param frame testing | |||||
*/ | |||||
public void addFrame(java.awt.Frame frame) { | |||||
log("Adding frame " + frame, MessageLevel.MSG_WARN); | |||||
} | |||||
/** | |||||
* testing | |||||
* | |||||
* @param runnable testing | |||||
*/ | |||||
public void addRun(Runnable runnable) { | |||||
log("Adding runnable of type " | |||||
+ runnable.getClass().getName(), MessageLevel.MSG_WARN); | |||||
} | |||||
} | |||||
@@ -0,0 +1,99 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.taskdef.io; | |||||
import java.io.File; | |||||
import org.apache.ant.common.converter.AbstractConverter; | |||||
import org.apache.ant.common.converter.ConversionException; | |||||
import org.apache.ant.common.util.AntException; | |||||
/** | |||||
* A converter to convert to File objects, resolving against the | |||||
* project's basedir | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 21 January 2002 | |||||
*/ | |||||
public class FileConverter extends AbstractConverter { | |||||
/** | |||||
* Get the list of classes this converter is able to convert to. | |||||
* | |||||
* @return an array of Class objects representing the classes this | |||||
* converter handles. | |||||
*/ | |||||
public Class[] getTypes() { | |||||
return new Class[]{File.class}; | |||||
} | |||||
/** | |||||
* Convert a string from the value given to an instance of the given | |||||
* type. | |||||
* | |||||
* @param value The value to be converted | |||||
* @param type the desired type of the converted object | |||||
* @return the value of the converted object | |||||
* @exception ConversionException if the conversion cannot be made | |||||
*/ | |||||
public Object convert(String value, Class type) throws ConversionException { | |||||
try { | |||||
return getContext().resolveFile(value); | |||||
} | |||||
catch (AntException e) { | |||||
throw new ConversionException("Unable to resolve file: " | |||||
+ value, e); | |||||
} | |||||
} | |||||
} | |||||
@@ -0,0 +1,92 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.cli; | |||||
import java.io.PrintStream; | |||||
import org.apache.ant.antcore.event.BuildListener; | |||||
/** | |||||
* Interface used by Ant to log the build output. A build logger is a build | |||||
* listener which has the 'right' to send output to the ant log, which is | |||||
* usually System.out unles redirected by the -logfile option. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 15 January 2002 | |||||
*/ | |||||
public interface BuildLogger extends BuildListener { | |||||
/** | |||||
* Set the msgOutputLevel this logger is to respond to. Only messages | |||||
* with a message level lower than or equal to the given level are | |||||
* output to the log. | |||||
* | |||||
* @param level the logging level for the logger. | |||||
*/ | |||||
public void setMessageOutputLevel(int level); | |||||
/** | |||||
* Set the output stream to which this logger is to send its output. | |||||
* | |||||
* @param output the output stream for the logger. | |||||
*/ | |||||
public void setOutputPrintStream(PrintStream output); | |||||
/** | |||||
* Set the output stream to which this logger is to send error messages. | |||||
* | |||||
* @param err the error stream for the logger. | |||||
*/ | |||||
public void setErrorPrintStream(PrintStream err); | |||||
} | |||||
@@ -0,0 +1,351 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.cli; | |||||
import java.io.File; | |||||
import java.io.FileOutputStream; | |||||
import java.io.IOException; | |||||
import java.io.PrintStream; | |||||
import java.net.MalformedURLException; | |||||
import java.net.URL; | |||||
import java.util.ArrayList; | |||||
import java.util.Iterator; | |||||
import java.util.List; | |||||
import org.apache.ant.cli.xml.XMLProjectParser; | |||||
import org.apache.ant.common.util.AntException; | |||||
import org.apache.ant.common.util.Location; | |||||
import org.apache.ant.common.util.MessageLevel; | |||||
import org.apache.ant.antcore.event.BuildListener; | |||||
import org.apache.ant.antcore.execution.ExecutionManager; | |||||
import org.apache.ant.antcore.model.Project; | |||||
import org.apache.ant.antcore.util.ConfigException; | |||||
import org.apache.ant.antcore.xml.XMLParseException; | |||||
import org.apache.ant.init.InitUtils; | |||||
import org.apache.ant.init.InitConfig; | |||||
/** | |||||
* This is the command line front end to end. It drives the core | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 9 January 2002 | |||||
*/ | |||||
public class Commandline { | |||||
/** The default build file name */ | |||||
public final static String DEFAULT_BUILD_FILENAME = "build.ant"; | |||||
/** The initialisation configuration for Ant */ | |||||
private InitConfig config; | |||||
/** Stream that we are using for logging */ | |||||
private PrintStream out = System.out; | |||||
/** Stream that we are using for logging error messages */ | |||||
private PrintStream err = System.err; | |||||
/** Names of classes to add as listeners to project */ | |||||
private List listeners = new ArrayList(2); | |||||
/** The list of targets to be evaluated in this invocation */ | |||||
private List targets = new ArrayList(4); | |||||
/** | |||||
* This is the build file to run. By default it is a file: type URL but | |||||
* other URL protocols can be used. | |||||
*/ | |||||
private URL buildFileURL; | |||||
/** | |||||
* The Ant logger class. There may be only one logger. It will have the | |||||
* right to use the 'out' PrintStream. The class must implements the | |||||
* BuildLogger interface | |||||
*/ | |||||
private String loggerClassname = null; | |||||
/** Our current message output status. Follows MessageLevel values */ | |||||
private int messageOutputLevel = MessageLevel.MSG_VERBOSE; | |||||
/** | |||||
* Start the command line front end for mutant. | |||||
* | |||||
* @param args the commandline arguments | |||||
* @param config the initialisation configuration | |||||
*/ | |||||
public static void start(String[] args, InitConfig config) { | |||||
// create a command line and use it to run ant | |||||
Commandline commandline = new Commandline(); | |||||
commandline.process(args, config); | |||||
} | |||||
/** | |||||
* Adds a feature to the BuildListeners attribute of the Commandline | |||||
* object | |||||
* | |||||
* @param execManager The feature to be added to the BuildListeners | |||||
* attribute | |||||
* @exception ConfigException if the necessary listener instances could | |||||
* not be created | |||||
*/ | |||||
protected void addBuildListeners(ExecutionManager execManager) | |||||
throws ConfigException { | |||||
// Add the default listener | |||||
execManager.addBuildListener(createLogger()); | |||||
for (Iterator i = listeners.iterator(); i.hasNext(); ) { | |||||
String className = (String)i.next(); | |||||
try { | |||||
BuildListener listener = | |||||
(BuildListener)Class.forName(className).newInstance(); | |||||
execManager.addBuildListener(listener); | |||||
} catch (ClassCastException e) { | |||||
System.err.println("The specified listener class " | |||||
+ className + | |||||
" does not implement the Listener interface"); | |||||
throw new ConfigException("Unable to instantiate listener " | |||||
+ className, e); | |||||
} catch (Exception e) { | |||||
System.err.println("Unable to instantiate specified listener " | |||||
+ "class " + className + " : " | |||||
+ e.getClass().getName()); | |||||
throw new ConfigException("Unable to instantiate listener " | |||||
+ className, e); | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* Start the command line front end for mutant. | |||||
* | |||||
* @param args the commandline arguments | |||||
* @param config the initialisation configuration | |||||
*/ | |||||
private void process(String[] args, InitConfig config) { | |||||
this.config = config; | |||||
try { | |||||
parseArguments(args); | |||||
Project project = parseProject(); | |||||
// create the execution manager to execute the build | |||||
ExecutionManager executionManager = new ExecutionManager(config); | |||||
addBuildListeners(executionManager); | |||||
executionManager.runBuild(project, targets); | |||||
} catch (AntException e) { | |||||
Location location = e.getLocation(); | |||||
Throwable cause = e.getCause(); | |||||
System.out.println(e.getMessage()); | |||||
if (cause != null) { | |||||
System.out.print("Root cause: " + cause.getClass().getName()); | |||||
if (!cause.getMessage().equals(e.getMessage())) { | |||||
System.out.print(": " + cause.getMessage()); | |||||
} | |||||
System.out.println(); | |||||
} | |||||
e.printStackTrace(); | |||||
System.exit(1); | |||||
} catch (Throwable t) { | |||||
t.printStackTrace(); | |||||
System.exit(1); | |||||
} | |||||
} | |||||
/** | |||||
* Use the XML parser to parse the build file into a project model | |||||
* | |||||
* @return a project model representation of the project file | |||||
* @exception XMLParseException if the project cannot be parsed | |||||
*/ | |||||
private Project parseProject() | |||||
throws XMLParseException { | |||||
XMLProjectParser parser = new XMLProjectParser(); | |||||
Project project = parser.parseBuildFile(buildFileURL); | |||||
return project; | |||||
} | |||||
/** | |||||
* Parse the command line arguments. | |||||
* | |||||
* @param args the command line arguments | |||||
* @exception ConfigException thrown when the command line contains some | |||||
* sort of error. | |||||
*/ | |||||
private void parseArguments(String[] args) | |||||
throws ConfigException { | |||||
for (int i = 0; i < args.length; i++) { | |||||
String arg = args[i]; | |||||
if (arg.equals("-buildfile") || arg.equals("-file") | |||||
|| arg.equals("-f")) { | |||||
try { | |||||
String url = args[i + 1]; | |||||
if (url.indexOf(":") == -1) { | |||||
// We convert any hash characters to their URL escape. | |||||
buildFileURL = InitUtils.getFileURL(new File(url)); | |||||
} else { | |||||
buildFileURL = new URL(url); | |||||
} | |||||
i++; | |||||
} catch (MalformedURLException e) { | |||||
System.err.println("Buildfile is not valid: " + | |||||
e.getMessage()); | |||||
throw new ConfigException("Build file is not valid", e); | |||||
} catch (ArrayIndexOutOfBoundsException e) { | |||||
System.err.println("You must specify a buildfile when " + | |||||
"using the -buildfile argument"); | |||||
return; | |||||
} | |||||
} else if (arg.equals("-logfile") || arg.equals("-l")) { | |||||
try { | |||||
File logFile = new File(args[i + 1]); | |||||
i++; | |||||
out = new PrintStream(new FileOutputStream(logFile)); | |||||
err = out; | |||||
} catch (IOException ioe) { | |||||
System.err.println("Cannot write on the specified log " + | |||||
"file. Make sure the path exists and " + | |||||
"you have write permissions."); | |||||
return; | |||||
} catch (ArrayIndexOutOfBoundsException aioobe) { | |||||
System.err.println("You must specify a log file when " + | |||||
"using the -log argument"); | |||||
return; | |||||
} | |||||
} else if (arg.equals("-quiet") || arg.equals("-q")) { | |||||
messageOutputLevel = MessageLevel.MSG_WARN; | |||||
} else if (arg.equals("-verbose") || arg.equals("-v")) { | |||||
// printVersion(); | |||||
messageOutputLevel = MessageLevel.MSG_VERBOSE; | |||||
} else if (arg.equals("-listener")) { | |||||
try { | |||||
listeners.add(args[i + 1]); | |||||
i++; | |||||
} catch (ArrayIndexOutOfBoundsException aioobe) { | |||||
System.err.println("You must specify a classname when " + | |||||
"using the -listener argument"); | |||||
return; | |||||
} | |||||
} else if (arg.equals("-logger")) { | |||||
if (loggerClassname != null) { | |||||
System.err.println("Only one logger class may be " + | |||||
"specified."); | |||||
return; | |||||
} | |||||
try { | |||||
loggerClassname = args[++i]; | |||||
} catch (ArrayIndexOutOfBoundsException aioobe) { | |||||
System.err.println("You must specify a classname when " + | |||||
"using the -logger argument"); | |||||
return; | |||||
} | |||||
} else if (arg.startsWith("-")) { | |||||
// we don't have any more args to recognize! | |||||
System.out.println("Unknown option: " + arg); | |||||
return; | |||||
} else { | |||||
// if it's no other arg, it must be a target | |||||
targets.add(arg); | |||||
} | |||||
} | |||||
if (buildFileURL == null) { | |||||
File defaultBuildFile = new File(DEFAULT_BUILD_FILENAME); | |||||
try { | |||||
buildFileURL = InitUtils.getFileURL(defaultBuildFile); | |||||
} catch (MalformedURLException e) { | |||||
System.err.println("Buildfile is not valid: " + e.getMessage()); | |||||
throw new ConfigException("Build file is not valid", e); | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* Creates the default build logger for sending build events to the ant | |||||
* log. | |||||
* | |||||
* @return the logger instance to be used for the build | |||||
* @exception ConfigException if the logger cannot be instantiatd | |||||
*/ | |||||
private BuildLogger createLogger() throws ConfigException { | |||||
BuildLogger logger = null; | |||||
if (loggerClassname != null) { | |||||
try { | |||||
Class loggerClass = Class.forName(loggerClassname); | |||||
logger = (BuildLogger)(loggerClass.newInstance()); | |||||
} catch (ClassCastException e) { | |||||
System.err.println("The specified logger class " | |||||
+ loggerClassname + | |||||
" does not implement the BuildLogger interface"); | |||||
throw new ConfigException("Unable to instantiate logger " | |||||
+ loggerClassname, e); | |||||
} catch (Exception e) { | |||||
System.err.println("Unable to instantiate specified logger " | |||||
+ "class " + loggerClassname + " : " | |||||
+ e.getClass().getName()); | |||||
throw new ConfigException("Unable to instantiate logger " | |||||
+ loggerClassname, e); | |||||
} | |||||
} else { | |||||
logger = new DefaultLogger(); | |||||
} | |||||
logger.setMessageOutputLevel(messageOutputLevel); | |||||
logger.setOutputPrintStream(out); | |||||
logger.setErrorPrintStream(err); | |||||
return logger; | |||||
} | |||||
} | |||||
@@ -0,0 +1,253 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.cli; | |||||
import java.io.PrintStream; | |||||
import org.apache.ant.common.util.AntException; | |||||
import org.apache.ant.common.util.Location; | |||||
import org.apache.ant.common.util.MessageLevel; | |||||
import org.apache.ant.antcore.event.BuildEvent; | |||||
import org.apache.ant.antcore.model.BuildElement; | |||||
import org.apache.ant.antcore.model.Target; | |||||
/** | |||||
* Writes build event to a PrintStream. Currently, it only writes which | |||||
* targets are being executed, and any messages that get logged. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 15 January 2002 | |||||
*/ | |||||
public class DefaultLogger implements BuildLogger { | |||||
/** Standard field separator */ | |||||
private static String lSep = System.getProperty("line.separator"); | |||||
/** spacing to allow for task tags */ | |||||
private final static int LEFT_COLUMN_SIZE = 12; | |||||
/** The stream where output should be written */ | |||||
private PrintStream out; | |||||
/** The stream to where errors should be written */ | |||||
private PrintStream err; | |||||
/** The level of messages which should be let through */ | |||||
private int messageOutputLevel = MessageLevel.MSG_ERR; | |||||
/** Controls whether adornments are added */ | |||||
private boolean emacsMode = false; | |||||
/** The time at which the build started */ | |||||
private long startTime = System.currentTimeMillis(); | |||||
/** | |||||
* Format the time into something readable | |||||
* | |||||
* @param millis Java millis value | |||||
* @return the formatted time | |||||
*/ | |||||
protected static String formatTime(long millis) { | |||||
long seconds = millis / 1000; | |||||
long minutes = seconds / 60; | |||||
if (minutes > 0) { | |||||
return Long.toString(minutes) + " minute" | |||||
+ (minutes == 1 ? " " : "s ") | |||||
+ Long.toString(seconds % 60) + " second" | |||||
+ (seconds % 60 == 1 ? "" : "s"); | |||||
} else { | |||||
return Long.toString(seconds) + " second" | |||||
+ (seconds % 60 == 1 ? "" : "s"); | |||||
} | |||||
} | |||||
/** | |||||
* Set the messageOutputLevel this logger is to respond to. Only | |||||
* messages with a message level lower than or equal to the given level | |||||
* are output to the log. <P> | |||||
* | |||||
* Constants for the message levels are in Project.java. The order of | |||||
* the levels, from least to most verbose, is MSG_ERR, MSG_WARN, | |||||
* MSG_INFO, MSG_VERBOSE, MSG_DEBUG. The default message level for | |||||
* DefaultLogger is Project.MSG_ERR. | |||||
* | |||||
* @param level the logging level for the logger. | |||||
*/ | |||||
public void setMessageOutputLevel(int level) { | |||||
this.messageOutputLevel = level; | |||||
} | |||||
/** | |||||
* Set the output stream to which this logger is to send its output. | |||||
* | |||||
* @param output the output stream for the logger. | |||||
*/ | |||||
public void setOutputPrintStream(PrintStream output) { | |||||
this.out = output; | |||||
} | |||||
/** | |||||
* Set the output stream to which this logger is to send error messages. | |||||
* | |||||
* @param err the error stream for the logger. | |||||
*/ | |||||
public void setErrorPrintStream(PrintStream err) { | |||||
this.err = err; | |||||
} | |||||
/** | |||||
* Set this logger to produce emacs (and other editor) friendly output. | |||||
* | |||||
* @param emacsMode true if output is to be unadorned so that emacs and | |||||
* other editors can parse files names, etc. | |||||
*/ | |||||
public void setEmacsMode(boolean emacsMode) { | |||||
this.emacsMode = emacsMode; | |||||
} | |||||
/** | |||||
* Report an exception | |||||
* | |||||
* @param t The exception to be reported. | |||||
*/ | |||||
public void reportException(Throwable t) { | |||||
if (t instanceof AntException) { | |||||
AntException e = (AntException)t; | |||||
Location location = e.getLocation(); | |||||
Throwable cause = e.getCause(); | |||||
if (location != null && location != Location.UNKNOWN_LOCATION) { | |||||
out.print(location); | |||||
} | |||||
out.println(e.getMessage()); | |||||
if (messageOutputLevel >= MessageLevel.MSG_VERBOSE) { | |||||
t.printStackTrace(); | |||||
} | |||||
if (cause != null) { | |||||
out.println("Root cause: " + cause.toString()); | |||||
} | |||||
} else { | |||||
t.printStackTrace(err); | |||||
} | |||||
} | |||||
/** | |||||
* Process an incoming build event | |||||
* | |||||
* @param event the build event to be processed | |||||
*/ | |||||
public void processBuildEvent(BuildEvent event) { | |||||
switch (event.getEventType()) { | |||||
case BuildEvent.BUILD_STARTED: | |||||
startTime = System.currentTimeMillis(); | |||||
break; | |||||
case BuildEvent.BUILD_FINISHED: | |||||
Throwable cause = event.getCause(); | |||||
if (cause == null) { | |||||
out.println(lSep + "BUILD SUCCESSFUL"); | |||||
} else { | |||||
err.println(lSep + "BUILD FAILED" + lSep); | |||||
reportException(cause); | |||||
} | |||||
out.println(lSep + "Total time: " | |||||
+ formatTime(System.currentTimeMillis() - startTime)); | |||||
break; | |||||
case BuildEvent.TARGET_STARTED: | |||||
if (MessageLevel.MSG_INFO <= messageOutputLevel) { | |||||
Target target = (Target)event.getModelElement(); | |||||
out.println(lSep + target.getName() + ":"); | |||||
} | |||||
break; | |||||
case BuildEvent.TARGET_FINISHED: | |||||
break; | |||||
case BuildEvent.TASK_STARTED: | |||||
break; | |||||
case BuildEvent.TASK_FINISHED: | |||||
break; | |||||
case BuildEvent.MESSAGE: | |||||
PrintStream logTo | |||||
= event.getPriority() == MessageLevel.MSG_ERR ? err : out; | |||||
// Filter out messages based on priority | |||||
if (event.getPriority() <= messageOutputLevel | |||||
&& event.getModelElement() instanceof BuildElement) { | |||||
// Print out the name of the task if we're in one | |||||
BuildElement buildElement | |||||
= (BuildElement)event.getModelElement(); | |||||
String name = buildElement.getType(); | |||||
if (!emacsMode) { | |||||
String msg = "[" + name + "] "; | |||||
int indentSize = LEFT_COLUMN_SIZE - msg.length(); | |||||
for (int i = 0; i < indentSize; i++) { | |||||
logTo.print(" "); | |||||
} | |||||
logTo.print(msg); | |||||
} | |||||
// Print the message | |||||
logTo.println(event.getMessage()); | |||||
} | |||||
break; | |||||
default: | |||||
err.println("Unrecognized event type = " + | |||||
event.getEventType()); | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
@@ -0,0 +1,145 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.cli.xml; | |||||
import java.util.Iterator; | |||||
import org.apache.ant.antcore.model.BuildElement; | |||||
import org.apache.ant.antcore.xml.ElementHandler; | |||||
import org.xml.sax.Attributes; | |||||
import org.xml.sax.SAXParseException; | |||||
/** | |||||
* A BuildElementHandler parses the task elements of a build. Task elements | |||||
* include tasks themselves plus all their nested elements to any depth. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 9 January 2002 | |||||
*/ | |||||
public class BuildElementHandler extends ElementHandler { | |||||
/** The task element being parsed by this handler. */ | |||||
private BuildElement buildElement; | |||||
/** | |||||
* Get the task element being parsed by this handler. | |||||
* | |||||
* @return the BuildElement being parsed. | |||||
*/ | |||||
public BuildElement getBuildElement() { | |||||
return buildElement; | |||||
} | |||||
/** | |||||
* Create a task element handler to parse a task element | |||||
* | |||||
* @param elementName the name of the element - always target | |||||
*/ | |||||
public void processElement(String elementName) { | |||||
buildElement | |||||
= new BuildElement(getLocation(), elementName); | |||||
for (Iterator i = getAttributes(); i.hasNext(); ) { | |||||
String attributeName = (String)i.next(); | |||||
buildElement.addAttribute(attributeName, | |||||
getAttribute(attributeName)); | |||||
} | |||||
buildElement.setAspects(getAspects()); | |||||
} | |||||
/** | |||||
* Process a nested element of this task element. All nested elements of | |||||
* a buildElement are themselves buildElements. | |||||
* | |||||
* @param uri The Namespace URI. | |||||
* @param localName The local name (without prefix). | |||||
* @param qualifiedName The qualified name (with prefix) | |||||
* @param attributes The attributes attached to the element. | |||||
* @throws SAXParseException if there is a parsing problem. | |||||
*/ | |||||
public void startElement(String uri, String localName, String qualifiedName, | |||||
Attributes attributes) | |||||
throws SAXParseException { | |||||
// everything within a task element is also a task element | |||||
BuildElementHandler nestedHandler | |||||
= new BuildElementHandler(); | |||||
nestedHandler.start(getParseContext(), getXMLReader(), | |||||
this, getLocator(), attributes, getElementSource(), qualifiedName); | |||||
buildElement.addNestedElement(nestedHandler.getBuildElement()); | |||||
} | |||||
/** | |||||
* This method is called when this element is finished being processed. | |||||
* This is a template method allowing subclasses to complete any | |||||
* necessary processing. | |||||
*/ | |||||
protected void finish() { | |||||
String content = getContent(); | |||||
if (content != null && content.trim().length() != 0) { | |||||
buildElement.addText(getContent()); | |||||
} | |||||
} | |||||
/** | |||||
* Validate that the given attribute and value are valid. | |||||
* | |||||
* @param attributeName The name of the attributes | |||||
* @param attributeValue The value of the attributes | |||||
*/ | |||||
protected void validateAttribute(String attributeName, | |||||
String attributeValue) { | |||||
// do nothing - all attributes are OK by default. | |||||
} | |||||
} | |||||
@@ -0,0 +1,139 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.cli.xml; | |||||
import java.net.MalformedURLException; | |||||
import java.net.URL; | |||||
import org.apache.ant.antcore.model.Project; | |||||
import org.apache.ant.antcore.xml.ElementHandler; | |||||
import org.apache.ant.antcore.xml.XMLParseException; | |||||
import org.xml.sax.SAXParseException; | |||||
/** | |||||
* The include handler is used to read in included projects or fragments | |||||
* into a project. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 11 January 2002 | |||||
*/ | |||||
public class IncludeHandler extends ElementHandler { | |||||
/** The attribute name which identifies the fragment to be included */ | |||||
public final static String SYSTEMID_ATTR = "fragment"; | |||||
/** The including project */ | |||||
private Project project; | |||||
/** | |||||
* Create an IncludeHandler. | |||||
* | |||||
* @param project the project into which the include fragment is to be | |||||
* placed | |||||
*/ | |||||
public IncludeHandler(Project project) { | |||||
this.project = project; | |||||
} | |||||
/** | |||||
* Process the element. | |||||
* | |||||
* @param elementName the name of the element | |||||
* @exception SAXParseException if there is a problem parsing the | |||||
* element | |||||
*/ | |||||
public void processElement(String elementName) | |||||
throws SAXParseException { | |||||
String includeSystemId = getAttribute(SYSTEMID_ATTR); | |||||
if (includeSystemId == null) { | |||||
throw new SAXParseException("Attribute " + SYSTEMID_ATTR + | |||||
" is required in an <include> element", getLocator()); | |||||
} | |||||
// create a new parser to read this project relative to the | |||||
// project's URI | |||||
try { | |||||
URL includeURL = new URL(getElementSource(), includeSystemId); | |||||
ProjectHandler includedProjectHandler = new ProjectHandler(project); | |||||
getParseContext().parse(includeURL, | |||||
new String[]{"project", "fragment"}, | |||||
includedProjectHandler); | |||||
} catch (MalformedURLException e) { | |||||
throw new SAXParseException("Unable to include " + includeSystemId | |||||
+ ": " + e.getMessage(), getLocator()); | |||||
} catch (XMLParseException e) { | |||||
throw new SAXParseException("Error parsing included project " | |||||
+ includeSystemId + ": " + e.getMessage(), getLocator()); | |||||
} | |||||
} | |||||
/** | |||||
* Validate that the given attribute and value are valid. | |||||
* | |||||
* @param attributeName The name of the attributes | |||||
* @param attributeValue The value of the attributes | |||||
* @exception SAXParseException if the attribute is not allowed on the | |||||
* element. | |||||
*/ | |||||
protected void validateAttribute(String attributeName, | |||||
String attributeValue) | |||||
throws SAXParseException { | |||||
if (!attributeName.equals(SYSTEMID_ATTR)) { | |||||
throwInvalidAttribute(attributeName); | |||||
} | |||||
} | |||||
} | |||||
@@ -0,0 +1,65 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.cli.xml; | |||||
/** | |||||
* A NoProjectReadException is used to indicate that a project was not read | |||||
* from the particular source. This will happen if the source is empty. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 15 January 2002 | |||||
*/ | |||||
public class NoProjectReadException extends Exception { | |||||
} | |||||
@@ -0,0 +1,206 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.cli.xml; | |||||
import org.apache.ant.antcore.model.ModelException; | |||||
import org.apache.ant.antcore.model.Project; | |||||
import org.apache.ant.antcore.xml.ElementHandler; | |||||
import org.xml.sax.Attributes; | |||||
import org.xml.sax.SAXParseException; | |||||
/** | |||||
* Element to parse the project element. The project handler creates a | |||||
* number of different handlers to which it delegates processing of child | |||||
* elements. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 9 January 2002 | |||||
*/ | |||||
public class ProjectHandler extends ElementHandler { | |||||
/** The basedir attribute tag */ | |||||
public final static String BASEDIR_ATTR = "basedir"; | |||||
/** The name attribute */ | |||||
public final static String NAME_ATTR = "name"; | |||||
/** The default attribute name */ | |||||
public final static String DEFAULT_ATTR = "default"; | |||||
/** The project being parsed. */ | |||||
private Project project; | |||||
/** Constructor parsing a new project */ | |||||
public ProjectHandler() { | |||||
project = null; | |||||
} | |||||
/** | |||||
* Constructor for including a project or fragment into an existing | |||||
* project | |||||
* | |||||
* @param project The project to be configured by the handler | |||||
*/ | |||||
public ProjectHandler(Project project) { | |||||
this.project = project; | |||||
} | |||||
/** | |||||
* Get the project that has been parsed from the element | |||||
* | |||||
* @return the project that has been parsed from the build source | |||||
* @throws NoProjectReadException thrown if no project was read in. | |||||
*/ | |||||
public Project getProject() | |||||
throws NoProjectReadException { | |||||
if (project == null) { | |||||
throw new NoProjectReadException(); | |||||
} | |||||
return project; | |||||
} | |||||
/** | |||||
* Process the project element | |||||
* | |||||
* @param elementName the name of the element | |||||
* @exception SAXParseException if there is a problem parsing the | |||||
* element | |||||
*/ | |||||
public void processElement(String elementName) | |||||
throws SAXParseException { | |||||
if (project == null) { | |||||
project = new Project(getElementSource(), getLocation()); | |||||
project.setDefaultTarget(getAttribute(DEFAULT_ATTR)); | |||||
project.setBase(getAttribute(BASEDIR_ATTR)); | |||||
project.setName(getAttribute(NAME_ATTR)); | |||||
project.setAspects(getAspects()); | |||||
} | |||||
} | |||||
/** | |||||
* Start a new element in the project. Project currently handles the | |||||
* following elements | |||||
* <ul> | |||||
* <li> ref</li> | |||||
* <li> include</li> | |||||
* <li> target</li> | |||||
* </ul> | |||||
* Everything else is treated as a task. | |||||
* | |||||
* @param uri The Namespace URI. | |||||
* @param localName The local name (without prefix). | |||||
* @param qualifiedName The qualified name (with prefix) | |||||
* @param attributes The attributes attached to the element. | |||||
* @throws SAXParseException if there is a parsing problem. | |||||
*/ | |||||
public void startElement(String uri, String localName, String qualifiedName, | |||||
Attributes attributes) | |||||
throws SAXParseException { | |||||
if (qualifiedName.equals("ref")) { | |||||
RefHandler refHandler = new RefHandler(); | |||||
refHandler.start(getParseContext(), getXMLReader(), this, | |||||
getLocator(), attributes, getElementSource(), | |||||
qualifiedName); | |||||
try { | |||||
project.referenceProject(refHandler.getRefName(), | |||||
refHandler.getReferencedProject()); | |||||
} catch (ModelException e) { | |||||
throw new SAXParseException(e.getMessage(), getLocator(), e); | |||||
} | |||||
} else if (qualifiedName.equals("include")) { | |||||
IncludeHandler includeHandler = new IncludeHandler(project); | |||||
includeHandler.start(getParseContext(), getXMLReader(), | |||||
this, getLocator(), attributes, getElementSource(), | |||||
qualifiedName); | |||||
} else if (qualifiedName.equals("target")) { | |||||
TargetHandler targetHandler = new TargetHandler(); | |||||
targetHandler.start(getParseContext(), getXMLReader(), | |||||
this, getLocator(), attributes, | |||||
getElementSource(), qualifiedName); | |||||
try { | |||||
project.addTarget(targetHandler.getTarget()); | |||||
} catch (ModelException e) { | |||||
throw new SAXParseException(e.getMessage(), getLocator(), e); | |||||
} | |||||
} else { | |||||
// everything else is a task | |||||
BuildElementHandler buildElementHandler = new BuildElementHandler(); | |||||
buildElementHandler.start(getParseContext(), getXMLReader(), | |||||
this, getLocator(), attributes, getElementSource(), | |||||
qualifiedName); | |||||
project.addTask(buildElementHandler.getBuildElement()); | |||||
} | |||||
} | |||||
/** | |||||
* Validate that the given attribute and value are valid. | |||||
* | |||||
* @param attributeName The name of the attributes | |||||
* @param attributeValue The value of the attributes | |||||
* @exception SAXParseException if the attribute is not allowed on the | |||||
* element. | |||||
*/ | |||||
protected void validateAttribute(String attributeName, | |||||
String attributeValue) | |||||
throws SAXParseException { | |||||
if (!attributeName.equals(BASEDIR_ATTR) && | |||||
!attributeName.equals(NAME_ATTR) && | |||||
!attributeName.equals(DEFAULT_ATTR)) { | |||||
throwInvalidAttribute(attributeName); | |||||
} | |||||
} | |||||
} | |||||
@@ -0,0 +1,161 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.cli.xml; | |||||
import java.net.MalformedURLException; | |||||
import java.net.URL; | |||||
import org.apache.ant.antcore.model.Project; | |||||
import org.apache.ant.antcore.xml.ElementHandler; | |||||
import org.apache.ant.antcore.xml.XMLParseException; | |||||
import org.xml.sax.SAXParseException; | |||||
/** | |||||
* The Ref handler handles the reference of one project to another. The | |||||
* project to be references is parsed with a new parser and then added to | |||||
* the current project under the given alias | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 10 January 2002 | |||||
*/ | |||||
public class RefHandler extends ElementHandler { | |||||
/** The attribute used to name the ref. */ | |||||
public final static String NAME_ATTR = "name"; | |||||
/** The attribute name used to locate the project to be referenced. */ | |||||
public final static String SYSTEMID_ATTR = "project"; | |||||
/** The project that has been referenced. */ | |||||
private Project referencedProject; | |||||
/** | |||||
* Get the project referenced. | |||||
* | |||||
* @return an referenced Project. | |||||
*/ | |||||
public Project getReferencedProject() { | |||||
return referencedProject; | |||||
} | |||||
/** | |||||
* Get the name under which the project is referenced. | |||||
* | |||||
* @return the ref name of the project | |||||
*/ | |||||
public String getRefName() { | |||||
return getAttribute(NAME_ATTR); | |||||
} | |||||
/** | |||||
* Create an ref handler to reference a project. | |||||
* | |||||
* @param elementName the name of the ref element | |||||
* @exception SAXParseException if the ref element could not be parsed | |||||
*/ | |||||
public void processElement(String elementName) | |||||
throws SAXParseException { | |||||
String refName = getAttribute(NAME_ATTR); | |||||
if (refName == null) { | |||||
throw new SAXParseException("Attribute " + NAME_ATTR + | |||||
" is required in a <ref> element", getLocator()); | |||||
} | |||||
String projectSystemId = getAttribute(SYSTEMID_ATTR); | |||||
if (projectSystemId == null) { | |||||
throw new SAXParseException("Attribute " + SYSTEMID_ATTR + | |||||
" is required in a <ref> element", getLocator()); | |||||
} | |||||
// create a new parser to read this project relative to the | |||||
// project's URI | |||||
try { | |||||
URL refURL = new URL(getElementSource(), projectSystemId); | |||||
ProjectHandler referencedProjectHandler = new ProjectHandler(); | |||||
getParseContext().parse(refURL, "project", | |||||
referencedProjectHandler); | |||||
referencedProject = referencedProjectHandler.getProject(); | |||||
} catch (XMLParseException e) { | |||||
throw new SAXParseException("Error parsing referenced project " | |||||
+ projectSystemId + ": " + e.getMessage(), getLocator()); | |||||
} catch (NoProjectReadException e) { | |||||
throw new SAXParseException("No project found in the reference: " | |||||
+ projectSystemId, getLocator()); | |||||
} catch (MalformedURLException e) { | |||||
throw new SAXParseException("Unable to reference project " | |||||
+ projectSystemId + ": " + e.getMessage(), | |||||
getLocator()); | |||||
} | |||||
} | |||||
/** | |||||
* Validate that the given attribute and value are valid. | |||||
* | |||||
* @param attributeName The name of the attributes | |||||
* @param attributeValue The value of the attributes | |||||
* @exception SAXParseException if the attribute is not allowed on the | |||||
* element. | |||||
*/ | |||||
protected void validateAttribute(String attributeName, | |||||
String attributeValue) | |||||
throws SAXParseException { | |||||
if (!attributeName.equals(SYSTEMID_ATTR) && | |||||
!attributeName.equals(NAME_ATTR)) { | |||||
throwInvalidAttribute(attributeName); | |||||
} | |||||
} | |||||
} | |||||
@@ -0,0 +1,155 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.cli.xml; | |||||
import java.util.StringTokenizer; | |||||
import org.apache.ant.antcore.model.Target; | |||||
import org.apache.ant.antcore.xml.ElementHandler; | |||||
import org.xml.sax.Attributes; | |||||
import org.xml.sax.SAXParseException; | |||||
/** | |||||
* Element handler for the target element | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 9 January 2002 | |||||
*/ | |||||
public class TargetHandler extends ElementHandler { | |||||
/** The name attribute */ | |||||
public final static String NAME_ATTR = "name"; | |||||
/** The depends attribute name */ | |||||
public final static String DEPENDS_ATTR = "depends"; | |||||
/** The depends attribute name */ | |||||
public final static String DESC_ATTR = "description"; | |||||
/** The target being configured. */ | |||||
private Target target; | |||||
/** | |||||
* Get the target parsed by this handler. | |||||
* | |||||
* @return the Target model object parsed by this handler. | |||||
*/ | |||||
public Target getTarget() { | |||||
return target; | |||||
} | |||||
/** | |||||
* Process the target element. | |||||
* | |||||
* @param elementName the name of the element | |||||
* @exception SAXParseException if there is a problem parsing the | |||||
* element | |||||
*/ | |||||
public void processElement(String elementName) | |||||
throws SAXParseException { | |||||
String targetName = null; | |||||
target = new Target(getLocation(), getAttribute(NAME_ATTR)); | |||||
target.setDescription(getAttribute(DESC_ATTR)); | |||||
target.setAspects(getAspects()); | |||||
String depends = getAttribute(DEPENDS_ATTR); | |||||
if (depends != null) { | |||||
StringTokenizer tokenizer = new StringTokenizer(depends, ","); | |||||
while (tokenizer.hasMoreTokens()) { | |||||
String dependency = tokenizer.nextToken(); | |||||
target.addDependency(dependency); | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* Process an element within this target. All elements within the target | |||||
* are treated as tasks. | |||||
* | |||||
* @param uri The Namespace URI. | |||||
* @param localName The local name (without prefix). | |||||
* @param qualifiedName The qualified name (with prefix) | |||||
* @param attributes The attributes attached to the element. | |||||
* @throws SAXParseException if there is a parsing problem. | |||||
*/ | |||||
public void startElement(String uri, String localName, String qualifiedName, | |||||
Attributes attributes) | |||||
throws SAXParseException { | |||||
// everything is a task | |||||
BuildElementHandler taskHandler = new BuildElementHandler(); | |||||
taskHandler.start(getParseContext(), getXMLReader(), this, getLocator(), | |||||
attributes, getElementSource(), qualifiedName); | |||||
target.addTask(taskHandler.getBuildElement()); | |||||
} | |||||
/** | |||||
* Validate that the given attribute and value are valid. | |||||
* | |||||
* @param attributeName The name of the attributes | |||||
* @param attributeValue The value of the attributes | |||||
* @exception SAXParseException if the attribute is not allowed on the | |||||
* element. | |||||
*/ | |||||
protected void validateAttribute(String attributeName, | |||||
String attributeValue) | |||||
throws SAXParseException { | |||||
if (!attributeName.equals(NAME_ATTR) && | |||||
!attributeName.equals(DEPENDS_ATTR) && | |||||
!attributeName.equals(DESC_ATTR)) { | |||||
throwInvalidAttribute(attributeName); | |||||
} | |||||
} | |||||
} | |||||
@@ -0,0 +1,92 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.cli.xml; | |||||
import java.net.URL; | |||||
import org.apache.ant.common.util.Location; | |||||
import org.apache.ant.antcore.model.Project; | |||||
import org.apache.ant.antcore.xml.ParseContext; | |||||
import org.apache.ant.antcore.xml.XMLParseException; | |||||
/** | |||||
* Parses an Ant project model from an XML source using a SAX Parser. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 9 January 2002 | |||||
*/ | |||||
public class XMLProjectParser { | |||||
/** | |||||
* Parse a build file from the given URL. | |||||
* | |||||
* @param buildSource the URL from where the build source may be read. | |||||
* @return a project model representing the project | |||||
* @exception XMLParseException if there is an problem parsing the XML | |||||
* representation | |||||
*/ | |||||
public Project parseBuildFile(URL buildSource) | |||||
throws XMLParseException { | |||||
try { | |||||
ParseContext context = new ParseContext(); | |||||
ProjectHandler projectHandler = new ProjectHandler(); | |||||
context.parse(buildSource, "project", projectHandler); | |||||
return projectHandler.getProject(); | |||||
} catch (NoProjectReadException e) { | |||||
throw new XMLParseException("No project defined in build source ", | |||||
e, new Location(buildSource.toString())); | |||||
} | |||||
} | |||||
} | |||||
@@ -0,0 +1,85 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.common.context; | |||||
import java.io.File; | |||||
import org.apache.ant.common.util.AntException; | |||||
/** | |||||
* The TaskContext is the interface through which the Ant Task container and | |||||
* the Task instances communicate | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 14 January 2002 | |||||
*/ | |||||
public abstract class AntContext { | |||||
/** | |||||
* Log a message | |||||
* | |||||
* @param message the message to be logged | |||||
* @param level the priority level of the message | |||||
*/ | |||||
public abstract void log(String message, int level); | |||||
/** | |||||
* Resolve a file according to the base directory of the project | |||||
* associated with this context | |||||
* | |||||
* @param fileName the file name to be resolved. | |||||
* @return the file resolved to the project's base dir | |||||
* @exception AntException if the file cannot be resolved | |||||
*/ | |||||
public abstract File resolveFile(String fileName) throws AntException; | |||||
} | |||||
@@ -0,0 +1,86 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.common.converter; | |||||
import org.apache.ant.common.context.AntContext; | |||||
/** | |||||
* Abstract implementation of the Converter interface | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public abstract class AbstractConverter implements Converter { | |||||
/** The converters's context */ | |||||
private AntContext context; | |||||
/** | |||||
* Initialise the converter. The converter may use the AntContext to request | |||||
* services from the Ant core. | |||||
* | |||||
* @param context the Converter's context | |||||
*/ | |||||
public void init(AntContext context) { | |||||
this.context = context; | |||||
} | |||||
/** | |||||
* Get this converter's context | |||||
* | |||||
* @return the converter context | |||||
*/ | |||||
protected AntContext getContext() { | |||||
return context; | |||||
} | |||||
} | |||||
@@ -0,0 +1,135 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.common.converter; | |||||
import org.apache.ant.common.util.AntException; | |||||
import org.apache.ant.common.util.Location; | |||||
/** | |||||
* Exception class for problems when converting values | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 20 January 2002 | |||||
*/ | |||||
public class ConversionException extends AntException { | |||||
/** | |||||
* Constructs an exception with the given descriptive message. | |||||
* | |||||
* @param msg Description of or information about the exception. | |||||
*/ | |||||
public ConversionException(String msg) { | |||||
super(msg); | |||||
} | |||||
/** | |||||
* 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 ConversionException(String msg, Location location) { | |||||
super(msg, location); | |||||
} | |||||
/** | |||||
* Constructs an exception with the given message and exception as a | |||||
* root cause. | |||||
* | |||||
* @param msg Description of or information about the exception. | |||||
* @param cause Throwable that might have cause this one. | |||||
*/ | |||||
public ConversionException(String msg, Throwable cause) { | |||||
super(msg, 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 ConversionException(String msg, Throwable cause, Location location) { | |||||
super(msg, cause, location); | |||||
} | |||||
/** | |||||
* Constructs an exception with the given exception as a root cause. | |||||
* | |||||
* @param cause Exception that might have caused this one. | |||||
*/ | |||||
public ConversionException(Throwable cause) { | |||||
super(cause); | |||||
} | |||||
/** | |||||
* Constructs an exception with the given exception as a root cause and | |||||
* a location in a file. | |||||
* | |||||
* @param cause Exception that might have cause this one. | |||||
* @param location Location in the project file where the error occured. | |||||
*/ | |||||
public ConversionException(Throwable cause, Location location) { | |||||
super(cause, location); | |||||
} | |||||
} | |||||
@@ -0,0 +1,92 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.common.converter; | |||||
import org.apache.ant.common.context.AntContext; | |||||
/** | |||||
* Convert between a string and a data type | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 19 January 2002 | |||||
*/ | |||||
public interface Converter { | |||||
/** | |||||
* Convert a string from the value given to an instance of the given | |||||
* type. | |||||
* | |||||
* @param value The value to be converted | |||||
* @param type the desired type of the converted object | |||||
* @return the value of the converted object | |||||
* @exception ConversionException if the conversion cannot be made | |||||
*/ | |||||
Object convert(String value, Class type) throws ConversionException; | |||||
/** | |||||
* Initialise the converter. The converter may use the AntContext to | |||||
* request services from the Ant core. | |||||
* | |||||
* @param context the Converter's AntContext | |||||
*/ | |||||
void init(AntContext context); | |||||
/** | |||||
* Get the list of classes this converter is able to convert to. | |||||
* | |||||
* @return an array of Class objects representing the classes this | |||||
* converter handles. | |||||
*/ | |||||
Class[] getTypes(); | |||||
} | |||||
@@ -0,0 +1,101 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.common.task; | |||||
import org.apache.ant.common.context.AntContext; | |||||
/** | |||||
* Abstract implementation of the Task interface | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 16 January 2002 | |||||
*/ | |||||
public abstract class AbstractTask implements Task { | |||||
/** The task's context */ | |||||
private AntContext context; | |||||
/** | |||||
* Initialise the task. The task may use the AntContext to request | |||||
* services from the Ant core. | |||||
* | |||||
* @param context the Task's context | |||||
*/ | |||||
public void init(AntContext context) { | |||||
this.context = context; | |||||
} | |||||
/** Task is about to be cleaned up */ | |||||
public void destroy() { | |||||
// do nothing here | |||||
} | |||||
/** | |||||
* Get this task's context | |||||
* | |||||
* @return the task context | |||||
*/ | |||||
protected AntContext getContext() { | |||||
return context; | |||||
} | |||||
/** | |||||
* Log a message as a build event | |||||
* | |||||
* @param message the message to be logged | |||||
* @param level the priority level of the message | |||||
*/ | |||||
protected void log(String message, int level) { | |||||
context.log(message, level); | |||||
} | |||||
} | |||||
@@ -0,0 +1,74 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.common.task; | |||||
import org.apache.ant.common.context.AntContext; | |||||
/** | |||||
* This is the interface used to descibe Ant types. A class used as a | |||||
* datatype which implements this interface will be given an AntContext | |||||
* instance through which it may interact with the Ant core. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 20 January 2002 | |||||
*/ | |||||
public interface DataType { | |||||
/** | |||||
* Initialise the type instance. The type instance may use the | |||||
* AntContext to request services from the Ant core. | |||||
* | |||||
* @param context the type's context | |||||
*/ | |||||
void init(AntContext context); | |||||
} | |||||
@@ -0,0 +1,82 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.common.task; | |||||
import org.apache.ant.common.context.AntContext; | |||||
/** | |||||
* The Task interface defines the methods that a Task must implement. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 16 January 2002 | |||||
*/ | |||||
public interface Task { | |||||
/** | |||||
* Initialise the task. The task may use the AntContext to request | |||||
* services from the Ant core. | |||||
* | |||||
* @param context the Task's context | |||||
*/ | |||||
void init(AntContext context); | |||||
/** | |||||
* Execute the task. | |||||
* | |||||
* @exception TaskException if the task has a problem executing. | |||||
*/ | |||||
void execute() throws TaskException; | |||||
/** Task is about to be cleaned up */ | |||||
void destroy(); | |||||
} | |||||
@@ -0,0 +1,71 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.common.task; | |||||
/** | |||||
* A TaskContainer is an object which can contain and manage ExecutionTasks. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 19 January 2002 | |||||
*/ | |||||
public interface TaskContainer { | |||||
/** | |||||
* Add a task to the container. | |||||
* | |||||
* @param task the task tobe added | |||||
* @exception TaskException if the container cannot add the task | |||||
*/ | |||||
void addTask(Task task) throws TaskException; | |||||
} | |||||
@@ -0,0 +1,135 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.common.task; | |||||
import org.apache.ant.common.util.AntException; | |||||
import org.apache.ant.common.util.Location; | |||||
/** | |||||
* An TaskException indicates a problem while executing tasks in a build | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 16 January 2002 | |||||
*/ | |||||
public class TaskException extends AntException { | |||||
/** | |||||
* Constructs an exception with the given descriptive message. | |||||
* | |||||
* @param msg Description of or information about the exception. | |||||
*/ | |||||
public TaskException(String msg) { | |||||
super(msg); | |||||
} | |||||
/** | |||||
* 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 TaskException(String msg, Location location) { | |||||
super(msg, location); | |||||
} | |||||
/** | |||||
* Constructs an exception with the given message and exception as a | |||||
* root cause. | |||||
* | |||||
* @param msg Description of or information about the exception. | |||||
* @param cause Throwable that might have cause this one. | |||||
*/ | |||||
public TaskException(String msg, Throwable cause) { | |||||
super(msg, 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 TaskException(String msg, Throwable cause, Location location) { | |||||
super(msg, cause, location); | |||||
} | |||||
/** | |||||
* Constructs an exception with the given exception as a root cause. | |||||
* | |||||
* @param cause Exception that might have caused this one. | |||||
*/ | |||||
public TaskException(Throwable cause) { | |||||
super(cause); | |||||
} | |||||
/** | |||||
* Constructs an exception with the given exception as a root cause and | |||||
* a location in a file. | |||||
* | |||||
* @param cause Exception that might have cause this one. | |||||
* @param location Location in the project file where the error occured. | |||||
*/ | |||||
public TaskException(Throwable cause, Location location) { | |||||
super(cause, location); | |||||
} | |||||
} | |||||
@@ -0,0 +1,213 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.common.util; | |||||
import java.io.PrintStream; | |||||
import java.io.PrintWriter; | |||||
/** | |||||
* An AntException indicates some exceptional case has been encountered in | |||||
* the processing of Ant. AntExceptions may accept a Throwable as a cause | |||||
* allowing exceptions to be nested | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 15 January 2002 | |||||
*/ | |||||
public abstract class AntException extends Exception { | |||||
/** Exception that might have caused this one. */ | |||||
private Throwable cause = null; | |||||
/** | |||||
* The location of the element which is associated with this exception | |||||
* if known. | |||||
*/ | |||||
private Location location = Location.UNKNOWN_LOCATION; | |||||
/** | |||||
* Constructs an exception with the given descriptive message. | |||||
* | |||||
* @param msg Description of or information about the exception. | |||||
*/ | |||||
public AntException(String msg) { | |||||
super(msg); | |||||
} | |||||
/** | |||||
* Constructs an exception with the given message and exception as a | |||||
* root cause. | |||||
* | |||||
* @param msg Description of or information about the exception. | |||||
* @param cause Throwable that might have cause this one. | |||||
*/ | |||||
public AntException(String msg, Throwable cause) { | |||||
super(msg); | |||||
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 AntException(String msg, Throwable cause, Location location) { | |||||
this(msg, cause); | |||||
setLocation(location); | |||||
} | |||||
/** | |||||
* Constructs an exception with the given exception as a root cause. | |||||
* | |||||
* @param cause Exception that might have caused this one. | |||||
*/ | |||||
public AntException(Throwable cause) { | |||||
super(cause.getMessage()); | |||||
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 AntException(String msg, Location location) { | |||||
super(msg); | |||||
setLocation(location); | |||||
} | |||||
/** | |||||
* Constructs an exception with the given exception as a root cause and | |||||
* a location in a file. | |||||
* | |||||
* @param cause Exception that might have cause this one. | |||||
* @param location Location in the project file where the error occured. | |||||
*/ | |||||
public AntException(Throwable cause, Location location) { | |||||
this(cause); | |||||
setLocation(location); | |||||
} | |||||
/** | |||||
* Sets the file location where the error occured. | |||||
* | |||||
* @param location the new location value | |||||
*/ | |||||
public void setLocation(Location location) { | |||||
if (location == null) { | |||||
this.location = Location.UNKNOWN_LOCATION; | |||||
} else { | |||||
this.location = location; | |||||
} | |||||
} | |||||
/** | |||||
* Returns the nested exception. | |||||
* | |||||
* @return the underlying exception | |||||
*/ | |||||
public Throwable getCause() { | |||||
return cause; | |||||
} | |||||
/** | |||||
* Returns the file location where the error occured. | |||||
* | |||||
* @return the location value | |||||
*/ | |||||
public Location getLocation() { | |||||
return location; | |||||
} | |||||
/** Print the stack trace to System.err */ | |||||
public void printStackTrace() { | |||||
printStackTrace(System.err); | |||||
} | |||||
/** | |||||
* Print the stack trace to the given PrintStream | |||||
* | |||||
* @param ps the PrintStream onto which the stack trace of this | |||||
* exception is to be printed | |||||
*/ | |||||
public void printStackTrace(PrintStream ps) { | |||||
synchronized (ps) { | |||||
super.printStackTrace(ps); | |||||
if (cause != null) { | |||||
ps.println("--- Nested Exception ---"); | |||||
cause.printStackTrace(ps); | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* Print the stack trace to the given PrintWriter | |||||
* | |||||
* @param pw the PrintWriter onto which the stack trace of this | |||||
* exception is to be printed | |||||
*/ | |||||
public void printStackTrace(PrintWriter pw) { | |||||
synchronized (pw) { | |||||
super.printStackTrace(pw); | |||||
if (cause != null) { | |||||
pw.println("--- Nested Exception ---"); | |||||
cause.printStackTrace(pw); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
@@ -0,0 +1,243 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001-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.ant.common.util; | |||||
import java.io.File; | |||||
import java.util.Stack; | |||||
import java.util.StringTokenizer; | |||||
/** | |||||
* This class encapsulates methods which allow Files to be refered to using | |||||
* abstract path names which are translated to native system file paths at | |||||
* runtime as well as copying files or setting there last modification time. | |||||
* | |||||
* @author duncan@x180.com | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||||
* @created 21 January 2002 | |||||
*/ | |||||
public class FileUtils { | |||||
/** | |||||
* Interpret the filename as a file relative to the given file - unless | |||||
* the filename already represents an absolute filename. | |||||
* | |||||
* @param file the "reference" file for relative paths. This instance | |||||
* must be an absolute file and must not contain "./" or | |||||
* "../" sequences (same for \ instead of /). If it is | |||||
* null, this call is equivalent to | |||||
* <code>new java.io.File(filename)</code> | |||||
* . | |||||
* @param filename a file name | |||||
* @return an absolute file that doesn't contain "./" or | |||||
* "../" sequences and uses the correct separator for the | |||||
* current platform. | |||||
* @exception GeneralAntException if the file cannot be resolved | |||||
*/ | |||||
public File resolveFile(File file, String filename) | |||||
throws GeneralAntException { | |||||
filename = filename.replace('/', File.separatorChar) | |||||
.replace('\\', File.separatorChar); | |||||
// deal with absolute files | |||||
if (filename.startsWith(File.separator) || | |||||
(filename.length() >= 2 && | |||||
Character.isLetter(filename.charAt(0)) && | |||||
filename.charAt(1) == ':') | |||||
) { | |||||
return normalize(filename); | |||||
} | |||||
if (file == null) { | |||||
return new File(filename); | |||||
} | |||||
File helpFile = new File(file.getAbsolutePath()); | |||||
StringTokenizer tok = new StringTokenizer(filename, File.separator); | |||||
while (tok.hasMoreTokens()) { | |||||
String part = tok.nextToken(); | |||||
if (part.equals("..")) { | |||||
helpFile = helpFile.getParentFile(); | |||||
if (helpFile == null) { | |||||
String msg = "The file or path you specified (" | |||||
+ filename + ") is invalid relative to " | |||||
+ file.getPath(); | |||||
throw new GeneralAntException(msg); | |||||
} | |||||
} else if (part.equals(".")) { | |||||
// Do nothing here | |||||
} else { | |||||
helpFile = new File(helpFile, part); | |||||
} | |||||
} | |||||
return new File(helpFile.getAbsolutePath()); | |||||
} | |||||
/** | |||||
* "normalize" the given absolute path. <p> | |||||
* | |||||
* This includes: | |||||
* <ul> | |||||
* <li> Uppercase the drive letter if there is one.</li> | |||||
* <li> Remove redundant slashes after the drive spec.</li> | |||||
* <li> resolve all ./, .\, ../ and ..\ sequences.</li> | |||||
* <li> DOS style paths that start with a drive letter will have \ as | |||||
* the separator.</li> | |||||
* </ul> | |||||
* | |||||
* | |||||
* @param path the path to be normalized | |||||
* @return the normalized path | |||||
* @exception GeneralAntException if there is a problem with the path | |||||
* @throws NullPointerException if the file path is equal to null. | |||||
*/ | |||||
public File normalize(String path) | |||||
throws NullPointerException, GeneralAntException { | |||||
String orig = path; | |||||
path = path.replace('/', File.separatorChar) | |||||
.replace('\\', File.separatorChar); | |||||
// make sure we are dealing with an absolute path | |||||
if (!path.startsWith(File.separator) && | |||||
!(path.length() >= 2 && | |||||
Character.isLetter(path.charAt(0)) && | |||||
path.charAt(1) == ':') | |||||
) { | |||||
String msg = path + " is not an absolute path"; | |||||
throw new GeneralAntException(msg); | |||||
} | |||||
boolean dosWithDrive = false; | |||||
String root = null; | |||||
// Eliminate consecutive slashes after the drive spec | |||||
if (path.length() >= 2 && | |||||
Character.isLetter(path.charAt(0)) && | |||||
path.charAt(1) == ':') { | |||||
dosWithDrive = true; | |||||
char[] ca = path.replace('/', '\\').toCharArray(); | |||||
StringBuffer sb = new StringBuffer(); | |||||
sb.append(Character.toUpperCase(ca[0])).append(':'); | |||||
for (int i = 2; i < ca.length; i++) { | |||||
if ((ca[i] != '\\') || | |||||
(ca[i] == '\\' && ca[i - 1] != '\\') | |||||
) { | |||||
sb.append(ca[i]); | |||||
} | |||||
} | |||||
path = sb.toString().replace('\\', File.separatorChar); | |||||
if (path.length() == 2) { | |||||
root = path; | |||||
path = ""; | |||||
} else { | |||||
root = path.substring(0, 3); | |||||
path = path.substring(3); | |||||
} | |||||
} else { | |||||
if (path.length() == 1) { | |||||
root = File.separator; | |||||
path = ""; | |||||
} else if (path.charAt(1) == File.separatorChar) { | |||||
// UNC drive | |||||
root = File.separator + File.separator; | |||||
path = path.substring(2); | |||||
} else { | |||||
root = File.separator; | |||||
path = path.substring(1); | |||||
} | |||||
} | |||||
Stack s = new Stack(); | |||||
s.push(root); | |||||
StringTokenizer tok = new StringTokenizer(path, File.separator); | |||||
while (tok.hasMoreTokens()) { | |||||
String thisToken = tok.nextToken(); | |||||
if (".".equals(thisToken)) { | |||||
continue; | |||||
} else if ("..".equals(thisToken)) { | |||||
if (s.size() < 2) { | |||||
throw new GeneralAntException("Cannot resolve path " | |||||
+ orig); | |||||
} else { | |||||
s.pop(); | |||||
} | |||||
} else {// plain component | |||||
s.push(thisToken); | |||||
} | |||||
} | |||||
StringBuffer sb = new StringBuffer(); | |||||
for (int i = 0; i < s.size(); i++) { | |||||
if (i > 1) { | |||||
// not before the filesystem root and not after it, since root | |||||
// already contains one | |||||
sb.append(File.separatorChar); | |||||
} | |||||
sb.append(s.elementAt(i)); | |||||
} | |||||
path = sb.toString(); | |||||
if (dosWithDrive) { | |||||
path = path.replace('/', '\\'); | |||||
} | |||||
return new File(path); | |||||
} | |||||
} | |||||
@@ -0,0 +1,133 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.common.util; | |||||
/** | |||||
* An GeneralAntException is used to for any exception case for which there | |||||
* is no specific AntException subclass which is appropriate | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 21 January 2002 | |||||
*/ | |||||
public class GeneralAntException extends AntException { | |||||
/** | |||||
* Constructs an exception with the given descriptive message. | |||||
* | |||||
* @param msg Description of or information about the exception. | |||||
*/ | |||||
public GeneralAntException(String msg) { | |||||
super(msg); | |||||
} | |||||
/** | |||||
* 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 GeneralAntException(String msg, Location location) { | |||||
super(msg, location); | |||||
} | |||||
/** | |||||
* Constructs an exception with the given message and exception as a | |||||
* root cause. | |||||
* | |||||
* @param msg Description of or information about the exception. | |||||
* @param cause Throwable that might have cause this one. | |||||
*/ | |||||
public GeneralAntException(String msg, Throwable cause) { | |||||
super(msg, 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 GeneralAntException(String msg, Throwable cause, Location location) { | |||||
super(msg, cause, location); | |||||
} | |||||
/** | |||||
* Constructs an exception with the given exception as a root cause. | |||||
* | |||||
* @param cause Exception that might have caused this one. | |||||
*/ | |||||
public GeneralAntException(Throwable cause) { | |||||
super(cause); | |||||
} | |||||
/** | |||||
* Constructs an exception with the given exception as a root cause and | |||||
* a location in a file. | |||||
* | |||||
* @param cause Exception that might have cause this one. | |||||
* @param location Location in the project file where the error occured. | |||||
*/ | |||||
public GeneralAntException(Throwable cause, Location location) { | |||||
super(cause, location); | |||||
} | |||||
} | |||||
@@ -0,0 +1,159 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.common.util; | |||||
/** | |||||
* Stores the file name and line number in a file. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 16 January 2002 | |||||
*/ | |||||
public class Location { | |||||
/** Standard unknown location constant; */ | |||||
public final static Location UNKNOWN_LOCATION = new Location(); | |||||
/** The source URL to which this location relates. */ | |||||
private String source; | |||||
/** The line number of this location within the source */ | |||||
private int lineNumber; | |||||
/** The column number of this location within the source */ | |||||
private int columnNumber; | |||||
/** | |||||
* Creates a location consisting of a source location but no line | |||||
* number. | |||||
* | |||||
* @param source the source (URL) to which this location is associated. | |||||
*/ | |||||
public Location(String source) { | |||||
this(source, 1, 1); | |||||
} | |||||
/** | |||||
* Creates a location consisting of a source location and co-ordinates | |||||
* within that source | |||||
* | |||||
* @param source the source (URL) to which this location is associated. | |||||
* @param lineNumber the line number of this location | |||||
* @param columnNumber the column number of this location | |||||
*/ | |||||
public Location(String source, int lineNumber, int columnNumber) { | |||||
this.source = source; | |||||
this.lineNumber = lineNumber; | |||||
this.columnNumber = columnNumber; | |||||
} | |||||
/** Creates an "unknown" location. */ | |||||
private Location() { | |||||
this(null, 0, 0); | |||||
} | |||||
/** | |||||
* Get the source URL for this location | |||||
* | |||||
* @return a URL string | |||||
*/ | |||||
public String getSourceURL() { | |||||
return source; | |||||
} | |||||
/** | |||||
* Get the line number of this location | |||||
* | |||||
* @return an integer line number | |||||
*/ | |||||
public int getLineNumber() { | |||||
return lineNumber; | |||||
} | |||||
/** | |||||
* Get the column number of this location | |||||
* | |||||
* @return an integer column number | |||||
*/ | |||||
public int getColumnNumber() { | |||||
return columnNumber; | |||||
} | |||||
/** | |||||
* Returns the source name, line number and a trailing space. An error | |||||
* message can be appended easily. For unknown locations, returns an | |||||
* empty string. | |||||
* | |||||
* @return a suitable string representation of the location | |||||
*/ | |||||
public String toString() { | |||||
StringBuffer buf = new StringBuffer(); | |||||
if (source != null) { | |||||
if (source.startsWith("file:")) { | |||||
buf.append(source.substring(5)); | |||||
} else { | |||||
buf.append(source); | |||||
} | |||||
if (lineNumber != 0) { | |||||
buf.append(":"); | |||||
buf.append(lineNumber); | |||||
} | |||||
buf.append(": "); | |||||
} | |||||
return buf.toString(); | |||||
} | |||||
} | |||||
@@ -0,0 +1,74 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.common.util; | |||||
/** | |||||
* The levels at which a log message may be sent. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 16 January 2002 | |||||
*/ | |||||
public class MessageLevel { | |||||
/** Error message level */ | |||||
public final static int MSG_ERR = 0; | |||||
/** Warnign message level */ | |||||
public final static int MSG_WARN = 1; | |||||
/** Informational message level */ | |||||
public final static int MSG_INFO = 2; | |||||
/** Verbose message level */ | |||||
public final static int MSG_VERBOSE = 3; | |||||
/** Debug Message level */ | |||||
public final static int MSG_DEBUG = 4; | |||||
} | |||||
@@ -0,0 +1,144 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.common.util; | |||||
import java.io.File; | |||||
import java.util.NoSuchElementException; | |||||
import java.util.StringTokenizer; | |||||
/** | |||||
* A Path tokenizer takes a path and returns the components that make up | |||||
* that path. The path can use path separators of either ':' or ';' and file | |||||
* separators of either '/' or '\' | |||||
* | |||||
* @author Conor MacNeill (conor@ieee.org) | |||||
* @created 20 January 2002 | |||||
*/ | |||||
public class PathTokenizer { | |||||
/** | |||||
* A tokenizer to break the string up based on the ':' or ';' | |||||
* separators. | |||||
*/ | |||||
private StringTokenizer tokenizer; | |||||
/** | |||||
* A String which stores any path components which have been read ahead. | |||||
*/ | |||||
private String lookahead = null; | |||||
/** | |||||
* Flag to indicate whether we are running on a platform with a DOS | |||||
* style filesystem | |||||
*/ | |||||
private boolean dosStyleFilesystem; | |||||
/** | |||||
* Create a path tokenizer to access the components of the path | |||||
* | |||||
* @param path the path to be tokenized | |||||
*/ | |||||
public PathTokenizer(String path) { | |||||
tokenizer = new StringTokenizer(path, ":;", false); | |||||
dosStyleFilesystem = File.pathSeparatorChar == ';'; | |||||
} | |||||
/** | |||||
* Indicate if there are more tokens available | |||||
* | |||||
* @return true if there are more tokens available | |||||
*/ | |||||
public boolean hasMoreTokens() { | |||||
if (lookahead != null) { | |||||
return true; | |||||
} | |||||
return tokenizer.hasMoreTokens(); | |||||
} | |||||
/** | |||||
* Get the next token from the path's list of components | |||||
* | |||||
* @return the path component | |||||
* @exception NoSuchElementException if there are no more components | |||||
* available. | |||||
*/ | |||||
public String nextToken() throws NoSuchElementException { | |||||
String token = null; | |||||
if (lookahead != null) { | |||||
token = lookahead; | |||||
lookahead = null; | |||||
} else { | |||||
token = tokenizer.nextToken().trim(); | |||||
} | |||||
if (token.length() == 1 && Character.isLetter(token.charAt(0)) | |||||
&& dosStyleFilesystem | |||||
&& tokenizer.hasMoreTokens()) { | |||||
// we are on a dos style system so this path could be a drive | |||||
// spec. We look at the next token | |||||
String nextToken = tokenizer.nextToken().trim(); | |||||
if (nextToken.startsWith("\\") || nextToken.startsWith("/")) { | |||||
// we know we are on a DOS style platform and the next path | |||||
// starts with a slash or backslash, so we know this is a | |||||
// drive spec | |||||
token += ":" + nextToken; | |||||
} else { | |||||
// store the token just read for next time | |||||
lookahead = nextToken; | |||||
} | |||||
} | |||||
return token; | |||||
} | |||||
} | |||||
@@ -0,0 +1,107 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.init; | |||||
import java.net.MalformedURLException; | |||||
import java.net.URL; | |||||
/** | |||||
* The ClassLocator is a utility class which is used to determine the URL | |||||
* from which a class was loaded. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 9 January 2002 | |||||
*/ | |||||
public class ClassLocator { | |||||
/** | |||||
* Get the URL for the given class's load location. | |||||
* | |||||
* @param theClass the class whose loadURL is desired. | |||||
* @return a URL which identifies the component from which this class | |||||
* was loaded. | |||||
* @throws MalformedURLException if the class' URL cannot be | |||||
* constructed. | |||||
*/ | |||||
public static URL getClassLocationURL(Class theClass) | |||||
throws MalformedURLException { | |||||
String className = theClass.getName().replace('.', '/') + ".class"; | |||||
URL classRawURL = theClass.getClassLoader().getResource(className); | |||||
String fileComponent = classRawURL.getFile(); | |||||
if (classRawURL.getProtocol().equals("file")) { | |||||
// Class comes from a directory of class files rather than | |||||
// from a jar. | |||||
int classFileIndex = fileComponent.lastIndexOf(className); | |||||
if (classFileIndex != -1) { | |||||
fileComponent = fileComponent.substring(0, classFileIndex); | |||||
} | |||||
return new URL("file:" + fileComponent); | |||||
} else if (classRawURL.getProtocol().equals("jar")) { | |||||
// Class is coming from a jar. The file component of the URL | |||||
// is actually the URL of the jar file | |||||
int classSeparatorIndex = fileComponent.lastIndexOf("!"); | |||||
if (classSeparatorIndex != -1) { | |||||
fileComponent = fileComponent.substring(0, classSeparatorIndex); | |||||
} | |||||
return new URL(fileComponent); | |||||
} else { | |||||
// its running out of something besides a jar. | |||||
// We just return the Raw URL as a best guess | |||||
return classRawURL; | |||||
} | |||||
} | |||||
} | |||||
@@ -0,0 +1,271 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.init; | |||||
import java.net.URL; | |||||
/** | |||||
* InitConfig is the initialization configuration created to start Ant. This | |||||
* is passed to the front end when Ant is started. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 9 January 2002 | |||||
*/ | |||||
public class InitConfig { | |||||
/** The system classloader */ | |||||
private ClassLoader systemLoader; | |||||
/** | |||||
* The common class loader loads components which are common to tasks | |||||
* and the core | |||||
*/ | |||||
private ClassLoader commonLoader; | |||||
/** | |||||
* The core loader is the loader which loads classes which are | |||||
* exclusively used by the Ant core | |||||
*/ | |||||
private ClassLoader coreLoader; | |||||
/** | |||||
* The tools.jar URL is available for things which require the Sun tools | |||||
* jar | |||||
*/ | |||||
private URL toolsJarURL; | |||||
/** | |||||
* The URLs to the Ant XML parser. These are available to allow tasks | |||||
* which require XML support to use the standard parser rather than | |||||
* having to supply their own | |||||
*/ | |||||
private URL[] parserURLs; | |||||
/** | |||||
* The location of the Ant library directory from which tasks may be | |||||
* loaded | |||||
*/ | |||||
private URL libraryURL; | |||||
/** The location of the system configuration file */ | |||||
private URL systemConfigArea; | |||||
/** The location of ANT_HOME */ | |||||
private URL antHome; | |||||
/** The location of the user config file */ | |||||
private URL userConfigArea; | |||||
/** | |||||
* Sets the location of the user configuration files | |||||
* | |||||
* @param userConfigArea the new user config area | |||||
*/ | |||||
public void setUserConfigArea(URL userConfigArea) { | |||||
this.userConfigArea = userConfigArea; | |||||
} | |||||
/** | |||||
* Set the location of ANT_HOME | |||||
* | |||||
* @param antHome the new value of ANT_HOME | |||||
*/ | |||||
public void setAntHome(URL antHome) { | |||||
this.antHome = antHome; | |||||
} | |||||
/** | |||||
* Sets the location of the system configuration files | |||||
* | |||||
* @param systemConfigArea the new system config area | |||||
*/ | |||||
public void setSystemConfigArea(URL systemConfigArea) { | |||||
this.systemConfigArea = systemConfigArea; | |||||
} | |||||
/** | |||||
* Sets the systemLoader of the InitConfig | |||||
* | |||||
* @param systemLoader the new systemLoader value | |||||
*/ | |||||
public void setSystemLoader(ClassLoader systemLoader) { | |||||
this.systemLoader = systemLoader; | |||||
} | |||||
/** | |||||
* Sets the commonLoader of the InitConfig | |||||
* | |||||
* @param commonLoader the new commonLoader value | |||||
*/ | |||||
public void setCommonLoader(ClassLoader commonLoader) { | |||||
this.commonLoader = commonLoader; | |||||
} | |||||
/** | |||||
* Sets the coreLoader of the InitConfig | |||||
* | |||||
* @param coreLoader the new coreLoader value | |||||
*/ | |||||
public void setCoreLoader(ClassLoader coreLoader) { | |||||
this.coreLoader = coreLoader; | |||||
} | |||||
/** | |||||
* Sets the toolsJarURL of the InitConfig | |||||
* | |||||
* @param toolsJarURL the new toolsJarURL value | |||||
*/ | |||||
public void setToolsJarURL(URL toolsJarURL) { | |||||
this.toolsJarURL = toolsJarURL; | |||||
} | |||||
/** | |||||
* Sets the parserURLs of the InitConfig | |||||
* | |||||
* @param parserURLs the new parserURLs value | |||||
*/ | |||||
public void setParserURLs(URL[] parserURLs) { | |||||
this.parserURLs = parserURLs; | |||||
} | |||||
/** | |||||
* Sets the libraryURL of the InitConfig | |||||
* | |||||
* @param libraryURL the new libraryURL value | |||||
*/ | |||||
public void setLibraryURL(URL libraryURL) { | |||||
this.libraryURL = libraryURL; | |||||
} | |||||
/** | |||||
* Get the location of the user's config files | |||||
* | |||||
* @return the location of the user's Ant config files | |||||
*/ | |||||
public URL getUserConfigArea() { | |||||
return userConfigArea; | |||||
} | |||||
/** | |||||
* Get the location of Ant's home area | |||||
* | |||||
* @return the location of ANT_HOME | |||||
*/ | |||||
public URL getAntHome() { | |||||
return antHome; | |||||
} | |||||
/** | |||||
* Get the location of the system config files | |||||
* | |||||
* @return the location of the system Ant config files | |||||
*/ | |||||
public URL getSystemConfigArea() { | |||||
return systemConfigArea; | |||||
} | |||||
/** | |||||
* Gets the systemLoader of the InitConfig | |||||
* | |||||
* @return the systemLoader value | |||||
*/ | |||||
public ClassLoader getSystemLoader() { | |||||
return systemLoader; | |||||
} | |||||
/** | |||||
* Gets the commonLoader of the InitConfig | |||||
* | |||||
* @return the commonLoader value | |||||
*/ | |||||
public ClassLoader getCommonLoader() { | |||||
return commonLoader; | |||||
} | |||||
/** | |||||
* Gets the coreLoader of the InitConfig | |||||
* | |||||
* @return the coreLoader value | |||||
*/ | |||||
public ClassLoader getCoreLoader() { | |||||
return coreLoader; | |||||
} | |||||
/** | |||||
* Gets the toolsJarURL of the InitConfig | |||||
* | |||||
* @return the toolsJarURL value | |||||
*/ | |||||
public URL getToolsJarURL() { | |||||
return toolsJarURL; | |||||
} | |||||
/** | |||||
* Gets the parserURLs of the InitConfig | |||||
* | |||||
* @return the parserURLs value | |||||
*/ | |||||
public URL[] getParserURLs() { | |||||
return parserURLs; | |||||
} | |||||
/** | |||||
* Gets the libraryURL of the InitConfig | |||||
* | |||||
* @return the libraryURL value | |||||
*/ | |||||
public URL getLibraryURL() { | |||||
return libraryURL; | |||||
} | |||||
} | |||||
@@ -0,0 +1,145 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.init; | |||||
import java.io.PrintStream; | |||||
import java.io.PrintWriter; | |||||
/** | |||||
* An InitException is an exception which occurs during Ant initialization | |||||
* phase. Such exceptions are usually fatal because Ant cannot be | |||||
* sufficiently initialised to properly handle the exception. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 11 January 2002 | |||||
*/ | |||||
public class InitException extends Exception { | |||||
/** Nested Exception if any. */ | |||||
private Throwable cause = null; | |||||
/** | |||||
* Constructs an exception with the given descriptive message. | |||||
* | |||||
* @param msg Description of or information about the exception. | |||||
*/ | |||||
public InitException(String msg) { | |||||
super(msg); | |||||
} | |||||
/** | |||||
* Constructs an exception with the given message and exception as a | |||||
* root cause. | |||||
* | |||||
* @param msg Description of or information about the exception. | |||||
* @param cause Throwable that might have cause this one. | |||||
*/ | |||||
public InitException(String msg, Throwable cause) { | |||||
super(msg); | |||||
this.cause = cause; | |||||
} | |||||
/** | |||||
* Constructs an exception with the given exception as a root cause. | |||||
* | |||||
* @param cause Exception that might have caused this one. | |||||
*/ | |||||
public InitException(Throwable cause) { | |||||
super(cause.getMessage()); | |||||
this.cause = cause; | |||||
} | |||||
/** Print the stack trace to System.err */ | |||||
public void printStackTrace() { | |||||
printStackTrace(System.err); | |||||
} | |||||
/** | |||||
* Print the stack trace to the given PrintStream | |||||
* | |||||
* @param ps the PrintStream onto which the stack trace of this | |||||
* exception is to be printed | |||||
*/ | |||||
public void printStackTrace(PrintStream ps) { | |||||
synchronized (ps) { | |||||
ps.println(this); | |||||
if (cause != null) { | |||||
ps.println("--- Nested Exception ---"); | |||||
cause.printStackTrace(ps); | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* Print the stack trace to the given PrintWriter | |||||
* | |||||
* @param pw the PrintWriter onto which the stack trace of this | |||||
* exception is to be printed | |||||
*/ | |||||
public void printStackTrace(PrintWriter pw) { | |||||
synchronized (pw) { | |||||
pw.println(this); | |||||
if (cause != null) { | |||||
pw.println("--- Nested Exception ---"); | |||||
cause.printStackTrace(pw); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
@@ -0,0 +1,87 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.init; | |||||
import java.io.File; | |||||
import java.net.MalformedURLException; | |||||
import java.net.URL; | |||||
/** | |||||
* A set of utility methods required during initialisation and beyond | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 20 January 2002 | |||||
*/ | |||||
public class InitUtils { | |||||
/** | |||||
* Get the URL for a file taking into account # characters | |||||
* | |||||
* @param file the file whose URL representation is required. | |||||
* @return The FileURL value | |||||
* @throws MalformedURLException if the URL representation cannot be | |||||
* formed. | |||||
*/ | |||||
public static URL getFileURL(File file) throws MalformedURLException { | |||||
String uri = "file:" + file.getAbsolutePath().replace('\\', '/'); | |||||
for (int i = uri.indexOf('#'); i != -1; i = uri.indexOf('#')) { | |||||
uri = uri.substring(0, i) + "%23" + uri.substring(i + 1); | |||||
} | |||||
if (file.isDirectory()) { | |||||
uri += "/"; | |||||
} | |||||
return new URL(uri); | |||||
} | |||||
} | |||||
@@ -0,0 +1,220 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.init; | |||||
import java.io.BufferedReader; | |||||
import java.io.File; | |||||
import java.io.FilenameFilter; | |||||
import java.io.IOException; | |||||
import java.io.InputStreamReader; | |||||
import java.io.PrintStream; | |||||
import java.net.MalformedURLException; | |||||
import java.net.URL; | |||||
import java.net.URLClassLoader; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
/** | |||||
* LoaderUtils is a utility class with methods for configuring a class | |||||
* loader from a URL. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 9 January 2002 | |||||
*/ | |||||
public class LoaderUtils { | |||||
/** | |||||
* This is the file that is consulted on remote systems to specify | |||||
* available jars | |||||
*/ | |||||
public final static String LIST_FILE = "file.list"; | |||||
/** | |||||
* Get the URLs to create class loader from the jars in a given location | |||||
* | |||||
* @param baseURL the baeURL is the location of the libs directory | |||||
* @param defaultFile default file if none can be found | |||||
* @return an array of URLs for the relevant jars | |||||
* @exception MalformedURLException the URLs cannot be created | |||||
*/ | |||||
public static URL[] getLoaderURLs(URL baseURL, String defaultFile) | |||||
throws MalformedURLException { | |||||
return getLoaderURLs(baseURL, defaultFile, new String[]{".jar"}); | |||||
} | |||||
/** | |||||
* Get the URLs for a class loader | |||||
* | |||||
* @param baseURL the baeURL is the location of the libs directory | |||||
* @param extensions array of allowable file extensions | |||||
* @param defaultFile default file if none can be found | |||||
* @return an array of URLs for the relevant jars | |||||
* @exception MalformedURLException if the URL to the jars could not be | |||||
* formed | |||||
*/ | |||||
public static URL[] getLoaderURLs(URL baseURL, String defaultFile, | |||||
String[] extensions) | |||||
throws MalformedURLException { | |||||
URL[] urls = null; | |||||
if (baseURL.getProtocol().equals("file")) { | |||||
// URL is local filesystem. | |||||
urls = getDirectoryURLs(new File(baseURL.getFile()), extensions); | |||||
} else { | |||||
// URL is remote - try to read a file with the list of jars | |||||
URL jarListURL = new URL(baseURL, LIST_FILE); | |||||
BufferedReader reader = null; | |||||
List jarList = new ArrayList(); | |||||
try { | |||||
InputStreamReader isr | |||||
= new InputStreamReader(jarListURL.openStream()); | |||||
reader = new BufferedReader(isr); | |||||
String line = null; | |||||
while ((line = reader.readLine().trim()) != null) { | |||||
for (int i = 0; i < extensions.length; ++i) { | |||||
if (line.endsWith(extensions[i])) { | |||||
jarList.add(new URL(baseURL, line)); | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
urls = (URL[])jarList.toArray(new URL[0]); | |||||
} catch (IOException e) { | |||||
// use the default location | |||||
if (defaultFile != null) { | |||||
urls = new URL[]{new URL(baseURL, defaultFile)}; | |||||
} | |||||
} finally { | |||||
if (reader != null) { | |||||
try { | |||||
reader.close(); | |||||
} catch (IOException e) { | |||||
} | |||||
} | |||||
} | |||||
} | |||||
return urls; | |||||
} | |||||
/** | |||||
* Debug method to dump a class loader hierarchy to a PrintStream | |||||
* URLClassLoaders dump their URLs | |||||
* | |||||
* @param loader the class loaders whose configuration is dumped | |||||
* @param ps PrintStream to which info is sent | |||||
*/ | |||||
public static void dumpLoader(PrintStream ps, ClassLoader loader) { | |||||
if (loader instanceof URLClassLoader) { | |||||
URLClassLoader urlLoader = (URLClassLoader)loader; | |||||
URL[] urls = urlLoader.getURLs(); | |||||
if (urls.length == 0) { | |||||
ps.println(" No URLs"); | |||||
} else { | |||||
for (int i = 0; i < urls.length; ++i) { | |||||
ps.println(" URL: " + urls[i]); | |||||
} | |||||
} | |||||
} else { | |||||
ps.println("Class Loader: " + loader.getClass().getName()); | |||||
} | |||||
ps.println(); | |||||
ClassLoader parentLoader = loader.getParent(); | |||||
if (parentLoader != null) { | |||||
ps.println("Parent Loader:"); | |||||
dumpLoader(ps, parentLoader); | |||||
} | |||||
} | |||||
/** | |||||
* Get an array of URLs for each jar file in the directory | |||||
* | |||||
* @param directory the local directory | |||||
* @param extensions an array of file extensions to be considered in the | |||||
* search | |||||
* @return an array of URLs for the file found in the directory. | |||||
* @exception MalformedURLException if the URLs to the jars cannot be | |||||
* formed | |||||
*/ | |||||
private static URL[] getDirectoryURLs(File directory, | |||||
final String[] extensions) | |||||
throws MalformedURLException { | |||||
URL[] urls = new URL[0]; | |||||
if (!directory.exists()) { | |||||
return urls; | |||||
} | |||||
File[] jars = directory.listFiles( | |||||
new FilenameFilter() { | |||||
public boolean accept(File dir, String name) { | |||||
for (int i = 0; i < extensions.length; ++i) { | |||||
if (name.endsWith(extensions[i])) { | |||||
return true; | |||||
} | |||||
} | |||||
return false; | |||||
} | |||||
}); | |||||
urls = new URL[jars.length]; | |||||
for (int i = 0; i < jars.length; ++i) { | |||||
urls[i] = InitUtils.getFileURL(jars[i]); | |||||
// ps.println("Adding URL " + urls[i]); | |||||
} | |||||
return urls; | |||||
} | |||||
} | |||||
@@ -0,0 +1,260 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 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.ant.start; | |||||
import java.io.File; | |||||
import java.lang.reflect.Method; | |||||
import java.net.MalformedURLException; | |||||
import java.net.URL; | |||||
import java.net.URLClassLoader; | |||||
import org.apache.ant.init.ClassLocator; | |||||
import org.apache.ant.init.InitUtils; | |||||
import org.apache.ant.init.InitConfig; | |||||
import org.apache.ant.init.InitException; | |||||
import org.apache.ant.init.LoaderUtils; | |||||
/** | |||||
* This is the main startup class for the command line interface of Ant. It | |||||
* establishes the classloaders used by the other components of Ant. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
* @created 9 January 2002 | |||||
*/ | |||||
public class Main { | |||||
/** The actual class that implements the command line front end. */ | |||||
public final static String COMMANDLINE_CLASS | |||||
= "org.apache.ant.cli.Commandline"; | |||||
/** | |||||
* Get a URL to the Ant Library directory. | |||||
* | |||||
* @return the URL for the Ant library directory | |||||
* @throws InitException if there is a problem constructing the library | |||||
* URL | |||||
*/ | |||||
public static URL getLibraryURL() | |||||
throws InitException { | |||||
try { | |||||
URL cliURL = ClassLocator.getClassLocationURL(Main.class); | |||||
if (cliURL.getProtocol().equals("file") | |||||
&& cliURL.getFile().endsWith("/")) { | |||||
// we are running from a set of classes. This should only | |||||
// happen in an Ant build situation. We use some embedded | |||||
// knowledge to locate the lib directory | |||||
File classesDirectory = new File(cliURL.getFile()); | |||||
File libDirectory = new File(classesDirectory.getParent(), | |||||
"lib"); | |||||
if (!libDirectory.exists()) { | |||||
throw new RuntimeException("Ant library directory " | |||||
+ libDirectory + " does not exist"); | |||||
} | |||||
return InitUtils.getFileURL(libDirectory); | |||||
} else { | |||||
String cliURLString = cliURL.toString(); | |||||
int index = cliURLString.lastIndexOf("/"); | |||||
if (index != -1) { | |||||
cliURLString = cliURLString.substring(0, index + 1); | |||||
} | |||||
return new URL(cliURLString); | |||||
} | |||||
} catch (MalformedURLException e) { | |||||
throw new InitException(e); | |||||
} | |||||
} | |||||
/** | |||||
* Entry point for starting command line Ant | |||||
* | |||||
* @param args commandline arguments | |||||
*/ | |||||
public static void main(String[] args) { | |||||
Main main = new Main(); | |||||
main.start(args); | |||||
} | |||||
/** | |||||
* Get the URLs necessary to load the Sun compiler tools. In some JVMs | |||||
* this is available in the VM's system loader, in others we have to | |||||
* find it ourselves | |||||
* | |||||
* @return the URL to the tools jar if available, null otherwise | |||||
* @throws InitException if the URL to the tools jar cannot be formed. | |||||
*/ | |||||
private URL getToolsJarURL() | |||||
throws InitException { | |||||
try { | |||||
Class compilerClass = Class.forName("sun.tools.javac.Main"); | |||||
// tools jar is on system classpath - no need for URL | |||||
return null; | |||||
} catch (ClassNotFoundException cnfe) { | |||||
try { | |||||
// couldn't find compiler - try to find tools.jar | |||||
// based on java.home setting | |||||
String javaHome = System.getProperty("java.home"); | |||||
if (javaHome.endsWith("jre")) { | |||||
javaHome = javaHome.substring(0, javaHome.length() - 4); | |||||
} | |||||
File toolsjar = new File(javaHome + "/lib/tools.jar"); | |||||
if (!toolsjar.exists()) { | |||||
System.out.println("Unable to locate tools.jar. " | |||||
+ "Expected to find it in " + toolsjar.getPath()); | |||||
return null; | |||||
} | |||||
URL toolsJarURL = InitUtils.getFileURL(toolsjar); | |||||
return toolsJarURL; | |||||
} catch (MalformedURLException e) { | |||||
throw new InitException(e); | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* Get the location of AntHome | |||||
* | |||||
* @return the URL containing AntHome. | |||||
* @throws InitException if Ant's home cannot be determined or properly | |||||
* contructed. | |||||
*/ | |||||
private URL getAntHome() | |||||
throws InitException { | |||||
try { | |||||
URL libraryURL = getLibraryURL(); | |||||
if (libraryURL != null) { | |||||
return new URL(libraryURL, ".."); | |||||
} | |||||
} catch (MalformedURLException e) { | |||||
throw new InitException(e); | |||||
} | |||||
throw new InitException("Unable to determine Ant Home"); | |||||
} | |||||
/** | |||||
* Internal start method used to initialise front end | |||||
* | |||||
* @param args commandline arguments | |||||
*/ | |||||
private void start(String[] args) { | |||||
try { | |||||
InitConfig config = new InitConfig(); | |||||
URL libraryURL = getLibraryURL(); | |||||
config.setLibraryURL(libraryURL); | |||||
URL antHome = getAntHome(); | |||||
config.setAntHome(antHome); | |||||
config.setSystemConfigArea(new URL(antHome, "conf/")); | |||||
File userConfigArea | |||||
= new File(System.getProperty("user.home"), ".ant/conf"); | |||||
config.setUserConfigArea(InitUtils.getFileURL(userConfigArea)); | |||||
// set up the class loaders that will be used when running Ant | |||||
ClassLoader systemLoader = getClass().getClassLoader(); | |||||
config.setSystemLoader(systemLoader); | |||||
URL toolsJarURL = getToolsJarURL(); | |||||
config.setToolsJarURL(toolsJarURL); | |||||
URL commonJarLib = new URL(libraryURL, "common"); | |||||
ClassLoader commonLoader | |||||
= new URLClassLoader(LoaderUtils.getLoaderURLs(commonJarLib, | |||||
"common.jar"), systemLoader); | |||||
config.setCommonLoader(commonLoader); | |||||
// core needs XML parser for parsing various XML components. | |||||
URL[] parserURLs | |||||
= LoaderUtils.getLoaderURLs(new URL(libraryURL, "parser"), | |||||
"crimson.jar"); | |||||
config.setParserURLs(parserURLs); | |||||
URL[] coreURLs | |||||
= LoaderUtils.getLoaderURLs(new URL(libraryURL, "antcore"), | |||||
"antcore.jar"); | |||||
URL[] combinedURLs = new URL[parserURLs.length + coreURLs.length]; | |||||
System.arraycopy(coreURLs, 0, combinedURLs, 0, coreURLs.length); | |||||
System.arraycopy(parserURLs, 0, combinedURLs, coreURLs.length, | |||||
parserURLs.length); | |||||
ClassLoader coreLoader = new URLClassLoader(combinedURLs, | |||||
commonLoader); | |||||
config.setCoreLoader(coreLoader); | |||||
URL cliJarLib = new URL(libraryURL, "cli"); | |||||
ClassLoader frontEndLoader | |||||
= new URLClassLoader(LoaderUtils.getLoaderURLs(cliJarLib, | |||||
"cli.jar"), coreLoader); | |||||
// System.out.println("Front End Loader config"); | |||||
// LoaderUtils.dumpLoader(System.out, frontEndLoader); | |||||
// Now start the front end by reflection. | |||||
Class commandLineClass = Class.forName(COMMANDLINE_CLASS, true, | |||||
frontEndLoader); | |||||
final Class[] param = {Class.forName("[Ljava.lang.String;"), | |||||
InitConfig.class}; | |||||
final Method startMethod | |||||
= commandLineClass.getMethod("start", param); | |||||
final Object[] argument = {args, config}; | |||||
startMethod.invoke(null, argument); | |||||
} catch (Exception e) { | |||||
e.printStackTrace(); | |||||
} | |||||
} | |||||
} | |||||