git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@270812 13f79535-47bb-0310-9956-ffa450edef68master
@@ -1,87 +1,6 @@ | |||||
<project default="jars"> | <project default="jars"> | ||||
<property name="src.dir" value="src/main"/> | |||||
<property name="component.src.dir" value="${src.dir}/org/apache/ant/component"/> | |||||
<property name="build.dir" value="build"/> | |||||
<property name="build.classes" value="build/classes"/> | |||||
<property name="component.classes.dir" value="org/apache/ant/component"/> | |||||
<property name="build.javadocs" value="build/javadocs"/> | |||||
<property name="build.lib" value="${build.dir}/lib"/> | |||||
<property name="frontend.manifest" value="${src.dir}/org/apache/ant/frontend/manifest.mf"/> | |||||
<property name="egg.manifest" value="${src.dir}/org/apache/ant/frontend/eggmanifest.mf"/> | |||||
<target name="compile"> | |||||
<mkdir dir="${build.classes}"/> | |||||
<depend srcdir="${src.dir}" | |||||
destdir="${build.classes}" closure="yes" | |||||
cache="${build.dir}/depcache"/> | |||||
<javac srcdir="${src.dir}" | |||||
destdir="${build.classes}" | |||||
deprecation="true" | |||||
debug="true"/> | |||||
<target name="jars"> | |||||
<echo message="Mutant is being retructured - returning shortly"/> | |||||
</target> | </target> | ||||
<target name="build-task"> | |||||
<echo message="building Task jar from ${component.classes.dir}/${taskset}/**/*.class"/> | |||||
<jar jarfile="${build.lib}/task/${taskset}.tsk" | |||||
basedir="${build.classes}"> | |||||
<zipfileset dir="${component.src.dir}/${taskset}" | |||||
prefix="ANT-INF" | |||||
includes="antlib.xml"/> | |||||
<include name="${component.classes.dir}/${taskset}/**/*.class" /> | |||||
</jar> | |||||
</target> | |||||
<target name="jars" depends="compile"> | |||||
<mkdir dir="${build.lib}"/> | |||||
<mkdir dir="${build.lib}/task"/> | |||||
<jar jarfile="${build.lib}/frontend.jar" | |||||
basedir="${build.classes}" | |||||
manifest="${frontend.manifest}"> | |||||
<include name="org/apache/ant/frontend/*.class" /> | |||||
</jar> | |||||
<jar jarfile="${build.lib}/egg.jar" | |||||
basedir="${build.classes}" | |||||
manifest="${egg.manifest}"> | |||||
<include name="org/apache/ant/frontend/RemoteLauncher.class" /> | |||||
<include name="org/apache/ant/core/support/AntClassLoader.class" /> | |||||
</jar> | |||||
<jar jarfile="${build.lib}/core.jar" | |||||
basedir="${build.classes}"> | |||||
<include name="org/apache/ant/core/**/*.class" /> | |||||
</jar> | |||||
<antcall target="build-task"> | |||||
<param name="taskset" value="core"/> | |||||
</antcall> | |||||
<antcall target="build-task"> | |||||
<param name="taskset" value="file"/> | |||||
</antcall> | |||||
<antcall target="build-task"> | |||||
<param name="taskset" value="thread"/> | |||||
</antcall> | |||||
<copy todir="${build.lib}"> | |||||
<fileset dir="lib"/> | |||||
</copy> | |||||
</target> | |||||
<target name="clean"> | |||||
<delete dir="${build.dir}"/> | |||||
</target> | |||||
<target name="javadoc"> | |||||
<mkdir dir="${build.javadocs}"/> | |||||
<javadoc packagenames="org.apache.*" | |||||
sourcepath="${src.dir}" | |||||
destdir="${build.javadocs}" | |||||
author="true" | |||||
version="true" | |||||
windowtitle="Ant 2.0 API" | |||||
doctitle="Ant 2.0" | |||||
private="true" | |||||
bottom="Copyright © 2001 Apache Software Foundation. All Rights Reserved."> | |||||
<group title="Ant Core" packages="org.apache.ant.core*" /> | |||||
<group title="Front End" packages="org.apache.ant.frontend*" /> | |||||
<group title="XML Parsing" packages="org.apache.ant.xml*" /> | |||||
</javadoc> | |||||
</target> | |||||
</project> | |||||
</project> |
@@ -1,298 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.bootstrap; | |||||
import java.io.*; | |||||
import java.util.*; | |||||
import java.util.zip.*; | |||||
import java.lang.reflect.*; | |||||
/** | |||||
* Bootstrap class to build the rest of ant with a minimum of user intervention | |||||
* | |||||
* The bootstrap class is able to act as a class loader to load new classes/jars | |||||
* into the VM in which it is running. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public class BootstrapLoader extends ClassLoader { | |||||
static public final String RECURSION_GUARD = "ant.bootstrap.recursionGuard"; | |||||
static private final int BUFFER_SIZE = 1024; | |||||
private String[] classpathElements; | |||||
public BootstrapLoader(String classpath) { | |||||
StringTokenizer tokenizer = new StringTokenizer(classpath, File.pathSeparator); | |||||
classpathElements = new String[tokenizer.countTokens()]; | |||||
for (int i = 0; tokenizer.hasMoreTokens(); ++i) { | |||||
classpathElements[i] = tokenizer.nextToken(); | |||||
} | |||||
} | |||||
protected Class findClass(String name) | |||||
throws ClassNotFoundException { | |||||
String resourceName = name.replace('.', '/') + ".class"; | |||||
InputStream classStream = getResourceStream(resourceName); | |||||
if (classStream == null) { | |||||
throw new ClassNotFoundException(); | |||||
} | |||||
try { | |||||
return getClassFromStream(classStream, name); | |||||
} | |||||
catch (IOException ioe) { | |||||
ioe.printStackTrace(); | |||||
throw new ClassNotFoundException(); | |||||
} | |||||
} | |||||
/** | |||||
* Get a stream to read the requested resource name. | |||||
* | |||||
* @param name the name of the resource for which a stream is required. | |||||
* | |||||
* @return a stream to the required resource or null if the resource cannot be | |||||
* found on the loader's classpath. | |||||
*/ | |||||
private InputStream getResourceStream(String name) { | |||||
// we need to search the components of the path to see if we can find the | |||||
// class we want. | |||||
InputStream stream = null; | |||||
for (int i = 0; i < classpathElements.length && stream == null; ++i) { | |||||
File pathComponent = new File(classpathElements[i]); | |||||
stream = getResourceStream(pathComponent, name); | |||||
} | |||||
return stream; | |||||
} | |||||
/** | |||||
* Get a stream to read the requested resource name. | |||||
* | |||||
* @param name the name of the resource for which a stream is required. | |||||
* | |||||
* @return a stream to the required resource or null if the resource cannot be | |||||
* found on the loader's classpath. | |||||
*/ | |||||
public InputStream getResourceAsStream(String name) { | |||||
return getResourceStream(name); | |||||
} | |||||
protected Class loadClass(String name, | |||||
boolean resolve) | |||||
throws ClassNotFoundException { | |||||
Class requestedClass = findLoadedClass(name); | |||||
try { | |||||
if (requestedClass == null) { | |||||
requestedClass = findClass(name); | |||||
if (resolve) { | |||||
resolveClass(requestedClass); | |||||
} | |||||
} | |||||
return requestedClass; | |||||
} | |||||
catch (ClassNotFoundException cnfe) { | |||||
return super.loadClass(name, resolve); | |||||
} | |||||
} | |||||
/** | |||||
* Get an inputstream to a given resource in the given file which may | |||||
* either be a directory or a zip file. | |||||
* | |||||
* @param file the file (directory or jar) in which to search for the resource. | |||||
* @param resourceName the name of the resource for which a stream is required. | |||||
* | |||||
* @return a stream to the required resource or null if the resource cannot be | |||||
* found in the given file object | |||||
*/ | |||||
private InputStream getResourceStream(File file, String resourceName) { | |||||
try { | |||||
if (!file.exists()) { | |||||
return null; | |||||
} | |||||
if (file.isDirectory()) { | |||||
File resource = new File(file, resourceName); | |||||
if (resource.exists()) { | |||||
return new FileInputStream(resource); | |||||
} | |||||
} | |||||
else { | |||||
ZipFile zipFile = null; | |||||
try { | |||||
zipFile = new ZipFile(file); | |||||
ZipEntry entry = zipFile.getEntry(resourceName); | |||||
if (entry != null) { | |||||
// we need to read the entry out of the zip file into | |||||
// a baos and then | |||||
ByteArrayOutputStream baos = new ByteArrayOutputStream(); | |||||
byte[] buffer = new byte[BUFFER_SIZE]; | |||||
int bytesRead; | |||||
InputStream stream = zipFile.getInputStream(entry); | |||||
while ((bytesRead = stream.read(buffer, 0, BUFFER_SIZE)) != -1) { | |||||
baos.write(buffer, 0, bytesRead); | |||||
} | |||||
return new ByteArrayInputStream(baos.toByteArray()); | |||||
} | |||||
} | |||||
finally { | |||||
if (zipFile != null) { | |||||
zipFile.close(); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
catch (Exception e) { | |||||
e.printStackTrace(); | |||||
} | |||||
return null; | |||||
} | |||||
/** | |||||
* Read a class definition from a stream. | |||||
* | |||||
* @param stream the stream from which the class is to be read. | |||||
* @param classname the class name of the class in the stream. | |||||
* | |||||
* @return the Class object read from the stream. | |||||
* | |||||
* @throws IOException if there is a problem reading the class from the | |||||
* stream. | |||||
*/ | |||||
private Class getClassFromStream(InputStream stream, String classname) | |||||
throws IOException { | |||||
ByteArrayOutputStream baos = new ByteArrayOutputStream(); | |||||
int bytesRead = -1; | |||||
byte[] buffer = new byte[1024]; | |||||
while ((bytesRead = stream.read(buffer, 0, 1024)) != -1) { | |||||
baos.write(buffer, 0, bytesRead); | |||||
} | |||||
byte[] classData = baos.toByteArray(); | |||||
return defineClass(classname, classData, 0, classData.length); | |||||
} | |||||
static private void buildAnt() { | |||||
System.out.println("Bootstrapping Ant ..."); | |||||
} | |||||
static private void runWithToolsJar(String[] args) { | |||||
try { | |||||
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 it to be in " + | |||||
toolsjar.getPath()); | |||||
return; | |||||
} | |||||
String newclasspath = toolsjar.getPath() + File.pathSeparator + | |||||
System.getProperty("java.class.path"); | |||||
System.out.println("New Classpath is " + newclasspath); | |||||
BootstrapLoader loader = new BootstrapLoader(newclasspath); | |||||
Class newBootClass = loader.loadClass("org.apache.ant.bootstrap.BootstrapLoader", | |||||
true); | |||||
final Class[] param = { Class.forName("[Ljava.lang.String;") }; | |||||
final Method main = newBootClass.getMethod("main", param); | |||||
final Object[] argument = { args }; | |||||
main.invoke(null, argument); | |||||
} | |||||
catch (Exception e) { | |||||
e.printStackTrace(); | |||||
throw new RuntimeException("Unable to run boot with tools.jar"); | |||||
} | |||||
} | |||||
static public void main(String[] args) { | |||||
// check whether the tools.jar is already in the classpath. | |||||
try { | |||||
Class compilerClass = Class.forName("sun.tools.javac.Main"); | |||||
System.out.println("Compiler is available"); | |||||
} catch (ClassNotFoundException cnfe) { | |||||
if (System.getProperty(RECURSION_GUARD) != null) { | |||||
cnfe.printStackTrace(); | |||||
System.out.println("Unable to load compiler"); | |||||
return; | |||||
} | |||||
System.setProperty(RECURSION_GUARD, "yes"); | |||||
System.out.println("Compiler is not on classpath - locating ..."); | |||||
runWithToolsJar(args); | |||||
return; | |||||
} | |||||
buildAnt(); | |||||
} | |||||
} | |||||
@@ -1,75 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2000 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.component.core; | |||||
import java.io.File; | |||||
import java.net.*; | |||||
import org.apache.ant.core.execution.*; | |||||
/** | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public class AntAspectHandler extends AbstractAspectHandler { | |||||
private String id; | |||||
public void setId(String id) { | |||||
this.id = id; | |||||
} | |||||
public void afterConfigElement(Object element) throws ExecutionException { | |||||
getAspectContext().setDataValue(id, element); | |||||
} | |||||
} |
@@ -1,162 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.component.core; | |||||
import org.apache.ant.core.execution.*; | |||||
import org.apache.ant.core.types.*; | |||||
import java.io.*; | |||||
/** | |||||
* Echo | |||||
* | |||||
* @author costin@dnt.ro | |||||
*/ | |||||
public class Echo extends AbstractTask { | |||||
protected String message = ""; // required | |||||
protected File file = null; | |||||
protected boolean append = false; | |||||
// by default, messages are always displayed | |||||
protected int logLevel = BuildEvent.MSG_WARN; | |||||
/** | |||||
* Does the work. | |||||
* | |||||
* @throws ExecutionException if someting goes wrong with the build | |||||
*/ | |||||
public void execute() throws ExecutionException { | |||||
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 ExecutionException(ioe); | |||||
} finally { | |||||
if (out != null) { | |||||
try { | |||||
out.close(); | |||||
} catch (IOException ioex) {} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* Sets the message variable. | |||||
* | |||||
* @param msg Sets the value for the message variable. | |||||
*/ | |||||
public void setMessage(String msg) { | |||||
this.message = msg; | |||||
} | |||||
/** | |||||
* Sets the file attribute. | |||||
*/ | |||||
public void setFile(File file) { | |||||
this.file = file; | |||||
} | |||||
/** | |||||
* Shall we append to an existing file? | |||||
*/ | |||||
public void setAppend(boolean append) { | |||||
this.append = append; | |||||
} | |||||
/** | |||||
* Set a multiline message. | |||||
*/ | |||||
public void addText(String msg) { | |||||
message += msg; | |||||
} | |||||
/** | |||||
* Set the logging level to one of | |||||
* <ul> | |||||
* <li>error</li> | |||||
* <li>warning</li> | |||||
* <li>info</li> | |||||
* <li>verbose</li> | |||||
* <li>debug</li> | |||||
* <ul> | |||||
* <p>The default is "warning" to ensure that messages are | |||||
* displayed by default when using the -quiet command line option.</p> | |||||
*/ | |||||
public void setLevel(EchoLevel echoLevel) { | |||||
String option = echoLevel.getValue(); | |||||
if (option.equals("error")) { | |||||
logLevel = BuildEvent.MSG_ERR; | |||||
} else if (option.equals("warning")) { | |||||
logLevel = BuildEvent.MSG_WARN; | |||||
} else if (option.equals("info")) { | |||||
logLevel = BuildEvent.MSG_INFO; | |||||
} else if (option.equals("verbose")) { | |||||
logLevel = BuildEvent.MSG_VERBOSE; | |||||
} else { | |||||
// must be "debug" | |||||
logLevel = BuildEvent.MSG_DEBUG; | |||||
} | |||||
} | |||||
public static class EchoLevel extends EnumeratedAttribute { | |||||
public String[] getValues() { | |||||
return new String[] {"error", "warning", "info", "verbose", "debug"}; | |||||
} | |||||
} | |||||
} |
@@ -1,98 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2000 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.component.core; | |||||
import org.apache.ant.core.execution.*; | |||||
import org.apache.ant.core.types.EnumeratedAttribute; | |||||
/** | |||||
* Convert between a string and an enumeration | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public class EnumeratedAttributeConverter implements AntConverter { | |||||
private ExecutionFrame frame; | |||||
public void init(ExecutionFrame frame) { | |||||
this.frame = frame; | |||||
} | |||||
public Object convert(String value, Class type) throws ConversionException { | |||||
// The string represents a value | |||||
// get the frame's URL | |||||
try { | |||||
Object instance = type.newInstance(); | |||||
if (!(instance instanceof EnumeratedAttribute)) { | |||||
throw new ConversionException("The type " + type.getName() | |||||
+ " is not a subclass of EnumeratedAttribute"); | |||||
} | |||||
EnumeratedAttribute enum = (EnumeratedAttribute)instance; | |||||
enum.setValue(value.trim()); | |||||
return enum; | |||||
} | |||||
catch (InstantiationException e) { | |||||
throw new ConversionException("Unable to instantiate the enumerated type " | |||||
+ type.getName()); | |||||
} | |||||
catch (IllegalAccessException e) { | |||||
throw new ConversionException("Illegale access when instantiation enumerated type " | |||||
+ type.getName()); | |||||
} | |||||
catch (ExecutionException e) { | |||||
throw new ConversionException("Unable to set the value of the enumerated type " | |||||
+ type.getName() + ": " + e.getMessage()); | |||||
} | |||||
} | |||||
} |
@@ -1,87 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2000 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.component.core; | |||||
import java.io.File; | |||||
import java.net.*; | |||||
import org.apache.ant.core.execution.*; | |||||
/** | |||||
* Convert between a string and a data type | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public class FileConverter implements AntConverter { | |||||
private ExecutionFrame frame; | |||||
public void init(ExecutionFrame frame) { | |||||
this.frame = frame; | |||||
} | |||||
public Object convert(String value, Class type) throws ConversionException { | |||||
// The string represents a value | |||||
// get the frame's URL | |||||
try { | |||||
URL url = new URL(frame.getBaseURL(), value); | |||||
if (url.getProtocol().equals("file")) { | |||||
return new File(url.getFile()); | |||||
} | |||||
} | |||||
catch (MalformedURLException e) { | |||||
// ignore and return as a file. | |||||
} | |||||
return new File(value); | |||||
} | |||||
} |
@@ -1,248 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.component.core; | |||||
import java.util.*; | |||||
import java.io.*; | |||||
import org.apache.ant.core.execution.*; | |||||
import java.net.*; | |||||
/** | |||||
* | |||||
*/ | |||||
public class Property extends AbstractTask { | |||||
private String name; | |||||
private String value; | |||||
private URL file; | |||||
private String resource; | |||||
// private Path classpath; | |||||
private String env; | |||||
// private Reference ref = null; | |||||
public void setName(String name) { | |||||
this.name = name; | |||||
} | |||||
public String getName() { | |||||
return name; | |||||
} | |||||
public void setValue(String value) { | |||||
this.value = value; | |||||
} | |||||
public String getValue() { | |||||
return value; | |||||
} | |||||
public void setFile(URL file) { | |||||
this.file = file; | |||||
} | |||||
public URL getFile() { | |||||
return file; | |||||
} | |||||
public void setLocation(File location) { | |||||
setValue(location.getAbsolutePath()); | |||||
} | |||||
// public void setRefid(Reference ref) { | |||||
// this.ref = ref; | |||||
// } | |||||
// | |||||
// public Reference getRefid() { | |||||
// return ref; | |||||
// } | |||||
// | |||||
public void setResource(String resource) { | |||||
this.resource = resource; | |||||
} | |||||
public String getResource() { | |||||
return resource; | |||||
} | |||||
public void setEnvironment(String env) { | |||||
this.env = env; | |||||
} | |||||
public String getEnvironment() { | |||||
return env; | |||||
} | |||||
// public void setClasspath(Path classpath) { | |||||
// if (this.classpath == null) { | |||||
// this.classpath = classpath; | |||||
// } else { | |||||
// this.classpath.append(classpath); | |||||
// } | |||||
// } | |||||
// | |||||
// public Path createClasspath() { | |||||
// if (this.classpath == null) { | |||||
// this.classpath = new Path(project); | |||||
// } | |||||
// return this.classpath.createPath(); | |||||
// } | |||||
// | |||||
// public void setClasspathRef(Reference r) { | |||||
// createClasspath().setRefid(r); | |||||
// } | |||||
// | |||||
public void execute() throws ExecutionException { | |||||
if ((name != null) && (value != null)) { | |||||
getTaskContext().setDataValue(name, value); | |||||
} | |||||
if (file != null) { | |||||
loadFile(file); | |||||
} | |||||
// if (resource != null) loadResource(resource); | |||||
// | |||||
// if (env != null) loadEnvironment(env); | |||||
// | |||||
// if ((name != null) && (ref != null)) { | |||||
// Object obj = ref.getReferencedObject(getProject()); | |||||
// if (obj != null) { | |||||
// addProperty(name, obj.toString()); | |||||
// } | |||||
// } | |||||
} | |||||
protected void loadFile (URL url) throws ExecutionException { | |||||
Properties props = new Properties(); | |||||
log("Loading " + url, BuildEvent.MSG_VERBOSE); | |||||
try { | |||||
InputStream stream = null; | |||||
if (url.getProtocol().equals("file")) { | |||||
File file = new File(url.getFile()); | |||||
if (file.exists()) { | |||||
stream = new FileInputStream(file); | |||||
} | |||||
} | |||||
else { | |||||
stream = url.openStream(); | |||||
} | |||||
if (stream != null) { | |||||
try { | |||||
props.load(stream); | |||||
resolveAllProperties(props); | |||||
addProperties(props); | |||||
} finally { | |||||
stream.close(); | |||||
} | |||||
} | |||||
} catch (IOException e) { | |||||
throw new ExecutionException("Unable to load property file: " + url, e); | |||||
} | |||||
} | |||||
protected void addProperties(Properties properties) throws ExecutionException { | |||||
for (Iterator i = properties.keySet().iterator(); i.hasNext();) { | |||||
String propertyName = (String)i.next(); | |||||
String propertyValue = properties.getProperty(propertyName); | |||||
getTaskContext().setDataValue(propertyName, | |||||
getTaskContext().replacePropertyRefs(propertyValue)); | |||||
} | |||||
} | |||||
private void resolveAllProperties(Properties props) throws ExecutionException { | |||||
for (Iterator propIterator = props.keySet().iterator(); propIterator.hasNext();) { | |||||
String name = (String)propIterator.next(); | |||||
String value = props.getProperty(name); | |||||
boolean resolved = false; | |||||
while (!resolved) { | |||||
List fragments = new ArrayList(); | |||||
List propertyRefs = new ArrayList(); | |||||
ExecutionFrame.parsePropertyString(value, fragments, propertyRefs); | |||||
resolved = true; | |||||
if (propertyRefs.size() != 0) { | |||||
StringBuffer sb = new StringBuffer(); | |||||
Iterator i = fragments.iterator(); | |||||
Iterator j = propertyRefs.iterator(); | |||||
while (i.hasNext()) { | |||||
String fragment = (String)i.next(); | |||||
if (fragment == null) { | |||||
String propertyName = (String)j.next(); | |||||
if (propertyName.equals(name)) { | |||||
throw new ExecutionException("Property " + name | |||||
+ " from " + file | |||||
+ " was circularly defined."); | |||||
} | |||||
if (props.containsKey(propertyName)) { | |||||
fragment = props.getProperty(propertyName); | |||||
resolved = false; | |||||
} | |||||
else { | |||||
fragment = "${" + propertyName + "}"; | |||||
} | |||||
} | |||||
sb.append(fragment); | |||||
} | |||||
value = sb.toString(); | |||||
props.put(name, value); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
@@ -1,93 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2000 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.component.core; | |||||
import org.apache.ant.core.execution.*; | |||||
import java.net.*; | |||||
import java.io.File; | |||||
/** | |||||
* Convert between a string and a URL, resolved to the ExecutionFrame's base | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public class URLConverter implements AntConverter { | |||||
private ExecutionFrame frame; | |||||
public void init(ExecutionFrame frame) { | |||||
this.frame = frame; | |||||
} | |||||
public Object convert(String value, Class type) throws ConversionException { | |||||
// The string represents a value | |||||
// get the frame's URL | |||||
try { | |||||
URL url = new URL(frame.getBaseURL(), value); | |||||
return url; | |||||
} | |||||
catch (MalformedURLException e) { | |||||
//try a local file | |||||
try { | |||||
File file = new File(value); | |||||
return file.toURL(); | |||||
} | |||||
catch (MalformedURLException e2) { | |||||
throw new ConversionException("Unable to convert " + value | |||||
+ " into a URL relative to the project's base"); | |||||
} | |||||
} | |||||
} | |||||
} |
@@ -1,18 +0,0 @@ | |||||
<antlib> | |||||
<!-- Tasks --> | |||||
<taskdef name="property" classname="org.apache.ant.component.core.Property"/> | |||||
<taskdef name="echo" classname="org.apache.ant.component.core.Echo"/> | |||||
<!-- Data Types --> | |||||
<taskdef name="patternset" classname="org.apache.ant.core.types.PatternSet"/> | |||||
<taskdef name="fileset" classname="org.apache.ant.core.types.FileSet"/> | |||||
<!-- Converters --> | |||||
<converter target="java.io.File" classname="org.apache.ant.component.core.FileConverter"/> | |||||
<converter target="java.net.URL" classname="org.apache.ant.component.core.URLConverter"/> | |||||
<converter target="org.apache.ant.core.types.EnumeratedAttribute" | |||||
classname="org.apache.ant.component.core.EnumeratedAttributeConverter"/> | |||||
<!-- Aspect Handlers --> | |||||
<aspect prefix="ant" classname="org.apache.ant.component.core.AntAspectHandler"/> | |||||
</antlib> |
@@ -1,2 +0,0 @@ | |||||
<antlib> | |||||
</antlib> |
@@ -1,78 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.component.thread; | |||||
import org.apache.ant.core.execution.*; | |||||
import java.io.*; | |||||
import java.util.*; | |||||
/** | |||||
* Parallel execution of contained tasks. | |||||
* | |||||
*/ | |||||
public class Parallel extends AbstractTask implements TaskContainer { | |||||
private List tasks = new ArrayList(); | |||||
public void addTask(Task nestedTask) { | |||||
tasks.add(nestedTask); | |||||
} | |||||
public void execute() throws ExecutionException { | |||||
for (Iterator i = tasks.iterator(); i.hasNext(); ) { | |||||
Task nestedTask = (Task)i.next(); | |||||
nestedTask.execute(); | |||||
} | |||||
} | |||||
} |
@@ -1,78 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.component.thread; | |||||
import org.apache.ant.core.execution.*; | |||||
import java.io.*; | |||||
import java.util.*; | |||||
/** | |||||
* Sequential execution of contained tasks. | |||||
* | |||||
*/ | |||||
public class Sequential extends AbstractTask implements TaskContainer { | |||||
private List tasks = new ArrayList(); | |||||
public void addTask(Task nestedTask) { | |||||
tasks.add(nestedTask); | |||||
} | |||||
public void execute() throws ExecutionException { | |||||
for (Iterator i = tasks.iterator(); i.hasNext(); ) { | |||||
Task nestedTask = (Task)i.next(); | |||||
nestedTask.execute(); | |||||
} | |||||
} | |||||
} |
@@ -1,4 +0,0 @@ | |||||
<antlib> | |||||
<taskdef name="parallel" classname="org.apache.ant.component.thread.Parallel"/> | |||||
<taskdef name="sequential" classname="org.apache.ant.component.thread.Sequential"/> | |||||
</antlib> |
@@ -1,147 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.core.config; | |||||
import java.io.*; | |||||
import java.net.MalformedURLException; | |||||
import java.net.URL; | |||||
import java.net.URLClassLoader; | |||||
import java.util.*; | |||||
import org.apache.ant.core.execution.*; | |||||
import org.apache.ant.core.support.*; | |||||
import org.apache.ant.core.xml.AntLibParser; | |||||
import org.xml.sax.SAXParseException; | |||||
/** | |||||
* Manager for Ant components | |||||
* | |||||
* The component manager is responsible for locating and loading the | |||||
* components contained in Ant's lib/task directory. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public class ComponentManager { | |||||
/** | |||||
* When Ant is run remotely, we need to look up the list of component | |||||
* libraries from the server. | |||||
*/ | |||||
static public String COMPONENT_INDEX = "taskindex"; | |||||
/** | |||||
* Create the component manager. When the component manager is created | |||||
* it will read the component definitions from the files in | |||||
* Ant's lib/task directory | |||||
*/ | |||||
static public AntLibrary[] getComponents() throws LocationException, ConfigException { | |||||
try { | |||||
URL componentsLocation = new URL(AntLocator.getLibraryURL(), "task/"); | |||||
URL[] componentFiles = null; | |||||
if (componentsLocation.getProtocol().equals("file")) { | |||||
// component directory is local - we determine the | |||||
// component files by scanning the local directory | |||||
HashSet componentFilesTypes = new HashSet(); | |||||
componentFilesTypes.add(".tsk"); | |||||
componentFilesTypes.add(".jar"); | |||||
componentFilesTypes.add(".zip"); | |||||
File componentsDirectory = new File(componentsLocation.getFile()); | |||||
componentFiles = AntLocator.getDirectoryURLs(componentsDirectory, componentFilesTypes); | |||||
} | |||||
else { | |||||
// The component directory is remote - we determine the | |||||
// list of component files by reading a "known" list file. | |||||
URL componentListURL = new URL(componentsLocation, COMPONENT_INDEX); | |||||
BufferedReader reader = null; | |||||
List componentList = new ArrayList(); | |||||
try { | |||||
reader = new BufferedReader(new InputStreamReader(componentListURL.openStream())); | |||||
String line = null; | |||||
while ((line = reader.readLine()) != null) { | |||||
componentList.add(new URL(componentsLocation, line.trim())); | |||||
} | |||||
} | |||||
finally { | |||||
if (reader != null) { | |||||
reader.close(); | |||||
} | |||||
} | |||||
componentFiles = (URL[])componentList.toArray(new URL[0]); | |||||
} | |||||
AntLibParser libdefParser = new AntLibParser(); | |||||
List libraries = new ArrayList(); | |||||
for (int i = 0; i < componentFiles.length; ++i) { | |||||
// We create a classloader for the component library | |||||
URL[] componentURLs = new URL[]{componentFiles[i]}; | |||||
AntClassLoader componentClassLoader | |||||
= new AntClassLoader(componentURLs, | |||||
ComponentManager.class.getClassLoader(), | |||||
componentFiles[i].toString()); | |||||
URL libDefinition = componentClassLoader.getResource("ANT-INF/antlib.xml"); | |||||
if (libDefinition != null) { | |||||
AntLibrary library | |||||
= libdefParser.parseAntLibrary(libDefinition, componentClassLoader); | |||||
libraries.add(library); | |||||
} | |||||
} | |||||
return (AntLibrary[])libraries.toArray(new AntLibrary[0]); | |||||
} | |||||
catch (IOException e) { | |||||
throw new ConfigException(e); | |||||
} | |||||
} | |||||
} | |||||
@@ -1,83 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.core.execution; | |||||
import org.apache.ant.core.model.*; | |||||
import org.apache.ant.core.support.*; | |||||
import java.util.*; | |||||
import java.net.URL; | |||||
/** | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public abstract class AbstractAspectHandler implements AspectHandler { | |||||
private ExecutionContext aspectContext; | |||||
public void setAspectContext(ExecutionContext context) { | |||||
this.aspectContext = context; | |||||
} | |||||
protected ExecutionContext getAspectContext() { | |||||
return aspectContext; | |||||
} | |||||
public void beforeConfigElement(Object element) throws ExecutionException { | |||||
} | |||||
public void afterConfigElement(Object element) throws ExecutionException { | |||||
} | |||||
} | |||||
@@ -1,96 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.core.execution; | |||||
import org.apache.ant.core.model.*; | |||||
import org.apache.ant.core.support.*; | |||||
import java.util.*; | |||||
import java.net.URL; | |||||
/** | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public abstract class AbstractTask implements Task { | |||||
private ExecutionContext taskContext; | |||||
public void setTaskContext(ExecutionContext context) { | |||||
this.taskContext = context; | |||||
} | |||||
protected ExecutionContext getTaskContext() { | |||||
return taskContext; | |||||
} | |||||
/** | |||||
* Log a message with the default (INFO) priority. | |||||
* | |||||
* @param msg the message to be logged. | |||||
*/ | |||||
public void log(String msg) { | |||||
log(msg, BuildEvent.MSG_INFO); | |||||
} | |||||
/** | |||||
* Log a mesage with the give priority. | |||||
* | |||||
* @param the message to be logged. | |||||
* @param msgLevel the message priority at which this message is to be logged. | |||||
*/ | |||||
public void log(String msg, int msgLevel) { | |||||
taskContext.log(msg, msgLevel); | |||||
} | |||||
} | |||||
@@ -1,65 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2000 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.core.execution; | |||||
/** | |||||
* An AntConverter is a Converter which is initialised with the | |||||
* ExecutionFrame context in which it will perform its conversions | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public interface AntConverter extends Converter { | |||||
void init(ExecutionFrame frame); | |||||
} |
@@ -1,137 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.core.execution; | |||||
import org.apache.ant.core.support.*; | |||||
import java.util.*; | |||||
import java.net.URL; | |||||
/** | |||||
* This object represents an Ant library definition. An Ant library | |||||
* is a set of plug-in for Ant consisting primarily of tasks but may include | |||||
* other ant components. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public class AntLibrary { | |||||
/** | |||||
* The task definitions contained by this library | |||||
*/ | |||||
private Map taskDefinitions = new HashMap(); | |||||
/** | |||||
* The converter definitions contained by this library | |||||
*/ | |||||
private Map converterDefinitions = new HashMap(); | |||||
/** | |||||
* The aspect handler definitions contained by this library | |||||
*/ | |||||
private Map aspectDefinitions = new HashMap(); | |||||
/** | |||||
* Add a task definition to this library | |||||
*/ | |||||
public void addTaskDefinition(TaskDefinition taskDefinition) { | |||||
String taskName = taskDefinition.getName(); | |||||
taskDefinitions.put(taskName, taskDefinition); | |||||
} | |||||
/** | |||||
* Add a converter definition to this library | |||||
*/ | |||||
public void addConverterDefinition(ConverterDefinition converterDef) { | |||||
String targetClassname = converterDef.getTargetClassName(); | |||||
converterDefinitions.put(targetClassname, converterDef); | |||||
} | |||||
/** | |||||
* Add an aspect handler definition to this library | |||||
*/ | |||||
public void addAspectDefinition(AspectDefinition aspectDef) { | |||||
String aspectPrefix = aspectDef.getAspectPrefix(); | |||||
aspectDefinitions.put(aspectPrefix, aspectDef); | |||||
} | |||||
/** | |||||
* Get the task definitions | |||||
* | |||||
* @return an iterator which returns TaskDefinition objects. | |||||
*/ | |||||
public Iterator getTaskDefinitions() { | |||||
return taskDefinitions.values().iterator(); | |||||
} | |||||
/** | |||||
* Get the converter definitions | |||||
* | |||||
* @return an iterator which returns ConverterDefinition objects. | |||||
*/ | |||||
public Iterator getConverterDefinitions() { | |||||
return converterDefinitions.values().iterator(); | |||||
} | |||||
/** | |||||
* Get the aspect handler definitions | |||||
* | |||||
* @return an iterator which returns AspectDefinition objects. | |||||
*/ | |||||
public Iterator getAspectDefinitions() { | |||||
return aspectDefinitions.values().iterator(); | |||||
} | |||||
} | |||||
@@ -1,124 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.core.execution; | |||||
import java.util.*; | |||||
import java.net.URL; | |||||
/** | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public class AspectDefinition { | |||||
/** The URL of the library which defines this aspect handler */ | |||||
private URL aspectLibraryURL; | |||||
/** The aspect's tag */ | |||||
private String aspectPrefix; | |||||
/** The aspect handler's classname */ | |||||
private String aspectClassName; | |||||
/** The aspect handler's class loader. */ | |||||
private ClassLoader aspectClassLoader; | |||||
/** The class to which this converter converts. */ | |||||
private Class aspectHandlerClass = null; | |||||
public AspectDefinition(URL aspectLibraryURL, String aspectPrefix, | |||||
String aspectClassName, ClassLoader aspectClassLoader) { | |||||
this.aspectLibraryURL = aspectLibraryURL; | |||||
this.aspectPrefix = aspectPrefix; | |||||
this.aspectClassName = aspectClassName; | |||||
this.aspectClassLoader = aspectClassLoader; | |||||
} | |||||
/** | |||||
* Get the URL where this aspect handler was defined. | |||||
* | |||||
* @returns a URL of the lib defintion file | |||||
*/ | |||||
public URL getLibraryURL() { | |||||
return aspectLibraryURL; | |||||
} | |||||
/** | |||||
* Get the Aspect's Prefix | |||||
*/ | |||||
public String getAspectPrefix() { | |||||
return aspectPrefix; | |||||
} | |||||
/** | |||||
* Get the aspect handler class | |||||
* | |||||
* @return a class object for this aspect handler's class | |||||
*/ | |||||
public synchronized Class getAspectHandlerClass() throws ClassNotFoundException { | |||||
if (aspectHandlerClass == null) { | |||||
aspectHandlerClass = Class.forName(aspectClassName, true, aspectClassLoader); | |||||
} | |||||
return aspectHandlerClass; | |||||
} | |||||
/** | |||||
* Get the classname of the aspect handler that is being defined. | |||||
*/ | |||||
public String getAspectHandlerClassName() { | |||||
return aspectClassName; | |||||
} | |||||
} | |||||
@@ -1,75 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.core.execution; | |||||
import org.apache.ant.core.model.*; | |||||
import org.apache.ant.core.support.*; | |||||
import java.util.*; | |||||
import java.net.URL; | |||||
/** | |||||
* An AspectHandler is used to handle a set of aspects which may occur in a number | |||||
* of elements in the build model. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public interface AspectHandler { | |||||
void setAspectContext(ExecutionContext context); | |||||
void beforeConfigElement(Object element) throws ExecutionException ; | |||||
void afterConfigElement(Object element) throws ExecutionException ; | |||||
} | |||||
@@ -1,171 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 1999 The Apache Software Foundation. All rights | |||||
* reserved. | |||||
* | |||||
* Redistribution and use in source and binary forms, with or without | |||||
* modification, are permitted provided that the following conditions | |||||
* are met: | |||||
* | |||||
* 1. Redistributions of source code must retain the above copyright | |||||
* notice, this list of conditions and the following disclaimer. | |||||
* | |||||
* 2. Redistributions in binary form must reproduce the above copyright | |||||
* notice, this list of conditions and the following disclaimer in | |||||
* the documentation and/or other materials provided with the | |||||
* distribution. | |||||
* | |||||
* 3. The end-user documentation included with the redistribution, if | |||||
* any, must include the following acknowlegement: | |||||
* "This product includes software developed by the | |||||
* Apache Software Foundation (http://www.apache.org/)." | |||||
* Alternately, this acknowlegement may appear in the software itself, | |||||
* if and wherever such third-party acknowlegements normally appear. | |||||
* | |||||
* 4. The names "The Jakarta Project", "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.core.execution; | |||||
import java.util.EventObject; | |||||
import org.apache.ant.core.model.*; | |||||
/* | |||||
* 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. | |||||
*/ | |||||
public class BuildEvent extends EventObject { | |||||
public static final int MSG_ERR = 0; | |||||
public static final int MSG_WARN = 1; | |||||
public static final int MSG_INFO = 2; | |||||
public static final int MSG_VERBOSE = 3; | |||||
public static final int MSG_DEBUG = 4; | |||||
public static final int BUILD_STARTED = 1; | |||||
public static final int BUILD_FINISHED = 2; | |||||
public static final int TARGET_STARTED = 3; | |||||
public static final int TARGET_FINISHED = 4; | |||||
public static final int TASK_STARTED = 5; | |||||
public static final int TASK_FINISHED = 6; | |||||
public static final int MESSAGE = 7; | |||||
private int eventType; | |||||
private BuildElement buildElement = null; | |||||
private Throwable cause = null; | |||||
private String message = null; | |||||
private int messagePriority; | |||||
/** | |||||
* Create a build event. | |||||
* | |||||
* @param soure the source of the build event. | |||||
* @param eventType the type of the buildEvent. | |||||
* @param buildElement the build element with which the event is associated. | |||||
*/ | |||||
public BuildEvent(Object source, int eventType, BuildElement buildElement) { | |||||
super(source); | |||||
this.eventType = eventType; | |||||
this.buildElement = buildElement; | |||||
} | |||||
/** | |||||
* Create a build event with an associated exception. | |||||
* | |||||
* @param soure the source of the build event. | |||||
* @param eventType the type of the buildEvent. | |||||
* @param buildElement the build element with which the event is associated. | |||||
*/ | |||||
public BuildEvent(Object source, int eventType, BuildElement buildElement, | |||||
Throwable cause) { | |||||
this(source, eventType, buildElement); | |||||
this.cause = cause; | |||||
} | |||||
/** | |||||
* Create a build event for a message | |||||
* | |||||
* @param soure the source of the build event. | |||||
* @param buildElement the build element with which the event is associated. | |||||
* @param message the message associated with this event | |||||
* @param priority the message priority | |||||
*/ | |||||
public BuildEvent(Object source, BuildElement buildElement, String message, | |||||
int priority) { | |||||
this(source, MESSAGE, buildElement); | |||||
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 BuildElement getBuildElement() { | |||||
return buildElement; | |||||
} | |||||
/** | |||||
* Returns the logging message. This field will only be set | |||||
* for "messageLogged" events. | |||||
* | |||||
*/ | |||||
public String getMessage() { | |||||
return message; | |||||
} | |||||
/** | |||||
* Returns the priority of the logging message. This field will only | |||||
* be set for "messageLogged" events. | |||||
*/ | |||||
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. | |||||
*/ | |||||
public Throwable getCause() { | |||||
return cause; | |||||
} | |||||
} |
@@ -1,116 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 1999 The Apache Software Foundation. All rights | |||||
* reserved. | |||||
* | |||||
* Redistribution and use in source and binary forms, with or without | |||||
* modification, are permitted provided that the following conditions | |||||
* are met: | |||||
* | |||||
* 1. Redistributions of source code must retain the above copyright | |||||
* notice, this list of conditions and the following disclaimer. | |||||
* | |||||
* 2. Redistributions in binary form must reproduce the above copyright | |||||
* notice, this list of conditions and the following disclaimer in | |||||
* the documentation and/or other materials provided with the | |||||
* distribution. | |||||
* | |||||
* 3. The end-user documentation included with the redistribution, if | |||||
* any, must include the following acknowlegement: | |||||
* "This product includes software developed by the | |||||
* Apache Software Foundation (http://www.apache.org/)." | |||||
* Alternately, this acknowlegement may appear in the software itself, | |||||
* if and wherever such third-party acknowlegements normally appear. | |||||
* | |||||
* 4. The names "The Jakarta Project", "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.core.execution; | |||||
import java.util.*; | |||||
import org.apache.ant.core.model.*; | |||||
/** | |||||
* BuildEventSupport is used by classes which which to send | |||||
* build events to the BuoldListeners | |||||
*/ | |||||
public class BuildEventSupport { | |||||
private List listeners = new ArrayList(); | |||||
public void addBuildListener(BuildListener listener) { | |||||
listeners.add(listener); | |||||
} | |||||
public void removeBuildListener(BuildListener listener) { | |||||
listeners.remove(listener); | |||||
} | |||||
public void forwardEvent(BuildEvent event) { | |||||
for (Iterator i = listeners.iterator(); i.hasNext();) { | |||||
BuildListener listener = (BuildListener)i.next(); | |||||
listener.processBuildEvent(event); | |||||
} | |||||
} | |||||
public void fireBuildStarted(Object source, BuildElement element) { | |||||
BuildEvent event = new BuildEvent(source, BuildEvent.BUILD_STARTED, element); | |||||
forwardEvent(event); | |||||
} | |||||
public void fireBuildFinished(Object source, BuildElement element, Throwable cause) { | |||||
BuildEvent event = new BuildEvent(source, BuildEvent.BUILD_FINISHED, element, cause); | |||||
forwardEvent(event); | |||||
} | |||||
public void fireTargetStarted(Object source, BuildElement element) { | |||||
BuildEvent event = new BuildEvent(source, BuildEvent.TARGET_STARTED, element); | |||||
forwardEvent(event); | |||||
} | |||||
public void fireTargetFinished(Object source, BuildElement element, Throwable cause) { | |||||
BuildEvent event = new BuildEvent(source, BuildEvent.TARGET_FINISHED, element, cause); | |||||
forwardEvent(event); | |||||
} | |||||
public void fireTaskStarted(Object source, BuildElement element) { | |||||
BuildEvent event = new BuildEvent(source, BuildEvent.TASK_STARTED, element); | |||||
forwardEvent(event); | |||||
} | |||||
public void fireTaskFinished(Object source, BuildElement element, Throwable cause) { | |||||
BuildEvent event = new BuildEvent(source, BuildEvent.TASK_FINISHED, element, cause); | |||||
forwardEvent(event); | |||||
} | |||||
public void fireMessageLogged(Object source, BuildElement element, | |||||
String message, int priority) { | |||||
BuildEvent event = new BuildEvent(source, element, message, priority); | |||||
forwardEvent(event); | |||||
} | |||||
} |
@@ -1,67 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 1999 The Apache Software Foundation. All rights | |||||
* reserved. | |||||
* | |||||
* Redistribution and use in source and binary forms, with or without | |||||
* modification, are permitted provided that the following conditions | |||||
* are met: | |||||
* | |||||
* 1. Redistributions of source code must retain the above copyright | |||||
* notice, this list of conditions and the following disclaimer. | |||||
* | |||||
* 2. Redistributions in binary form must reproduce the above copyright | |||||
* notice, this list of conditions and the following disclaimer in | |||||
* the documentation and/or other materials provided with the | |||||
* distribution. | |||||
* | |||||
* 3. The end-user documentation included with the redistribution, if | |||||
* any, must include the following acknowlegement: | |||||
* "This product includes software developed by the | |||||
* Apache Software Foundation (http://www.apache.org/)." | |||||
* Alternately, this acknowlegement may appear in the software itself, | |||||
* if and wherever such third-party acknowlegements normally appear. | |||||
* | |||||
* 4. The names "The Jakarta Project", "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.core.execution; | |||||
import java.util.EventListener; | |||||
/** | |||||
* Classes that implement this interface will be notified when | |||||
* things happend during a build. | |||||
* | |||||
* @see BuildEvent | |||||
*/ | |||||
public interface BuildListener extends EventListener { | |||||
void processBuildEvent(BuildEvent event); | |||||
} |
@@ -1,144 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.core.execution; | |||||
import java.io.*; | |||||
/** | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public class ClassIntrospectionException extends Exception { | |||||
/** | |||||
* Exception that might have caused this one. | |||||
*/ | |||||
private Throwable cause = null; | |||||
/** | |||||
* Constructs an exception with the given descriptive message. | |||||
* @param msg Description of or information about the exception. | |||||
*/ | |||||
public ClassIntrospectionException(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 ClassIntrospectionException(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 ClassIntrospectionException(Throwable cause) { | |||||
super(cause.getMessage()); | |||||
this.cause = cause; | |||||
} | |||||
/** | |||||
* Returns the nested exception. | |||||
* | |||||
* @return the underlying exception | |||||
*/ | |||||
public Throwable getCause() { | |||||
return 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); | |||||
} | |||||
} | |||||
} | |||||
} |
@@ -1,477 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2000 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.core.execution; | |||||
import java.lang.reflect.*; | |||||
import java.io.File; | |||||
import java.util.*; | |||||
/** | |||||
* Introspects a class and builds a set of objects to assist in intospecting the | |||||
* class. | |||||
* | |||||
* @author Stefan Bodewig <a href="mailto:stefan.bodewig@megabit.net">stefan.bodewig@megabit.net</a> | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public class ClassIntrospector { | |||||
/** | |||||
* holds the types of the attributes that could be set. | |||||
*/ | |||||
private Hashtable attributeTypes; | |||||
/** | |||||
* holds the attribute setter methods. | |||||
*/ | |||||
private Hashtable attributeSetters; | |||||
/** | |||||
* Holds the types of nested elements that could be created. | |||||
*/ | |||||
private Hashtable nestedTypes; | |||||
/** | |||||
* Holds methods to create nested elements. | |||||
*/ | |||||
private Hashtable nestedCreators; | |||||
/** | |||||
* The method to add PCDATA stuff. | |||||
*/ | |||||
private Method addText = null; | |||||
/** | |||||
* The Class that's been introspected. | |||||
*/ | |||||
private Class bean; | |||||
/** | |||||
* returns the boolean equivalent of a string, which is considered true | |||||
* if either "on", "true", or "yes" is found, ignoring case. | |||||
*/ | |||||
public static boolean toBoolean(String s) { | |||||
return (s.equalsIgnoreCase("on") || | |||||
s.equalsIgnoreCase("true") || | |||||
s.equalsIgnoreCase("yes")); | |||||
} | |||||
public ClassIntrospector(final Class bean, Map converters) { | |||||
attributeTypes = new Hashtable(); | |||||
attributeSetters = new Hashtable(); | |||||
nestedTypes = new Hashtable(); | |||||
nestedCreators = new Hashtable(); | |||||
this.bean = bean; | |||||
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 ("addText".equals(name) | |||||
&& java.lang.Void.TYPE.equals(returnType) | |||||
&& args.length == 1 | |||||
&& java.lang.String.class.equals(args[0])) { | |||||
addText = methods[i]; | |||||
} else if (name.startsWith("set") | |||||
&& java.lang.Void.TYPE.equals(returnType) | |||||
&& args.length == 1 | |||||
&& !args[0].isArray()) { | |||||
String propName = getPropertyName(name, "set"); | |||||
AttributeSetter as = createAttributeSetter(m, args[0], converters); | |||||
if (as != null) { | |||||
attributeTypes.put(propName, args[0]); | |||||
attributeSetters.put(propName, as); | |||||
} | |||||
} else if (name.startsWith("create") | |||||
&& !returnType.isArray() | |||||
&& !returnType.isPrimitive() | |||||
&& args.length == 0) { | |||||
String propName = getPropertyName(name, "create"); | |||||
nestedTypes.put(propName, returnType); | |||||
nestedCreators.put(propName, new NestedCreator() { | |||||
public Object create(Object parent) | |||||
throws InvocationTargetException, | |||||
IllegalAccessException { | |||||
return m.invoke(parent, new Object[] {}); | |||||
} | |||||
}); | |||||
} else if (name.startsWith("add") | |||||
&& java.lang.Void.TYPE.equals(returnType) | |||||
&& args.length == 1 | |||||
&& !java.lang.String.class.equals(args[0]) | |||||
&& !args[0].isArray() | |||||
&& !args[0].isPrimitive()) { | |||||
try { | |||||
final Constructor c = | |||||
args[0].getConstructor(new Class[] {}); | |||||
String propName = getPropertyName(name, "add"); | |||||
nestedTypes.put(propName, args[0]); | |||||
nestedCreators.put(propName, new NestedCreator() { | |||||
public Object create(Object parent) | |||||
throws InvocationTargetException, IllegalAccessException, InstantiationException { | |||||
Object o = c.newInstance(new Object[] {}); | |||||
m.invoke(parent, new Object[] {o}); | |||||
return o; | |||||
} | |||||
}); | |||||
} catch (NoSuchMethodException nse) { | |||||
} | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* Sets the named attribute. | |||||
*/ | |||||
public void setAttribute(Object element, String attributeName, | |||||
String value) | |||||
throws ClassIntrospectionException, ConversionException { | |||||
AttributeSetter as = (AttributeSetter) attributeSetters.get(attributeName); | |||||
if (as == null) { | |||||
String msg = "Class " + element.getClass().getName() + | |||||
" doesn't support the \"" + attributeName + "\" attribute"; | |||||
throw new ClassIntrospectionException(msg); | |||||
} | |||||
try { | |||||
as.set(element, value); | |||||
} catch (IllegalAccessException ie) { | |||||
// impossible as getMethods should only return public methods | |||||
throw new ClassIntrospectionException(ie); | |||||
} catch (InvocationTargetException ite) { | |||||
Throwable t = ite.getTargetException(); | |||||
if (t instanceof ClassIntrospectionException) { | |||||
throw (ClassIntrospectionException) t; | |||||
} | |||||
throw new ClassIntrospectionException(t); | |||||
} | |||||
} | |||||
/** | |||||
* Adds PCDATA areas. | |||||
*/ | |||||
public void addText(Object element, String text) | |||||
throws ClassIntrospectionException { | |||||
if (addText == null) { | |||||
String msg = "Class " + element.getClass().getName() + | |||||
" doesn't support nested text elements"; | |||||
throw new ClassIntrospectionException(msg); | |||||
} | |||||
try { | |||||
addText.invoke(element, new String[] {text}); | |||||
} catch (IllegalAccessException ie) { | |||||
// impossible as getMethods should only return public methods | |||||
throw new ClassIntrospectionException(ie); | |||||
} catch (InvocationTargetException ite) { | |||||
Throwable t = ite.getTargetException(); | |||||
if (t instanceof ClassIntrospectionException) { | |||||
throw (ClassIntrospectionException) t; | |||||
} | |||||
throw new ClassIntrospectionException(t); | |||||
} | |||||
} | |||||
public boolean supportsNestedElement(String elementName) { | |||||
return nestedCreators.containsKey(elementName); | |||||
} | |||||
/** | |||||
* Creates a named nested element. | |||||
*/ | |||||
public Object createElement(Object element, String elementName) | |||||
throws ClassIntrospectionException { | |||||
NestedCreator nc = (NestedCreator) nestedCreators.get(elementName); | |||||
if (nc == null) { | |||||
String msg = "Class " + element.getClass().getName() + | |||||
" doesn't support the nested \"" + elementName + "\" element"; | |||||
throw new ClassIntrospectionException(msg); | |||||
} | |||||
try { | |||||
return nc.create(element); | |||||
} catch (IllegalAccessException ie) { | |||||
// impossible as getMethods should only return public methods | |||||
throw new ClassIntrospectionException(ie); | |||||
} catch (InstantiationException ine) { | |||||
// impossible as getMethods should only return public methods | |||||
throw new ClassIntrospectionException(ine); | |||||
} catch (InvocationTargetException ite) { | |||||
Throwable t = ite.getTargetException(); | |||||
if (t instanceof ClassIntrospectionException) { | |||||
throw (ClassIntrospectionException) t; | |||||
} | |||||
throw new ClassIntrospectionException(t); | |||||
} | |||||
} | |||||
/** | |||||
* returns the type of a named nested element. | |||||
*/ | |||||
public Class getElementType(String elementName) | |||||
throws ClassIntrospectionException { | |||||
Class nt = (Class) nestedTypes.get(elementName); | |||||
if (nt == null) { | |||||
String msg = "Class " + bean.getName() + | |||||
" doesn't support the nested \"" + elementName + "\" element"; | |||||
throw new ClassIntrospectionException(msg); | |||||
} | |||||
return nt; | |||||
} | |||||
/** | |||||
* returns the type of a named attribute. | |||||
*/ | |||||
public Class getAttributeType(String attributeName) | |||||
throws ClassIntrospectionException { | |||||
Class at = (Class) attributeTypes.get(attributeName); | |||||
if (at == null) { | |||||
String msg = "Class " + bean.getName() + | |||||
" doesn't support the \"" + attributeName + "\" attribute"; | |||||
throw new ClassIntrospectionException(msg); | |||||
} | |||||
return at; | |||||
} | |||||
/** | |||||
* Does the introspected class support PCDATA? | |||||
*/ | |||||
public boolean supportsCharacters() { | |||||
return addText != null; | |||||
} | |||||
/** | |||||
* Return all attribues supported by the introspected class. | |||||
*/ | |||||
public Enumeration getAttributes() { | |||||
return attributeSetters.keys(); | |||||
} | |||||
/** | |||||
* Return all nested elements supported by the introspected class. | |||||
*/ | |||||
public Enumeration getNestedElements() { | |||||
return nestedTypes.keys(); | |||||
} | |||||
/** | |||||
* Create a proper implementation of AttributeSetter for the given | |||||
* attribute type. | |||||
*/ | |||||
private AttributeSetter createAttributeSetter(final Method m, | |||||
final Class arg, | |||||
Map converters) { | |||||
if (converters != null && converters.containsKey(arg)) { | |||||
// we have a converter to use to convert the strign | |||||
// value of into something the set method expects. | |||||
final Converter converter = (Converter)converters.get(arg); | |||||
return new AttributeSetter() { | |||||
public void set(Object parent, String value) | |||||
throws InvocationTargetException, IllegalAccessException, | |||||
ClassIntrospectionException, ConversionException { | |||||
m.invoke(parent, new Object[] {converter.convert(value, arg)}); | |||||
} | |||||
}; | |||||
} | |||||
// simplest case - setAttribute expects String | |||||
else if (java.lang.String.class.equals(arg)) { | |||||
return new AttributeSetter() { | |||||
public void set(Object parent, String value) | |||||
throws InvocationTargetException, IllegalAccessException { | |||||
m.invoke(parent, new String[] {value}); | |||||
} | |||||
}; | |||||
// now for the primitive types, use their wrappers | |||||
} else if (java.lang.Character.class.equals(arg) | |||||
|| java.lang.Character.TYPE.equals(arg)) { | |||||
return new AttributeSetter() { | |||||
public void set(Object parent, String value) | |||||
throws InvocationTargetException, IllegalAccessException { | |||||
m.invoke(parent, new Character[] {new Character(value.charAt(0))}); | |||||
} | |||||
}; | |||||
} else if (java.lang.Byte.TYPE.equals(arg)) { | |||||
return new AttributeSetter() { | |||||
public void set(Object parent, String value) | |||||
throws InvocationTargetException, IllegalAccessException { | |||||
m.invoke(parent, new Byte[] {new Byte(value)}); | |||||
} | |||||
}; | |||||
} else if (java.lang.Short.TYPE.equals(arg)) { | |||||
return new AttributeSetter() { | |||||
public void set(Object parent, String value) | |||||
throws InvocationTargetException, IllegalAccessException { | |||||
m.invoke(parent, new Short[] {new Short(value)}); | |||||
} | |||||
}; | |||||
} else if (java.lang.Integer.TYPE.equals(arg)) { | |||||
return new AttributeSetter() { | |||||
public void set(Object parent, String value) | |||||
throws InvocationTargetException, IllegalAccessException { | |||||
m.invoke(parent, new Integer[] {new Integer(value)}); | |||||
} | |||||
}; | |||||
} else if (java.lang.Long.TYPE.equals(arg)) { | |||||
return new AttributeSetter() { | |||||
public void set(Object parent, String value) | |||||
throws InvocationTargetException, IllegalAccessException { | |||||
m.invoke(parent, new Long[] {new Long(value)}); | |||||
} | |||||
}; | |||||
} else if (java.lang.Float.TYPE.equals(arg)) { | |||||
return new AttributeSetter() { | |||||
public void set(Object parent, String value) | |||||
throws InvocationTargetException, IllegalAccessException { | |||||
m.invoke(parent, new Float[] {new Float(value)}); | |||||
} | |||||
}; | |||||
} else if (java.lang.Double.TYPE.equals(arg)) { | |||||
return new AttributeSetter() { | |||||
public void set(Object parent, String value) | |||||
throws InvocationTargetException, IllegalAccessException { | |||||
m.invoke(parent, new Double[] {new Double(value)}); | |||||
} | |||||
}; | |||||
} else if (java.lang.Boolean.class.equals(arg) | |||||
|| java.lang.Boolean.TYPE.equals(arg)) { | |||||
return new AttributeSetter() { | |||||
public void set(Object parent, String value) | |||||
throws InvocationTargetException, IllegalAccessException { | |||||
m.invoke(parent, | |||||
new Boolean[] {new Boolean(toBoolean(value))}); | |||||
} | |||||
}; | |||||
// Class doesn't have a String constructor but a decent factory method | |||||
} else if (java.lang.Class.class.equals(arg)) { | |||||
return new AttributeSetter() { | |||||
public void set(Object parent, String value) | |||||
throws InvocationTargetException, IllegalAccessException, ClassIntrospectionException { | |||||
try { | |||||
m.invoke(parent, new Class[] {Class.forName(value)}); | |||||
} catch (ClassNotFoundException ce) { | |||||
throw new ClassIntrospectionException(ce); | |||||
} | |||||
} | |||||
}; | |||||
// worst case. look for a public String constructor and use it | |||||
} else { | |||||
try { | |||||
final Constructor c = | |||||
arg.getConstructor(new Class[] {java.lang.String.class}); | |||||
return new AttributeSetter() { | |||||
public void set(Object parent, | |||||
String value) | |||||
throws InvocationTargetException, IllegalAccessException, ClassIntrospectionException { | |||||
try { | |||||
m.invoke(parent, new Object[] {c.newInstance(new String[] {value})}); | |||||
} catch (InstantiationException ie) { | |||||
throw new ClassIntrospectionException(ie); | |||||
} | |||||
} | |||||
}; | |||||
} catch (NoSuchMethodException nme) { | |||||
} | |||||
} | |||||
return null; | |||||
} | |||||
/** | |||||
* extract the name of a property from a method name - subtracting | |||||
* a given prefix. | |||||
*/ | |||||
private String getPropertyName(String methodName, String prefix) { | |||||
int start = prefix.length(); | |||||
return methodName.substring(start).toLowerCase(); | |||||
} | |||||
private interface NestedCreator { | |||||
public Object create(Object parent) | |||||
throws InvocationTargetException, IllegalAccessException, InstantiationException; | |||||
} | |||||
private interface AttributeSetter { | |||||
public void set(Object parent, String value) | |||||
throws InvocationTargetException, IllegalAccessException, | |||||
ClassIntrospectionException, ConversionException; | |||||
} | |||||
} |
@@ -1,144 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.core.execution; | |||||
import java.io.*; | |||||
/** | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public class ConversionException extends Exception { | |||||
/** | |||||
* Exception that might have caused this one. | |||||
*/ | |||||
private Throwable cause = null; | |||||
/** | |||||
* 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 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); | |||||
this.cause = cause; | |||||
} | |||||
/** | |||||
* 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.toString()); | |||||
this.cause = cause; | |||||
} | |||||
/** | |||||
* Returns the nested exception. | |||||
* | |||||
* @return the underlying exception | |||||
*/ | |||||
public Throwable getCause() { | |||||
return 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); | |||||
} | |||||
} | |||||
} | |||||
} |
@@ -1,67 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2000 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.core.execution; | |||||
/** | |||||
* Convert between a string and a data type | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public interface Converter { | |||||
/** | |||||
* Convert a string from the value given to an instance of the given type. | |||||
*/ | |||||
Object convert(String value, Class type) throws ConversionException; | |||||
} |
@@ -1,144 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.core.execution; | |||||
import java.util.*; | |||||
import java.net.URL; | |||||
/** | |||||
* A Converter definition defines a class which will convert | |||||
* a string into an instance of a particular type of class. Converters | |||||
* are typically only needed when some context information is | |||||
* required to perform the conversion. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public class ConverterDefinition { | |||||
/** The URL of the library which defines this converter */ | |||||
private URL converterLibraryURL; | |||||
/** The converter's class name */ | |||||
private String converterClassName; | |||||
/** The converted class returned by this converter */ | |||||
private String targetClassName; | |||||
/** The converter class loaded from the loader on demand. | |||||
*/ | |||||
private Class converterClass = null; | |||||
/** The class to which this converter converts. | |||||
*/ | |||||
private Class targetClass = null; | |||||
/** The converters's class loader. */ | |||||
private ClassLoader converterClassLoader; | |||||
public ConverterDefinition(URL converterLibraryURL, String converterClassName, | |||||
String targetClassName, ClassLoader converterClassLoader) { | |||||
this.converterLibraryURL = converterLibraryURL; | |||||
this.converterClassName = converterClassName; | |||||
this.targetClassName = targetClassName; | |||||
this.converterClassLoader = converterClassLoader; | |||||
} | |||||
/** | |||||
* Get the name of the class that this converter will return. | |||||
*/ | |||||
public String getTargetClassName() { | |||||
return targetClassName; | |||||
} | |||||
/** | |||||
* Get the classname of the converter that is being defined. | |||||
*/ | |||||
public String getConverterClassName() { | |||||
return converterClassName; | |||||
} | |||||
/** | |||||
* Get the URL where this converter was defined. | |||||
* | |||||
* @returns a URL of the lib defintion file | |||||
*/ | |||||
public URL getLibraryURL() { | |||||
return converterLibraryURL; | |||||
} | |||||
/** | |||||
* Get the converter class | |||||
* | |||||
* @return a class object for this converter | |||||
*/ | |||||
public synchronized Class getConverterClass() throws ClassNotFoundException { | |||||
if (converterClass == null) { | |||||
converterClass = Class.forName(converterClassName, true, converterClassLoader); | |||||
} | |||||
return converterClass; | |||||
} | |||||
/** | |||||
* Get the converter class | |||||
* | |||||
* @return a class object for this converter | |||||
*/ | |||||
public synchronized Class getTargetClass() throws ClassNotFoundException { | |||||
if (targetClass == null) { | |||||
targetClass = Class.forName(targetClassName, true, converterClassLoader); | |||||
} | |||||
return targetClass; | |||||
} | |||||
} | |||||
@@ -1,108 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.core.execution; | |||||
import org.apache.ant.core.model.*; | |||||
import org.apache.ant.core.support.*; | |||||
import java.util.*; | |||||
import java.net.URL; | |||||
/** | |||||
* The ExecutionContext interface provides a task or apsect instance with access to the | |||||
* container-provided services. This is the only way to access the container. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public class ExecutionContext { | |||||
private ExecutionFrame frame = null; | |||||
private BuildEventSupport eventSupport; | |||||
private BuildElement buildElement; | |||||
public ExecutionContext(ExecutionFrame frame, BuildEventSupport eventSupport, | |||||
BuildElement buildElement) { | |||||
this.frame = frame; | |||||
this.eventSupport = eventSupport; | |||||
this.buildElement = buildElement; | |||||
} | |||||
/** | |||||
* Log a mesage with the give priority. | |||||
* | |||||
* @param the message to be logged. | |||||
* @param msgLevel the message priority at which this message is to be logged. | |||||
*/ | |||||
public void log(String msg, int msgLevel) { | |||||
eventSupport.fireMessageLogged(this, buildElement, msg, msgLevel); | |||||
} | |||||
public void setDataValue(String name, Object value) throws ExecutionException { | |||||
frame.setDataValue(name, value); | |||||
} | |||||
public Object getDataValue(String name) throws ExecutionException { | |||||
return frame.getDataValue(name); | |||||
} | |||||
/** | |||||
* Replace ${} style constructions in the given value with the string value of | |||||
* the corresponding data types. | |||||
* | |||||
* @param value the string to be scanned for property references. | |||||
*/ | |||||
public String replacePropertyRefs(String value) throws ExecutionException { | |||||
return frame.replacePropertyRefs(value); | |||||
} | |||||
} | |||||
@@ -1,125 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.core.execution; | |||||
import org.apache.ant.core.support.*; | |||||
import java.io.*; | |||||
/** | |||||
* An ExecutiuonException indicates a problem during | |||||
* the execution of the build files tasks | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
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); | |||||
} | |||||
} |
@@ -1,920 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.core.execution; | |||||
import org.apache.ant.core.model.*; | |||||
import org.apache.ant.core.support.*; | |||||
import org.apache.ant.core.types.*; | |||||
import java.util.*; | |||||
import java.net.*; | |||||
/** | |||||
* An ExecutionFrame is the state of a project during an execution. | |||||
* The ExecutionFrame contains the data values set by Ant tasks as | |||||
* they are executed, including task definitions, property values, etc. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public class ExecutionFrame { | |||||
/** State used in dependency analysis when a target's dependencies are being | |||||
examined. */ | |||||
private static final String VISITING = "VISITING"; | |||||
/** State used in dependency analysis to indicate a target has been examined */ | |||||
private static final String VISITED = "VISITED"; | |||||
/** The Project that this execiton frame is processing */ | |||||
private Project project = null; | |||||
/** The base URL for this frame. This is derived from the | |||||
Project's source URL and it's base attribute. */ | |||||
private URL baseURL = null; | |||||
/** The imported frames of this frame. For each project imported by this frame's | |||||
project, a corresponding ExecutionFrame is created. */ | |||||
private Map importedFrames = new HashMap(); | |||||
/** BuildEvent support used to fire events and manage listeners */ | |||||
private BuildEventSupport eventSupport = new BuildEventSupport(); | |||||
/** The context of this execution. This contains all data object's | |||||
created by tasks that have been executed */ | |||||
private Map dataValues = new HashMap(); | |||||
/** Introspector objects used to configure Tasks from the Task models.*/ | |||||
private Map introspectors = new HashMap(); | |||||
/** The task defs that this frame will use to process tasks */ | |||||
private Map taskDefs = new HashMap(); | |||||
/** Type converters for this executionFrame. Converters are used when configuring | |||||
Tasks to handle special type conversions. */ | |||||
private Map converters = new HashMap(); | |||||
/** The aspect handler active in this frame */ | |||||
private Map aspectHandlers = new HashMap(); | |||||
/** The namespace under which this execution frame lives in the hierarchical | |||||
project namespace - null for the root namespace */ | |||||
private String namespace; | |||||
/** | |||||
* Construct an execution frame to process the given project model with | |||||
* the configuration represented by the libraries. | |||||
* | |||||
* @param project the model of the project to be built. | |||||
* @param libraries an Array of AntLibrary objects containing the | |||||
* configuration of Ant for this build. | |||||
* | |||||
* @throws ConfigException when the project cannot be setup with the | |||||
* given configuration | |||||
*/ | |||||
public ExecutionFrame(Project project, AntLibrary[] libraries) | |||||
throws ConfigException { | |||||
this.namespace = null; | |||||
setupFrame(project, libraries); | |||||
} | |||||
/** | |||||
* Construct a subframe for managing a project imported into the main project. | |||||
* @param project the model of the project to be built. | |||||
* @param libraries an Array of AntLibrary objects containing the | |||||
* configuration of Ant for this build. | |||||
* @param namespace the location of this project within the overall import | |||||
* namespace. | |||||
* | |||||
* @throws ConfigException when the project cannot be setup with the | |||||
* given configuration | |||||
*/ | |||||
private ExecutionFrame(Project project, AntLibrary[] libraries, String namespace) | |||||
throws ConfigException { | |||||
this.namespace = namespace; | |||||
setupFrame(project, libraries); | |||||
} | |||||
/** | |||||
* Set up the execution frame. | |||||
* | |||||
* This method examines the project model and constructs the required | |||||
* subframes to handle imported projects. | |||||
* @param project the model of the project to be built. | |||||
* @param libraries an Array of AntLibrary objects containing the | |||||
* configuration of Ant for this build. | |||||
* | |||||
* @throws ConfigException when the project cannot be setup with the | |||||
* given configuration | |||||
*/ | |||||
private void setupFrame(Project project, AntLibrary[] libraries) | |||||
throws ConfigException { | |||||
this.project = project; | |||||
for (int i = 0; i < libraries.length; ++i) { | |||||
addLibrary(libraries[i]); | |||||
} | |||||
try { | |||||
String base = project.getBase(); | |||||
if (base == null) { | |||||
baseURL = project.getSourceURL(); | |||||
} | |||||
else { | |||||
base = base.trim(); | |||||
if (!base.endsWith("/")) { | |||||
base += "/"; | |||||
} | |||||
baseURL = new URL(project.getSourceURL(), base); | |||||
} | |||||
} | |||||
catch (MalformedURLException e) { | |||||
throw new ConfigException("Project's base value \"" + project.getBase() | |||||
+ "\" is not valid", e, project.getLocation()); | |||||
} | |||||
for (Iterator i = project.getImportedProjectNames(); i.hasNext();) { | |||||
String importName = (String)i.next(); | |||||
Project importedProject = project.getImportedProject(importName); | |||||
String importNamespace | |||||
= namespace == null ? importName : namespace + ":" + importName; | |||||
ExecutionFrame importedFrame | |||||
= new ExecutionFrame(importedProject, libraries, importNamespace); | |||||
importedFrames.put(importName, importedFrame); | |||||
} | |||||
} | |||||
/** | |||||
* Add a configuration library to this execution frame. The library | |||||
* will contain task definitions, converters, apsect handler definitions, | |||||
* etc. | |||||
* | |||||
* @param library the configuration library to add to this frame. | |||||
* | |||||
* @throws ConfigException if the items in the library cannot be configured. | |||||
*/ | |||||
public void addLibrary(AntLibrary library) throws ConfigException { | |||||
for (Iterator i = library.getTaskDefinitions(); i.hasNext(); ) { | |||||
TaskDefinition taskDefinition = (TaskDefinition)i.next(); | |||||
addTaskDefinition(taskDefinition); | |||||
} | |||||
for (Iterator i = library.getConverterDefinitions(); i.hasNext(); ) { | |||||
ConverterDefinition converterDef = (ConverterDefinition)i.next(); | |||||
addConverterDefinition(converterDef); | |||||
} | |||||
for (Iterator i = library.getAspectDefinitions(); i.hasNext(); ) { | |||||
AspectDefinition aspectDef = (AspectDefinition)i.next(); | |||||
addAspectHandler(aspectDef); | |||||
} | |||||
} | |||||
/** | |||||
* Add a task definition to this execution frame | |||||
* | |||||
* @param taskDefinition the TaskDefinition to be added to the project. | |||||
*/ | |||||
public void addTaskDefinition(TaskDefinition taskDefinition) { | |||||
String taskName = taskDefinition.getName(); | |||||
taskDefs.put(taskName, taskDefinition); | |||||
} | |||||
/** | |||||
* Add a aspect handler definition to this execution frame | |||||
* | |||||
* @param taskDefinition the TaskDefinition to be added to the project. | |||||
* | |||||
* @throws ConfigException if the aspect handler cannot be created or configured. | |||||
*/ | |||||
public void addAspectHandler(AspectDefinition aspectDefinition) | |||||
throws ConfigException { | |||||
String aspectPrefix = aspectDefinition.getAspectPrefix(); | |||||
try { | |||||
Class aspectHandlerClass = aspectDefinition.getAspectHandlerClass(); | |||||
aspectHandlers.put(aspectPrefix, aspectHandlerClass); | |||||
} | |||||
catch (ClassNotFoundException e) { | |||||
throw new ConfigException("Unable to load aspect handler class for " | |||||
+ aspectDefinition.getAspectHandlerClassName() | |||||
+ " in converter from " + aspectDefinition.getLibraryURL(), | |||||
e); | |||||
} | |||||
} | |||||
/** | |||||
* Add a converter definition to this library. | |||||
* | |||||
* The converter is created immediately to handle conversions | |||||
* when items are being configured. If the converter is an instance of | |||||
* an AntConverter, the converter is configured with this execution | |||||
* frame giving it the context it needs to resolve items relative to the | |||||
* project's base, etc. | |||||
* | |||||
* @param converterDef the converter definition to load | |||||
* | |||||
* @throws ConfigException if the converter cannot be created or configured. | |||||
*/ | |||||
public void addConverterDefinition(ConverterDefinition converterDef) throws ConfigException { | |||||
boolean targetLoaded = false; | |||||
try { | |||||
Class targetClass = converterDef.getTargetClass(); | |||||
targetLoaded = false; | |||||
Class converterClass = converterDef.getConverterClass(); | |||||
Converter converter = (AntConverter)converterClass.newInstance(); | |||||
if (converter instanceof AntConverter) { | |||||
((AntConverter)converter).init(this); | |||||
} | |||||
converters.put(targetClass, converter); | |||||
} | |||||
catch (ClassNotFoundException e) { | |||||
if (targetLoaded) { | |||||
throw new ConfigException("Unable to load converter class for " | |||||
+ converterDef.getConverterClassName() | |||||
+ " in converter from " + converterDef.getLibraryURL(), | |||||
e); | |||||
} | |||||
else { | |||||
throw new ConfigException("Unable to load target class " | |||||
+ converterDef.getTargetClassName() | |||||
+ " in converter from " + converterDef.getLibraryURL(), | |||||
e); | |||||
} | |||||
} | |||||
catch (InstantiationException e) { | |||||
throw new ConfigException("Unable to instantiate converter class " | |||||
+ converterDef.getTargetClassName() | |||||
+ " in converter from " + converterDef.getLibraryURL(), | |||||
e); | |||||
} | |||||
catch (IllegalAccessException e) { | |||||
throw new ConfigException("Unable to access converter class " | |||||
+ converterDef.getTargetClassName() | |||||
+ " in converter from " + converterDef.getLibraryURL(), | |||||
e); | |||||
} | |||||
} | |||||
/** | |||||
* Get the bae URL of this frame. This will either be specified by the project's | |||||
* base attribute or be derived implicitly from the project's location. | |||||
*/ | |||||
public URL getBaseURL() { | |||||
return baseURL; | |||||
} | |||||
public void addBuildListener(BuildListener listener) { | |||||
for (Iterator i = getImportedFrames(); i.hasNext(); ) { | |||||
ExecutionFrame subFrame = (ExecutionFrame)i.next(); | |||||
subFrame.addBuildListener(listener); | |||||
} | |||||
eventSupport.addBuildListener(listener); | |||||
} | |||||
public void removeBuildListener(BuildListener listener) { | |||||
for (Iterator i = getImportedFrames(); i.hasNext(); ) { | |||||
ExecutionFrame subFrame = (ExecutionFrame)i.next(); | |||||
subFrame.removeBuildListener(listener); | |||||
} | |||||
eventSupport.removeBuildListener(listener); | |||||
} | |||||
/** | |||||
* Get the project associated with this execution frame. | |||||
* | |||||
* @return the project associated iwth this execution frame. | |||||
*/ | |||||
public Project getProject() { | |||||
return project; | |||||
} | |||||
/** | |||||
* Get the names of the frames representing imported projects. | |||||
* | |||||
* @return an iterator which returns the names of the imported frames. | |||||
*/ | |||||
public Iterator getImportedFrameNames() { | |||||
return importedFrames.keySet().iterator(); | |||||
} | |||||
/** | |||||
* Get the frames representing imported projects. | |||||
* | |||||
* @return an iterator which returns the imported ExeuctionFrames.. | |||||
*/ | |||||
public Iterator getImportedFrames() { | |||||
return importedFrames.values().iterator(); | |||||
} | |||||
/** | |||||
* Get an imported frame by name | |||||
* | |||||
* @param importName the name under which the frame was imported. | |||||
* | |||||
* @return the ExecutionFrame asscociated with the given import name or null | |||||
* if there is no such project. | |||||
*/ | |||||
public ExecutionFrame getImportedFrame(String importName) { | |||||
return (ExecutionFrame)importedFrames.get(importName); | |||||
} | |||||
/** | |||||
* Get the location of this frame in the namespace hierarchy | |||||
* | |||||
* @return the location of this frame within the project import | |||||
* namespace hierarchy. | |||||
*/ | |||||
public String getNamespace() { | |||||
return namespace; | |||||
} | |||||
/** | |||||
* Get the fully qualified name of something with respect to this | |||||
* execution frame. | |||||
* | |||||
* @param name the unqualified name. | |||||
* | |||||
* @return the fully qualified version of the given name | |||||
*/ | |||||
public String getQualifiedName(String name) { | |||||
return namespace == null ? name : namespace + ":" + name; | |||||
} | |||||
/** | |||||
* Execute the given target's tasks | |||||
* | |||||
* @param the name of the target within this frame that is to be executed. | |||||
*/ | |||||
public void executeTargetTasks(String targetName) throws ExecutionException, ConfigException { | |||||
Target target = project.getTarget(targetName); | |||||
try { | |||||
Iterator taskIterator = target.getTasks(); | |||||
eventSupport.fireTargetStarted(this, target); | |||||
executeTasks(taskIterator); | |||||
eventSupport.fireTargetFinished(this, target, null); | |||||
} | |||||
catch (RuntimeException e) { | |||||
eventSupport.fireTargetFinished(this, target, e); | |||||
throw e; | |||||
} | |||||
} | |||||
/** | |||||
* Initialize the frame by executing the project level tasks if any | |||||
*/ | |||||
public void initialize() throws ExecutionException, ConfigException { | |||||
for (Iterator i = getImportedFrames(); i.hasNext(); ) { | |||||
ExecutionFrame subFrame = (ExecutionFrame)i.next(); | |||||
subFrame.initialize(); | |||||
} | |||||
Iterator taskIterator = project.getTasks(); | |||||
executeTasks(taskIterator); | |||||
} | |||||
public void fillinDependencyOrder(String targetName, List dependencyOrder, | |||||
Map state, Stack visiting) throws ConfigException { | |||||
String fullTargetName = getQualifiedName(targetName); | |||||
if (state.get(fullTargetName) == VISITED) { | |||||
return; | |||||
} | |||||
Target target = getProject().getTarget(targetName); | |||||
if (target == null) { | |||||
StringBuffer sb = new StringBuffer("Target `"); | |||||
sb.append(targetName); | |||||
sb.append("' does not exist in this project. "); | |||||
if (!visiting.empty()) { | |||||
String parent = (String)visiting.peek(); | |||||
sb.append("It is used from target `"); | |||||
sb.append(parent); | |||||
sb.append("'."); | |||||
} | |||||
throw new ConfigException(new String(sb), getProject().getLocation()); | |||||
} | |||||
state.put(fullTargetName, VISITING); | |||||
visiting.push(fullTargetName); | |||||
for (Iterator i = target.getDependencies(); i.hasNext(); ) { | |||||
String dependency = (String)i.next(); | |||||
try { | |||||
ExecutionFrame dependencyFrame = getRelativeFrame(dependency); | |||||
if (dependencyFrame == null) { | |||||
StringBuffer sb = new StringBuffer("Target `"); | |||||
sb.append(dependency); | |||||
sb.append("' does not exist in this project. "); | |||||
throw new ConfigException(new String(sb), target.getLocation()); | |||||
} | |||||
String fullyQualifiedName = getQualifiedName(dependency); | |||||
String dependencyState = (String)state.get(fullyQualifiedName); | |||||
if (dependencyState == null) { | |||||
dependencyFrame.fillinDependencyOrder(getNameInFrame(dependency), dependencyOrder, | |||||
state, visiting); | |||||
} | |||||
else if (dependencyState == VISITING) { | |||||
String circleDescription | |||||
= getCircularDesc(dependency, visiting); | |||||
throw new ConfigException(circleDescription, target.getLocation()); | |||||
} | |||||
} | |||||
catch (ExecutionException e) { | |||||
throw new ConfigException(e.getMessage(), e, target.getLocation()); | |||||
} | |||||
} | |||||
state.put(fullTargetName, VISITED); | |||||
String poppedNode = (String)visiting.pop(); | |||||
if (poppedNode != fullTargetName) { | |||||
throw new ConfigException("Problem determining dependencies " + | |||||
" - expecting '" + fullTargetName + | |||||
"' but got '" + poppedNode + "'"); | |||||
} | |||||
dependencyOrder.add(fullTargetName); | |||||
} | |||||
private String getCircularDesc(String end, Stack visitingNodes) { | |||||
StringBuffer sb = new StringBuffer("Circular dependency: "); | |||||
sb.append(end); | |||||
String c; | |||||
do { | |||||
c = (String)visitingNodes.pop(); | |||||
sb.append(" <- "); | |||||
sb.append(c); | |||||
} while(!c.equals(end)); | |||||
return new String(sb); | |||||
} | |||||
/** | |||||
* Check whether the targets in this frame and its subframes are OK | |||||
*/ | |||||
public void checkTargets(List dependencyOrder, Map state, Stack visiting) | |||||
throws ConfigException { | |||||
// get the targets and just iterate through them. | |||||
for (Iterator i = getProject().getTargets(); i.hasNext();) { | |||||
Target target = (Target)i.next(); | |||||
fillinDependencyOrder(target.getName(), | |||||
dependencyOrder, state, visiting); | |||||
} | |||||
// Now do the subframes. | |||||
for (Iterator i = getImportedFrames(); i.hasNext();) { | |||||
ExecutionFrame importedFrame = (ExecutionFrame)i.next(); | |||||
importedFrame.checkTargets(dependencyOrder, state, visiting); | |||||
} | |||||
} | |||||
/** | |||||
* Create a Task and configure it according to the given model. | |||||
*/ | |||||
private Task configureTask(TaskElement model) | |||||
throws ConfigException, ExecutionException { | |||||
String taskType = model.getType(); | |||||
TaskDefinition taskDefinition = (TaskDefinition)taskDefs.get(taskType); | |||||
if (taskDefinition == null) { | |||||
throw new ConfigException("There is no defintion for tasks of type <" | |||||
+ taskType + ">", model.getLocation()); | |||||
} | |||||
try { | |||||
Class elementClass = taskDefinition.getExecutionTaskClass(); | |||||
Object element = elementClass.newInstance(); | |||||
Task task = null; | |||||
if (element instanceof Task) { | |||||
// create a Task context for the Task | |||||
task = (Task)element; | |||||
} | |||||
else { | |||||
task = new TaskAdapter(taskType, element); | |||||
} | |||||
configureElement(element, model); | |||||
return task; | |||||
} | |||||
catch (ClassNotFoundException e) { | |||||
throw new ConfigException("Execution class " + taskDefinition.getTaskClassName() | |||||
+ " was not found", e, model.getLocation()); | |||||
} | |||||
catch (InstantiationException e) { | |||||
throw new ConfigException("Unable to instantiate execution class " | |||||
+ taskDefinition.getTaskClassName(), | |||||
e, model.getLocation()); | |||||
} | |||||
catch (IllegalAccessException e) { | |||||
throw new ConfigException("Unable to access execution class " | |||||
+ taskDefinition.getTaskClassName(), | |||||
e, model.getLocation()); | |||||
} | |||||
} | |||||
private List getActiveAspects(BuildElement model) | |||||
throws ConfigException, ExecutionException, | |||||
ClassIntrospectionException, ConversionException { | |||||
List activeAspects = new ArrayList(); | |||||
for (Iterator i = model.getAspectNames(); i.hasNext();) { | |||||
String aspectPrefix = (String)i.next(); | |||||
Class aspectHandlerClass = (Class)aspectHandlers.get(aspectPrefix); | |||||
if (aspectHandlerClass != null) { | |||||
try { | |||||
AspectHandler aspectHandler | |||||
= (AspectHandler)aspectHandlerClass.newInstance(); | |||||
ClassIntrospector introspector = getIntrospector(aspectHandlerClass); | |||||
ExecutionContext context = new ExecutionContext(this, eventSupport, model); | |||||
aspectHandler.setAspectContext(context); | |||||
Map aspectAttributes = model.getAspectAttributes(aspectPrefix); | |||||
for (Iterator j = aspectAttributes.keySet().iterator(); j.hasNext();) { | |||||
String attributeName = (String)j.next(); | |||||
String attributeValue = (String)aspectAttributes.get(attributeName); | |||||
introspector.setAttribute(aspectHandler, attributeName, | |||||
replacePropertyRefs(attributeValue)); | |||||
} | |||||
activeAspects.add(aspectHandler); | |||||
} | |||||
catch (InstantiationException e) { | |||||
throw new ConfigException("Unable to instantiate aspect handler class " | |||||
+ aspectHandlerClass, | |||||
e); | |||||
} | |||||
catch (IllegalAccessException e) { | |||||
throw new ConfigException("Unable to access aspect handler class " | |||||
+ aspectHandlerClass, | |||||
e); | |||||
} | |||||
} | |||||
} | |||||
return activeAspects; | |||||
} | |||||
/** | |||||
* Configure an element according to the given model. | |||||
*/ | |||||
private void configureElement(Object element, TaskElement model) | |||||
throws ExecutionException, ConfigException { | |||||
if (element instanceof Task) { | |||||
Task task = (Task)element; | |||||
ExecutionContext context = new ExecutionContext(this, eventSupport, model); | |||||
task.setTaskContext(context); | |||||
} | |||||
try { | |||||
ClassIntrospector introspector = getIntrospector(element.getClass()); | |||||
List aspects = getActiveAspects(model); | |||||
for (Iterator i = aspects.iterator(); i.hasNext(); ) { | |||||
AspectHandler aspectHandler = (AspectHandler)i.next(); | |||||
aspectHandler.beforeConfigElement(element); | |||||
} | |||||
// start by setting the attributes of this element | |||||
for (Iterator i = model.getAttributeNames(); i.hasNext();) { | |||||
String attributeName = (String)i.next(); | |||||
String attributeValue = model.getAttributeValue(attributeName); | |||||
introspector.setAttribute(element, attributeName, | |||||
replacePropertyRefs(attributeValue)); | |||||
} | |||||
String modelText = model.getText().trim(); | |||||
if (modelText.length() != 0) { | |||||
introspector.addText(element, replacePropertyRefs(modelText)); | |||||
} | |||||
// now do the nested elements | |||||
for (Iterator i = model.getNestedElements(); i.hasNext();) { | |||||
TaskElement nestedElementModel = (TaskElement)i.next(); | |||||
if (element instanceof TaskContainer && | |||||
!introspector.supportsNestedElement(nestedElementModel.getType())) { | |||||
Task nestedTask = configureTask(nestedElementModel); | |||||
TaskContainer container = (TaskContainer)element; | |||||
container.addTask(nestedTask); | |||||
} | |||||
else { | |||||
Object nestedElement | |||||
= introspector.createElement(element, nestedElementModel.getType()); | |||||
configureElement(nestedElement, nestedElementModel); | |||||
} | |||||
} | |||||
for (Iterator i = aspects.iterator(); i.hasNext(); ) { | |||||
AspectHandler aspectHandler = (AspectHandler)i.next(); | |||||
aspectHandler.afterConfigElement(element); | |||||
} | |||||
} | |||||
catch (ClassIntrospectionException e) { | |||||
throw new ExecutionException(e, model.getLocation()); | |||||
} | |||||
catch (ConversionException e) { | |||||
throw new ExecutionException(e, model.getLocation()); | |||||
} | |||||
} | |||||
/** | |||||
* Run the tasks returned by the give iterator | |||||
* | |||||
* @param taskIterator the iterator giving the tasks to execute | |||||
*/ | |||||
public void executeTasks(Iterator taskIterator) throws ExecutionException, ConfigException { | |||||
TaskElement task = null; | |||||
try { | |||||
while (taskIterator.hasNext()) { | |||||
task = (TaskElement)taskIterator.next(); | |||||
try { | |||||
Task configuredTask = configureTask(task); | |||||
eventSupport.fireTaskStarted(this, task); | |||||
configuredTask.execute(); | |||||
} | |||||
catch (ExecutionException e) { | |||||
if (e.getLocation() == null || e.getLocation() == Location.UNKNOWN_LOCATION) { | |||||
e.setLocation(task.getLocation()); | |||||
} | |||||
throw e; | |||||
} | |||||
catch (ConfigException e) { | |||||
if (e.getLocation() == null || e.getLocation() == Location.UNKNOWN_LOCATION) { | |||||
e.setLocation(task.getLocation()); | |||||
} | |||||
throw e; | |||||
} | |||||
eventSupport.fireTaskFinished(this, task, null); | |||||
} | |||||
} | |||||
catch (RuntimeException e) { | |||||
eventSupport.fireTaskFinished(this, task, e); | |||||
throw e; | |||||
} | |||||
} | |||||
private ClassIntrospector getIntrospector(Class c) { | |||||
if (introspectors.containsKey(c)) { | |||||
return (ClassIntrospector)introspectors.get(c); | |||||
} | |||||
ClassIntrospector introspector = new ClassIntrospector(c, converters); | |||||
introspectors.put(c, introspector); | |||||
return introspector; | |||||
} | |||||
/** | |||||
* Replace ${} style constructions in the given value with the string value of | |||||
* the corresponding data types. | |||||
* | |||||
* @param value the string to be scanned for property references. | |||||
*/ | |||||
public String replacePropertyRefs(String value) throws ExecutionException { | |||||
if (value == null) { | |||||
return null; | |||||
} | |||||
List fragments = new ArrayList(); | |||||
List propertyRefs = new ArrayList(); | |||||
parsePropertyString(value, fragments, propertyRefs); | |||||
StringBuffer sb = new StringBuffer(); | |||||
Iterator i = fragments.iterator(); | |||||
Iterator j = propertyRefs.iterator(); | |||||
while (i.hasNext()) { | |||||
String fragment = (String)i.next(); | |||||
if (fragment == null) { | |||||
String propertyName = (String)j.next(); | |||||
if (!isDataValueSet(propertyName)) { | |||||
throw new ExecutionException("Property " + propertyName + " has not been set"); | |||||
} | |||||
fragment = getDataValue(propertyName).toString(); | |||||
} | |||||
sb.append(fragment); | |||||
} | |||||
return sb.toString(); | |||||
} | |||||
/** | |||||
* This method will parse a string containing ${value} style | |||||
* property values into two list. The first list is a collection | |||||
* of text fragments, while the other is a set of string property names | |||||
* null entries in the first list indicate a property reference from the | |||||
* second list. | |||||
*/ | |||||
static public void parsePropertyString(String value, List fragments, List propertyRefs) | |||||
throws ExecutionException { | |||||
int prev = 0; | |||||
int pos; | |||||
while ((pos = value.indexOf("$", prev)) >= 0) { | |||||
if (pos > 0) { | |||||
fragments.add(value.substring(prev, pos)); | |||||
} | |||||
if( pos == (value.length() - 1)) { | |||||
fragments.add("$"); | |||||
prev = pos + 1; | |||||
} | |||||
else if (value.charAt(pos + 1) != '{' ) { | |||||
fragments.add(value.substring(pos + 1, pos + 2)); | |||||
prev = pos + 2; | |||||
} else { | |||||
int endName = value.indexOf('}', pos); | |||||
if (endName < 0) { | |||||
throw new ExecutionException("Syntax error in property: " | |||||
+ value ); | |||||
} | |||||
String propertyName = value.substring(pos + 2, endName); | |||||
fragments.add(null); | |||||
propertyRefs.add(propertyName); | |||||
prev = endName + 1; | |||||
} | |||||
} | |||||
if (prev < value.length()) { | |||||
fragments.add(value.substring(prev)); | |||||
} | |||||
} | |||||
/** | |||||
* Given a name of an object, get the frame relative from this frame that | |||||
* contains that object. | |||||
*/ | |||||
public ExecutionFrame getRelativeFrame(String name) throws ExecutionException { | |||||
int index = name.lastIndexOf(":"); | |||||
if (index == -1) { | |||||
return this; | |||||
} | |||||
ExecutionFrame currentFrame = this; | |||||
String relativeFrameName = name.substring(0, index); | |||||
StringTokenizer tokenizer = new StringTokenizer(relativeFrameName, ":"); | |||||
while (tokenizer.hasMoreTokens()) { | |||||
String frameName = tokenizer.nextToken(); | |||||
currentFrame = currentFrame.getImportedFrame(frameName); | |||||
if (currentFrame == null) { | |||||
throw new ExecutionException("The project " + frameName + " in " | |||||
+ name + " was not found"); | |||||
} | |||||
} | |||||
return currentFrame; | |||||
} | |||||
/** | |||||
* Get the name of an object in its frame | |||||
*/ | |||||
public String getNameInFrame(String name) { | |||||
int index = name.lastIndexOf(":"); | |||||
if (index == -1) { | |||||
return name; | |||||
} | |||||
return name.substring(index+1); | |||||
} | |||||
/** | |||||
* Set a value in this frame or any of its imported frames | |||||
*/ | |||||
public void setDataValue(String name, Object value) throws ExecutionException { | |||||
ExecutionFrame frame = getRelativeFrame(name); | |||||
frame.setDirectDataValue(getNameInFrame(name), value); | |||||
} | |||||
/** | |||||
* Get a value from this frame or any imported frame | |||||
*/ | |||||
public Object getDataValue(String name) throws ExecutionException { | |||||
ExecutionFrame frame = getRelativeFrame(name); | |||||
return frame.getDirectDataValue(getNameInFrame(name)); | |||||
} | |||||
/** | |||||
* Set a value in this frame only | |||||
*/ | |||||
private void setDirectDataValue(String name, Object value) { | |||||
dataValues.put(name, value); | |||||
} | |||||
/** | |||||
* Get a value from this frame | |||||
*/ | |||||
private Object getDirectDataValue(String name) { | |||||
return dataValues.get(name); | |||||
} | |||||
/** | |||||
* Indicate if a data value has been set | |||||
*/ | |||||
public boolean isDataValueSet(String name) throws ExecutionException { | |||||
ExecutionFrame frame = getRelativeFrame(name); | |||||
return frame.isDirectDataValueSet(getNameInFrame(name)); | |||||
} | |||||
/** | |||||
* Indicate if a data value has been set in this frame | |||||
*/ | |||||
private boolean isDirectDataValueSet(String name) { | |||||
return dataValues.containsKey(name); | |||||
} | |||||
public void runBuild(List targetNames) throws AntException { | |||||
Throwable buildFailureCause = null; | |||||
try { | |||||
eventSupport.fireBuildStarted(this, project); | |||||
initialize(); | |||||
if (targetNames.isEmpty()) { | |||||
// we just execute the default target if any | |||||
String defaultTarget = project.getDefaultTarget(); | |||||
if (defaultTarget != null) { | |||||
executeTarget(defaultTarget); | |||||
} | |||||
} | |||||
else { | |||||
for (Iterator i = targetNames.iterator(); i.hasNext();) { | |||||
executeTarget((String)i.next()); | |||||
} | |||||
} | |||||
eventSupport.fireBuildFinished(this, project, null); | |||||
} | |||||
catch (RuntimeException e) { | |||||
buildFailureCause = e; | |||||
throw e; | |||||
} | |||||
catch (AntException e) { | |||||
buildFailureCause = e; | |||||
throw e; | |||||
} | |||||
finally { | |||||
eventSupport.fireBuildFinished(this, project, buildFailureCause); | |||||
} | |||||
} | |||||
public void executeTarget(String targetName) throws ExecutionException, ConfigException { | |||||
// to execute a target we must determine its dependencies and | |||||
// execute them in order. | |||||
Map state = new HashMap(); | |||||
Stack visiting = new Stack(); | |||||
List dependencyOrder = new ArrayList(); | |||||
ExecutionFrame startingFrame = getRelativeFrame(targetName); | |||||
startingFrame.fillinDependencyOrder(getNameInFrame(targetName), | |||||
dependencyOrder, state, visiting); | |||||
// Now tell each frame to execute the targets required | |||||
for (Iterator i = dependencyOrder.iterator(); i.hasNext();) { | |||||
String fullTargetName = (String)i.next(); | |||||
ExecutionFrame frame = getRelativeFrame(fullTargetName); | |||||
frame.executeTargetTasks(getNameInFrame(fullTargetName)); | |||||
} | |||||
} | |||||
} |
@@ -1,77 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 1999 The Apache Software Foundation. All rights | |||||
* reserved. | |||||
* | |||||
* Redistribution and use in source and binary forms, with or without | |||||
* modification, are permitted provided that the following conditions | |||||
* are met: | |||||
* | |||||
* 1. Redistributions of source code must retain the above copyright | |||||
* notice, this list of conditions and the following disclaimer. | |||||
* | |||||
* 2. Redistributions in binary form must reproduce the above copyright | |||||
* notice, this list of conditions and the following disclaimer in | |||||
* the documentation and/or other materials provided with the | |||||
* distribution. | |||||
* | |||||
* 3. The end-user documentation included with the redistribution, if | |||||
* any, must include the following acknowlegement: | |||||
* "This product includes software developed by the | |||||
* Apache Software Foundation (http://www.apache.org/)." | |||||
* Alternately, this acknowlegement may appear in the software itself, | |||||
* if and wherever such third-party acknowlegements normally appear. | |||||
* | |||||
* 4. The names "The Jakarta Project", "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.core.execution; | |||||
/* | |||||
* An input provider is an object which is provided to Ant's core | |||||
* execution system to provide input from the user. Typically command | |||||
* line based clients will request input from the console whilst | |||||
* GUI clients may pop up an input dialog. Unattended operation may | |||||
* be able to source input from some form of script. | |||||
*/ | |||||
public interface InputProvider { | |||||
/** | |||||
* Request input from the user | |||||
* | |||||
* @param prompt a string which is used to prompt the user for input. | |||||
* @param defaultInput the default value initially supplied to the user | |||||
* @param timeout a timeout in milliseconds which some clients may use | |||||
* to either accept the default or to fail. | |||||
* | |||||
* @return a string of the user's input if the user provided any. | |||||
* | |||||
* @throws ExecutionException if the no input could be obtained from the user | |||||
*/ | |||||
String userInput(String prompt, String defaultInput) throws ExecutionException; | |||||
} |
@@ -1,73 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.core.execution; | |||||
import org.apache.ant.core.model.*; | |||||
import org.apache.ant.core.support.*; | |||||
import java.util.*; | |||||
import java.net.URL; | |||||
/** | |||||
* A task is a top level element in the buidl which will be processed. Ant | |||||
* currently handles two types of tasks - DataType tasks and execution tasks. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public interface Task { | |||||
void setTaskContext(ExecutionContext context); | |||||
void execute() throws ExecutionException; | |||||
} | |||||
@@ -1,100 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 1999 The Apache Software Foundation. All rights | |||||
* reserved. | |||||
* | |||||
* Redistribution and use in source and binary forms, with or without | |||||
* modification, are permitted provided that the following conditions | |||||
* are met: | |||||
* | |||||
* 1. Redistributions of source code must retain the above copyright | |||||
* notice, this list of conditions and the following disclaimer. | |||||
* | |||||
* 2. Redistributions in binary form must reproduce the above copyright | |||||
* notice, this list of conditions and the following disclaimer in | |||||
* the documentation and/or other materials provided with the | |||||
* distribution. | |||||
* | |||||
* 3. The end-user documentation included with the redistribution, if | |||||
* any, must include the following acknowlegement: | |||||
* "This product includes software developed by the | |||||
* Apache Software Foundation (http://www.apache.org/)." | |||||
* Alternately, this acknowlegement may appear in the software itself, | |||||
* if and wherever such third-party acknowlegements normally appear. | |||||
* | |||||
* 4. The names "The Jakarta Project", "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.core.execution; | |||||
import java.lang.reflect.*; | |||||
import java.util.*; | |||||
/** | |||||
* Use introspection to "adapt" an arbitrary Bean ( not extending Task, but with similar | |||||
* patterns). | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public class TaskAdapter extends AbstractTask { | |||||
/** | |||||
* The real object that is performing the work | |||||
*/ | |||||
private Object worker; | |||||
private Method executeMethod = null; | |||||
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); | |||||
} | |||||
} | |||||
public void execute() throws ExecutionException { | |||||
try { | |||||
executeMethod.invoke(worker, null); | |||||
} | |||||
catch( Exception ex ) { | |||||
throw new ExecutionException(ex); | |||||
} | |||||
} | |||||
} |
@@ -1,72 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.core.execution; | |||||
import java.util.*; | |||||
import java.net.URL; | |||||
/** | |||||
* A TaskContainer is an object which can contain and manage | |||||
* ExecutionTasks. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public interface TaskContainer { | |||||
/** | |||||
* Add a task to the container. | |||||
*/ | |||||
void addTask(Task task) throws ExecutionException; | |||||
} | |||||
@@ -1,125 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.core.execution; | |||||
import java.util.*; | |||||
import java.net.URL; | |||||
/** | |||||
* A Task definition provides the information necessary to execute | |||||
* a task implementation. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public class TaskDefinition { | |||||
/** The URL of the library which defines this task */ | |||||
private URL taskLibraryURL; | |||||
/** The task's name */ | |||||
private String taskName; | |||||
/** The task's class */ | |||||
private String taskClassName; | |||||
/** The task's class loaded from the loader on demand. */ | |||||
private Class taskClass = null; | |||||
/** The task's class loader. */ | |||||
private ClassLoader taskClassLoader; | |||||
public TaskDefinition(URL taskLibraryURL, String taskName, String taskClassName, | |||||
ClassLoader taskClassLoader) { | |||||
this.taskLibraryURL = taskLibraryURL; | |||||
this.taskName = taskName; | |||||
this.taskClassName = taskClassName; | |||||
this.taskClassLoader = taskClassLoader; | |||||
} | |||||
/** | |||||
* Get the name of the task that is being defined. | |||||
*/ | |||||
public String getName() { | |||||
return taskName; | |||||
} | |||||
/** | |||||
* Get the classname of the task that is being defined. | |||||
*/ | |||||
public String getTaskClassName() { | |||||
return taskClassName; | |||||
} | |||||
/** | |||||
* Get the URL where this task was defined. | |||||
* | |||||
* @returns a URL of the lib defintion file | |||||
*/ | |||||
public URL getLibraryURL() { | |||||
return taskLibraryURL; | |||||
} | |||||
/** | |||||
* Get the task class for this task | |||||
* | |||||
* @return a class object for this task | |||||
*/ | |||||
public synchronized Class getExecutionTaskClass() throws ClassNotFoundException { | |||||
if (taskClass == null) { | |||||
taskClass = Class.forName(taskClassName, true, taskClassLoader); | |||||
} | |||||
return taskClass; | |||||
} | |||||
} | |||||
@@ -1,157 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.core.model; | |||||
import java.util.*; | |||||
import org.apache.ant.core.support.*; | |||||
/** | |||||
* A BuildElement is an element of a build file and has a location | |||||
* within that file. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public class BuildElement { | |||||
/** 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 build element giving its location. | |||||
* | |||||
* @param location identifies where this element is defined | |||||
*/ | |||||
public BuildElement(Location location) { | |||||
this.location = location; | |||||
} | |||||
/** | |||||
* Get the location of the source where this element is defined | |||||
* | |||||
* @return the element's location | |||||
*/ | |||||
public Location getLocation() { | |||||
return 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; | |||||
} | |||||
/** | |||||
* Get the comment associated with this element. | |||||
* | |||||
* @return the element's comment which may be null. | |||||
*/ | |||||
public String getComment() { | |||||
return comment; | |||||
} | |||||
/** | |||||
* Set the aspects of this element | |||||
* | |||||
* @param aspects a Map of apects that relate to this build 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 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 apsectPrefix the prefix used to identify the prefix. | |||||
* | |||||
* @return a map of the attribute values for the given aspect. | |||||
*/ | |||||
public Map getAspectAttributes(String aspectPrefix) { | |||||
return (Map)aspectMaps.get(aspectPrefix); | |||||
} | |||||
} | |||||
@@ -1,267 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.core.model; | |||||
import org.apache.ant.core.support.*; | |||||
import java.util.*; | |||||
import java.net.URL; | |||||
/** | |||||
* A project is a collection of targets and global tasks. A project | |||||
* may reference objects in other projects using named references of | |||||
* the form project:object | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public class Project extends BuildElement { | |||||
/** 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 imported into this project. Each imported project is | |||||
* given a name which is used to identify access to that project's | |||||
* elements. | |||||
*/ | |||||
private Map importedProjects = 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; | |||||
} | |||||
/** | |||||
* Get the URL where this project is defined | |||||
* | |||||
* @return the project source URL | |||||
*/ | |||||
public URL getSourceURL() { | |||||
return sourceURL; | |||||
} | |||||
/** | |||||
* Add a target to the project. | |||||
* | |||||
* @param target the Target to be added | |||||
* | |||||
* @throws ProjectModelException if a target with the same name already exists. | |||||
*/ | |||||
public void addTarget(Target target) throws ProjectModelException { | |||||
if (targets.containsKey(target.getName())) { | |||||
throw new ProjectModelException("A target with name '" + target.getName() + | |||||
"' has already been defined in this project", | |||||
target.getLocation()); | |||||
} | |||||
targets.put(target.getName(), target); | |||||
} | |||||
/** | |||||
* 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; | |||||
} | |||||
/** | |||||
* 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; | |||||
} | |||||
/** | |||||
* Set the base URL for this project. | |||||
* | |||||
* @param base the baseURL for this project. | |||||
*/ | |||||
public void setBase(String base) { | |||||
this.base = base; | |||||
} | |||||
/** | |||||
* Get the base URL for this project. | |||||
* | |||||
* @return the baseURL for this project as a string. | |||||
*/ | |||||
public String getBase() { | |||||
return base; | |||||
} | |||||
/** | |||||
* Set the name of this project. | |||||
* | |||||
* @param name the name for this project. | |||||
*/ | |||||
public void setName(String name) { | |||||
this.name = name; | |||||
} | |||||
/** | |||||
* 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(TaskElement task) { | |||||
tasks.add(task); | |||||
} | |||||
/** | |||||
* Import a project to be referenced using the given name. | |||||
* | |||||
* @param importName the name under which the project will be referenced. | |||||
* @param project the imported project. | |||||
* | |||||
* @throws ProjectModelException if an existing project has already | |||||
* been imported with that name. | |||||
*/ | |||||
public void importProject(String importName, Project project) | |||||
throws ProjectModelException { | |||||
if (importedProjects.containsKey(importName)) { | |||||
throw new ProjectModelException("A project has already been imported with name '" + | |||||
importName + "'"); | |||||
} | |||||
importedProjects.put(importName, project); | |||||
} | |||||
/** | |||||
* 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 name sof the imported projects. | |||||
* | |||||
* @return an iterator which returns the name sof the imported projects. | |||||
*/ | |||||
public Iterator getImportedProjectNames() { | |||||
return importedProjects.keySet().iterator(); | |||||
} | |||||
/** | |||||
* Get an imported project by name | |||||
* | |||||
* @param importName the name under which the project was imported. | |||||
* | |||||
* @return the project asscociated with the given import name or null | |||||
* if there is no such project. | |||||
*/ | |||||
public Project getImportedProject(String importName) { | |||||
return (Project)importedProjects.get(importName); | |||||
} | |||||
/** | |||||
* Get the initialisation tasks for this project | |||||
* | |||||
* @return an iterator over the set of tasks for this project. | |||||
*/ | |||||
public Iterator getTasks() { | |||||
return tasks.iterator(); | |||||
} | |||||
} | |||||
@@ -1,129 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.core.model; | |||||
import org.apache.ant.core.support.*; | |||||
import java.util.*; | |||||
import java.net.URL; | |||||
/** | |||||
* A project 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> | |||||
*/ | |||||
public class ProjectModelException extends AntException { | |||||
/** | |||||
* Constructs an exception with the given descriptive message. | |||||
* | |||||
* @param msg Description of or information about the exception. | |||||
*/ | |||||
public ProjectModelException(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 ProjectModelException(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 ProjectModelException(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 ProjectModelException(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 ProjectModelException(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 ProjectModelException(Throwable cause, Location location) { | |||||
super(cause, location); | |||||
} | |||||
} | |||||
@@ -1,136 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.core.model; | |||||
import java.util.*; | |||||
import org.apache.ant.core.support.*; | |||||
/** | |||||
* A Target is a collection of tasks. It may have | |||||
* dependencies on other targets | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public class Target extends BuildElement { | |||||
private List dependencies = new ArrayList(); | |||||
/** | |||||
* This target's list of tasks | |||||
*/ | |||||
private List tasks = new ArrayList(); | |||||
/** | |||||
* The target's name. | |||||
*/ | |||||
private String name; | |||||
/** | |||||
* 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; | |||||
} | |||||
/** | |||||
* Get this target's name. | |||||
* | |||||
* @return the target's name. | |||||
*/ | |||||
public String getName() { | |||||
return name; | |||||
} | |||||
/** | |||||
* Add a task to this target | |||||
* | |||||
* @param task the task to be added to the target. | |||||
*/ | |||||
public void addTask(TaskElement 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); | |||||
} | |||||
/** | |||||
* 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(); | |||||
} | |||||
} | |||||
@@ -1,169 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.core.model; | |||||
import java.util.*; | |||||
import org.apache.ant.core.support.*; | |||||
/** | |||||
* A TaskElement is a holder for Task configuration information. | |||||
* TaskElements may be grouped into a hierarchy to capture | |||||
* any level of Task element nesting. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public class TaskElement extends BuildElement { | |||||
/** The attributes of this task element */ | |||||
private Map attributes = new HashMap(); | |||||
/** | |||||
* The task's name or type | |||||
*/ | |||||
private String type; | |||||
/** | |||||
* The task elements that make up this task. | |||||
*/ | |||||
private List taskElements = new ArrayList(); | |||||
/** The content (text) of this task */ | |||||
private String text = ""; | |||||
/** | |||||
* Create a Task of the given type | |||||
* | |||||
* @param location the location of the element | |||||
* @param type the task element's type | |||||
*/ | |||||
public TaskElement(Location location, String type) { | |||||
super(location); | |||||
this.type = type; | |||||
} | |||||
/** | |||||
* Add text to this task. | |||||
* | |||||
* @param text the element text to add. | |||||
*/ | |||||
public void addText(String text) { | |||||
this.text += text; | |||||
} | |||||
/** | |||||
* Get the text of this task | |||||
* | |||||
* @return the task's text. | |||||
*/ | |||||
public String getText() { | |||||
return text; | |||||
} | |||||
/** | |||||
* Add a task element to this task | |||||
* | |||||
* @param taskElement the task element to be added. | |||||
*/ | |||||
public void addTaskElement(TaskElement taskElement) { | |||||
taskElements.add(taskElement); | |||||
} | |||||
/** | |||||
* Get an iterator over this element's nexted elements | |||||
* | |||||
* @return an iterator which provides TaskElement instances | |||||
*/ | |||||
public Iterator getNestedElements() { | |||||
return taskElements.iterator(); | |||||
} | |||||
/** | |||||
* Get the type of this task element | |||||
* | |||||
* @return the element's type | |||||
*/ | |||||
public String getType() { | |||||
return type; | |||||
} | |||||
/** | |||||
* Add an attribute to this task 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); | |||||
} | |||||
/** | |||||
* Get an iterator over the task'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); | |||||
} | |||||
} | |||||
@@ -1,150 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.core.support; | |||||
import java.util.*; | |||||
import java.net.*; | |||||
import java.io.*; | |||||
/** | |||||
* The AntClassLoader is a type of URL classloader which reverses the standard | |||||
* lookup order to load things from the URLs first and then to use the parent class | |||||
* loader only if the class does not exist in the URLs. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public class AntClassLoader extends URLClassLoader { | |||||
/** A Debug label to print when the Classloader finds or fails to find a class. */ | |||||
private String debugLabel = null; | |||||
/** A flag whihc controls whether messages are logged by the loader */ | |||||
private boolean debug = false; | |||||
private void dumpURLs() { | |||||
if (debug && debugLabel != null) { | |||||
System.out.println(debugLabel + ": loader URLs"); | |||||
URL[] urls = getURLs(); | |||||
for (int i = 0; i < urls.length; ++i) { | |||||
System.out.println(debugLabel + ": URL: " + urls[i]); | |||||
} | |||||
} | |||||
} | |||||
public AntClassLoader(URL[] urls) { | |||||
super(urls); | |||||
} | |||||
public AntClassLoader(URL[] urls, String debugLabel) { | |||||
super(urls); | |||||
this.debugLabel = debugLabel; | |||||
} | |||||
public AntClassLoader(URL[] urls, | |||||
ClassLoader parent) { | |||||
super(urls, parent); | |||||
} | |||||
public AntClassLoader(URL[] urls, | |||||
ClassLoader parent, String debugLabel) { | |||||
super(urls, parent); | |||||
this.debugLabel = debugLabel; | |||||
} | |||||
public void setDebug(boolean debug) { | |||||
this.debug = debug; | |||||
dumpURLs(); | |||||
} | |||||
protected Class loadClass(String name, boolean resolve) | |||||
throws ClassNotFoundException { | |||||
if (debug && debugLabel != null) { | |||||
System.out.println(debugLabel + ": Trying to load class " + name); | |||||
} | |||||
Class c = findLoadedClass(name); | |||||
if (c == null) { | |||||
try { | |||||
c = findClass(name); | |||||
if (debug && debugLabel != null) { | |||||
System.out.println(debugLabel + ": Found class " + name + " in this loader"); | |||||
} | |||||
} catch (ClassNotFoundException e) { | |||||
c = super.loadClass(name, resolve); | |||||
if (debug && debugLabel != null) { | |||||
System.out.println(debugLabel + ": Found class " + name + " in parent loader"); | |||||
} | |||||
return c; | |||||
} | |||||
} | |||||
if (resolve) { | |||||
resolveClass(c); | |||||
} | |||||
return c; | |||||
} | |||||
public void addURL(URL url) { | |||||
super.addURL(url); | |||||
} | |||||
public URL getResource(String name) { | |||||
URL url = findResource(name); | |||||
if (url == null) { | |||||
url = super.getResource(name); | |||||
} | |||||
return url; | |||||
} | |||||
} | |||||
@@ -1,205 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.core.support; | |||||
import java.io.*; | |||||
/** | |||||
* 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> | |||||
*/ | |||||
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); | |||||
} | |||||
/** | |||||
* Returns the nested exception. | |||||
* | |||||
* @return the underlying exception | |||||
*/ | |||||
public Throwable getCause() { | |||||
return cause; | |||||
} | |||||
/** | |||||
* Sets the file location where the error occured. | |||||
*/ | |||||
public void setLocation(Location location) { | |||||
if (location == null) { | |||||
this.location = Location.UNKNOWN_LOCATION; | |||||
} | |||||
else { | |||||
this.location = location; | |||||
} | |||||
} | |||||
/** | |||||
* Returns the file location where the error occured. | |||||
*/ | |||||
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) { | |||||
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); | |||||
} | |||||
} | |||||
} | |||||
} |
@@ -1,331 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.core.support; | |||||
import java.util.*; | |||||
import java.net.*; | |||||
import java.io.*; | |||||
/** | |||||
* The Ant Locator is used to find various Ant components without | |||||
* requiring the user to maintain environment properties. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public class AntLocator { | |||||
private AntLocator() {} | |||||
/** | |||||
* 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 LocationException if the class' URL cannot be constructed. | |||||
*/ | |||||
static public URL getClassLocationURL(Class theClass) | |||||
throws LocationException { | |||||
String className = theClass.getName().replace('.', '/') + ".class"; | |||||
URL classRawURL = theClass.getClassLoader().getResource(className); | |||||
try { | |||||
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; | |||||
} | |||||
} | |||||
catch (MalformedURLException e) { | |||||
throw new LocationException(e); | |||||
} | |||||
} | |||||
/** | |||||
* Get the location of AntHome | |||||
* | |||||
* @return the URL containing AntHome. | |||||
* | |||||
* @throws LocationException if Ant's home cannot be determined. | |||||
*/ | |||||
static public URL getAntHome() throws LocationException { | |||||
try { | |||||
URL libraryURL = getLibraryURL(); | |||||
if (libraryURL != null) { | |||||
return new URL(libraryURL, ".."); | |||||
} | |||||
else { | |||||
return null; | |||||
} | |||||
} | |||||
catch (MalformedURLException e) { | |||||
e.printStackTrace(); | |||||
return null; | |||||
} | |||||
} | |||||
/** | |||||
* Get a URL to the Ant core jar. Other jars can be located | |||||
* from this as relative URLs | |||||
* | |||||
* @return a URL containing the Ant core or null if the core cannot be determined. | |||||
* | |||||
* @throws LocationException if the URL of the core.jar cannot be determined. | |||||
*/ | |||||
static public URL getCoreURL() throws LocationException { | |||||
return getClassLocationURL(AntLocator.class); | |||||
} | |||||
/** | |||||
* Get a URL to the Ant Library directory. | |||||
* | |||||
* @throws LocationException if the location of the Ant library directory cannot | |||||
* be determined | |||||
*/ | |||||
static public URL getLibraryURL() throws LocationException { | |||||
URL coreURL = getCoreURL(); | |||||
try { | |||||
if (coreURL.getProtocol().equals("file") && | |||||
coreURL.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 coreClassDirectory = new File(coreURL.getFile()); | |||||
File libDirectory = coreClassDirectory.getParentFile().getParentFile(); | |||||
if (!libDirectory.exists()) { | |||||
throw new LocationException("Ant library directory " + libDirectory + | |||||
" does not exist"); | |||||
} | |||||
return (new File(libDirectory, "lib")).toURL(); | |||||
} | |||||
else { | |||||
String coreURLString = coreURL.toString(); | |||||
int index = coreURLString.lastIndexOf("/"); | |||||
if (index != -1) { | |||||
coreURLString = coreURLString.substring(0, index+1); | |||||
} | |||||
return new URL(coreURLString); | |||||
} | |||||
} | |||||
catch (MalformedURLException e) { | |||||
throw new LocationException(e); | |||||
} | |||||
} | |||||
/** | |||||
* Get a classloader with which to load the SAX parser | |||||
* | |||||
* @return the classloader to use to load Ant's XML parser | |||||
* | |||||
* @throws LocationException if the location of the parser jars | |||||
* could not be determined. | |||||
*/ | |||||
static public ClassLoader getParserClassLoader(Properties properties) | |||||
throws LocationException { | |||||
// we look for the parser directory based on a system property first | |||||
String parserURLString = properties.getProperty(Constants.PropertyNames.PARSER_URL); | |||||
URL parserURL = null; | |||||
if (parserURLString != null) { | |||||
try { | |||||
parserURL = new URL(parserURLString); | |||||
} | |||||
catch (MalformedURLException e) { | |||||
throw new LocationException("XML Parser URL " + parserURLString + | |||||
" is malformed.", e); | |||||
} | |||||
} | |||||
else { | |||||
try { | |||||
parserURL = new URL(getLibraryURL(), "parser/"); | |||||
} | |||||
catch (Exception e) { | |||||
// ignore - we will just use the default class loader. | |||||
} | |||||
} | |||||
if (parserURL != null) { | |||||
try { | |||||
URL[] parserURLs = null; | |||||
if (parserURL.getProtocol().equals("file")) { | |||||
// build up the URLs for each jar file in the | |||||
// parser directory | |||||
parserURLs = getDirectoryJarURLs(new File(parserURL.getFile())); | |||||
} | |||||
else { | |||||
// we can't search the URL so we look for a known parser relative to | |||||
// that URL | |||||
String defaultParser = properties.getProperty(Constants.PropertyNames.DEFAULT_PARSER); | |||||
if (defaultParser == null) { | |||||
defaultParser = Constants.Defaults.DEFAULT_PARSER; | |||||
} | |||||
parserURLs = new URL[1]; | |||||
parserURLs[0] = new URL(parserURL, defaultParser); | |||||
} | |||||
return new AntClassLoader(parserURLs, "parser"); | |||||
} | |||||
catch (MalformedURLException e) { | |||||
throw new LocationException(e); | |||||
} | |||||
} | |||||
return AntLocator.class.getClassLoader(); | |||||
} | |||||
/** | |||||
* Get an array of URLs for each file matching the given set of extensions | |||||
* | |||||
* @param directory the local directory | |||||
* @param extensions the set of extensions to be returned | |||||
* | |||||
* @return an array of URLs for the file found in the directory. | |||||
*/ | |||||
static public URL[] getDirectoryURLs(File directory, final Set extensions) { | |||||
URL[] urls = new URL[0]; | |||||
if (!directory.exists()) { | |||||
return urls; | |||||
} | |||||
File[] jars = directory.listFiles(new FilenameFilter() { | |||||
public boolean accept(File dir, String name) { | |||||
int extensionIndex = name.lastIndexOf("."); | |||||
if (extensionIndex == -1) { | |||||
return false; | |||||
} | |||||
String extension = name.substring(extensionIndex); | |||||
return extensions.contains(extension); | |||||
} | |||||
}); | |||||
urls = new URL[jars.length]; | |||||
for (int i = 0; i < jars.length; ++i) { | |||||
try { | |||||
urls[i] = jars[i].toURL(); | |||||
} | |||||
catch (MalformedURLException e) { | |||||
// just ignore | |||||
} | |||||
} | |||||
return urls; | |||||
} | |||||
/** | |||||
* Get an array of URLs for each jar file in a local directory. | |||||
* | |||||
* @param directory the local directory | |||||
* | |||||
* @return an array of URLs for the jars found in the directory. | |||||
*/ | |||||
static private URL[] getDirectoryJarURLs(File directory) { | |||||
HashSet extensions = new HashSet(); | |||||
extensions.add(".jar"); | |||||
return getDirectoryURLs(directory, extensions); | |||||
} | |||||
/** | |||||
* Get the Core Class Loader. The core requires a SAX parser which must come from the | |||||
* given classloader | |||||
* | |||||
* @throws LocationException if the location of the core ant classes could | |||||
* not be determined | |||||
*/ | |||||
static public AntClassLoader getCoreClassLoader(Properties properties) | |||||
throws LocationException { | |||||
URL[] coreURL = new URL[1]; | |||||
coreURL[0] = getCoreURL(); | |||||
AntClassLoader coreLoader | |||||
= new AntClassLoader(coreURL, getParserClassLoader(properties), "core"); | |||||
URL libraryURL = getLibraryURL(); | |||||
if (libraryURL != null && libraryURL.getProtocol().equals("file")) { | |||||
// we can search this | |||||
URL[] optionalURLs = getDirectoryJarURLs(new File(libraryURL.getFile(), "optional")); | |||||
for (int i = 0; i < optionalURLs.length; ++i) { | |||||
coreLoader.addURL(optionalURLs[i]); | |||||
} | |||||
} | |||||
return coreLoader; | |||||
} | |||||
} | |||||
@@ -1,125 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.core.support; | |||||
import java.io.*; | |||||
/** | |||||
* A ConfigException indicates a problem with | |||||
* Ant's configuration. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
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); | |||||
} | |||||
} |
@@ -1,76 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.core.support; | |||||
import java.util.*; | |||||
import java.net.*; | |||||
import java.io.*; | |||||
/** | |||||
* Constants used by the Ant core | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public class Constants { | |||||
static public class PropertyNames { | |||||
static public final String PARSER_URL = "ant.parser.url"; | |||||
static public final String DEFAULT_PARSER = "ant.parser.default"; | |||||
} | |||||
static public class Defaults { | |||||
static public final String DEFAULT_PARSER = "crimson.jar"; | |||||
} | |||||
} | |||||
@@ -1,166 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.core.support; | |||||
/** | |||||
* Stores the file name and line number in a file. | |||||
*/ | |||||
public class 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 locatin within the source | |||||
*/ | |||||
private int columnNumber; | |||||
/** | |||||
* Standard unknown location constant; | |||||
*/ | |||||
public static final Location UNKNOWN_LOCATION = new Location(); | |||||
/** | |||||
* Creates an "unknown" location. | |||||
*/ | |||||
private Location() { | |||||
this(null, 0, 0); | |||||
} | |||||
/** | |||||
* 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; | |||||
} | |||||
/** | |||||
* 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(); | |||||
} | |||||
/** | |||||
* 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; | |||||
} | |||||
} |
@@ -1,97 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.core.support; | |||||
import java.util.*; | |||||
import java.net.URL; | |||||
/** | |||||
* A LocationException is thrown when there is a problem determining | |||||
* the location of an Ant component. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public class LocationException extends AntException { | |||||
/** | |||||
* Constructs an exception with the given descriptive message. | |||||
* | |||||
* @param msg Description of or information about the exception. | |||||
*/ | |||||
public LocationException(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 LocationException(String msg, Throwable cause) { | |||||
super(msg, cause); | |||||
} | |||||
/** | |||||
* Constructs an exception with the given exception as a root cause. | |||||
* | |||||
* @param cause Exception that might have caused this one. | |||||
*/ | |||||
public LocationException(Throwable cause) { | |||||
super(cause); | |||||
} | |||||
} | |||||
@@ -1,580 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2000 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.core.types; | |||||
import java.io.*; | |||||
import java.util.*; | |||||
import org.apache.ant.core.execution.*; | |||||
/** | |||||
* The abstract FileSetInfo performs all of the name matching and mapping operations | |||||
* common to FileSetInfo classes. | |||||
*/ | |||||
public abstract class AbstractScanner implements FileSetScanner { | |||||
/** The list of patternSets to process on this directory */ | |||||
List patternSets; | |||||
/** Indicator for whether default excludes should be applied. */ | |||||
boolean useDefaultExcludes; | |||||
/* | |||||
* The patterns for the files that should be included. | |||||
*/ | |||||
private String[] includes; | |||||
/** | |||||
* The patterns for the files that should be excluded. | |||||
*/ | |||||
private String[] excludes; | |||||
/** | |||||
* Patterns that should be excluded by default. | |||||
* | |||||
* @see #addDefaultExcludes() | |||||
*/ | |||||
protected final static String[] DEFAULTEXCLUDES = { | |||||
"**/*~", | |||||
"**/#*#", | |||||
"**/.#*", | |||||
"**/%*%", | |||||
"**/CVS", | |||||
"**/CVS/**", | |||||
"**/.cvsignore", | |||||
"**/SCCS", | |||||
"**/SCCS/**" | |||||
}; | |||||
public AbstractScanner(List patternSets, | |||||
boolean useDefaultExcludes) throws ExecutionException { | |||||
this.patternSets = patternSets; | |||||
this.useDefaultExcludes = useDefaultExcludes; | |||||
//convert patternsets into excludes | |||||
PatternSet combinedSet = new PatternSet(); | |||||
for (Iterator i = patternSets.iterator(); i.hasNext(); ) { | |||||
PatternSet set = (PatternSet)i.next(); | |||||
combinedSet.append(set); | |||||
} | |||||
String[] includes = combinedSet.getIncludePatterns(); | |||||
if (includes == null) { | |||||
// No includes supplied, so set it to 'matches all' | |||||
includes = new String[1]; | |||||
includes[0] = "**"; | |||||
} | |||||
String[] excludes = combinedSet.getExcludePatterns(); | |||||
if (excludes == null) { | |||||
excludes = new String[0]; | |||||
} | |||||
setIncludes(includes); | |||||
setExcludes(excludes); | |||||
if (useDefaultExcludes) { | |||||
addDefaultExcludes(); | |||||
} | |||||
} | |||||
/** | |||||
* Sets the set of include patterns to use. All '/' and '\' characters are | |||||
* replaced by <code>File.separatorChar</code>. So the separator used need | |||||
* not match <code>File.separatorChar</code>. | |||||
* <p> | |||||
* When a pattern ends with a '/' or '\', "**" is appended. | |||||
* | |||||
* @param includes list of include patterns | |||||
*/ | |||||
protected void setIncludes(String[] includes) { | |||||
if (includes == null) { | |||||
this.includes = null; | |||||
} else { | |||||
this.includes = new String[includes.length]; | |||||
for (int i = 0; i < includes.length; i++) { | |||||
String pattern; | |||||
pattern = includes[i].replace('/',File.separatorChar).replace('\\',File.separatorChar); | |||||
if (pattern.endsWith(File.separator)) { | |||||
pattern += "**"; | |||||
} | |||||
this.includes[i] = pattern; | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* Sets the set of exclude patterns to use. All '/' and '\' characters are | |||||
* replaced by <code>File.separatorChar</code>. So the separator used need | |||||
* not match <code>File.separatorChar</code>. | |||||
* <p> | |||||
* When a pattern ends with a '/' or '\', "**" is appended. | |||||
* | |||||
* @param excludes list of exclude patterns | |||||
*/ | |||||
protected void setExcludes(String[] excludes) { | |||||
if (excludes == null) { | |||||
this.excludes = null; | |||||
} else { | |||||
this.excludes = new String[excludes.length]; | |||||
for (int i = 0; i < excludes.length; i++) { | |||||
String pattern; | |||||
pattern = excludes[i].replace('/',File.separatorChar).replace('\\',File.separatorChar); | |||||
if (pattern.endsWith(File.separator)) { | |||||
pattern += "**"; | |||||
} | |||||
this.excludes[i] = pattern; | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* Does the path match the start of this pattern up to the first "**". | |||||
+ | |||||
* <p>This is not a general purpose test and should only be used if you | |||||
* can live with false positives.</p> | |||||
* | |||||
* <p><code>pattern=**\\a</code> and <code>str=b</code> will yield true. | |||||
* | |||||
* @param pattern the (non-null) pattern to match against | |||||
* @param str the (non-null) string (path) to match | |||||
*/ | |||||
protected static boolean matchPatternStart(String pattern, String str) { | |||||
// When str starts with a File.separator, pattern has to start with a | |||||
// File.separator. | |||||
// When pattern starts with a File.separator, str has to start with a | |||||
// File.separator. | |||||
if (str.startsWith(File.separator) != | |||||
pattern.startsWith(File.separator)) { | |||||
return false; | |||||
} | |||||
Vector patDirs = new Vector(); | |||||
StringTokenizer st = new StringTokenizer(pattern,File.separator); | |||||
while (st.hasMoreTokens()) { | |||||
patDirs.addElement(st.nextToken()); | |||||
} | |||||
Vector strDirs = new Vector(); | |||||
st = new StringTokenizer(str,File.separator); | |||||
while (st.hasMoreTokens()) { | |||||
strDirs.addElement(st.nextToken()); | |||||
} | |||||
int patIdxStart = 0; | |||||
int patIdxEnd = patDirs.size()-1; | |||||
int strIdxStart = 0; | |||||
int strIdxEnd = strDirs.size()-1; | |||||
// up to first '**' | |||||
while (patIdxStart <= patIdxEnd && strIdxStart <= strIdxEnd) { | |||||
String patDir = (String)patDirs.elementAt(patIdxStart); | |||||
if (patDir.equals("**")) { | |||||
break; | |||||
} | |||||
if (!match(patDir,(String)strDirs.elementAt(strIdxStart))) { | |||||
return false; | |||||
} | |||||
patIdxStart++; | |||||
strIdxStart++; | |||||
} | |||||
if (strIdxStart > strIdxEnd) { | |||||
// String is exhausted | |||||
return true; | |||||
} else if (patIdxStart > patIdxEnd) { | |||||
// String not exhausted, but pattern is. Failure. | |||||
return false; | |||||
} else { | |||||
// pattern now holds ** while string is not exhausted | |||||
// this will generate false positives but we can live with that. | |||||
return true; | |||||
} | |||||
} | |||||
/** | |||||
* Matches a path against a pattern. | |||||
* | |||||
* @param pattern the (non-null) pattern to match against | |||||
* @param str the (non-null) string (path) to match | |||||
* | |||||
* @return <code>true</code> when the pattern matches against the string. | |||||
* <code>false</code> otherwise. | |||||
*/ | |||||
protected static boolean matchPath(String pattern, String str) { | |||||
// When str starts with a File.separator, pattern has to start with a | |||||
// File.separator. | |||||
// When pattern starts with a File.separator, str has to start with a | |||||
// File.separator. | |||||
if (str.startsWith(File.separator) != | |||||
pattern.startsWith(File.separator)) { | |||||
return false; | |||||
} | |||||
Vector patDirs = new Vector(); | |||||
StringTokenizer st = new StringTokenizer(pattern,File.separator); | |||||
while (st.hasMoreTokens()) { | |||||
patDirs.addElement(st.nextToken()); | |||||
} | |||||
Vector strDirs = new Vector(); | |||||
st = new StringTokenizer(str,File.separator); | |||||
while (st.hasMoreTokens()) { | |||||
strDirs.addElement(st.nextToken()); | |||||
} | |||||
int patIdxStart = 0; | |||||
int patIdxEnd = patDirs.size()-1; | |||||
int strIdxStart = 0; | |||||
int strIdxEnd = strDirs.size()-1; | |||||
// up to first '**' | |||||
while (patIdxStart <= patIdxEnd && strIdxStart <= strIdxEnd) { | |||||
String patDir = (String)patDirs.elementAt(patIdxStart); | |||||
if (patDir.equals("**")) { | |||||
break; | |||||
} | |||||
if (!match(patDir,(String)strDirs.elementAt(strIdxStart))) { | |||||
return false; | |||||
} | |||||
patIdxStart++; | |||||
strIdxStart++; | |||||
} | |||||
if (strIdxStart > strIdxEnd) { | |||||
// String is exhausted | |||||
for (int i = patIdxStart; i <= patIdxEnd; i++) { | |||||
if (!patDirs.elementAt(i).equals("**")) { | |||||
return false; | |||||
} | |||||
} | |||||
return true; | |||||
} else { | |||||
if (patIdxStart > patIdxEnd) { | |||||
// String not exhausted, but pattern is. Failure. | |||||
return false; | |||||
} | |||||
} | |||||
// up to last '**' | |||||
while (patIdxStart <= patIdxEnd && strIdxStart <= strIdxEnd) { | |||||
String patDir = (String)patDirs.elementAt(patIdxEnd); | |||||
if (patDir.equals("**")) { | |||||
break; | |||||
} | |||||
if (!match(patDir,(String)strDirs.elementAt(strIdxEnd))) { | |||||
return false; | |||||
} | |||||
patIdxEnd--; | |||||
strIdxEnd--; | |||||
} | |||||
if (strIdxStart > strIdxEnd) { | |||||
// String is exhausted | |||||
for (int i = patIdxStart; i <= patIdxEnd; i++) { | |||||
if (!patDirs.elementAt(i).equals("**")) { | |||||
return false; | |||||
} | |||||
} | |||||
return true; | |||||
} | |||||
while (patIdxStart != patIdxEnd && strIdxStart <= strIdxEnd) { | |||||
int patIdxTmp = -1; | |||||
for (int i = patIdxStart+1; i <= patIdxEnd; i++) { | |||||
if (patDirs.elementAt(i).equals("**")) { | |||||
patIdxTmp = i; | |||||
break; | |||||
} | |||||
} | |||||
if (patIdxTmp == patIdxStart+1) { | |||||
// '**/**' situation, so skip one | |||||
patIdxStart++; | |||||
continue; | |||||
} | |||||
// Find the pattern between padIdxStart & padIdxTmp in str between | |||||
// strIdxStart & strIdxEnd | |||||
int patLength = (patIdxTmp-patIdxStart-1); | |||||
int strLength = (strIdxEnd-strIdxStart+1); | |||||
int foundIdx = -1; | |||||
strLoop: | |||||
for (int i = 0; i <= strLength - patLength; i++) { | |||||
for (int j = 0; j < patLength; j++) { | |||||
String subPat = (String)patDirs.elementAt(patIdxStart+j+1); | |||||
String subStr = (String)strDirs.elementAt(strIdxStart+i+j); | |||||
if (!match(subPat,subStr)) { | |||||
continue strLoop; | |||||
} | |||||
} | |||||
foundIdx = strIdxStart+i; | |||||
break; | |||||
} | |||||
if (foundIdx == -1) { | |||||
return false; | |||||
} | |||||
patIdxStart = patIdxTmp; | |||||
strIdxStart = foundIdx+patLength; | |||||
} | |||||
for (int i = patIdxStart; i <= patIdxEnd; i++) { | |||||
if (!patDirs.elementAt(i).equals("**")) { | |||||
return false; | |||||
} | |||||
} | |||||
return true; | |||||
} | |||||
/** | |||||
* Matches a string against a pattern. The pattern contains two special | |||||
* characters: | |||||
* '*' which means zero or more characters, | |||||
* '?' which means one and only one character. | |||||
* | |||||
* @param pattern the (non-null) pattern to match against | |||||
* @param str the (non-null) string that must be matched against the | |||||
* pattern | |||||
* | |||||
* @return <code>true</code> when the string matches against the pattern, | |||||
* <code>false</code> otherwise. | |||||
*/ | |||||
protected static boolean match(String pattern, String str) { | |||||
char[] patArr = pattern.toCharArray(); | |||||
char[] strArr = str.toCharArray(); | |||||
int patIdxStart = 0; | |||||
int patIdxEnd = patArr.length-1; | |||||
int strIdxStart = 0; | |||||
int strIdxEnd = strArr.length-1; | |||||
char ch; | |||||
boolean containsStar = false; | |||||
for (int i = 0; i < patArr.length; i++) { | |||||
if (patArr[i] == '*') { | |||||
containsStar = true; | |||||
break; | |||||
} | |||||
} | |||||
if (!containsStar) { | |||||
// No '*'s, so we make a shortcut | |||||
if (patIdxEnd != strIdxEnd) { | |||||
return false; // Pattern and string do not have the same size | |||||
} | |||||
for (int i = 0; i <= patIdxEnd; i++) { | |||||
ch = patArr[i]; | |||||
if (ch != '?' && ch != strArr[i]) { | |||||
return false; // Character mismatch | |||||
} | |||||
} | |||||
return true; // String matches against pattern | |||||
} | |||||
if (patIdxEnd == 0) { | |||||
return true; // Pattern contains only '*', which matches anything | |||||
} | |||||
// Process characters before first star | |||||
while((ch = patArr[patIdxStart]) != '*' && strIdxStart <= strIdxEnd) { | |||||
if (ch != '?' && ch != strArr[strIdxStart]) { | |||||
return false; | |||||
} | |||||
patIdxStart++; | |||||
strIdxStart++; | |||||
} | |||||
if (strIdxStart > strIdxEnd) { | |||||
// All characters in the string are used. Check if only '*'s are | |||||
// left in the pattern. If so, we succeeded. Otherwise failure. | |||||
for (int i = patIdxStart; i <= patIdxEnd; i++) { | |||||
if (patArr[i] != '*') { | |||||
return false; | |||||
} | |||||
} | |||||
return true; | |||||
} | |||||
// Process characters after last star | |||||
while((ch = patArr[patIdxEnd]) != '*' && strIdxStart <= strIdxEnd) { | |||||
if (ch != '?' && ch != strArr[strIdxEnd]) { | |||||
return false; | |||||
} | |||||
patIdxEnd--; | |||||
strIdxEnd--; | |||||
} | |||||
if (strIdxStart > strIdxEnd) { | |||||
// All characters in the string are used. Check if only '*'s are | |||||
// left in the pattern. If so, we succeeded. Otherwise failure. | |||||
for (int i = patIdxStart; i <= patIdxEnd; i++) { | |||||
if (patArr[i] != '*') { | |||||
return false; | |||||
} | |||||
} | |||||
return true; | |||||
} | |||||
// process pattern between stars. padIdxStart and patIdxEnd point | |||||
// always to a '*'. | |||||
while (patIdxStart != patIdxEnd && strIdxStart <= strIdxEnd) { | |||||
int patIdxTmp = -1; | |||||
for (int i = patIdxStart+1; i <= patIdxEnd; i++) { | |||||
if (patArr[i] == '*') { | |||||
patIdxTmp = i; | |||||
break; | |||||
} | |||||
} | |||||
if (patIdxTmp == patIdxStart+1) { | |||||
// Two stars next to each other, skip the first one. | |||||
patIdxStart++; | |||||
continue; | |||||
} | |||||
// Find the pattern between padIdxStart & padIdxTmp in str between | |||||
// strIdxStart & strIdxEnd | |||||
int patLength = (patIdxTmp-patIdxStart-1); | |||||
int strLength = (strIdxEnd-strIdxStart+1); | |||||
int foundIdx = -1; | |||||
strLoop: | |||||
for (int i = 0; i <= strLength - patLength; i++) { | |||||
for (int j = 0; j < patLength; j++) { | |||||
ch = patArr[patIdxStart+j+1]; | |||||
if (ch != '?' && ch != strArr[strIdxStart+i+j]) { | |||||
continue strLoop; | |||||
} | |||||
} | |||||
foundIdx = strIdxStart+i; | |||||
break; | |||||
} | |||||
if (foundIdx == -1) { | |||||
return false; | |||||
} | |||||
patIdxStart = patIdxTmp; | |||||
strIdxStart = foundIdx+patLength; | |||||
} | |||||
// All characters in the string are used. Check if only '*'s are left | |||||
// in the pattern. If so, we succeeded. Otherwise failure. | |||||
for (int i = patIdxStart; i <= patIdxEnd; i++) { | |||||
if (patArr[i] != '*') { | |||||
return false; | |||||
} | |||||
} | |||||
return true; | |||||
} | |||||
/** | |||||
* Tests whether a name matches against at least one include pattern. | |||||
* | |||||
* @param name the name to match | |||||
* @return <code>true</code> when the name matches against at least one | |||||
* include pattern, <code>false</code> otherwise. | |||||
*/ | |||||
protected boolean isIncluded(String name) { | |||||
for (int i = 0; i < includes.length; i++) { | |||||
if (matchPath(includes[i],name)) { | |||||
return true; | |||||
} | |||||
} | |||||
return false; | |||||
} | |||||
/** | |||||
* Tests whether a name matches the start of at least one include pattern. | |||||
* | |||||
* @param name the name to match | |||||
* @return <code>true</code> when the name matches against at least one | |||||
* include pattern, <code>false</code> otherwise. | |||||
*/ | |||||
protected boolean couldHoldIncluded(String name) { | |||||
for (int i = 0; i < includes.length; i++) { | |||||
if (matchPatternStart(includes[i],name)) { | |||||
return true; | |||||
} | |||||
} | |||||
return false; | |||||
} | |||||
/** | |||||
* Tests whether a name matches against at least one exclude pattern. | |||||
* | |||||
* @param name the name to match | |||||
* @return <code>true</code> when the name matches against at least one | |||||
* exclude pattern, <code>false</code> otherwise. | |||||
*/ | |||||
protected boolean isExcluded(String name) { | |||||
for (int i = 0; i < excludes.length; i++) { | |||||
if (matchPath(excludes[i],name)) { | |||||
return true; | |||||
} | |||||
} | |||||
return false; | |||||
} | |||||
/** | |||||
* Adds the array with default exclusions to the current exclusions set. | |||||
* | |||||
*/ | |||||
public void addDefaultExcludes() { | |||||
int excludesLength = excludes == null ? 0 : excludes.length; | |||||
String[] newExcludes; | |||||
newExcludes = new String[excludesLength + DEFAULTEXCLUDES.length]; | |||||
if (excludesLength > 0) { | |||||
System.arraycopy(excludes,0,newExcludes,0,excludesLength); | |||||
} | |||||
for (int i = 0; i < DEFAULTEXCLUDES.length; i++) { | |||||
newExcludes[i+excludesLength] = DEFAULTEXCLUDES[i].replace('/',File.separatorChar).replace('\\',File.separatorChar); | |||||
} | |||||
excludes = newExcludes; | |||||
} | |||||
} |
@@ -1,140 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.core.types; | |||||
import org.apache.ant.core.execution.*; | |||||
import java.io.*; | |||||
/** | |||||
* A DataType is an element which can register a named value in the | |||||
* ExecutionFrame's context. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public abstract class DataType extends AbstractTask { | |||||
private String reference = null; | |||||
private Object referencedObject = null; | |||||
public void execute() throws ExecutionException { | |||||
validate(); | |||||
} | |||||
protected void validate() throws ExecutionException { | |||||
} | |||||
/** | |||||
* Creates an exception that indicates that refid has to be the | |||||
* only attribute if it is set. | |||||
*/ | |||||
protected ExecutionException tooManyAttributes() { | |||||
return new ExecutionException("You must not specify more than one attribute" + | |||||
" when using refid" ); | |||||
} | |||||
/** | |||||
* Creates an exception that indicates that this XML element must | |||||
* not have child elements if the refid attribute is set. | |||||
*/ | |||||
protected ExecutionException noChildrenAllowed() { | |||||
return new ExecutionException("You must not specify nested elements when using refid"); | |||||
} | |||||
/** | |||||
* Creates an exception that indicates the user has generated a | |||||
* loop of data types referencing each other. | |||||
*/ | |||||
protected ExecutionException circularReference() { | |||||
return new ExecutionException("This data type contains a circular reference."); | |||||
} | |||||
/** | |||||
* Makes this instance in effect a reference to another DataType | |||||
* instance. | |||||
*/ | |||||
public void setRefid(String reference) throws ExecutionException { | |||||
this.reference = reference; | |||||
Object referencedObject = getTaskContext().getDataValue(reference); | |||||
if (referencedObject == null) { | |||||
throw new ExecutionException("Unable to locate the reference specified by refid '" + | |||||
getReference() + "'"); | |||||
} | |||||
if (!this.getClass().isAssignableFrom(referencedObject.getClass())) { | |||||
throw new ExecutionException("The object referenced by refid '" + | |||||
getReference() + "' is not compatible with this element "); | |||||
} | |||||
} | |||||
/** | |||||
* Has the refid attribute of this element been set? | |||||
*/ | |||||
public boolean isReference() { | |||||
return referencedObject != null; | |||||
} | |||||
protected Object getReferencedObject() throws ExecutionException { | |||||
if (!isReference()) { | |||||
throw new ExecutionException("You cannot get a referenced value from a data type " + | |||||
"which does not have the refid attribute"); | |||||
} | |||||
return referencedObject; | |||||
} | |||||
protected String getReference() { | |||||
return reference; | |||||
} | |||||
} |
@@ -1,266 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2000 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.core.types; | |||||
import java.io.*; | |||||
import java.util.*; | |||||
import org.apache.ant.core.execution.*; | |||||
/** | |||||
* A DirectoryFileset is a fileset where the files come from a directory and | |||||
* its subdirectories. | |||||
*/ | |||||
public class DirectoryScanner extends AbstractScanner { | |||||
/** The directory which is the root of the search space. */ | |||||
File basedir; | |||||
/** | |||||
* The files that where found and matched at least one includes, and matched | |||||
* no excludes. | |||||
*/ | |||||
protected List filesIncluded; | |||||
/** | |||||
* The files that where found and did not match any includes. | |||||
*/ | |||||
protected List filesNotIncluded; | |||||
/** | |||||
* The files that where found and matched at least one includes, and also | |||||
* matched at least one excludes. | |||||
*/ | |||||
protected List filesExcluded; | |||||
/** | |||||
* The directories that where found and matched at least one includes, and | |||||
* matched no excludes. | |||||
*/ | |||||
protected List dirsIncluded; | |||||
/** | |||||
* The directories that where found and did not match any includes. | |||||
*/ | |||||
protected List dirsNotIncluded; | |||||
/** | |||||
* The files that where found and matched at least one includes, and also | |||||
* matched at least one excludes. | |||||
*/ | |||||
protected List dirsExcluded; | |||||
/** Map to map filenames to actual File objects */ | |||||
private Map filenameMap = null; | |||||
public DirectoryScanner(File basedir, List patternSets, | |||||
boolean useDefaultExcludes) throws ExecutionException { | |||||
super(patternSets, useDefaultExcludes); | |||||
this.basedir = basedir; | |||||
} | |||||
public String[] getIncludedFiles() throws ExecutionException { | |||||
if (filesIncluded == null) { | |||||
scan(); | |||||
} | |||||
return (String[])filesIncluded.toArray(new String[0]); | |||||
} | |||||
/** | |||||
* Scans the base directory for files that match at least one include | |||||
* pattern, and don't match any exclude patterns. | |||||
* | |||||
* @throws ExecutionException when basedir was set incorrecly | |||||
*/ | |||||
public void scan() throws ExecutionException { | |||||
if (basedir == null) { | |||||
throw new ExecutionException("The directory to scan has not been set"); | |||||
} | |||||
if (!basedir.exists()) { | |||||
throw new ExecutionException("basedir \"" + basedir | |||||
+ "\" does not exist"); | |||||
} | |||||
if (!basedir.isDirectory()) { | |||||
throw new ExecutionException("basedir \"" + basedir | |||||
+ "\" is not a directory"); | |||||
} | |||||
filesIncluded = new ArrayList(); | |||||
filesNotIncluded = new ArrayList(); | |||||
filesExcluded = new ArrayList(); | |||||
dirsIncluded = new ArrayList(); | |||||
dirsNotIncluded = new ArrayList(); | |||||
dirsExcluded = new ArrayList(); | |||||
filenameMap = new HashMap(); | |||||
String root = ""; | |||||
String mappedRoot = mapName(root); | |||||
filenameMap.put(mappedRoot, root); | |||||
if (isIncluded(root)) { | |||||
if (!isExcluded(root)) { | |||||
dirsIncluded.add(mappedRoot); | |||||
} else { | |||||
dirsExcluded.add(mappedRoot); | |||||
} | |||||
} else { | |||||
dirsNotIncluded.add(mappedRoot); | |||||
} | |||||
scandir(basedir, root, true); | |||||
} | |||||
/** | |||||
* Scans the passed dir for files and directories. Found files and | |||||
* directories are placed in their respective collections, based on the | |||||
* matching of includes and excludes. When a directory is found, it is | |||||
* scanned recursively. | |||||
* | |||||
* @param dir the directory to scan | |||||
* @param vpath the path relative to the basedir (needed to prevent | |||||
* problems with an absolute path when using dir) | |||||
* | |||||
* @see #filesIncluded | |||||
* @see #filesNotIncluded | |||||
* @see #filesExcluded | |||||
* @see #dirsIncluded | |||||
* @see #dirsNotIncluded | |||||
* @see #dirsExcluded | |||||
*/ | |||||
protected void scandir(File dir, String vpath, boolean fast) | |||||
throws ExecutionException { | |||||
String[] newfiles = dir.list(); | |||||
if (newfiles == null) { | |||||
/* | |||||
* two reasons are mentioned in the API docs for File.list | |||||
* (1) dir is not a directory. This is impossible as | |||||
* we wouldn't get here in this case. | |||||
* (2) an IO error occurred (why doesn't it throw an exception | |||||
* then???) | |||||
*/ | |||||
throw new ExecutionException ("IO error scanning directory " | |||||
+ dir.getAbsolutePath()); | |||||
} | |||||
for (int i = 0; i < newfiles.length; i++) { | |||||
String name = vpath+newfiles[i]; | |||||
String mappedName = mapName(name); | |||||
filenameMap.put(mappedName, name); | |||||
File file = new File(dir,newfiles[i]); | |||||
if (file.isDirectory()) { | |||||
if (isIncluded(name)) { | |||||
if (!isExcluded(name)) { | |||||
dirsIncluded.add(mappedName); | |||||
if (fast) { | |||||
scandir(file, name+File.separator, fast); | |||||
} | |||||
} else { | |||||
dirsExcluded.add(mappedName); | |||||
} | |||||
} else { | |||||
dirsNotIncluded.add(mappedName); | |||||
if (fast && couldHoldIncluded(name)) { | |||||
scandir(file, name+File.separator, fast); | |||||
} | |||||
} | |||||
if (!fast) { | |||||
scandir(file, name+File.separator, fast); | |||||
} | |||||
} else if (file.isFile()) { | |||||
if (isIncluded(name)) { | |||||
if (!isExcluded(name)) { | |||||
filesIncluded.add(mappedName); | |||||
} else { | |||||
filesExcluded.add(mappedName); | |||||
} | |||||
} else { | |||||
filesNotIncluded.add(mappedName); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
private String mapName(String rawName) { | |||||
return "bozo/" + rawName; | |||||
} | |||||
public File getLocalFile(String mappedName) throws ExecutionException { | |||||
if (filesIncluded == null) { | |||||
scan(); | |||||
} | |||||
String realName = (String)filenameMap.get(mappedName); | |||||
if (realName == null) { | |||||
throw new ExecutionException("\"" + mappedName + "\" was not included in the scan."); | |||||
} | |||||
return new File(basedir, realName); | |||||
} | |||||
public String toString() { | |||||
try { | |||||
String[] files = getIncludedFiles(); | |||||
StringBuffer sb = new StringBuffer(); | |||||
String lsep = System.getProperty("line.separator"); | |||||
for (int i = 0; i < files.length; ++i) { | |||||
sb.append(files[i]); | |||||
sb.append(lsep); | |||||
} | |||||
return sb.toString(); | |||||
} | |||||
catch (ExecutionException e) { | |||||
return "Fileset from \"" + basedir + "\""; | |||||
} | |||||
} | |||||
} |
@@ -1,116 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2000 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.core.types; | |||||
import org.apache.ant.core.execution.*; | |||||
/** | |||||
* Helper class for attributes that can only take one of a fixed list | |||||
* of values. | |||||
* | |||||
* @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||||
*/ | |||||
public abstract class EnumeratedAttribute { | |||||
/** The value of this attribute. */ | |||||
private String value; | |||||
/** | |||||
* This is the only method a subclass needs to implement. | |||||
* | |||||
* @return an array holding all possible values of the enumeration. | |||||
*/ | |||||
public abstract String[] getValues(); | |||||
/** | |||||
* Set the value of the enumeration. | |||||
* | |||||
* Invoked by {@link org.apache.ant.core.execution.IntrospectionHelper IntrospectionHelper}. | |||||
* | |||||
* @param value the value of the enumeration | |||||
* | |||||
* @throws ExecutionException if the value is not value | |||||
*/ | |||||
public final void setValue(String value) throws ExecutionException { | |||||
if (!containsValue(value)) { | |||||
throw new ExecutionException(value + " is not a legal value for this attribute"); | |||||
} | |||||
this.value = value; | |||||
} | |||||
/** | |||||
* Is this value included in the enumeration? | |||||
*/ | |||||
public final boolean containsValue(String value) { | |||||
String[] values = getValues(); | |||||
if (values == null || value == null) { | |||||
return false; | |||||
} | |||||
for (int i = 0; i < values.length; i++) { | |||||
if (value.equals(values[i])) { | |||||
return true; | |||||
} | |||||
} | |||||
return false; | |||||
} | |||||
/** | |||||
* Retrieves the value. | |||||
*/ | |||||
public final String getValue() { | |||||
return value; | |||||
} | |||||
} |
@@ -1,319 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2000 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.core.types; | |||||
import java.util.*; | |||||
import java.io.*; | |||||
import java.net.URL; | |||||
import org.apache.ant.core.execution.*; | |||||
/** | |||||
* Moved out of MatchingTask to make it a standalone object that could | |||||
* be referenced (by scripts for example). | |||||
* | |||||
* @author Arnout J. Kuiper <a href="mailto:ajkuiper@wxs.nl">ajkuiper@wxs.nl</a> | |||||
* @author Stefano Mazzocchi <a href="mailto:stefano@apache.org">stefano@apache.org</a> | |||||
* @author Sam Ruby <a href="mailto:rubys@us.ibm.com">rubys@us.ibm.com</a> | |||||
* @author Jon S. Stevens <a href="mailto:jon@clearink.com">jon@clearink.com</a> | |||||
* @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||||
*/ | |||||
public class FileSet extends DataType { | |||||
private FileSetScanner scanner = null; | |||||
private PatternSet defaultPatterns = new PatternSet(); | |||||
private List patternSets = new ArrayList(); | |||||
/** | |||||
* The dir attribute is set when you are generating the list of files | |||||
* from a directory. | |||||
*/ | |||||
private File dir = null; | |||||
/** The zipfile attribute is used when the source of files is a zip file */ | |||||
private URL zipFile = null; | |||||
/** | |||||
* The filelist attribute is a file which contains a list of file names. It must be used | |||||
* with the base attribute which indicates where the files are stored. | |||||
*/ | |||||
private URL fileList = null; | |||||
/** | |||||
* When using the filelist this attribute indicates the base location of the files in | |||||
* the list. | |||||
*/ | |||||
private URL fileListBase = null; | |||||
private boolean useDefaultExcludes = true; | |||||
public FileSet() { | |||||
patternSets.add(defaultPatterns); | |||||
} | |||||
/** | |||||
* Makes this instance in effect a reference to another FileSet | |||||
* instance. | |||||
* | |||||
* <p>You must not set another attribute or nest elements inside | |||||
* this element if you make it a reference.</p> | |||||
*/ | |||||
public void setRefid(String reference) throws ExecutionException { | |||||
if (dir != null || defaultPatterns.hasPatterns()) { | |||||
throw tooManyAttributes(); | |||||
} | |||||
if (!(patternSets.size() == 1)) { | |||||
throw noChildrenAllowed(); | |||||
} | |||||
super.setRefid(reference); | |||||
} | |||||
public void setDir(File dir) throws ExecutionException { | |||||
if (isReference()) { | |||||
throw tooManyAttributes(); | |||||
} | |||||
this.dir = dir; | |||||
} | |||||
public void setZipFile(URL zipFile) throws ExecutionException { | |||||
if (isReference()) { | |||||
throw tooManyAttributes(); | |||||
} | |||||
this.zipFile = zipFile; | |||||
} | |||||
public void setFileList(URL fileList) throws ExecutionException { | |||||
if (isReference()) { | |||||
throw tooManyAttributes(); | |||||
} | |||||
this.fileList = fileList; | |||||
} | |||||
public void setFileListBase(URL fileListBase) throws ExecutionException { | |||||
if (isReference()) { | |||||
throw tooManyAttributes(); | |||||
} | |||||
this.fileListBase = fileListBase; | |||||
} | |||||
public PatternSet createPatternSet() throws ExecutionException { | |||||
if (isReference()) { | |||||
throw noChildrenAllowed(); | |||||
} | |||||
PatternSet patternSet = new PatternSet(); | |||||
patternSets.add(patternSet); | |||||
return patternSet; | |||||
} | |||||
/** | |||||
* add a name entry on the include list | |||||
*/ | |||||
public PatternSet.NameEntry createInclude() throws ExecutionException { | |||||
if (isReference()) { | |||||
throw noChildrenAllowed(); | |||||
} | |||||
return defaultPatterns.createInclude(); | |||||
} | |||||
/** | |||||
* add a name entry on the exclude list | |||||
*/ | |||||
public PatternSet.NameEntry createExclude() throws ExecutionException { | |||||
if (isReference()) { | |||||
throw noChildrenAllowed(); | |||||
} | |||||
return defaultPatterns.createExclude(); | |||||
} | |||||
/** | |||||
* Sets the set of include patterns. Patterns may be separated by a comma | |||||
* or a space. | |||||
* | |||||
* @param includes the string containing the include patterns | |||||
*/ | |||||
public void setIncludes(String includes) throws ExecutionException { | |||||
if (isReference()) { | |||||
throw tooManyAttributes(); | |||||
} | |||||
defaultPatterns.setIncludes(includes); | |||||
} | |||||
/** | |||||
* Sets the set of exclude patterns. Patterns may be separated by a comma | |||||
* or a space. | |||||
* | |||||
* @param excludes the string containing the exclude patterns | |||||
*/ | |||||
public void setExcludes(String excludes) throws ExecutionException { | |||||
if (isReference()) { | |||||
throw tooManyAttributes(); | |||||
} | |||||
defaultPatterns.setExcludes(excludes); | |||||
} | |||||
/** | |||||
* Sets the name of the file containing the includes patterns. | |||||
* | |||||
* @param incl The file to fetch the include patterns from. | |||||
*/ | |||||
public void setIncludesFile(URL incl) throws ExecutionException { | |||||
if (isReference()) { | |||||
throw tooManyAttributes(); | |||||
} | |||||
defaultPatterns.setIncludesFile(incl); | |||||
} | |||||
/** | |||||
* Sets the name of the file containing the includes patterns. | |||||
* | |||||
* @param excl The file to fetch the exclude patterns from. | |||||
*/ | |||||
public void setExcludesFile(URL excl) throws ExecutionException { | |||||
if (isReference()) { | |||||
throw tooManyAttributes(); | |||||
} | |||||
defaultPatterns.setExcludesFile(excl); | |||||
} | |||||
/** | |||||
* Sets whether default exclusions should be used or not. | |||||
* | |||||
* @param useDefaultExcludes "true"|"on"|"yes" when default exclusions | |||||
* should be used, "false"|"off"|"no" when they | |||||
* shouldn't be used. | |||||
*/ | |||||
public void setDefaultExcludes(boolean useDefaultExcludes) throws ExecutionException { | |||||
if (isReference()) { | |||||
throw tooManyAttributes(); | |||||
} | |||||
this.useDefaultExcludes = useDefaultExcludes; | |||||
} | |||||
protected FileSet getReferencedFileSet() throws ExecutionException { | |||||
Object o = getReferencedObject(); | |||||
if (!(o instanceof FileSet)) { | |||||
throw new ExecutionException(getReference() + " doesn\'t denote a fileset");; | |||||
} else { | |||||
return (FileSet) o; | |||||
} | |||||
} | |||||
public void validate() throws ExecutionException { | |||||
if (dir != null) { | |||||
// firstly validate that the other attributes are not set | |||||
if (zipFile != null || fileList != null || fileListBase != null) { | |||||
throw new ExecutionException("The 'dir' attribute may not be combined with any " | |||||
+ "of the 'zipfile', 'filelist' and 'base' attributes"); | |||||
} | |||||
} | |||||
else if (zipFile != null) { | |||||
if (fileList != null || fileListBase != null) { | |||||
throw new ExecutionException("The 'zipfile' attribute may not be combined with any " | |||||
+ "of the 'dir', 'filelist' and 'base' attributes"); | |||||
} | |||||
} | |||||
else if (fileList != null) { | |||||
if (fileListBase == null) { | |||||
throw new ExecutionException("A 'base' attribute is required when using the 'filelist' " | |||||
+ "attribute"); | |||||
} | |||||
} | |||||
else { | |||||
throw new ExecutionException("You must specify one of the 'dir', 'zipfile', or 'filelist' " | |||||
+ "attributes"); | |||||
} | |||||
} | |||||
public FileSetScanner getScanner() throws ExecutionException { | |||||
if (isReference()) { | |||||
return getReferencedFileSet().getScanner(); | |||||
} | |||||
if (scanner != null) { | |||||
return scanner; | |||||
} | |||||
// need to create the fileset info. For that we are going to need | |||||
// to determine which type of FileSetInfo implementation we should use. | |||||
if (dir != null) { | |||||
scanner = new DirectoryScanner(dir, patternSets, useDefaultExcludes); | |||||
} | |||||
else if (zipFile != null) { | |||||
} | |||||
else if (fileList != null) { | |||||
} | |||||
else { | |||||
} | |||||
return scanner; | |||||
} | |||||
public String toString() { | |||||
try { | |||||
return getScanner().toString(); | |||||
} | |||||
catch (ExecutionException e) { | |||||
return "FileSet"; | |||||
} | |||||
} | |||||
} |
@@ -1,115 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2000 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.core.types; | |||||
import java.io.*; | |||||
import java.net.URL; | |||||
import org.apache.ant.core.execution.*; | |||||
/** | |||||
* The FileSetInfo interface defines the result of applying filtering to | |||||
* some base collection of files. Filtering involves both file exclusion | |||||
* and file name mapping. | |||||
* | |||||
* FileSetInfo should be lazily evaluated to allow them to be defined before the | |||||
* required files have been created. They should be evaluated at first use. | |||||
*/ | |||||
public interface FileSetScanner { | |||||
/** | |||||
* Get the included files after their file names have been mapped | |||||
* | |||||
* @return an array of strings, each one is the mapped name of a file. | |||||
*/ | |||||
String[] getIncludedFiles() throws ExecutionException ; | |||||
// | |||||
// /** | |||||
// * Get directories included after their file names have been mapped | |||||
// * | |||||
// * @return an array of strings, each one is the mapped name of a file. | |||||
// */ | |||||
// String[] getIncludedDirectories(); | |||||
// | |||||
// /** | |||||
// * Get a file for the content of the named included file. If the content | |||||
// * is not stored in the local filesystem, a temporary file is created with the content. | |||||
// * Callers should not rely on this file representing the actual location of the underlying | |||||
// * data. | |||||
// */ | |||||
// File getContentFile(String mappedName); | |||||
// | |||||
// /** | |||||
// * Get a URL for the content. The content may be cached on the local system and thus | |||||
// * callers should not rely on the location | |||||
// * | |||||
// */ | |||||
// URL getContentURL(String mappedName); | |||||
// | |||||
// /** | |||||
// * Get an input stream to the content of the named entry of the fileset. | |||||
// */ | |||||
// InputStream getInputStream(String mappedName); | |||||
// | |||||
/** | |||||
* Get a local file. | |||||
* | |||||
* This method returns a file pointing to the actual local filesystem file from | |||||
* which the file content comes. If the file does not exist locally, a null is | |||||
* returned. Note that due to name mapping, the actual file name may be different | |||||
* from the mapped name. | |||||
* | |||||
* @return a file representing the mapped file in the local filesystem. | |||||
*/ | |||||
File getLocalFile(String mappedName) throws ExecutionException ; | |||||
} |
@@ -1,373 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2000 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.core.types; | |||||
import java.io.*; | |||||
import java.util.*; | |||||
import org.apache.ant.core.execution.*; | |||||
import java.net.URL; | |||||
/** | |||||
* Named collection of include/exclude tags. | |||||
* | |||||
* @author Arnout J. Kuiper <a href="mailto:ajkuiper@wxs.nl">ajkuiper@wxs.nl</a> | |||||
* @author Stefano Mazzocchi <a href="mailto:stefano@apache.org">stefano@apache.org</a> | |||||
* @author Sam Ruby <a href="mailto:rubys@us.ibm.com">rubys@us.ibm.com</a> | |||||
* @author Jon S. Stevens <a href="mailto:jon@clearink.com">jon@clearink.com</a> | |||||
* @author <a href="mailto:stefan.bodewig@megabit.net">Stefan Bodewig</a> | |||||
*/ | |||||
public class PatternSet extends DataType { | |||||
private boolean filesRead = false; | |||||
private List includeList = new ArrayList(); | |||||
private List excludeList = new ArrayList(); | |||||
private URL includeFile = null; | |||||
private URL excludeFile = null; | |||||
/** | |||||
* inner class to hold a name on list. "If" and "Unless" attributes | |||||
* may be used to invalidate the entry based on the existence of a | |||||
* property (typically set thru the use of the Available task). | |||||
*/ | |||||
public class NameEntry { | |||||
private String name; | |||||
// private String ifCond; | |||||
// private String unlessCond; | |||||
public void setName(String name) { | |||||
this.name = name; | |||||
} | |||||
// public void setIf(String cond) { | |||||
// ifCond = cond; | |||||
// } | |||||
// | |||||
// public void setUnless(String cond) { | |||||
// unlessCond = cond; | |||||
// } | |||||
// | |||||
public String getName() { | |||||
return name; | |||||
} | |||||
// public String evalName(Project p) { | |||||
// return valid(p) ? name : null; | |||||
// } | |||||
// private boolean valid(Project p) { | |||||
// if (ifCond != null && p.getProperty(ifCond) == null) { | |||||
// return false; | |||||
// } else if (unlessCond != null && p.getProperty(unlessCond) != null) { | |||||
// return false; | |||||
// } | |||||
// return true; | |||||
// } | |||||
} | |||||
/** | |||||
* Makes this instance in effect a reference to another PatternSet | |||||
* instance. | |||||
* | |||||
* <p>You must not set another attribute or nest elements inside | |||||
* this element if you make it a reference.</p> | |||||
*/ | |||||
public void setRefid(String reference) throws ExecutionException { | |||||
if (!includeList.isEmpty() || !excludeList.isEmpty()) { | |||||
throw tooManyAttributes(); | |||||
} | |||||
super.setRefid(reference); | |||||
} | |||||
/** | |||||
* add a name entry on the include list | |||||
*/ | |||||
public NameEntry createInclude() throws ExecutionException { | |||||
if (isReference()) { | |||||
throw noChildrenAllowed(); | |||||
} | |||||
return addPatternToList(includeList); | |||||
} | |||||
/** | |||||
* add a name entry on the exclude list | |||||
*/ | |||||
public NameEntry createExclude() throws ExecutionException { | |||||
if (isReference()) { | |||||
throw noChildrenAllowed(); | |||||
} | |||||
return addPatternToList(excludeList); | |||||
} | |||||
/** | |||||
* Sets the set of include patterns. Patterns may be separated by a comma | |||||
* or a space. | |||||
* | |||||
* @param includes the string containing the include patterns | |||||
*/ | |||||
public void setIncludes(String includes) throws ExecutionException { | |||||
if (isReference()) { | |||||
throw tooManyAttributes(); | |||||
} | |||||
if (includes != null && includes.length() > 0) { | |||||
StringTokenizer tok = new StringTokenizer(includes, ", ", false); | |||||
while (tok.hasMoreTokens()) { | |||||
createInclude().setName(tok.nextToken()); | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* Sets the set of exclude patterns. Patterns may be separated by a comma | |||||
* or a space. | |||||
* | |||||
* @param excludes the string containing the exclude patterns | |||||
*/ | |||||
public void setExcludes(String excludes) throws ExecutionException { | |||||
if (isReference()) { | |||||
throw tooManyAttributes(); | |||||
} | |||||
if (excludes != null && excludes.length() > 0) { | |||||
StringTokenizer tok = new StringTokenizer(excludes, ", ", false); | |||||
while (tok.hasMoreTokens()) { | |||||
createExclude().setName(tok.nextToken()); | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* add a name entry to the given list | |||||
*/ | |||||
private NameEntry addPatternToList(List list) { | |||||
NameEntry result = new NameEntry(); | |||||
list.add(result); | |||||
return result; | |||||
} | |||||
/** | |||||
* Sets the name of the file containing the includes patterns. | |||||
* | |||||
* @param incl The file to fetch the include patterns from. | |||||
*/ | |||||
public void setIncludesFile(URL includeFile) throws ExecutionException { | |||||
if (isReference()) { | |||||
throw tooManyAttributes(); | |||||
} | |||||
// if (!incl.exists()) { | |||||
// throw new BuildException("Includesfile "+incl.getAbsolutePath() | |||||
// +" not found."); | |||||
// } | |||||
this.includeFile = includeFile; | |||||
} | |||||
/** | |||||
* Sets the name of the file containing the excludes patterns. | |||||
* | |||||
* @param excludeFile The file to fetch the exclude patterns from. | |||||
*/ | |||||
public void setExcludesFile(URL excludeFile) throws ExecutionException { | |||||
if (isReference()) { | |||||
throw tooManyAttributes(); | |||||
} | |||||
// if (!excl.exists()) { | |||||
// throw new BuildException("Excludesfile "+excl.getAbsolutePath() | |||||
// +" not found."); | |||||
// } | |||||
this.excludeFile = excludeFile; | |||||
} | |||||
/** | |||||
* Reads path matching patterns from a file and adds them to the | |||||
* includes or excludes list (as appropriate). | |||||
*/ | |||||
private void readPatterns(URL patternFile, List patternList) | |||||
throws ExecutionException { | |||||
BufferedReader patternReader = null; | |||||
try { | |||||
// Get a FileReader | |||||
patternReader = | |||||
new BufferedReader(new InputStreamReader(patternFile.openStream())); | |||||
// Create one NameEntry in the appropriate pattern list for each | |||||
// line in the file. | |||||
String line = null; | |||||
while ((line = patternReader.readLine()) != null) { | |||||
if (line.length() > 0) { | |||||
line = getTaskContext().replacePropertyRefs(line); | |||||
addPatternToList(patternList).setName(line); | |||||
} | |||||
} | |||||
} catch(IOException ioe) { | |||||
throw new ExecutionException("An error occured while reading from pattern file: " | |||||
+ patternFile, ioe); | |||||
} | |||||
finally { | |||||
if (patternReader != null) { | |||||
try { | |||||
patternReader.close(); | |||||
} | |||||
catch (IOException e) { | |||||
// do nothing | |||||
} | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* Adds the patterns of the other instance to this set. | |||||
*/ | |||||
public void append(PatternSet other) throws ExecutionException { | |||||
if (isReference()) { | |||||
throw new ExecutionException("Cannot append to a reference"); | |||||
} | |||||
String[] incl = other.getIncludePatterns(); | |||||
if (incl != null) { | |||||
for (int i=0; i<incl.length; i++) { | |||||
createInclude().setName(incl[i]); | |||||
} | |||||
} | |||||
String[] excl = other.getExcludePatterns(); | |||||
if (excl != null) { | |||||
for (int i=0; i<excl.length; i++) { | |||||
createExclude().setName(excl[i]); | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* Returns the filtered include patterns. | |||||
*/ | |||||
public String[] getIncludePatterns() throws ExecutionException { | |||||
if (isReference()) { | |||||
return getReferencedPatternSet().getIncludePatterns(); | |||||
} else { | |||||
readFiles(); | |||||
return makeArray(includeList); | |||||
} | |||||
} | |||||
/** | |||||
* Returns the filtered include patterns. | |||||
*/ | |||||
public String[] getExcludePatterns() throws ExecutionException { | |||||
if (isReference()) { | |||||
return getReferencedPatternSet().getExcludePatterns(); | |||||
} else { | |||||
readFiles(); | |||||
return makeArray(excludeList); | |||||
} | |||||
} | |||||
/** | |||||
* helper for FileSet. | |||||
*/ | |||||
boolean hasPatterns() { | |||||
return includeFile != null || excludeFile != null | |||||
|| includeList.size() > 0 || excludeList.size() > 0; | |||||
} | |||||
/** | |||||
* Performs the check for circular references and returns the | |||||
* referenced PatternSet. | |||||
*/ | |||||
private PatternSet getReferencedPatternSet() throws ExecutionException { | |||||
Object o = getReferencedObject(); | |||||
if (!(o instanceof PatternSet)) { | |||||
throw new ExecutionException(getReference() + " doesn\'t denote a patternset");; | |||||
} else { | |||||
return (PatternSet) o; | |||||
} | |||||
} | |||||
/** | |||||
* Convert a list of NameEntry elements into an array of Strings. | |||||
*/ | |||||
private String[] makeArray(List list) { | |||||
if (list.size() == 0) { | |||||
return null; | |||||
} | |||||
List tmpNames = new Vector(); | |||||
for (Iterator i = list.iterator() ; i.hasNext() ;) { | |||||
NameEntry ne = (NameEntry)i.next(); | |||||
String pattern = ne.getName(); | |||||
if (pattern != null && pattern.length() > 0) { | |||||
tmpNames.add(pattern); | |||||
} | |||||
} | |||||
String[] result = (String[])tmpNames.toArray(new String[0]); | |||||
return result; | |||||
} | |||||
/** | |||||
* Read includefile ot excludefile if not already done so. | |||||
*/ | |||||
private void readFiles() throws ExecutionException { | |||||
if (!filesRead) { | |||||
filesRead = true; | |||||
if (includeFile != null) { | |||||
readPatterns(includeFile, includeList); | |||||
} | |||||
if (excludeFile != null) { | |||||
readPatterns(excludeFile, excludeList); | |||||
} | |||||
} | |||||
} | |||||
} |
@@ -1,285 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.core.xml; | |||||
import java.io.*; | |||||
import java.net.MalformedURLException; | |||||
import java.net.URL; | |||||
import java.util.*; | |||||
import javax.xml.parsers.*; | |||||
import org.apache.ant.core.support.*; | |||||
import org.apache.ant.core.execution.*; | |||||
import org.xml.sax.*; | |||||
import org.xml.sax.helpers.DefaultHandler; | |||||
/** | |||||
* Parses the TASK-INF/antlib.xml file of an ant library | |||||
* component. An Ant library may contains tasks, apsects and | |||||
* other ant plug in components | |||||
*/ | |||||
public class AntLibParser { | |||||
public static final String TASK_ELEMENT = "taskdef"; | |||||
public static final String CONVERTER_ELEMENT = "converter"; | |||||
public static final String ASPECT_ELEMENT = "aspect"; | |||||
/** | |||||
* The factory used to create SAX parsers. | |||||
*/ | |||||
private SAXParserFactory parserFactory; | |||||
/** | |||||
* Parse the library definition | |||||
* | |||||
* @param libSource the URL from where the library XML is read. | |||||
* | |||||
* @throws SAXParseException if there is a problem parsing the task definitions | |||||
*/ | |||||
public AntLibrary parseAntLibrary(URL libSource, ClassLoader componentLoader) | |||||
throws ConfigException { | |||||
try { | |||||
parserFactory = SAXParserFactory.newInstance(); | |||||
SAXParser saxParser = parserFactory.newSAXParser(); | |||||
XMLReader xmlReader = saxParser.getXMLReader(); | |||||
AntLibRootHandler rootHandler = new AntLibRootHandler(libSource, xmlReader, componentLoader); | |||||
saxParser.parse(libSource.toString(), rootHandler); | |||||
return rootHandler.getAntLibrary(); | |||||
} | |||||
catch (SAXParseException e) { | |||||
throw new ConfigException(e.getMessage(), e, | |||||
new Location(libSource.toString(), | |||||
e.getLineNumber(), e.getColumnNumber())); | |||||
} | |||||
catch (ParserConfigurationException e) { | |||||
throw new ConfigException("Unable to parse Ant library component", e, | |||||
new Location(libSource.toString())); | |||||
} | |||||
catch (SAXException e) { | |||||
throw new ConfigException("Unable to parse Ant library component", e, | |||||
new Location(libSource.toString())); | |||||
} | |||||
catch (IOException e) { | |||||
throw new ConfigException("Unable to parse Ant library component", e, | |||||
new Location(libSource.toString())); | |||||
} | |||||
} | |||||
/** | |||||
* The root handler handles the antlib element. An ant lib may | |||||
* contain a number of different types of elements | |||||
* <ul> | |||||
* <li>taskdef</li> | |||||
* <li>aspect</li> | |||||
* <li>converter</li> | |||||
* </ul> | |||||
*/ | |||||
private class AntLibRootHandler extends RootHandler { | |||||
static private final int STATE_LOOKING_FOR_ROOT = 1; | |||||
static private final int STATE_ROOT_SEEN = 2; | |||||
static private final int STATE_FINISHED = 3; | |||||
private int state = STATE_LOOKING_FOR_ROOT; | |||||
/** | |||||
* The AntLibrary that will be defined by parsing the library's definition | |||||
* file. | |||||
*/ | |||||
private AntLibrary library = null; | |||||
private ClassLoader componentLoader = null; | |||||
/** | |||||
* Create an Ant Library Root Handler. | |||||
* | |||||
* @param taskdefSource the URL from where the task definitions exist | |||||
* @param reader the XML parser. | |||||
*/ | |||||
public AntLibRootHandler(URL taskdefSource, XMLReader reader, ClassLoader componentLoader) { | |||||
super(taskdefSource, reader); | |||||
this.componentLoader = componentLoader; | |||||
} | |||||
/** | |||||
* Get the library which has been parsed. | |||||
* | |||||
* @return an AntLibary with the library definitions | |||||
*/ | |||||
public AntLibrary getAntLibrary() { | |||||
return library; | |||||
} | |||||
/** | |||||
* Start a new element in the root. This must be a taskdefs 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 { | |||||
switch (state) { | |||||
case STATE_LOOKING_FOR_ROOT: | |||||
if (qualifiedName.equals("antlib")) { | |||||
state = STATE_ROOT_SEEN; | |||||
library = new AntLibrary(); | |||||
} | |||||
else { | |||||
throw new SAXParseException("An Ant library component must start with an " + | |||||
"<antlib> element and not with <" + | |||||
qualifiedName + ">", getLocator()); | |||||
} | |||||
break; | |||||
case STATE_ROOT_SEEN: | |||||
if (qualifiedName.equals(TASK_ELEMENT)) { | |||||
createTaskDef(attributes); | |||||
} | |||||
else if (qualifiedName.equals(CONVERTER_ELEMENT)) { | |||||
createConverterDef(attributes); | |||||
} | |||||
else if (qualifiedName.equals(ASPECT_ELEMENT)) { | |||||
createAspectHandler(attributes); | |||||
} | |||||
else { | |||||
throw new SAXParseException("Unrecognized element <" + | |||||
qualifiedName + "> in Ant library definition", getLocator()); | |||||
} | |||||
break; | |||||
} | |||||
} | |||||
public void createTaskDef(Attributes attributes) throws SAXParseException { | |||||
Set validAttributes = new HashSet(); | |||||
validAttributes.add("name"); | |||||
validAttributes.add("classname"); | |||||
Map attributeValues | |||||
= AttributeValidator.validateAttributes(TASK_ELEMENT, attributes, | |||||
validAttributes, getLocator()); | |||||
String taskName = (String)attributeValues.get("name"); | |||||
String className = (String)attributeValues.get("classname"); | |||||
if (taskName == null) { | |||||
throw new SAXParseException("'name' attribute is required in a <" | |||||
+ TASK_ELEMENT + "> element", | |||||
getLocator()); | |||||
} | |||||
if (className == null) { | |||||
throw new SAXParseException("'classname' attribute is required in a " + | |||||
"<" + TASK_ELEMENT + "> element", getLocator()); | |||||
} | |||||
TaskDefinition taskdef = new TaskDefinition(getSourceURL(), taskName, className, componentLoader); | |||||
library.addTaskDefinition(taskdef); | |||||
} | |||||
public void createConverterDef(Attributes attributes) throws SAXParseException { | |||||
Set validAttributes = new HashSet(); | |||||
validAttributes.add("target"); | |||||
validAttributes.add("classname"); | |||||
Map attributeValues | |||||
= AttributeValidator.validateAttributes(CONVERTER_ELEMENT, attributes, | |||||
validAttributes, getLocator()); | |||||
String targetClassName = (String)attributeValues.get("target"); | |||||
String className = (String)attributeValues.get("classname"); | |||||
if (targetClassName == null) { | |||||
throw new SAXParseException("'target' attribute is required in a <" | |||||
+ CONVERTER_ELEMENT + "> element", | |||||
getLocator()); | |||||
} | |||||
if (className == null) { | |||||
throw new SAXParseException("'classname' attribute is required in a " + | |||||
"<" + CONVERTER_ELEMENT + "> element", getLocator()); | |||||
} | |||||
ConverterDefinition converterDef | |||||
= new ConverterDefinition(getSourceURL(), className, targetClassName, componentLoader); | |||||
library.addConverterDefinition(converterDef); | |||||
} | |||||
public void createAspectHandler(Attributes attributes) throws SAXParseException { | |||||
Set validAttributes = new HashSet(); | |||||
validAttributes.add("prefix"); | |||||
validAttributes.add("classname"); | |||||
Map attributeValues | |||||
= AttributeValidator.validateAttributes(ASPECT_ELEMENT, attributes, | |||||
validAttributes, getLocator()); | |||||
String aspectPrefix = (String)attributeValues.get("prefix"); | |||||
String aspectClassname = (String)attributeValues.get("classname"); | |||||
if (aspectPrefix == null) { | |||||
throw new SAXParseException("'prefix' attribute is required in a <" | |||||
+ ASPECT_ELEMENT + "> element", | |||||
getLocator()); | |||||
} | |||||
if (aspectClassname == null) { | |||||
throw new SAXParseException("'classname' attribute is required in a " + | |||||
"<" + ASPECT_ELEMENT + "> element", getLocator()); | |||||
} | |||||
AspectDefinition aspectDef | |||||
= new AspectDefinition(getSourceURL(), aspectPrefix, aspectClassname, componentLoader); | |||||
library.addAspectDefinition(aspectDef); | |||||
} | |||||
public void endElement(String namespaceURI, String localName, String qName) { | |||||
if (state == STATE_ROOT_SEEN && qName.equals("antlib")) { | |||||
state = STATE_FINISHED; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
@@ -1,112 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.core.xml; | |||||
import org.xml.sax.helpers.DefaultHandler; | |||||
import org.xml.sax.*; | |||||
import java.util.*; | |||||
/** | |||||
* Validates and extracts attribute values from a set of element attributes. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public abstract class AttributeValidator { | |||||
static public Map validateAttributes(String elementName, Attributes attributes, | |||||
Set validAttributes, Locator locator) | |||||
throws SAXParseException { | |||||
return validateAttributes(elementName, attributes, null, validAttributes, locator); | |||||
} | |||||
static public Map validateAttributes(String elementName, Attributes attributes, Map aspects, | |||||
Set validAttributes, Locator locator) | |||||
throws SAXParseException { | |||||
Map attributeValues = new HashMap(); | |||||
Set invalidAttributes = new HashSet(); | |||||
for (int i = 0; i < attributes.getLength(); ++i) { | |||||
String attributeName = attributes.getQName(i); | |||||
String attributeValue = attributes.getValue(i); | |||||
if (validAttributes.contains(attributeName)) { | |||||
attributeValues.put(attributeName, attributeValue); | |||||
} | |||||
else if (aspects != null && attributeName.indexOf(":") != -1) { | |||||
aspects.put(attributeName, attributeValue); | |||||
} | |||||
else { | |||||
invalidAttributes.add(attributeName); | |||||
} | |||||
} | |||||
if (invalidAttributes.size() != 0) { | |||||
StringBuffer message = new StringBuffer(); | |||||
boolean justOne = invalidAttributes.size() == 1; | |||||
message.append(justOne ? "The attribute " : "The attributes "); | |||||
for (Iterator i = invalidAttributes.iterator(); i.hasNext();) { | |||||
String attributeName = (String)i.next(); | |||||
message.append(attributeName + " "); | |||||
} | |||||
message.append(justOne ? "is " : "are "); | |||||
message.append("not valid for the <" + elementName + "> element."); | |||||
throw new SAXParseException(message.toString(), locator); | |||||
} | |||||
return attributeValues; | |||||
} | |||||
} |
@@ -1,109 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.core.xml; | |||||
import org.xml.sax.helpers.DefaultHandler; | |||||
import org.xml.sax.*; | |||||
/** | |||||
* 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. | |||||
*/ | |||||
public abstract class ElementHandler extends DefaultHandler { | |||||
private XMLReader reader; | |||||
private ContentHandler parent; | |||||
private Locator locator; | |||||
public ElementHandler(XMLReader reader, ContentHandler parent, | |||||
Locator locator) { | |||||
this.reader = reader; | |||||
this.parent = parent; | |||||
this.locator = locator; | |||||
reader.setContentHandler(this); | |||||
} | |||||
/** | |||||
* This element is finished - complete any necessary processing. | |||||
*/ | |||||
protected void finish() { | |||||
} | |||||
/** | |||||
* Get the XML Reader being used to parse the XML. | |||||
* | |||||
* @return the XML Reader. | |||||
*/ | |||||
protected XMLReader getXMLReader() { | |||||
return reader; | |||||
} | |||||
/** | |||||
* 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; | |||||
} | |||||
public void endElement(String namespaceURI, String localName, String qName) { | |||||
finish(); | |||||
reader.setContentHandler(parent); | |||||
} | |||||
} |
@@ -1,131 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.core.xml; | |||||
import org.xml.sax.helpers.DefaultHandler; | |||||
import org.xml.sax.*; | |||||
import java.net.URL; | |||||
/** | |||||
* Handle the root of a XML parse | |||||
*/ | |||||
public abstract class RootHandler extends DefaultHandler { | |||||
/** | |||||
* 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; | |||||
/** | |||||
* Create a Root Handler. | |||||
* | |||||
* @param sourceURL the URL containing the XML source | |||||
* @param reader the XML parser. | |||||
*/ | |||||
public RootHandler(URL sourceURL, XMLReader reader) { | |||||
this.sourceURL = sourceURL; | |||||
this.reader = reader; | |||||
} | |||||
/** | |||||
* 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; | |||||
} | |||||
/** | |||||
* Get the XML Reader being used to parse the XML. | |||||
* | |||||
* @return the XML Reader. | |||||
*/ | |||||
protected XMLReader getXMLReader() { | |||||
return reader; | |||||
} | |||||
/** | |||||
* 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; | |||||
} | |||||
/** | |||||
* Get the source URL | |||||
* | |||||
* @return a URL identifiying from where the XML is being read. | |||||
*/ | |||||
public URL getSourceURL() { | |||||
return sourceURL; | |||||
} | |||||
} | |||||
@@ -1,831 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.core.xml; | |||||
import java.io.*; | |||||
import java.net.MalformedURLException; | |||||
import java.net.URL; | |||||
import java.util.*; | |||||
import javax.xml.parsers.*; | |||||
import org.apache.ant.core.model.*; | |||||
import org.apache.ant.core.support.*; | |||||
import org.xml.sax.*; | |||||
import org.xml.sax.helpers.DefaultHandler; | |||||
/** | |||||
* Parses a project from an XML source using a SAX Parser. | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public class XMLProjectParser { | |||||
private Stack recursionCheck = new Stack(); | |||||
/** | |||||
* The factory used to create SAX parsers. | |||||
*/ | |||||
private SAXParserFactory parserFactory; | |||||
static private Location getLocation(Locator locator) { | |||||
return new Location(locator.getSystemId(), locator.getLineNumber(), | |||||
locator.getColumnNumber()); | |||||
} | |||||
/** | |||||
* Parse a build file form the given URL. | |||||
* | |||||
* @param buildSource the URL from where the build source may be read. | |||||
* | |||||
* @throws SAXParseException if there is a problem parsing the build file. | |||||
*/ | |||||
public Project parseBuildFile(URL buildSource) | |||||
throws ConfigException { | |||||
try { | |||||
parserFactory = SAXParserFactory.newInstance(); | |||||
SAXParser saxParser = parserFactory.newSAXParser(); | |||||
XMLReader xmlReader = saxParser.getXMLReader(); | |||||
recursionCheck.push(buildSource); | |||||
ProjectRootHandler projectRootHandler | |||||
= new ProjectRootHandler(buildSource, xmlReader); | |||||
saxParser.parse(buildSource.toString(), projectRootHandler); | |||||
return projectRootHandler.getProject(); | |||||
} | |||||
catch (SAXParseException e) { | |||||
throw new ConfigException(e.getMessage(), e, | |||||
new Location(buildSource.toString(), | |||||
e.getLineNumber(), e.getColumnNumber())); | |||||
} | |||||
catch (NoProjectReadException e) { | |||||
throw new ConfigException("No project defined in build source", e, | |||||
new Location(buildSource.toString())); | |||||
} | |||||
catch (ParserConfigurationException e) { | |||||
throw new ConfigException("Unable to parse project: " + e.getMessage(), e, | |||||
new Location(buildSource.toString())); | |||||
} | |||||
catch (SAXException e) { | |||||
throw new ConfigException("Unable to parse project: " + e.getMessage(), e, | |||||
new Location(buildSource.toString())); | |||||
} | |||||
catch (IOException e) { | |||||
throw new ConfigException("Unable to parse project: " + e.getMessage(), e, | |||||
new Location(buildSource.toString())); | |||||
} | |||||
} | |||||
/** | |||||
* The root handler handles the start of parsing. This element looks for the | |||||
* root element which must be a project element. It then delegates handling of the | |||||
* project element to a project handler from which it extracts the parsed project. | |||||
*/ | |||||
private class ProjectRootHandler extends RootHandler { | |||||
/** | |||||
* The project handler created to parse the project element. | |||||
*/ | |||||
ProjectHandler projectHandler; | |||||
/** | |||||
* Create a Root Handler. | |||||
* | |||||
* @param buildSource the URL containing the build definition | |||||
* @param reader the XML parser. | |||||
*/ | |||||
public ProjectRootHandler(URL buildSource, XMLReader reader) { | |||||
super(buildSource, reader); | |||||
} | |||||
/** | |||||
* 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 { | |||||
if (qualifiedName.equals("project")) { | |||||
projectHandler = new ProjectHandler(getXMLReader(), this, | |||||
getLocator(), attributes, getSourceURL()); | |||||
} else { | |||||
throw new SAXParseException("Build file should start with a <project> element not <" + | |||||
qualifiedName + ">", getLocator()); | |||||
} | |||||
} | |||||
/** | |||||
* Get the project that has been parsed from the element | |||||
* | |||||
* @return the project that has been parsed from the build osurce | |||||
* | |||||
* @throws NoProjectReadException thrown if no project was read in. | |||||
*/ | |||||
public Project getProject() throws NoProjectReadException { | |||||
if (projectHandler == null) { | |||||
throw new NoProjectReadException(); | |||||
} | |||||
return projectHandler.getProject(); | |||||
} | |||||
} | |||||
/** | |||||
* Root Handler for include elements. | |||||
* | |||||
* Includes must contain either a project (which is being extended) or | |||||
* a fragment element which contains the fragment to be included. | |||||
*/ | |||||
private class IncludeRootHandler extends RootHandler { | |||||
/** | |||||
* The project into which the fragment is to be included. | |||||
*/ | |||||
private Project project; | |||||
/** | |||||
* Create an Include Root Handler. | |||||
* | |||||
* @param buildSource the URL containing the fragment definition | |||||
* @param reader the XML parser. | |||||
* @param project the project into which the fragment's elements will be included. | |||||
*/ | |||||
public IncludeRootHandler(URL buildSource, XMLReader reader, Project project) { | |||||
super(buildSource, reader); | |||||
this.project = project; | |||||
} | |||||
/** | |||||
* Start a new element in the include root. This must be a project element | |||||
* or a fragment 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 { | |||||
if (qualifiedName.equals("project") || | |||||
qualifiedName.equals("fragment")) { | |||||
// if it is a fragment, it must have no attributes | |||||
// any project attributes are ignored | |||||
if (qualifiedName.equals("fragment") && attributes.getLength() != 0) { | |||||
throw new SAXParseException("<fragment> element may not have any attributes", | |||||
getLocator()); | |||||
} | |||||
new ProjectHandler(getXMLReader(), this, getLocator(), | |||||
getSourceURL(), project); | |||||
} else { | |||||
throw new SAXParseException("An included file should contain either a " + | |||||
"<project> or <fragment> element and not a <" + | |||||
qualifiedName + "> element", getLocator()); | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* Element to parse the project element. | |||||
* | |||||
* The project handler creates a number of different handlers to which it | |||||
* delegates processing of child elements. | |||||
*/ | |||||
private class ProjectHandler extends ElementHandler { | |||||
/** | |||||
* The project being parsed. | |||||
*/ | |||||
private Project project; | |||||
/** | |||||
* The sourceURL for the current content being added to the project. | |||||
*/ | |||||
private URL sourceURL; | |||||
/** | |||||
* Create a ProjectHandler to read in a complete project. | |||||
* | |||||
* @param xmlReader the XML parser being used to parse the project element. | |||||
* @param parent the parent element handler. | |||||
* @param locator the SAX locator object used to associate elements with source | |||||
* locations. | |||||
* @param attributes the project element's attributes. | |||||
* @param projectSource the URL from which the XML source is being parsed. | |||||
*/ | |||||
public ProjectHandler(XMLReader xmlReader, ContentHandler parent, | |||||
Locator locator, Attributes attributes, URL projectSource) | |||||
throws SAXParseException { | |||||
super(xmlReader, parent, locator); | |||||
this.sourceURL = projectSource; | |||||
project = new Project(projectSource, getLocation(locator)); | |||||
String base = null; | |||||
String defaultTarget = null; | |||||
String projectName = null; | |||||
Map aspects = new HashMap(); | |||||
for (int i = 0; i < attributes.getLength(); ++i) { | |||||
String attributeName = attributes.getQName(i); | |||||
String attributeValue = attributes.getValue(i); | |||||
if (attributeName.equals("base")) { | |||||
base = attributeValue; | |||||
} | |||||
else if (attributeName.equals("default")) { | |||||
defaultTarget = attributeValue; | |||||
} | |||||
else if (attributeName.equals("name")) { | |||||
projectName = attributeValue; | |||||
} | |||||
else if (attributeName.indexOf(":") != -1) { | |||||
// potential aspect attribute | |||||
aspects.put(attributeName, attributeValue); | |||||
} | |||||
else { | |||||
throw new SAXParseException("The attribute '" + attributeName + "' is not " + | |||||
"supported by the <project> element", getLocator()); | |||||
} | |||||
} | |||||
project.setDefaultTarget(defaultTarget); | |||||
project.setBase(base); | |||||
project.setName(projectName); | |||||
project.setAspects(aspects); | |||||
} | |||||
/** | |||||
* Create a Project handler for an included fragment. The elements | |||||
* from the fragment are added to the given project. | |||||
* | |||||
* @param xmlReader the XML parser being used to parse the project element. | |||||
* @param parent the parent element handler. | |||||
* @param locator the SAX locator object used to associate elements with source | |||||
* locations. | |||||
* @param includeSource the URL from which the XML source is being included. | |||||
* @param project the project to which the included fragments elements are added. | |||||
*/ | |||||
public ProjectHandler(XMLReader xmlReader, ContentHandler parent, | |||||
Locator locator, URL includeSource, Project project) { | |||||
super(xmlReader, parent, locator); | |||||
this.sourceURL = includeSource; | |||||
this.project = project; | |||||
} | |||||
/** | |||||
* Start a new element in the project. Project currently handle the | |||||
* following elements | |||||
* <ul> | |||||
* <li>import</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("import")) { | |||||
ImportHandler importHandler | |||||
= new ImportHandler(getXMLReader(), this, getLocator(), | |||||
attributes, sourceURL); | |||||
try { | |||||
project.importProject(importHandler.getImportName(), | |||||
importHandler.getImportedProject()); | |||||
} | |||||
catch (ProjectModelException e) { | |||||
throw new SAXParseException(e.getMessage(), getLocator(), e); | |||||
} | |||||
} | |||||
else if (qualifiedName.equals("include")) { | |||||
IncludeHandler includeHandler | |||||
= new IncludeHandler(getXMLReader(), this, getLocator(), | |||||
attributes, sourceURL, project); | |||||
} | |||||
else if (qualifiedName.equals("target")) { | |||||
TargetHandler targetHandler | |||||
= new TargetHandler(getXMLReader(), this, getLocator(), attributes); | |||||
try { | |||||
project.addTarget(targetHandler.getTarget()); | |||||
} | |||||
catch (ProjectModelException e) { | |||||
throw new SAXParseException(e.getMessage(), getLocator(), e); | |||||
} | |||||
} | |||||
else { | |||||
// everything else is a task | |||||
TaskElementHandler taskElementHandler | |||||
= new TaskElementHandler(getXMLReader(), this, getLocator(), | |||||
attributes, qualifiedName); | |||||
project.addTask(taskElementHandler.getTaskElement()); | |||||
} | |||||
} | |||||
/** | |||||
* Get the project that has been parsed from the XML source | |||||
* | |||||
* @return the project model of the parsed project. | |||||
*/ | |||||
public Project getProject() { | |||||
return project; | |||||
} | |||||
} | |||||
/** | |||||
* The import handler handles the importing of one project into another. | |||||
* | |||||
* The project to be imported is parsed with a new parser and then added to the | |||||
* current project under the given import name | |||||
*/ | |||||
private class ImportHandler extends ElementHandler { | |||||
/** | |||||
* The attribute used to name the import. | |||||
*/ | |||||
static public final String IMPORT_NAME_ATTR = "name"; | |||||
/** | |||||
* The attribute name used to locate the project to be imported. | |||||
*/ | |||||
static public final String IMPORT_SYSTEMID_ATTR = "project"; | |||||
/** | |||||
* The project that has been imported. | |||||
*/ | |||||
private Project importedProject; | |||||
/** | |||||
* The name under which the project is being imported. | |||||
*/ | |||||
private String importName; | |||||
/** | |||||
* The systemId (URL) where the project is to be imported from. | |||||
*/ | |||||
private String projectSystemId; | |||||
/** | |||||
* Create an import handler to import a project. | |||||
* | |||||
* @param xmlReader the XML parser being used to parse the import element. | |||||
* @param parent the parent element handler. | |||||
* @param locator the SAX locator object used to associate elements with source | |||||
* locations. | |||||
* @param attributes attributes of the import statement. | |||||
* @param importingSource the URL of the importing source. | |||||
*/ | |||||
public ImportHandler(XMLReader xmlReader, ContentHandler parent, | |||||
Locator locator, Attributes attributes, URL importingSource) | |||||
throws SAXParseException { | |||||
super(xmlReader, parent, locator); | |||||
for (int i = 0; i < attributes.getLength(); ++i) { | |||||
String attributeName = attributes.getQName(i); | |||||
String attributeValue = attributes.getValue(i); | |||||
if (attributeName.equals(IMPORT_NAME_ATTR)) { | |||||
importName = attributeValue; | |||||
} | |||||
else if (attributeName.equals(IMPORT_SYSTEMID_ATTR)) { | |||||
projectSystemId = attributeValue; | |||||
} | |||||
else { | |||||
throw new SAXParseException("Attribute " + attributeName + | |||||
" is not allowed in an <import> element", getLocator()); | |||||
} | |||||
} | |||||
if (importName == null) { | |||||
throw new SAXParseException("Attribute " + IMPORT_NAME_ATTR + | |||||
" is required in an <import> element", getLocator()); | |||||
} | |||||
if (projectSystemId == null) { | |||||
throw new SAXParseException("Attribute " + IMPORT_SYSTEMID_ATTR + | |||||
" is required in an <import> element", getLocator()); | |||||
} | |||||
// create a new parser to read this project relative to the | |||||
// project's URI | |||||
try { | |||||
URL importURL = new URL(importingSource, projectSystemId); | |||||
SAXParser importSAXParser = parserFactory.newSAXParser(); | |||||
XMLReader importXMLReader = importSAXParser.getXMLReader(); | |||||
if (recursionCheck.contains(importURL)) { | |||||
throw new SAXParseException("Circular import detected when importing '" + | |||||
importURL + "'", getLocator()); | |||||
} | |||||
recursionCheck.push(importURL); | |||||
ProjectRootHandler importRootHandler = new ProjectRootHandler(importURL, importXMLReader); | |||||
importSAXParser.parse(importURL.toString(), importRootHandler); | |||||
if (recursionCheck.pop() != importURL) { | |||||
throw new RuntimeException("Failure to pop expected element off recursion stack"); | |||||
} | |||||
importedProject = importRootHandler.getProject(); | |||||
} | |||||
catch (SAXParseException e) { | |||||
throw e; | |||||
} | |||||
catch (NoProjectReadException e) { | |||||
throw new SAXParseException("No project was imported from " + projectSystemId, | |||||
getLocator()); | |||||
} | |||||
catch (MalformedURLException e) { | |||||
throw new SAXParseException("Unable to import project from " + projectSystemId + | |||||
": " + e.getMessage(), | |||||
getLocator()); | |||||
} | |||||
catch (ParserConfigurationException e) { | |||||
throw new SAXParseException("Unable to parse project imported from " + projectSystemId + | |||||
": " + e.getMessage(), | |||||
getLocator()); | |||||
} | |||||
catch (SAXException e) { | |||||
throw new SAXParseException("Unable to parse project imported from " + projectSystemId + | |||||
": " + e.getMessage(), | |||||
getLocator()); | |||||
} | |||||
catch (IOException e) { | |||||
throw new SAXParseException("Error reading project imported from " + projectSystemId + | |||||
": " + e.getMessage(), | |||||
getLocator()); | |||||
} | |||||
} | |||||
/** | |||||
* Import does not support nested elements. This method will always throw an | |||||
* exception | |||||
* @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 always. | |||||
*/ | |||||
public void startElement(String uri, String localName, String qualifiedName, | |||||
Attributes attributes) throws SAXParseException { | |||||
// everything is a task | |||||
throw new SAXParseException("<import> does not support nested elements", getLocator()); | |||||
} | |||||
/** | |||||
* Get the project imported. | |||||
* | |||||
* @return an imported Project. | |||||
*/ | |||||
public Project getImportedProject() { | |||||
return importedProject; | |||||
} | |||||
/** | |||||
* Get the name under which the project is imported. | |||||
* | |||||
* @return the import name of the project | |||||
*/ | |||||
public String getImportName() { | |||||
return importName; | |||||
} | |||||
} | |||||
/** | |||||
* The include handler is used to read in included projects or | |||||
* fragments into a project. | |||||
*/ | |||||
private class IncludeHandler extends ElementHandler { | |||||
/** | |||||
* The attribute name which identifies the fragment to be included | |||||
*/ | |||||
static public final String INCLUDE_SYSTEMID_ATTR = "fragment"; | |||||
/** | |||||
* The system id of the fragment to be included. | |||||
*/ | |||||
private String includeSystemId; | |||||
/** | |||||
* Create an IncludeHandler to include an element into the | |||||
* current project | |||||
* | |||||
* @param xmlReader the XML parser being used to parse the include element. | |||||
* @param parent the parent element handler. | |||||
* @param locator the SAX locator object used to associate elements with source | |||||
* locations. | |||||
* @param attributes attributes of the include statement. | |||||
* @param includingSource the URL of the including source. | |||||
* @param project the project into which the included elements are added. | |||||
*/ | |||||
public IncludeHandler(XMLReader xmlReader, ContentHandler parent, | |||||
Locator locator, Attributes attributes, URL includingSource, | |||||
Project project) | |||||
throws SAXParseException { | |||||
super(xmlReader, parent, locator); | |||||
for (int i = 0; i < attributes.getLength(); ++i) { | |||||
String attributeName = attributes.getQName(i); | |||||
String attributeValue = attributes.getValue(i); | |||||
if (attributeName.equals(INCLUDE_SYSTEMID_ATTR)) { | |||||
includeSystemId = attributeValue; | |||||
} | |||||
else { | |||||
throw new SAXParseException("Attribute " + attributeName + | |||||
" is not allowed in an <include> element", getLocator()); | |||||
} | |||||
} | |||||
if (includeSystemId == null) { | |||||
throw new SAXParseException("Attribute " + INCLUDE_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(includingSource, includeSystemId); | |||||
SAXParser includeSAXParser = parserFactory.newSAXParser(); | |||||
XMLReader includeXMLReader = includeSAXParser.getXMLReader(); | |||||
if (recursionCheck.contains(includeURL)) { | |||||
throw new SAXParseException("Circular include detected when including '" + | |||||
includeURL + "'", getLocator()); | |||||
} | |||||
recursionCheck.push(includeURL); | |||||
IncludeRootHandler includeRootHandler | |||||
= new IncludeRootHandler(includeURL, includeXMLReader, project); | |||||
includeSAXParser.parse(includeURL.toString(), includeRootHandler); | |||||
if (recursionCheck.pop() != includeURL) { | |||||
throw new RuntimeException("Failure to pop expected element off recursion stack"); | |||||
} | |||||
} | |||||
catch (SAXParseException e) { | |||||
throw e; | |||||
} | |||||
catch (MalformedURLException e) { | |||||
throw new SAXParseException("Unable to include " + includeSystemId + | |||||
": " + e.getMessage(), | |||||
getLocator()); | |||||
} | |||||
catch (ParserConfigurationException e) { | |||||
throw new SAXParseException("Unable to parse include " + includeSystemId + | |||||
": " + e.getMessage(), | |||||
getLocator()); | |||||
} | |||||
catch (SAXException e) { | |||||
throw new SAXParseException("Unable to parse include " + includeSystemId + | |||||
": " + e.getMessage(), | |||||
getLocator()); | |||||
} | |||||
catch (IOException e) { | |||||
throw new SAXParseException("Error reading include " + includeSystemId + | |||||
": " + e.getMessage(), | |||||
getLocator()); | |||||
} | |||||
} | |||||
/** | |||||
* Include does not support nested elements. This method will always throw an | |||||
* exception | |||||
* | |||||
* @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 always. | |||||
*/ | |||||
public void startElement(String uri, String localName, String qualifiedName, | |||||
Attributes attributes) throws SAXParseException { | |||||
// everything is a task | |||||
throw new SAXParseException("<include> does not support nested elements", getLocator()); | |||||
} | |||||
} | |||||
/** | |||||
* A TargetHandler process the Target element. | |||||
*/ | |||||
private class TargetHandler extends ElementHandler { | |||||
/** | |||||
* The target being configured. | |||||
*/ | |||||
private Target target; | |||||
/** | |||||
* Create a Target handler. Event element in a target is | |||||
* considered to be a task | |||||
* | |||||
* @param xmlReader the XML parser being used to parse the target element. | |||||
* @param parent the parent element handler. | |||||
* @param locator the SAX locator object used to associate elements with source | |||||
* locations. | |||||
* @param attributes attributes of the target | |||||
*/ | |||||
public TargetHandler(XMLReader xmlReader, ContentHandler parent, | |||||
Locator locator, Attributes attributes) | |||||
throws SAXParseException { | |||||
super(xmlReader, parent, locator); | |||||
String targetName = null; | |||||
String depends = null; | |||||
Map aspects = new HashMap(); | |||||
for (int i = 0; i < attributes.getLength(); ++i) { | |||||
String attributeName = attributes.getQName(i); | |||||
String attributeValue = attributes.getValue(i); | |||||
if (attributeName.equals("name")) { | |||||
targetName = attributeValue; | |||||
} | |||||
else if (attributeName.equals("depends")) { | |||||
depends = attributeValue; | |||||
} | |||||
else if (attributeName.indexOf(":") != -1) { | |||||
// potential aspect attribute | |||||
aspects.put(attributeName, attributeValue); | |||||
} | |||||
else { | |||||
throw new SAXParseException("The attribute '" + attributeName + "' is not " + | |||||
"supported by the <target> element", getLocator()); | |||||
} | |||||
} | |||||
if (targetName == null) { | |||||
throw new SAXParseException("Targets must have a name attribute", locator); | |||||
} | |||||
target = new Target(getLocation(locator), targetName); | |||||
target.setAspects(aspects); | |||||
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 | |||||
TaskElementHandler taskHandler | |||||
= new TaskElementHandler(getXMLReader(), this, getLocator(), | |||||
attributes, qualifiedName); | |||||
target.addTask(taskHandler.getTaskElement()); | |||||
} | |||||
/** | |||||
* Get the target parsed by this handler. | |||||
* | |||||
* @return the Target model object parsed by this handler. | |||||
*/ | |||||
public Target getTarget() { | |||||
return target; | |||||
} | |||||
} | |||||
/** | |||||
* A TaskElementHandler parses the task elements of a build | |||||
*/ | |||||
private class TaskElementHandler extends ElementHandler { | |||||
/** | |||||
* The task element being parsed by this handler. | |||||
*/ | |||||
private TaskElement taskElement; | |||||
/** | |||||
* Create a task element handler to parse a task element | |||||
* | |||||
* @param xmlReader the XML parser being used to parse the task element. | |||||
* @param parent the parent element handler. | |||||
* @param locator the SAX locator object used to associate elements with source | |||||
* locations. | |||||
* @param attributes attributes of the task element | |||||
* @param elementTagName the name of the task element. | |||||
*/ | |||||
public TaskElementHandler(XMLReader xmlReader, ContentHandler parent, Locator locator, | |||||
Attributes attributes, String elementTagName) { | |||||
super(xmlReader, parent, locator); | |||||
taskElement | |||||
= new TaskElement(getLocation(locator), elementTagName); | |||||
Map aspects = new HashMap(); | |||||
for (int i = 0; i < attributes.getLength(); ++i) { | |||||
String attributeName = attributes.getQName(i); | |||||
String attributeValue = attributes.getValue(i); | |||||
if (attributeName.indexOf(":") != -1) { | |||||
// potential aspect attribute | |||||
aspects.put(attributeName, attributeValue); | |||||
} | |||||
else { | |||||
taskElement.addAttribute(attributeName, attributeValue); | |||||
} | |||||
} | |||||
taskElement.setAspects(aspects); | |||||
} | |||||
/** | |||||
* Process a nested element of this task element. All nested elements | |||||
* of a taskElement are themselves taskElements. | |||||
* | |||||
* @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 | |||||
TaskElementHandler nestedHandler | |||||
= new TaskElementHandler(getXMLReader(), this, getLocator(), | |||||
attributes, qualifiedName); | |||||
taskElement.addTaskElement(nestedHandler.getTaskElement()); | |||||
} | |||||
public void characters(char[] buf, int start, int end) throws SAXParseException { | |||||
taskElement.addText(new String(buf, start, end)); | |||||
} | |||||
/** | |||||
* Get the task element being parsed by this handler. | |||||
* | |||||
* @return the TaskElement being parsed. | |||||
*/ | |||||
public TaskElement getTaskElement() { | |||||
return taskElement; | |||||
} | |||||
} | |||||
/** | |||||
* A NoProjectReadException is used to indicate that a project | |||||
* was not read from the particular source. This will happen | |||||
* if the source is empty. | |||||
*/ | |||||
private class NoProjectReadException extends Exception { | |||||
} | |||||
} | |||||
@@ -1,94 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 1999 The Apache Software Foundation. All rights | |||||
* reserved. | |||||
* | |||||
* Redistribution and use in source and binary forms, with or without | |||||
* modification, are permitted provided that the following conditions | |||||
* are met: | |||||
* | |||||
* 1. Redistributions of source code must retain the above copyright | |||||
* notice, this list of conditions and the following disclaimer. | |||||
* | |||||
* 2. Redistributions in binary form must reproduce the above copyright | |||||
* notice, this list of conditions and the following disclaimer in | |||||
* the documentation and/or other materials provided with the | |||||
* distribution. | |||||
* | |||||
* 3. The end-user documentation included with the redistribution, if | |||||
* any, must include the following acknowlegement: | |||||
* "This product includes software developed by the | |||||
* Apache Software Foundation (http://www.apache.org/)." | |||||
* Alternately, this acknowlegement may appear in the software itself, | |||||
* if and wherever such third-party acknowlegements normally appear. | |||||
* | |||||
* 4. The names "The Jakarta Project", "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.frontend; | |||||
import org.apache.ant.core.execution.*; | |||||
import java.io.*; | |||||
/** | |||||
* 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> | |||||
*/ | |||||
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); | |||||
} |
@@ -1,311 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.frontend; | |||||
import java.io.*; | |||||
import java.net.*; | |||||
import java.util.*; | |||||
import javax.xml.parsers.*; | |||||
import org.xml.sax.SAXParseException; | |||||
import java.lang.reflect.*; | |||||
import org.apache.ant.core.execution.*; | |||||
import org.apache.ant.core.support.*; | |||||
import org.apache.ant.core.xml.*; | |||||
import org.apache.ant.core.config.*; | |||||
import org.apache.ant.core.model.*; | |||||
/** | |||||
* This is the command line front end to end. It drives the core | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public class Commandline { | |||||
/** The default build file name */ | |||||
static public final String DEFAULT_BUILD_FILENAME = "build.ant"; | |||||
/** 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); | |||||
/** Our current message output status. Follows Project.MSG_XXX */ | |||||
private int messageOutputLevel = BuildEvent.MSG_VERBOSE; | |||||
/** | |||||
* 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; | |||||
public static void start(String[] args) { | |||||
// create a command line and use it to run ant | |||||
Commandline commandline = new Commandline(); | |||||
commandline.runAnt(args); | |||||
} | |||||
public void runAnt(String[] args) { | |||||
ExecutionFrame mainFrame = null; | |||||
try { | |||||
parseArguments(args); | |||||
Project project = getProject(); | |||||
for (Iterator i = project.getTargets(); i.hasNext();) { | |||||
Target target = (Target)i.next(); | |||||
} | |||||
// Get the list of library components | |||||
AntLibrary[] libraries = ComponentManager.getComponents(); | |||||
mainFrame = new ExecutionFrame(project, libraries); | |||||
// We iterate through all nodes of all projects and make sure every node is OK | |||||
Map state = new HashMap(); | |||||
Stack visiting = new Stack(); | |||||
List dependencyOrder = new ArrayList(); | |||||
mainFrame.checkTargets(dependencyOrder, state, visiting); | |||||
addBuildListeners(mainFrame); | |||||
} | |||||
catch (AntException e) { | |||||
Location location = e.getLocation(); | |||||
Throwable cause = e.getCause(); | |||||
if (location != null && location != Location.UNKNOWN_LOCATION) { | |||||
System.out.print(location); | |||||
} | |||||
System.out.println(e.getMessage()); | |||||
if (cause != null) { | |||||
System.out.println("Root cause: " + cause.getClass().getName() + ": " + cause.getMessage()); | |||||
} | |||||
System.exit(1); | |||||
} | |||||
try { | |||||
mainFrame.runBuild(targets); | |||||
System.exit(0); | |||||
} | |||||
catch (Exception e) { | |||||
System.exit(1); | |||||
} | |||||
} | |||||
protected void addBuildListeners(ExecutionFrame frame) | |||||
throws ConfigException { | |||||
// Add the default listener | |||||
frame.addBuildListener(createLogger()); | |||||
for (Iterator i = listeners.iterator(); i.hasNext(); ) { | |||||
String className = (String) i.next(); | |||||
try { | |||||
BuildListener listener = | |||||
(BuildListener) Class.forName(className).newInstance(); | |||||
frame.addBuildListener(listener); | |||||
} | |||||
catch(Exception exc) { | |||||
throw new ConfigException("Unable to instantiate listener " + className, exc); | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* Creates the default build logger for sending build events to the ant log. | |||||
*/ | |||||
private BuildLogger createLogger() throws ConfigException { | |||||
BuildLogger logger = null; | |||||
if (loggerClassname != null) { | |||||
try { | |||||
logger = (BuildLogger)(Class.forName(loggerClassname).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; | |||||
} | |||||
/** | |||||
* Parse the command line arguments. | |||||
*/ | |||||
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) { | |||||
File file = new File(url); | |||||
String uri = "file:" + file.getAbsolutePath().replace('\\', '/'); | |||||
for (int index = uri.indexOf('#'); index != -1; index = uri.indexOf('#')) { | |||||
uri = uri.substring(0, index) + "%23" + uri.substring(index+1); | |||||
} | |||||
buildFileURL = new URL(uri); | |||||
// We convert any hash characters to their URL escape. | |||||
} | |||||
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("-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 argument: " + 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 = defaultBuildFile.toURL(); | |||||
} | |||||
catch (MalformedURLException e) { | |||||
System.err.println("Buildfile is not valid: " + e.getMessage()); | |||||
throw new ConfigException("Build file is not valid", e); | |||||
} | |||||
} | |||||
} | |||||
private Project getProject() throws ConfigException { | |||||
XMLProjectParser parser = new XMLProjectParser(); | |||||
Project project = parser.parseBuildFile(buildFileURL); | |||||
return project; | |||||
} | |||||
} | |||||
@@ -1,225 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 1999 The Apache Software Foundation. All rights | |||||
* reserved. | |||||
* | |||||
* Redistribution and use in source and binary forms, with or without | |||||
* modification, are permitted provided that the following conditions | |||||
* are met: | |||||
* | |||||
* 1. Redistributions of source code must retain the above copyright | |||||
* notice, this list of conditions and the following disclaimer. | |||||
* | |||||
* 2. Redistributions in binary form must reproduce the above copyright | |||||
* notice, this list of conditions and the following disclaimer in | |||||
* the documentation and/or other materials provided with the | |||||
* distribution. | |||||
* | |||||
* 3. The end-user documentation included with the redistribution, if | |||||
* any, must include the following acknowlegement: | |||||
* "This product includes software developed by the | |||||
* Apache Software Foundation (http://www.apache.org/)." | |||||
* Alternately, this acknowlegement may appear in the software itself, | |||||
* if and wherever such third-party acknowlegements normally appear. | |||||
* | |||||
* 4. The names "The Jakarta Project", "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.frontend; | |||||
import org.apache.ant.core.support.*; | |||||
import org.apache.ant.core.model.*; | |||||
import org.apache.ant.core.execution.*; | |||||
import java.io.*; | |||||
/** | |||||
* Writes build event to a PrintStream. Currently, it | |||||
* only writes which targets are being executed, and | |||||
* any messages that get logged. | |||||
*/ | |||||
public class DefaultLogger implements BuildLogger { | |||||
private static int LEFT_COLUMN_SIZE = 12; | |||||
protected PrintStream out; | |||||
protected PrintStream err; | |||||
protected int msgOutputLevel = BuildEvent.MSG_ERR; | |||||
private long startTime = System.currentTimeMillis(); | |||||
protected static String lSep = System.getProperty("line.separator"); | |||||
protected boolean emacsMode = false; | |||||
/** | |||||
* 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. | |||||
* <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.msgOutputLevel = 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; | |||||
} | |||||
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 (cause != null) { | |||||
out.println("Root cause: " + cause.toString()); | |||||
} | |||||
} | |||||
else { | |||||
t.printStackTrace(err); | |||||
} | |||||
} | |||||
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 (BuildEvent.MSG_INFO <= msgOutputLevel) { | |||||
Target target = (Target)event.getBuildElement(); | |||||
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() == BuildEvent.MSG_ERR ? err : out; | |||||
// Filter out messages based on priority | |||||
if (event.getPriority() <= msgOutputLevel) { | |||||
// Print out the name of the task if we're in one | |||||
Object buildElement = event.getBuildElement(); | |||||
if (buildElement instanceof TaskElement) { | |||||
TaskElement taskElement = (TaskElement)buildElement; | |||||
String name = taskElement.getType(); | |||||
if (!emacsMode) { | |||||
String msg = "[" + name + "] "; | |||||
for (int i = 0; i < (LEFT_COLUMN_SIZE - msg.length()); i++) { | |||||
logTo.print(" "); | |||||
} | |||||
logTo.print(msg); | |||||
} | |||||
} | |||||
// Print the message | |||||
logTo.println(event.getMessage()); | |||||
} | |||||
break; | |||||
default: | |||||
err.println("Unrecognized event type = " + event.getEventType()); | |||||
break; | |||||
} | |||||
} | |||||
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"); | |||||
} | |||||
} | |||||
} |
@@ -1,77 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.frontend; | |||||
import java.io.*; | |||||
import java.net.*; | |||||
import java.util.*; | |||||
import javax.xml.parsers.*; | |||||
import org.xml.sax.SAXParseException; | |||||
import java.lang.reflect.*; | |||||
import org.apache.ant.core.support.*; | |||||
import org.apache.ant.core.xml.*; | |||||
import org.apache.ant.core.config.*; | |||||
/** | |||||
* This class illustrates the use of the ExecutionFrame class | |||||
* standalone to execute tasks | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public class EmbedTest { | |||||
} | |||||
@@ -1,89 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.frontend; | |||||
import java.io.*; | |||||
import java.net.*; | |||||
import javax.xml.parsers.*; | |||||
import java.lang.reflect.*; | |||||
import org.apache.ant.core.support.*; | |||||
/** | |||||
* This is the command line front end to end. It drives the core | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public class Launcher { | |||||
public static void main(String[] args) throws Exception { | |||||
// we need to find the parser jars and makre sure we are going to use | |||||
// those in preference to anything else that may be lying about in the | |||||
// user's classpath | |||||
AntClassLoader coreClassLoader = AntLocator.getCoreClassLoader(System.getProperties()); | |||||
URL frontEndURL = AntLocator.getClassLocationURL(Launcher.class); | |||||
coreClassLoader.addURL(frontEndURL); | |||||
Class commandLineClass = Class.forName("org.apache.ant.frontend.Commandline", true, coreClassLoader); | |||||
final Class[] param = {Class.forName("[Ljava.lang.String;")}; | |||||
Class target = null; | |||||
final Method startMethod = commandLineClass.getMethod("start", param); | |||||
final Object[] argument = {args}; | |||||
startMethod.invoke(null, argument); | |||||
} | |||||
} | |||||
@@ -1,97 +0,0 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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.frontend; | |||||
import java.io.*; | |||||
import java.net.*; | |||||
import javax.xml.parsers.*; | |||||
import java.lang.reflect.*; | |||||
import org.apache.ant.core.support.*; | |||||
/** | |||||
* Command line to run Ant core from a remote server | |||||
* | |||||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
*/ | |||||
public class RemoteLauncher { | |||||
public static void main(String[] args) throws Exception { | |||||
String antHome = args[0]; | |||||
String parserHome = args[1]; | |||||
URL[] remoteCore = new URL[3]; | |||||
remoteCore[0] = new URL(antHome + "/lib/core.jar"); | |||||
remoteCore[1] = new URL(antHome + "/lib/frontend.jar"); | |||||
remoteCore[2] = new URL(parserHome); | |||||
AntClassLoader coreClassLoader = new AntClassLoader(remoteCore); | |||||
String[] realArgs = new String[args.length - 2]; | |||||
System.arraycopy(args, 2, realArgs, 0, realArgs.length); | |||||
System.out.print("Loading remote Ant ... "); | |||||
Class launcher = Class.forName("org.apache.ant.frontend.Commandline", true, coreClassLoader); | |||||
final Class[] param = { Class.forName("[Ljava.lang.String;") }; | |||||
Class target = null; | |||||
final Method startMethod = launcher.getMethod("start", param); | |||||
final Object[] argument = {realArgs}; | |||||
System.out.println("Done"); | |||||
System.out.println("Starting remote Ant"); | |||||
startMethod.invoke(null, argument); | |||||
} | |||||
} | |||||
@@ -1,5 +0,0 @@ | |||||
Manifest-Version: 1.0 | |||||
Created-By: Ant 2.0alpha | |||||
Main-Class: org.apache.ant.frontend.RemoteLauncher | |||||
Class-Path: core.jar | |||||
Sealed: true |
@@ -1,5 +0,0 @@ | |||||
Manifest-Version: 1.0 | |||||
Created-By: Ant 2.0alpha | |||||
Main-Class: org.apache.ant.frontend.Launcher | |||||
Class-Path: core.jar | |||||
Sealed: true |