commit each directory separately. :-) git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@273087 13f79535-47bb-0310-9956-ffa450edef68master
@@ -1,30 +0,0 @@ | |||
@echo off | |||
REM Copyright (c) 2000-2001 The Apache Software Foundation. All rights | |||
REM reserved. | |||
REM cleanup curretn boot area | |||
if exist bin rmdir /s/q bin | |||
if exist bootstrap rmdir /s/q bootstrap | |||
if exist dist rmdir /s/q dist | |||
REM compile init jar | |||
mkdir bin\init | |||
javac -d bin\init src\java\init\org\apache\ant\init\*.java | |||
REM compile bootstrap classes | |||
mkdir bin\bootstrap | |||
javac -classpath bin\init -d bin\bootstrap src\java\bootstrap\org\apache\ant\bootstrap\*.java | |||
REM compiler builder classes | |||
mkdir bin\builder | |||
javac -classpath bin\init;bin\bootstrap -d bin\builder src\java\bootstrap\org\apache\ant\builder\*.java | |||
REM run bootstrap | |||
java -classpath bin\init;bin\bootstrap org.apache.ant.bootstrap.Bootstrap | |||
REM run full build using bootstrapped version | |||
java -jar bootstrap\lib\start.jar %* | |||
REM Use the full build as the build used by the build script | |||
xcopy /s /y dist bootstrap | |||
@@ -1,29 +0,0 @@ | |||
#!/bin/sh | |||
# Copyright (c) 2000-2001 The Apache Software Foundation. All rights | |||
# reserved. | |||
# cleanup curretn boot area | |||
rm -rf bin bootstrap dist | |||
# compile init jar | |||
mkdir -p bin/init | |||
javac -d bin/init src/java/init/org/apache/ant/init/*.java | |||
# compile bootstrap classes | |||
mkdir bin/bootstrap | |||
javac -classpath bin/init -d bin/bootstrap src/java/bootstrap/org/apache/ant/bootstrap/*.java | |||
# compiler builder classes | |||
mkdir bin/builder | |||
javac -classpath bin/init:bin/bootstrap -d bin/builder src/java/bootstrap/org/apache/ant/builder/*.java | |||
# run bootstrap | |||
java -classpath bin/init:bin/bootstrap org.apache.ant.bootstrap.Bootstrap | |||
# run full build using bootstrapped version | |||
java -jar bootstrap/lib/core/start/start.jar $* | |||
# Use the full build as the build used by the build script | |||
cp -r dist/lib bootstrap | |||
@@ -1,5 +0,0 @@ | |||
@echo off | |||
REM Copyright (c) 2002 The Apache Software Foundation. All rights | |||
REM reserved. | |||
java -jar bootstrap\lib\start.jar %* |
@@ -1,6 +0,0 @@ | |||
#!/bin/sh | |||
# Copyright (c) 2002 The Apache Software Foundation. All rights | |||
# reserved. | |||
java -jar bootstrap/lib/core/start/start.jar $@ |
@@ -1,285 +0,0 @@ | |||
<project default="dist-lite" name="Mutant"> | |||
<!-- source locations --> | |||
<property name="src.dir" value="src"/> | |||
<property name="lib.dir" value="lib"/> | |||
<property name="java.dir" value="${src.dir}/java"/> | |||
<property name="script.dir" value="${src.dir}/script"/> | |||
<property name="conf.dir" value="${src.dir}/conf"/> | |||
<!-- build and distribution locations --> | |||
<property name="bin.dir" value="bin"/> | |||
<property name="dist.dir" value="dist"/> | |||
<property name="dist.bin" value="${dist.dir}/bin"/> | |||
<property name="dist.conf" value="${dist.dir}/conf"/> | |||
<property name="javadocs.dir" value="${dist.dir}/docs/manual/api"/> | |||
<property name="dist.lib.dir" value="${dist.dir}/lib"/> | |||
<property name="dist.core.dir" value="${dist.lib.dir}/core"/> | |||
<property name="dist.frontend.dir" value="${dist.lib.dir}/frontend"/> | |||
<property name="dist.antlibs.dir" value="${dist.lib.dir}/antlibs"/> | |||
<property name="dist.syslibs.dir" value="${dist.core.dir}/syslibs"/> | |||
<!-- control flags --> | |||
<property name="debug" value="true"/> | |||
<property name="chmod.fail" value="true" /> | |||
<path id="classpath.parser"> | |||
<fileset dir="${lib.dir}/parser" includes="*.jar"/> | |||
</path> | |||
<path id="classpath.common"> | |||
<pathelement location="${dist.core.dir}/start/init.jar"/> | |||
</path> | |||
<path id="classpath.antcore"> | |||
<path refid="classpath.common"/> | |||
<pathelement location="${dist.core.dir}/common/common.jar"/> | |||
<path refid="classpath.parser"/> | |||
</path> | |||
<path id="classpath.frontend"> | |||
<path refid="classpath.antcore"/> | |||
<pathelement location="${dist.core.dir}/antcore/antcore.jar"/> | |||
</path> | |||
<path id="classpath.start"> | |||
<pathelement location="${dist.core.dir}/start/init.jar"/> | |||
</path> | |||
<target name="buildsetup"> | |||
<available classname="com.puppycrawl.tools.checkstyle.CheckStyleTask" | |||
property="checkstyle.available"/> | |||
<mkdir dir="${bin.dir}"/> | |||
<mkdir dir="${dist.core.dir}"/> | |||
<copy todir="${dist.core.dir}/parser"> | |||
<fileset dir="${lib.dir}/parser"/> | |||
</copy> | |||
</target> | |||
<target name="initjar" depends="buildsetup"> | |||
<mkdir dir="${bin.dir}/init"/> | |||
<mkdir dir="${dist.core.dir}/start"/> | |||
<depend destdir="${bin.dir}/init" srcdir="${java.dir}/init" closure="yes"/> | |||
<javac destdir="${bin.dir}/init" srcdir="${java.dir}/init" debug="${debug}"/> | |||
<jar basedir="${bin.dir}/init" jarfile="${dist.core.dir}/start/init.jar"/> | |||
</target> | |||
<target name="common" depends="initjar"> | |||
<mkdir dir="${bin.dir}/common"/> | |||
<mkdir dir="${dist.core.dir}/common"/> | |||
<depend destdir="${bin.dir}/common" srcdir="${java.dir}/common" closure="yes"> | |||
<classpath refid="classpath.common"/> | |||
</depend> | |||
<javac destdir="${bin.dir}/common" srcdir="${java.dir}/common" debug="${debug}"> | |||
<classpath refid="classpath.common"/> | |||
</javac> | |||
<jar basedir="${bin.dir}/common" jarfile="${dist.core.dir}/common/common.jar"/> | |||
</target> | |||
<target name="antcore" depends="common"> | |||
<mkdir dir="${bin.dir}/antcore"/> | |||
<mkdir dir="${dist.core.dir}/antcore"/> | |||
<depend destdir="${bin.dir}/antcore" srcdir="${java.dir}/antcore" closure="yes"> | |||
<classpath refid="classpath.antcore"/> | |||
</depend> | |||
<javac destdir="${bin.dir}/antcore" srcdir="${java.dir}/antcore" debug="${debug}"> | |||
<classpath refid="classpath.antcore"/> | |||
</javac> | |||
<jar basedir="${bin.dir}/antcore" jarfile="${dist.core.dir}/antcore/antcore.jar"/> | |||
</target> | |||
<target name="frontend" depends="antcore, startjar"> | |||
<mkdir dir="${bin.dir}/frontend"/> | |||
<mkdir dir="${dist.frontend.dir}"/> | |||
<depend destdir="${bin.dir}/frontend" srcdir="${java.dir}/frontend" closure="yes"> | |||
<classpath refid="classpath.frontend"/> | |||
</depend> | |||
<javac destdir="${bin.dir}/frontend" srcdir="${java.dir}/frontend" debug="${debug}"> | |||
<classpath refid="classpath.frontend"/> | |||
</javac> | |||
<jar basedir="${bin.dir}/frontend" jarfile="${dist.frontend.dir}/cli.jar"> | |||
<include name="**/cli/*.class"/> | |||
<manifest> | |||
<attribute name="Main-Class" value="org.apache.ant.cli.Commandline"/> | |||
</manifest> | |||
</jar> | |||
</target> | |||
<target name="startjar" depends="initjar"> | |||
<mkdir dir="${bin.dir}/start"/> | |||
<mkdir dir="${dist.core.dir}/start"/> | |||
<depend destdir="${bin.dir}/start" srcdir="${java.dir}/start" closure="yes"> | |||
<classpath refid="classpath.start"/> | |||
</depend> | |||
<javac destdir="${bin.dir}/start" srcdir="${java.dir}/start" debug="${debug}"> | |||
<classpath refid="classpath.start"/> | |||
</javac> | |||
<jar basedir="${bin.dir}/start" jarfile="${dist.core.dir}/start/start.jar"> | |||
<manifest> | |||
<attribute name="Main-Class" value="org.apache.ant.start.Main"/> | |||
<attribute name="Class-Path" value="init.jar"/> | |||
</manifest> | |||
<include name="org/apache/ant/**/*"/> | |||
</jar> | |||
<jar basedir="${bin.dir}/start" jarfile="${dist.core.dir}/start/ant.jar"> | |||
<manifest> | |||
<attribute name="Main-Class" value="org.apache.tools.ant.Main"/> | |||
<attribute name="Class-Path" value="start.jar"/> | |||
</manifest> | |||
<include name="org/apache/tools/ant/**/*"/> | |||
</jar> | |||
</target> | |||
<!-- | |||
<target name="remote" depends="initjar"> | |||
<mkdir dir="${bin.dir}/remote"/> | |||
<depend destdir="${bin.dir}/remote" srcdir="${java.dir}/remote" closure="yes"> | |||
<classpath refid="classpath.start"/> | |||
</depend> | |||
<javac destdir="${bin.dir}/remote" srcdir="${java.dir}/remote" debug="${debug}"> | |||
<classpath refid="classpath.start"/> | |||
</javac> | |||
<jar basedir="${bin.dir}/remote" jarfile="${distlib.dir}/remote.jar"> | |||
<manifest> | |||
<attribute name="Main-Class" value="org.apache.ant.remote.RemoteMain"/> | |||
</manifest> | |||
</jar> | |||
</target> | |||
--> | |||
<target name="antlibs" depends="common"> | |||
<!-- <ant antfile="build/script.xml"/> --> | |||
<antcall target="buildlib"> | |||
<param name="libname" value="system"/> | |||
<param name="antlibdir" value="${dist.syslibs.dir}"/> | |||
</antcall> | |||
<antcall target="buildlib"> | |||
<param name="libname" value="monitor"/> | |||
<param name="antlibdir" value="${dist.syslibs.dir}"/> | |||
</antcall> | |||
<ant antfile="build/ant1compat.xml"/> | |||
</target> | |||
<target name="buildlib"> | |||
<property name="antlib.build.dir" value="${bin.dir}/antlibs/${libname}"/> | |||
<property name="antlib.src.dir" value="${java.dir}/antlibs/${libname}"/> | |||
<mkdir dir="${antlib.build.dir}"/> | |||
<mkdir dir="${antlibdir}"/> | |||
<path id="classpath.antlibs"> | |||
<path refid="classpath.common"/> | |||
<pathelement location="${dist.core.dir}/common/common.jar"/> | |||
</path> | |||
<depend destdir="${antlib.build.dir}" srcdir="${antlib.src.dir}" closure="yes"> | |||
<classpath refid="classpath.antlibs"/> | |||
</depend> | |||
<javac destdir="${antlib.build.dir}" srcdir="${antlib.src.dir}" debug="${debug}"> | |||
<classpath refid="classpath.antlibs"/> | |||
</javac> | |||
<jar basedir="${antlib.build.dir}" jarfile="${antlibdir}/${libname}.jar"> | |||
<metainf dir="${antlib.src.dir}" | |||
includes="antlib.xml"/> | |||
</jar> | |||
</target> | |||
<target name="setup-bin"> | |||
<mkdir dir="${dist.bin}"/> | |||
<copy todir="${dist.bin}"> | |||
<fileset dir="${script.dir}/" /> | |||
</copy> | |||
<fixcrlf srcdir="${dist.bin}" eol="crlf" includes="*.bat" /> | |||
<fixcrlf srcdir="${dist.bin}" eol="lf"> | |||
<include name="mutant" /> | |||
<include name="antRun" /> | |||
<include name="*.pl" /> | |||
</fixcrlf> | |||
<chmod perm="ugo+rx" dir="${dist.dir}" type="dir" includes="**" | |||
failonerror="${chmod.fail}" /> | |||
<chmod perm="ugo+r" dir="${dist.dir}" type="file" includes="**" | |||
failonerror="${chmod.fail}" /> | |||
<chmod perm="ugo+x" type="file" failonerror="${chmod.fail}"> | |||
<fileset dir="${dist.bin}"> | |||
<include name="**/mutant" /> | |||
<include name="**/antRun" /> | |||
<include name="**/*.pl" /> | |||
<include name="**/*.py" /> | |||
</fileset> | |||
</chmod> | |||
</target> | |||
<target name="setup-conf"> | |||
<mkdir dir="${dist.conf}"/> | |||
<copy todir="${dist.conf}"> | |||
<fileset dir="${conf.dir}/" /> | |||
</copy> | |||
</target> | |||
<target name="clean"> | |||
<delete dir="${bin.dir}"/> | |||
<delete dir="${dist.dir}"/> | |||
</target> | |||
<target name="checkstyle" depends="buildsetup" if="checkstyle.available"> | |||
<taskdef name="checkstyle" | |||
classname="com.puppycrawl.tools.checkstyle.CheckStyleTask"/> | |||
<mkdir dir="${bin.dir}/check"/> | |||
<checkstyle headerFile="../../src/etc/RequiredHeader.txt" | |||
headerIgnoreLine="4"> | |||
<fileset dir="${java.dir}"> | |||
<include name="**/*.java"/> | |||
<exclude name="**/org/apache/tools/ant/Task.java"/> | |||
<exclude name="**/org/apache/tools/ant/ProjectComponent.java"/> | |||
<exclude name="**/org/apache/tools/ant/types/DataType.java"/> | |||
<exclude name="**/builder/MutantBuilder.java"/> | |||
<exclude name="**/builder/Ant1CompatBuilder.java"/> | |||
</fileset> | |||
</checkstyle> | |||
<checkstyle allowProtected="true" | |||
headerFile="../../src/etc/RequiredHeader.txt" | |||
headerIgnoreLine="4"> | |||
<fileset dir="${java.dir}"> | |||
<include name="**/org/apache/tools/ant/Task.java"/> | |||
<include name="**/org/apache/tools/ant/ProjectComponent.java"/> | |||
<include name="**/org/apache/tools/ant/types/DataType.java"/> | |||
</fileset> | |||
</checkstyle> | |||
</target> | |||
<target name="javadocs"> | |||
<mkdir dir="${javadocs.dir}"/> | |||
<javadoc packagenames="org.apache.*" | |||
useexternalfile="yes" | |||
sourcepath="${java.dir}/antcore:${java.dir}/init:${java.dir}/common:${java.dir}/frontend:${java.dir}/start" | |||
destdir="${javadocs.dir}" | |||
author="true" | |||
private ="true" | |||
version="true" | |||
windowtitle="Mutant API" | |||
doctitle="Mutant"> | |||
<group title="Ant Library" packages="org.apache.ant.common.antlib*" /> | |||
<group title="Services" packages="org.apache.ant.common.service*" /> | |||
<group title="Common Facilities" packages="org.apache.ant.common*" /> | |||
<group title="Core" packages="org.apache.ant.antcore*" /> | |||
<group title="Initialisation" packages="org.apache.ant.init*,org.apache.ant.start*" /> | |||
<group title="Command Line" packages="org.apache.ant.cli*" /> | |||
<group title="Ant1 Compatability Layer" packages="org.apache.tools.ant*" /> | |||
<tag name="created" description="Date Created:" scope="types"/> | |||
</javadoc> | |||
</target> | |||
<target name="test"> | |||
<ant antfile="build/ant1compat.xml" target="test"/> | |||
</target> | |||
<target name="jars" depends="initjar, startjar, antcore, frontend, antlibs"/> | |||
<target name="dist-lite" depends="jars, setup-bin, setup-conf"/> | |||
<target name="dist" depends="dist-lite, javadocs"/> | |||
</project> |
@@ -1,799 +0,0 @@ | |||
<project default="ant1compat" name="Ant1Compat" basedir=".."> | |||
<property name="debug" value="true" /> | |||
<property name="deprecation" value="false" /> | |||
<property name="optimize" value="true" /> | |||
<property name="junit.fork" value="false" /> | |||
<property name="junit.filtertrace" value="off"/> | |||
<property name="junit.summary" value="no"/> | |||
<property name="ant1base.dir" value="../.."/> | |||
<property name="ant1src.dir" value="${ant1base.dir}/src"/> | |||
<property name="ant1java.dir" value="${ant1src.dir}/main"/> | |||
<property name="ant1etc.dir" value="${ant1src.dir}/etc"/> | |||
<property name="ant1.tests.dir" value="${ant1src.dir}/etc/testcases"/> | |||
<property name="src.dir" value="src"/> | |||
<property name="java.dir" value="${src.dir}/java"/> | |||
<property name="lib.dir" value="lib"/> | |||
<property name="tests.dir" value="${ant1src.dir}/testcases"/> | |||
<property name="tests.etc.dir" value="${src.dir}/etc/testcases"/> | |||
<property name="bin.dir" value="bin"/> | |||
<property name="dist.dir" value="dist"/> | |||
<property name="dist.lib.dir" value="${dist.dir}/lib"/> | |||
<property name="dist.core.dir" value="${dist.lib.dir}/core"/> | |||
<property name="dist.antlibs.dir" value="${dist.lib.dir}/antlibs"/> | |||
<property name="dist.syslibs.dir" value="${dist.core.dir}/syslibs"/> | |||
<property name="ant.package" value="org/apache/tools/ant"/> | |||
<property name="optional.package" value="${ant.package}/taskdefs/optional"/> | |||
<property name="optional.type.package" value="${ant.package}/types/optional"/> | |||
<property name="util.package" value="${ant.package}/util"/> | |||
<property name="regexp.package" value="${util.package}/regexp"/> | |||
<!-- | |||
=================================================================== | |||
Set the properties for the build area | |||
=================================================================== | |||
--> | |||
<property name="build.tests" value="${bin.dir}/testcases"/> | |||
<path id="classpath"> | |||
<pathelement location="${dist.core.dir}/start/init.jar"/> | |||
<fileset dir="${dist.core.dir}/parser" includes="*.jar"/> | |||
<!-- <fileset dir="${lib.dir}/ant1compat" includes="*.jar"/> --> | |||
<pathelement location="${dist.core.dir}/common/common.jar"/> | |||
<pathelement location="${dist.syslibs.dir}/system.jar"/> | |||
</path> | |||
<path id="tests-classpath"> | |||
<pathelement location="${build.classes}" /> | |||
<pathelement location="${build.tests}" /> | |||
<!-- | |||
include the test source and test data dirs | |||
so that we can pick resources via getResource(AsStream) | |||
--> | |||
<pathelement location="${tests.dir}"/> | |||
<pathelement location="${tests.etc.dir}"/> | |||
<path refid="classpath" /> | |||
</path> | |||
<patternset id="deprecated"> | |||
<exclude name="org/apache/tools/ant/taskdefs/Copydir.java"/> | |||
<exclude name="org/apache/tools/ant/taskdefs/Copyfile.java"/> | |||
</patternset> | |||
<patternset id="toohard"> | |||
</patternset> | |||
<patternset id="converted"> | |||
<exclude name="org/apache/tools/ant/taskdefs/Ant.java"/> | |||
<exclude name="org/apache/tools/ant/taskdefs/CallTarget.java"/> | |||
<exclude name="org/apache/tools/ant/taskdefs/input/InputRequest.java"/> | |||
<exclude name="org/apache/tools/ant/types/DataType.java"/> | |||
<exclude name="org/apache/tools/ant/Project.java"/> | |||
<exclude name="org/apache/tools/ant/Target.java"/> | |||
<exclude name="org/apache/tools/ant/TaskContainer.java"/> | |||
<exclude name="org/apache/tools/ant/ProjectComponent.java"/> | |||
<exclude name="org/apache/tools/ant/ProjectHelper.java"/> | |||
<exclude name="org/apache/tools/ant/Task.java"/> | |||
<exclude name="org/apache/tools/ant/Main.java"/> | |||
<exclude name="org/apache/tools/ant/input/InputRequest.java"/> | |||
</patternset> | |||
<patternset id="notrequired"> | |||
<exclude name="org/apache/tools/ant/DemuxOutputStream.java"/> | |||
<exclude name="org/apache/tools/ant/RuntimeConfigurable.java"/> | |||
<exclude name="org/apache/tools/ant/UnknownElement.java"/> | |||
</patternset> | |||
<patternset id="unsupportedTests"> | |||
<exclude name="org/apache/tools/ant/taskdefs/ParallelTest.java"/> | |||
<exclude name="org/apache/tools/ant/taskdefs/AntTest.java"/> | |||
<exclude name="org/apache/tools/ant/taskdefs/InitializeClassTest.java"/> | |||
<exclude name="org/apache/tools/ant/taskdefs/InputTest.java"/> | |||
<exclude name="org/apache/tools/ant/taskdefs/JavaTest.java"/> | |||
<exclude name="org/apache/tools/ant/taskdefs/JavacTest.java"/> | |||
<exclude name="org/apache/tools/ant/taskdefs/TStampTest.java"/> | |||
<exclude name="org/apache/tools/ant/taskdefs/TaskdefTest.java"/> | |||
<exclude name="org/apache/tools/ant/taskdefs/TypedefTest.java"/> | |||
<exclude name="org/apache/tools/ant/taskdefs/optional/sitraka/XMLReportTest.java"/> | |||
</patternset> | |||
<fileset id="ant1src_tocopy" dir="${ant1java.dir}"> | |||
<include name="**/*.properties"/> | |||
<include name="**/*.mf"/> | |||
<include name="org/apache/tools/ant/taskdefs/**/*.java"/> | |||
<include name="org/apache/tools/ant/types/**/*.java"/> | |||
<include name="org/apache/tools/ant/filters/**/*.java"/> | |||
<include name="org/apache/tools/ant/util/**/*.java"/> | |||
<include name="org/apache/tools/zip/**/*.java"/> | |||
<include name="org/apache/tools/bzip2/**/*.java"/> | |||
<include name="org/apache/tools/mail/**/*.java"/> | |||
<include name="org/apache/tools/tar/**/*.java"/> | |||
<include name="org/apache/tools/ant/*.java"/> | |||
<include name="org/apache/tools/ant/input/*.java"/> | |||
<!-- <patternset refid="deprecated"/> --> | |||
<patternset refid="toohard"/> | |||
<patternset refid="converted"/> | |||
<patternset refid="notrequired"/> | |||
</fileset> | |||
<fileset id="ant1testcases_tocopy" dir="${ant1.tests.dir}"> | |||
</fileset> | |||
<!-- | |||
=================================================================== | |||
Set up patternsets to be used by javac and junit to exclude | |||
files that have dependencies that are not available | |||
=================================================================== | |||
--> | |||
<!-- depends on JDK version --> | |||
<patternset id="needs.jdk1.2+"> | |||
<exclude name="${util.package}/optional/NoExitSecurityManager.java" | |||
unless="jdk1.2+" /> | |||
<exclude name="${optional.package}/Javah.java" | |||
unless="jdk1.2+" /> | |||
<exclude name="${optional.package}/metamata/*.java" | |||
unless="jdk1.2+" /> | |||
<exclude name="${optional.package}/ejb/EjbJar.java" | |||
unless="jdk1.2+" /> | |||
<exclude name="${optional.package}/ejb/*DeploymentTool.java" | |||
unless="jdk1.2+" /> | |||
<exclude name="${optional.package}/ejb/IPlanet*.java" | |||
unless="jdk1.2+" /> | |||
<!-- uses the context classloader --> | |||
<exclude name="${optional.package}/junit/JUnitClassLoaderTest.java" | |||
unless="jdk1.2+" /> | |||
<!-- use various 1.2 methods --> | |||
<exclude name="${optional.package}/sitraka/**/*.java" | |||
unless="jdk1.2+" /> | |||
</patternset> | |||
<patternset id="needs.jdk1.3+"> | |||
<exclude name="${ant.package}/taskdefs/TestProcess.java" | |||
unless="jdk1.3+" /> | |||
<exclude name="${optional.package}/extension/**/*.java" | |||
unless="jdk1.3+" /> | |||
</patternset> | |||
<patternset id="needs.jdk1.4+"> | |||
<exclude name="${regexp.package}/Jdk14Regexp*.java" | |||
unless="jdk1.4+" /> | |||
</patternset> | |||
<!-- classes that should be present in Sun based JVMs, but not in | |||
Kaffe for example --> | |||
<patternset id="needs.sun.tools"> | |||
<exclude name="${optional.package}/Native2Ascii.java" | |||
unless="sun.tools.present" /> | |||
<exclude name="${optional.package}/Javah.java" | |||
unless="sun.tools.present" /> | |||
</patternset> | |||
<patternset id="needs.sun.uue"> | |||
<exclude name="${ant.package}/taskdefs/email/UUMailer.java" | |||
unless="sunuue.present" /> | |||
</patternset> | |||
<patternset id="needs.sun.b64"> | |||
<exclude name="${ant.package}/taskdefs/Get.java" | |||
unless="base64.present" /> | |||
<exclude name="${optional.package}/splash/SplashTask.java" | |||
unless="base64.present" /> | |||
</patternset> | |||
<!-- depends on external libraries --> | |||
<patternset id="needs.trax"> | |||
<exclude name="${optional.package}/TraXLiaison*.java" | |||
unless="trax.present" /> | |||
<exclude name="${optional.package}/sitraka/**" | |||
unless="trax.present"/> | |||
<exclude name="${optional.package}/metamata/MMetrics*" | |||
unless="trax.present"/> | |||
<exclude name="${optional.package}/XsltTest.java" | |||
unless="trax.present"/> | |||
</patternset> | |||
<patternset id="needs.xalan1"> | |||
<exclude name="${optional.package}/XalanLiaison*.java" | |||
unless="xalan.present" /> | |||
<exclude name="${optional.package}/junit/Xalan1Executor.java" | |||
unless="xalan.present" /> | |||
</patternset> | |||
<patternset id="needs.xalan2"> | |||
<exclude name="${optional.package}/junit/Xalan2Executor.java" | |||
unless="xalan2.present" /> | |||
</patternset> | |||
<patternset id="needs.xslp"> | |||
<exclude name="${optional.package}/XslpLiaison*.java" | |||
unless="xslp.present" /> | |||
</patternset> | |||
<patternset id="needs.junit"> | |||
<exclude name="${optional.package}/junit/*.java" unless="junit.present" /> | |||
</patternset> | |||
<patternset id="needs.jakarta.regexp"> | |||
<exclude name="${regexp.package}/JakartaRegexp*.java" | |||
unless="jakarta.regexp.present" /> | |||
</patternset> | |||
<patternset id="needs.jakarta.oro"> | |||
<exclude name="${regexp.package}/JakartaOro*.java" | |||
unless="jakarta.oro.present" /> | |||
<exclude name="${optional.package}/perforce/*.java" | |||
unless="jakarta.oro.present" /> | |||
<exclude name="${optional.package}/metamata/MAudit*.java" | |||
unless="jakarta.oro.present"/> | |||
</patternset> | |||
<patternset id="needs.jakarta.bcel"> | |||
<exclude name="${ant.package}/filters/util/JavaClassHelper.java" | |||
unless="bcel.present" /> | |||
<exclude name="${util.package}/depend/bcel/*.java" | |||
unless="bcel.present" /> | |||
<exclude name="${optional.type.package}/depend/ClassFileSetTest.java" | |||
unless="bcel.present" /> | |||
</patternset> | |||
<patternset id="needs.jakarta.log4j"> | |||
<exclude name="${ant.package}/listener/Log4jListener.java" | |||
unless="log4j.present" /> | |||
</patternset> | |||
<patternset id="needs.commons.logging"> | |||
<exclude name="${ant.package}/listener/CommonsLoggingListener.java" | |||
unless="commons.logging.present" /> | |||
</patternset> | |||
<patternset id="needs.bsf"> | |||
<exclude name="${optional.package}/Script.java" | |||
unless="bsf.present" /> | |||
</patternset> | |||
<patternset id="needs.stylebook"> | |||
<exclude name="${optional.package}/StyleBook.java" | |||
unless="stylebook.present" /> | |||
</patternset> | |||
<patternset id="needs.javamail"> | |||
<exclude name="${ant.package}/taskdefs/email/MimeMailer.java" | |||
unless="javamail.complete" /> | |||
</patternset> | |||
<patternset id="needs.icontract"> | |||
<exclude name="${optional.package}/IContract.java" | |||
unless="icontract.present" /> | |||
</patternset> | |||
<patternset id="needs.netrexx"> | |||
<exclude name="${optional.package}/NetRexxC.java" | |||
unless="netrexx.present" /> | |||
</patternset> | |||
<patternset id="needs.weblogic.ejbc"> | |||
<exclude name="${optional.package}/ejb/Ejbc*.java" | |||
unless="ejb.ejbc.present" /> | |||
</patternset> | |||
<patternset id="needs.weblogic.ddcreator"> | |||
<exclude name="${optional.package}/ejb/DDCreator*.java" | |||
unless="ejb.DDCreator.present" /> | |||
</patternset> | |||
<patternset id="needs.weblogic.server"> | |||
<exclude name="${optional.package}/ejb/WLRun.java" | |||
unless="ejb.wls.present" /> | |||
<exclude name="${optional.package}/ejb/WLStop.java" | |||
unless="ejb.wls.present" /> | |||
</patternset> | |||
<patternset id="needs.netcomponents"> | |||
<exclude name="${optional.package}/net/FTP.java" | |||
unless="netcomp.present" /> | |||
<exclude name="${optional.package}/net/TelnetTask.java" | |||
unless="netcomp.present" /> | |||
</patternset> | |||
<patternset id="needs.starteam"> | |||
<exclude name="${optional.package}/scm/AntStarTeam*.java" | |||
unless="starteam.present" /> | |||
<exclude name="${optional.package}/starteam/*.java" | |||
unless="starteam.present" /> | |||
</patternset> | |||
<patternset id="needs.vaj"> | |||
<exclude name="${optional.package}/ide/VAJ*.java" | |||
unless="vaj.present" /> | |||
</patternset> | |||
<patternset id="needs.antlr"> | |||
<exclude name="${optional.package}/ANTLR*.java" unless="antlr.present" /> | |||
</patternset> | |||
<patternset id="needs.servletapi"> | |||
<exclude name="${optional.package}/ide/VAJ*Servlet.java" | |||
unless="servlet.present" /> | |||
</patternset> | |||
<patternset id="needs.jmf"> | |||
<exclude name="${optional.package}/sound/*.java" unless="jmf.present" /> | |||
</patternset> | |||
<patternset id="needs.jdepend"> | |||
<exclude name="${optional.package}/jdepend/*" unless="jdepend.present" /> | |||
</patternset> | |||
<patternset id="onlinetests"> | |||
<exclude name="**/GetTest.java" if="offline" /> | |||
</patternset> | |||
<patternset id="needs.swing"> | |||
<exclude name="${optional.package}/splash/*.java" unless="swing.present" /> | |||
</patternset> | |||
<patternset id="teststhatfail"> | |||
</patternset> | |||
<!-- | |||
=================================================================== | |||
Check to see what optional dependencies are available | |||
=================================================================== | |||
--> | |||
<target name="check_for_optional_packages"> | |||
<available property="jdk1.2+" classname="java.lang.ThreadLocal" /> | |||
<available property="jdk1.3+" classname="java.lang.StrictMath" /> | |||
<available property="jdk1.4+" classname="java.lang.CharSequence" /> | |||
<available property="bsf.present" | |||
classname="com.ibm.bsf.BSFManager" | |||
classpathref="classpath" /> | |||
<condition property="netrexx.present"> | |||
<and> | |||
<isset property="jdk1.2+"/> | |||
<available classname="netrexx.lang.Rexx" | |||
classpathref="classpath"/> | |||
</and> | |||
</condition> | |||
<available property="trax.present" | |||
classname="javax.xml.transform.Transformer" | |||
classpathref="classpath" /> | |||
<available property="xslp.present" | |||
classname="com.kvisco.xsl.XSLProcessor" | |||
classpathref="classpath" /> | |||
<available property="xalan.present" | |||
classname="org.apache.xalan.xslt.XSLTProcessorFactory" | |||
classpathref="classpath" /> | |||
<available property="xalan2.present" | |||
classname="org.apache.xalan.transformer.TransformerImpl" | |||
classpathref="classpath" /> | |||
<available property="ejb.ejbc.present" | |||
classname="weblogic.ejbc" | |||
classpathref="classpath" /> | |||
<available property="ejb.DDCreator.present" | |||
classname="weblogic.ejb.utils.DDCreator" | |||
classpathref="classpath" /> | |||
<available property="ejb.wls.present" | |||
classname="weblogic.Server" | |||
classpathref="classpath" /> | |||
<available property="junit.present" | |||
classname="junit.framework.TestCase" | |||
classpathref="classpath" /> | |||
<available property="netcomp.present" | |||
classname="com.oroinc.net.ftp.FTPClient" | |||
classpathref="classpath" /> | |||
<available property="starteam.present" | |||
classname="com.starbase.util.Platform" | |||
classpathref="classpath" /> | |||
<available property="antlr.present" | |||
classname="antlr.Tool" | |||
classpathref="classpath"/> | |||
<available property="vaj.present" | |||
classname="com.ibm.ivj.util.base.Workspace" | |||
classpathref="classpath"/> | |||
<available property="stylebook.present" | |||
classname="org.apache.stylebook.Engine" | |||
classpathref="classpath"/> | |||
<available property="jakarta.regexp.present" | |||
classname="org.apache.regexp.RE" | |||
classpathref="classpath"/> | |||
<available property="jakarta.oro.present" | |||
classname="org.apache.oro.text.regex.Perl5Matcher" | |||
classpathref="classpath" /> | |||
<available property="jmf.present" | |||
classname="javax.sound.sampled.Clip" | |||
classpathref="classpath"/> | |||
<condition property="icontract.present"> | |||
<and> | |||
<isset property="jdk1.2+"/> | |||
<available classname="com.reliablesystems.iContract.IContracted" | |||
classpathref="classpath"/> | |||
</and> | |||
</condition> | |||
<available property="jdepend.present" | |||
classname="jdepend.framework.JDepend" | |||
classpathref="classpath"/> | |||
<available property="log4j.present" | |||
classname="org.apache.log4j.Category" | |||
classpathref="classpath"/> | |||
<available property="commons.logging.present" | |||
classname="org.apache.commons.logging.LogFactory" | |||
classpathref="classpath"/> | |||
<!-- this is just a way to check for a TraX implementation --> | |||
<available property="trax.impl.present" | |||
resource="META-INF/services/javax.xml.transform.TransformerFactory" | |||
classpathref="classpath"/> | |||
<available property="xalan.envcheck" | |||
classname="org.apache.xalan.xslt.EnvironmentCheck" | |||
classpathref="classpath" /> | |||
<available property="which.present" | |||
classname="org.apache.env.Which" | |||
classpathref="classpath" /> | |||
<available property="servlet.present" | |||
classname="javax.servlet.Servlet" | |||
classpathref="classpath"/> | |||
<available property="xerces.present" | |||
classname="org.apache.xerces.parsers.SAXParser" | |||
classpathref="classpath" /> | |||
<condition property="bcel.present"> | |||
<and> | |||
<isset property="jdk1.2+"/> | |||
<available classname="org.apache.bcel.Constants" | |||
classpathref="classpath"/> | |||
</and> | |||
</condition> | |||
<available property="sunuue.present" | |||
classname="sun.misc.UUEncoder" | |||
classpathref="classpath" /> | |||
<condition property="javamail.complete"> | |||
<and> | |||
<available classname="javax.activation.DataHandler" | |||
classpathref="classpath"/> | |||
<available classname="javax.mail.Transport" | |||
classpathref="classpath"/> | |||
</and> | |||
</condition> | |||
<condition property="some.regexp.support"> | |||
<or> | |||
<isset property="jdk1.4+" /> | |||
<isset property="jakarta.regexp.present" /> | |||
<isset property="jakarta.oro.present" /> | |||
</or> | |||
</condition> | |||
<condition property="tests.and.ant.share.classloader"> | |||
<or> | |||
<equals arg1="${junit.fork}" arg2="true" /> | |||
<equals arg1="${build.sysclasspath}" arg2="only" /> | |||
</or> | |||
</condition> | |||
<condition property="sun.tools.present"> | |||
<and> | |||
<available classname="sun.tools.native2ascii.Main" /> | |||
<available classname="com.sun.tools.javah.Main" /> | |||
</and> | |||
</condition> | |||
<available property="base64.present" classname="sun.misc.BASE64Encoder" /> | |||
<property name="build.tests.resolved" location="${build.tests}" /> | |||
<condition property="tests.are.on.system.classpath"> | |||
<or> | |||
<!-- relative paths in CLASSPATH --> | |||
<contains string="${java.class.path}" | |||
substring="${build.tests}" /> | |||
<!-- absolute paths in CLASSPATH --> | |||
<contains string="${java.class.path}" | |||
substring="${build.tests.resolved}" /> | |||
</or> | |||
</condition> | |||
<condition property="jasper.present"> | |||
<and> | |||
<available classname="org.apache.jasper.compiler.Compiler" /> | |||
<available classname="org.apache.jasper.JasperException" /> | |||
</and> | |||
</condition> | |||
<available property="swing.present" | |||
classname="javax.swing.ImageIcon" | |||
classpathref="classpath"/> | |||
<condition property="wsdl.found"> | |||
<or> | |||
<available file="wsdl" filepath="${env.PATH}" /> | |||
<available file="wsdl.exe" filepath="${env.PATH}" /> | |||
<available file="wsdl.exe" filepath="${env.Path}" /> | |||
</or> | |||
</condition> | |||
<echo level="verbose"> wsdl.found=${wsdl.found}</echo> | |||
<condition property="csc.found"> | |||
<or> | |||
<available file="csc" filepath="${env.PATH}" /> | |||
<available file="csc.exe" filepath="${env.PATH}" /> | |||
<available file="csc.exe" filepath="${env.Path}" /> | |||
</or> | |||
</condition> | |||
<echo level="verbose"> csc.found=${csc.found}</echo> | |||
<condition property="dotnetapps.found"> | |||
<and> | |||
<isset property="csc.found"/> | |||
<isset property="wsdl.found"/> | |||
</and> | |||
</condition> | |||
<echo level="verbose"> csc.found=${csc.found}</echo> | |||
</target> | |||
<target name="ant1compat" depends="check_for_optional_packages"> | |||
<mkdir dir="${bin.dir}/ant1src_copy"/> | |||
<mkdir dir="${bin.dir}/ant1compat"/> | |||
<copy todir="${bin.dir}/ant1src_copy"> | |||
<fileset refid="ant1src_tocopy"/> | |||
</copy> | |||
<depend destdir="${bin.dir}/ant1compat" srcdir="${bin.dir}/ant1src_copy:${java.dir}/antlibs/ant1compat" | |||
closure="yes"> | |||
<classpath refid="classpath"/> | |||
</depend> | |||
<javac destdir="${bin.dir}/ant1compat" | |||
srcdir="${bin.dir}/ant1src_copy:${java.dir}/antlibs/ant1compat" | |||
debug="${debug}"> | |||
<classpath refid="classpath" /> | |||
<patternset refid="needs.jdk1.2+" /> | |||
<patternset refid="needs.jdk1.3+" /> | |||
<patternset refid="needs.jdk1.4+" /> | |||
<patternset refid="needs.jakarta.regexp" /> | |||
<patternset refid="needs.jakarta.oro" /> | |||
<patternset refid="needs.jakarta.log4j" /> | |||
<patternset refid="needs.commons.logging" /> | |||
<patternset refid="needs.sun.uue" /> | |||
<patternset refid="needs.javamail" /> | |||
<patternset refid="needs.icontract" /> | |||
<patternset refid="needs.bsf" /> | |||
<patternset refid="needs.stylebook" /> | |||
<patternset refid="needs.netrexx" /> | |||
<patternset refid="needs.trax" /> | |||
<patternset refid="needs.xslp" /> | |||
<patternset refid="needs.xalan1" /> | |||
<patternset refid="needs.weblogic.ejbc" /> | |||
<patternset refid="needs.weblogic.ddcreator" /> | |||
<patternset refid="needs.weblogic.server" /> | |||
<patternset refid="needs.junit" /> | |||
<patternset refid="needs.netcomponents" /> | |||
<patternset refid="needs.starteam" /> | |||
<patternset refid="needs.antlr" /> | |||
<patternset refid="needs.vaj" /> | |||
<patternset refid="needs.servletapi" /> | |||
<patternset refid="needs.jmf" /> | |||
<patternset refid="needs.xalan2" /> | |||
<patternset refid="needs.jdepend" /> | |||
<patternset refid="needs.sun.tools" /> | |||
<patternset refid="needs.sun.b64" /> | |||
<patternset refid="needs.jakarta.bcel" /> | |||
<patternset refid="needs.swing" /> | |||
</javac> | |||
<copy todir="${bin.dir}/ant1compat"> | |||
<fileset dir="${bin.dir}/ant1src_copy" excludes="**/*.java"/> | |||
</copy> | |||
<copy todir="${bin.dir}/ant1compat/${optional.package}/junit/xsl"> | |||
<fileset dir="${ant1etc.dir}"> | |||
<include name="junit-frames.xsl" /> | |||
<include name="junit-noframes.xsl" /> | |||
</fileset> | |||
</copy> | |||
<mkdir dir="${dist.antlibs.dir}"/> | |||
<jar basedir="${bin.dir}/ant1compat" jarfile="${dist.antlibs.dir}/ant1compat.jar"> | |||
<metainf dir="${java.dir}/antlibs/ant1compat" | |||
includes="antlib.xml"/> | |||
</jar> | |||
</target> | |||
<!-- | |||
=================================================================== | |||
Compile testcases | |||
=================================================================== | |||
--> | |||
<target name="compile-tests" depends="check_for_optional_packages" if="junit.present"> | |||
<mkdir dir="${build.tests}"/> | |||
<javac srcdir="${tests.dir}" | |||
destdir="${build.tests}" | |||
debug="${debug}" | |||
deprecation="${deprecation}" > | |||
<classpath refid="tests-classpath" /> | |||
<patternset refid="needs.antlr" /> | |||
<patternset refid="needs.jdk1.2+" /> | |||
<patternset refid="needs.jdk1.3+" /> | |||
<patternset refid="needs.jdk1.4+" /> | |||
<patternset refid="needs.jakarta.regexp" /> | |||
<patternset refid="needs.jakarta.oro" /> | |||
<patternset refid="needs.trax" /> | |||
<patternset refid="needs.xslp" /> | |||
<patternset refid="needs.xalan1" /> | |||
<patternset refid="needs.jakarta.bcel" /> | |||
<patternset refid="unsupportedTests" /> | |||
</javac> | |||
<copy todir="${tests.etc.dir}"> | |||
<fileset refid="ant1testcases_tocopy"/> | |||
</copy> | |||
</target> | |||
<target name="dump-info" depends="dump-sys-properties,run-which" /> | |||
<target name="dump-sys-properties" unless="which.present" | |||
depends="xml-check"> | |||
<echo message="java.vm.info=${java.vm.info}" /> | |||
<echo message="java.vm.name=${java.vm.name}" /> | |||
<echo message="java.vm.vendor=${java.vm.vendor}" /> | |||
<echo message="java.vm.version=${java.vm.version}" /> | |||
<echo message="os.arch=${os.arch}" /> | |||
<echo message="os.name=${os.name}" /> | |||
<echo message="os.version=${os.version}" /> | |||
<echo message="file.encoding=${file.encoding}" /> | |||
<echo message="user.language=${user.language}" /> | |||
</target> | |||
<!-- helper class from Xalan2 to check for jar versioning of xml/xsl processors --> | |||
<target name="xml-check" depends="check_for_optional_packages" | |||
if="xalan.envcheck" unless="which.present"> | |||
<java classname="org.apache.xalan.xslt.EnvironmentCheck"/> | |||
</target> | |||
<target name="run-which" depends="check_for_optional_packages" | |||
if="which.present"> | |||
<java classname="org.apache.env.Which" taskname="which"/> | |||
</target> | |||
<!-- test to see if we are online or not. can take a while when we are off line, so | |||
setting the property is a good shortcut--> | |||
<target name="probe-offline"> | |||
<condition property="offline"> | |||
<or> | |||
<isset property="offline"/> | |||
<not> | |||
<http url="http://www.apache.org/"/> | |||
</not> | |||
</or> | |||
</condition> | |||
<echo level="verbose" > offline=${offline}</echo> | |||
</target> | |||
<!-- | |||
=================================================================== | |||
Run testcase | |||
=================================================================== | |||
--> | |||
<target name="test" depends="run-tests" description="--> run JUnit tests"/> | |||
<target name="run-tests" depends="dump-info,compile-tests,probe-offline" if="junit.present"> | |||
<junit printsummary="${junit.summary}" haltonfailure="yes" | |||
filtertrace="${junit.filtertrace}" | |||
fork="${junit.fork}"> | |||
<classpath refid="tests-classpath"/> | |||
<sysproperty key="ant.home" value="${ant.home}" /> | |||
<sysproperty key="build.tests" value="${build.tests}"/> | |||
<sysproperty key="tests-classpath.value" | |||
value="${tests-classpath.value}" /> | |||
<formatter type="brief" usefile="false" /> | |||
<batchtest> | |||
<fileset dir="${tests.dir}"> | |||
<include name="**/*Test*" /> | |||
<!-- abstract classes, not testcases --> | |||
<exclude name="${ant.package}/taskdefs/TaskdefsTest.java" /> | |||
<exclude name="${ant.package}/BuildFileTest.java" /> | |||
<exclude name="${regexp.package}/RegexpMatcherTest.java" /> | |||
<exclude name="${regexp.package}/RegexpTest.java" /> | |||
<exclude name="${optional.package}/AbstractXSLTLiaisonTest.java" /> | |||
<exclude name="${ant.package}/types/AbstractFileSetTest.java" /> | |||
<!-- helper classes, not testcases --> | |||
<exclude name="org/example/**" /> | |||
<exclude name="${ant.package}/taskdefs/TaskdefTest*Task.java" /> | |||
<!-- interactive test --> | |||
<exclude name="${ant.package}/taskdefs/TestProcess.java" /> | |||
<!-- only run these tests if their required libraries are | |||
installed --> | |||
<patternset refid="needs.jdk1.2+" /> | |||
<patternset refid="needs.jdk1.4+" /> | |||
<patternset refid="needs.jakarta.regexp" /> | |||
<patternset refid="needs.jakarta.oro" /> | |||
<patternset refid="needs.vaj" /> | |||
<patternset refid="needs.antlr" /> | |||
<patternset refid="needs.xalan1" /> | |||
<patternset refid="needs.xslp" /> | |||
<patternset refid="needs.jakarta.bcel" /> | |||
<patternset refid="needs.trax" /> | |||
<patternset refid="unsupportedTests" /> | |||
<!-- fails under 1.1 --> | |||
<exclude name="${optional.package}/perforce/P4ChangeTest.java" | |||
unless="jdk1.2+"/> | |||
<!-- tests excluded if the test is run in offline mode --> | |||
<patternset refid="onlinetests"/> | |||
<!-- failing tests excluded unless run.failing.tests is set --> | |||
<patternset refid="teststhatfail" /> | |||
<!-- runtime dependencies that are different from compile | |||
time dependencies --> | |||
<exclude name="${optional.package}/ReplaceRegExpTest.java" | |||
unless="some.regexp.support" /> | |||
<exclude name="${optional.package}/sitraka/*.java" | |||
unless="some.regexp.support" /> | |||
<!-- fail if testcases can be loaded from the system classloader --> | |||
<exclude name="${optional.package}/junit/JUnitClassLoaderTest.java" | |||
if="tests.are.on.system.classpath"/> | |||
<exclude name="${optional.package}/sitraka/XMLReportTest.java" | |||
if="tests.are.on.system.classpath"/> | |||
<!-- these tests need to be localised before being ran???? --> | |||
<exclude name="${optional.package}/PvcsTest.java" /> | |||
<!-- ehm, this is not really a TraX test but rather a xalan2 test..--> | |||
<exclude name="${optional.package}/TraXLiaisonTest.java" | |||
unless="xalan2.present"/> | |||
<!-- needs BSF to work --> | |||
<exclude name="${optional.package}/XalanLiaisonTest.java" | |||
unless="bsf.present" /> | |||
<!-- | |||
XXX need to figure out what's causing this InvocationTargetException | |||
--> | |||
<exclude name="${optional.package}/junit/JUnitTestRunnerTest.java" | |||
unless="jdk1.2+" /> | |||
<!-- DateTime handling seems to be broken in JDK 1.1 --> | |||
<exclude name="${util.package}/DateUtilsTest.java" | |||
unless="jdk1.2+" /> | |||
<!-- misc oneoff tests --> | |||
<exclude name="${optional.package}/JspcTest.java" | |||
unless="jasper.present" /> | |||
<exclude name="${optional.package}/WsdlToDotnetTest.java" | |||
unless="dotnetapps.found" /> | |||
<!-- These tests only passes if testcases and Ant classes have | |||
been loaded by the same classloader - will throw | |||
IllegalAccessExceptions otherwise. --> | |||
<exclude name="${ant.package}/taskdefs/SQLExecTest.java" | |||
unless="tests.and.ant.share.classloader" /> | |||
<exclude name="${optional.package}/sos/SOSTest.java" | |||
unless="tests.and.ant.share.classloader" /> | |||
<exclude name="${optional.package}/TraXLiaisonTest.java" | |||
unless="tests.and.ant.share.classloader" /> | |||
<exclude name="${optional.package}/metamata/MAuditParserTest.java" | |||
unless="tests.and.ant.share.classloader" /> | |||
<!-- can only run if cvs is installed on your machine | |||
enable by setting the property have.cvs | |||
--> | |||
<exclude name="${ant.package}/taskdefs/AbstractCvsTaskTest.java" | |||
unless="have.cvs" /> | |||
</fileset> | |||
</batchtest> | |||
</junit> | |||
</target> | |||
<target name="run-single-test" if="testcase" depends="compile-tests" | |||
description="--> runs the single unit test defined in the testcase property"> | |||
<junit printsummary="${junit.summary}" | |||
haltonfailure="yes" | |||
fork="${junit.fork}" | |||
filtertrace="${junit.filtertrace}"> | |||
<!-- <jvmarg value="-classic"/> --> | |||
<sysproperty key="ant.home" value="${ant.home}" /> | |||
<sysproperty key="build.tests" value="${build.tests}"/> | |||
<sysproperty key="tests-classpath.value" | |||
value="${tests-classpath.value}" /> | |||
<classpath refid="classes.zip" /> | |||
<classpath refid="tests-classpath"/> | |||
<formatter type="plain" usefile="false" /> | |||
<test name="${testcase}" /> | |||
</junit> | |||
</target> | |||
<target name="clean"> | |||
<delete dir="${bin.dir}/ant1src_copy"/> | |||
<delete dir="${bin.dir}/ant1compat"/> | |||
<delete dir="${tests.etc.dir}"/> | |||
</target> | |||
</project> |
@@ -1,9 +0,0 @@ | |||
<project name="mutant-bootstrap" default="main" basedir=".."> | |||
<target name="main"> | |||
<style in="build.xml" out="src/java/bootstrap/org/apache/ant/builder/MutantBuilder.java" | |||
style="build/bootstrap.xsl"/> | |||
<style in="build/ant1compat.xml" out="src/java/bootstrap/org/apache/ant/builder/Ant1CompatBuilder.java" | |||
style="build/bootstrap.xsl"/> | |||
</target> | |||
</project> | |||
@@ -1,198 +0,0 @@ | |||
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> | |||
<xsl:strip-space elements="*"/> | |||
<xsl:output method="text" omit-xml-declaration="yes"/> | |||
<xsl:template match="project"> | |||
<xsl:text>package org.apache.ant.builder; </xsl:text> | |||
<xsl:text>public class </xsl:text> | |||
<xsl:value-of select="attribute::name"/> | |||
<xsl:text>Builder { </xsl:text> | |||
<xsl:text> protected void _init(BuildHelper helper) { </xsl:text> | |||
<xsl:apply-templates select="property"/> | |||
<xsl:apply-templates select="path"/> | |||
<xsl:text> } </xsl:text> | |||
<xsl:apply-templates select="target"/> | |||
<xsl:text>} </xsl:text> | |||
</xsl:template> | |||
<xsl:template match="property"> | |||
<xsl:text> helper.setProperty("</xsl:text> | |||
<xsl:value-of select="attribute::name"/> | |||
<xsl:text>", "</xsl:text> | |||
<xsl:value-of select="attribute::value"/> | |||
<xsl:text>"); </xsl:text> | |||
</xsl:template> | |||
<xsl:template match="antcall"> | |||
<xsl:text> { </xsl:text> | |||
<xsl:text> BuildHelper subHelper = new BuildHelper(); </xsl:text> | |||
<xsl:for-each select="param"> | |||
<xsl:text> subHelper.setProperty("</xsl:text> | |||
<xsl:value-of select="attribute::name"/> | |||
<xsl:text>", helper.resolve("</xsl:text> | |||
<xsl:value-of select="attribute::value"/> | |||
<xsl:text>")); </xsl:text> | |||
</xsl:for-each> | |||
<xsl:text> subHelper.setParent(helper); </xsl:text> | |||
<xsl:text> _init(subHelper); </xsl:text> | |||
<xsl:text> </xsl:text> | |||
<xsl:value-of select="attribute::target"/> | |||
<xsl:text>(subHelper); </xsl:text> | |||
<xsl:text> } </xsl:text> | |||
</xsl:template> | |||
<xsl:template match="echo"> | |||
</xsl:template> | |||
<xsl:template match="path"> | |||
<xsl:text> helper.createPath("</xsl:text> | |||
<xsl:variable name="pathName" select="attribute::id"/> | |||
<xsl:value-of select="$pathName"/> | |||
<xsl:text>"); </xsl:text> | |||
<xsl:for-each select="fileset"> | |||
<xsl:text> </xsl:text> | |||
<xsl:text>helper.addFileSetToPath("</xsl:text> | |||
<xsl:value-of select="$pathName"/> | |||
<xsl:text>", </xsl:text> | |||
<xsl:text> "</xsl:text> | |||
<xsl:value-of select="attribute::dir"/> | |||
<xsl:text>", </xsl:text> | |||
<xsl:choose> | |||
<xsl:when test="attribute::includes"> | |||
<xsl:text>"</xsl:text> | |||
<xsl:value-of select="attribute::includes"/> | |||
<xsl:text>"</xsl:text> | |||
</xsl:when> | |||
<xsl:otherwise> | |||
<xsl:text>null</xsl:text> | |||
</xsl:otherwise> | |||
</xsl:choose> | |||
<xsl:text>); </xsl:text> | |||
</xsl:for-each> | |||
<xsl:for-each select="pathelement"> | |||
<xsl:text> </xsl:text> | |||
<xsl:text>helper.addPathElementToPath("</xsl:text> | |||
<xsl:value-of select="$pathName"/> | |||
<xsl:text>", "</xsl:text> | |||
<xsl:value-of select="attribute::location"/> | |||
<xsl:text>"); </xsl:text> | |||
</xsl:for-each> | |||
<xsl:for-each select="path"> | |||
<xsl:text> </xsl:text> | |||
<xsl:text>helper.addPathToPath("</xsl:text> | |||
<xsl:value-of select="$pathName"/> | |||
<xsl:text>", "</xsl:text> | |||
<xsl:value-of select="attribute::refid"/> | |||
<xsl:text>"); </xsl:text> | |||
</xsl:for-each> | |||
</xsl:template> | |||
<xsl:template match="target"> | |||
<xsl:text> protected void </xsl:text> | |||
<xsl:value-of select="translate(attribute::name, '-', '_')"/> | |||
<xsl:text>(BuildHelper helper) { </xsl:text> | |||
<xsl:text> helper.runDepends(this, "</xsl:text> | |||
<xsl:value-of select="translate(attribute::name, '-', '_')"/> | |||
<xsl:text>", "</xsl:text> | |||
<xsl:value-of select="translate(attribute::depends, '-', '_')"/> | |||
<xsl:text>"); </xsl:text> | |||
<xsl:text> System.out.println("</xsl:text> | |||
<xsl:value-of select="attribute::name"/> | |||
<xsl:text>: "); </xsl:text> | |||
<xsl:apply-templates/> | |||
<xsl:text> } </xsl:text> | |||
</xsl:template> | |||
<xsl:template match="mkdir"> | |||
<xsl:text> helper.mkdir("</xsl:text> | |||
<xsl:value-of select="attribute::dir"/> | |||
<xsl:text>"); </xsl:text> | |||
</xsl:template> | |||
<xsl:template match="javac"> | |||
<xsl:text> helper.javac("</xsl:text> | |||
<xsl:value-of select="attribute::srcdir"/> | |||
<xsl:text>", "</xsl:text> | |||
<xsl:value-of select="attribute::destdir"/> | |||
<xsl:text>", </xsl:text> | |||
<xsl:choose> | |||
<xsl:when test="classpath"> | |||
<xsl:text>"</xsl:text> | |||
<xsl:value-of select="classpath/attribute::refid"/> | |||
<xsl:text>"</xsl:text> | |||
</xsl:when> | |||
<xsl:otherwise> | |||
<xsl:text>null</xsl:text> | |||
</xsl:otherwise> | |||
</xsl:choose> | |||
<xsl:text>); </xsl:text> | |||
</xsl:template> | |||
<xsl:template match="jar"> | |||
<xsl:text> helper.jar("</xsl:text> | |||
<xsl:value-of select="attribute::basedir"/> | |||
<xsl:text>", "</xsl:text> | |||
<xsl:value-of select="attribute::jarfile"/> | |||
<xsl:text>", </xsl:text> | |||
<xsl:choose> | |||
<xsl:when test="metainf"> | |||
<xsl:text>"</xsl:text> | |||
<xsl:value-of select="metainf/attribute::dir"/> | |||
<xsl:text>", </xsl:text> | |||
<xsl:choose> | |||
<xsl:when test="metainf/attribute::includes"> | |||
<xsl:text>"</xsl:text> | |||
<xsl:value-of select="metainf/attribute::includes"/> | |||
<xsl:text>", </xsl:text> | |||
</xsl:when> | |||
<xsl:otherwise> | |||
<xsl:text>null, </xsl:text> | |||
</xsl:otherwise> | |||
</xsl:choose> | |||
</xsl:when> | |||
<xsl:otherwise> | |||
<xsl:text>null, null, </xsl:text> | |||
</xsl:otherwise> | |||
</xsl:choose> | |||
<xsl:choose> | |||
<xsl:when test="manifest/attribute[attribute::name='Class-Path']"> | |||
<xsl:text>"</xsl:text> | |||
<xsl:value-of select="manifest/attribute[attribute::name='Class-Path']/attribute::value"/> | |||
<xsl:text>", </xsl:text> | |||
</xsl:when> | |||
<xsl:otherwise>null, </xsl:otherwise> | |||
</xsl:choose> | |||
<xsl:choose> | |||
<xsl:when test="manifest/attribute[attribute::name='Main-Class']"> | |||
<xsl:text>"</xsl:text> | |||
<xsl:value-of select="manifest/attribute[attribute::name='Main-Class']/attribute::value"/> | |||
<xsl:text>"</xsl:text> | |||
</xsl:when> | |||
<xsl:otherwise>null</xsl:otherwise> | |||
</xsl:choose> | |||
<xsl:text>); </xsl:text> | |||
</xsl:template> | |||
<xsl:template match="copy/fileset"> | |||
<xsl:choose> | |||
<xsl:when test="attribute::refid"> | |||
<xsl:text> helper.copyFilesetRef("</xsl:text> | |||
<xsl:value-of select="attribute::refid"/> | |||
<xsl:text>", "</xsl:text> | |||
<xsl:value-of select="../attribute::todir"/> | |||
<xsl:text>"); </xsl:text> | |||
</xsl:when> | |||
<xsl:otherwise> | |||
<xsl:text> helper.copyFileset("</xsl:text> | |||
<xsl:value-of select="attribute::dir"/> | |||
<xsl:text>", "</xsl:text> | |||
<xsl:value-of select="../attribute::todir"/> | |||
<xsl:text>"); </xsl:text> | |||
</xsl:otherwise> | |||
</xsl:choose> | |||
</xsl:template> | |||
</xsl:stylesheet> |
@@ -1,49 +0,0 @@ | |||
<project name="build-site" default="docs" basedir=".."> | |||
<!-- Initialization properties --> | |||
<property name="project.name" value="mutant"/> | |||
<property name="docs.src" location="xdocs"/> | |||
<property name="docs.dest" location="docs"/> | |||
<property name="project.file" value="stylesheets/project.xml" /> | |||
<property name="site.dir" location="../../../jakarta-site2" /> | |||
<property name="templ.path" location="xdocs/stylesheets" /> | |||
<property name="velocity.props" location="${docs.src}/velocity.properties" /> | |||
<path id="anakia.classpath"> | |||
<fileset dir="${site.dir}/lib"> | |||
<include name="*.jar"/> | |||
</fileset> | |||
</path> | |||
<target name="prepare"> | |||
<available classname="org.apache.velocity.anakia.AnakiaTask" | |||
property="AnakiaTask.present"> | |||
<classpath refid="anakia.classpath"/> | |||
</available> | |||
</target> | |||
<target depends="prepare" name="prepare-error" unless="AnakiaTask.present"> | |||
<echo> | |||
AnakiaTask is not present! Please check to make sure that | |||
velocity.jar is in your classpath. | |||
</echo> | |||
</target> | |||
<target name="docs" depends="prepare-error" if="AnakiaTask.present"> | |||
<taskdef name="anakia" classname="org.apache.velocity.anakia.AnakiaTask"> | |||
<classpath refid="anakia.classpath"/> | |||
</taskdef> | |||
<anakia basedir="${docs.src}" destdir="${docs.dest}/" | |||
extension=".html" style="./site.vsl" | |||
projectFile="${project.file}" | |||
excludes="**/stylesheets/** faq.xml" | |||
includes="**/*.xml" | |||
lastModifiedCheck="true" | |||
templatePath="${templ.path}" | |||
velocityPropertiesFile="${velocity.props}"> | |||
</anakia> | |||
</target> | |||
<target name="all" depends="docs"/> | |||
</project> |
@@ -1,51 +0,0 @@ | |||
<project default="build" name="Ant2 script tasks" basedir=".."> | |||
<property name="src.dir" value="src"/> | |||
<property name="lib.dir" value="lib"/> | |||
<property name="java.dir" value="${src.dir}/java"/> | |||
<property name="bin.dir" value="bin"/> | |||
<property name="dist.dir" value="dist"/> | |||
<property name="javadocs.dir" value="${dist.dir}/javadocs"/> | |||
<property name="distlib.dir" value="${dist.dir}/lib"/> | |||
<property name="debug" value="true"/> | |||
<property name="ant.package" value="org/apache/tools/ant"/> | |||
<property name="optional.package" value="${ant.package}/taskdefs/optional"/> | |||
<property name="optional.type.package" value="${ant.package}/types/optional"/> | |||
<property name="util.package" value="${ant.package}/util"/> | |||
<property name="regexp.package" value="${util.package}/regexp"/> | |||
<path id="classpath.script"> | |||
<pathelement location="${distlib.dir}/init.jar"/> | |||
<fileset dir="${lib.dir}/antlib/script" includes="*.jar"/> | |||
<pathelement location="${distlib.dir}/common/common.jar"/> | |||
</path> | |||
<target name="check_bsf"> | |||
<available property="bsf.present" | |||
classname="com.ibm.bsf.BSFManager" | |||
classpathref="classpath.script" /> | |||
</target> | |||
<target name="nobsf" unless="bsf.present"> | |||
<echo message="You must provide the bsf.jar library in the ${lib.dir}/antlib/script directory"/> | |||
</target> | |||
<target name="build" depends="check_bsf, nobsf" if="bsf.present"> | |||
<mkdir dir="${bin.dir}/antlibs/script"/> | |||
<mkdir dir="${distlib.dir}/antlibs"/> | |||
<depend destdir="${bin.dir}/antlibs/script" srcdir="${java.dir}/antlibs/script" closure="yes"> | |||
<classpath refid="classpath.script"/> | |||
</depend> | |||
<javac destdir="${bin.dir}/antlibs/script" srcdir="${java.dir}/antlibs/script" debug="${debug}"> | |||
<classpath refid="classpath.script"/> | |||
</javac> | |||
<jar basedir="${bin.dir}/antlibs/script" jarfile="${distlib.dir}/antlibs/script.tsk"> | |||
<metainf dir="${java.dir}/antlibs/script" | |||
includes="antlib.xml"/> | |||
</jar> | |||
</target> | |||
</project> |
@@ -1,657 +0,0 @@ | |||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> | |||
<!-- Content Stylesheet for Site --> | |||
<!-- start the processing --> | |||
<html> | |||
<head> | |||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/> | |||
<meta name="author" value="Conor MacNeill"> | |||
<meta name="email" value=""> | |||
<title>Mutant Proposal - Mutant Design Notes</title> | |||
</head> | |||
<body bgcolor="#ffffff" text="#000000" link="#525D76"> | |||
<table border="0" width="100%" cellspacing="0"> | |||
<!-- TOP IMAGE --> | |||
<tr> | |||
<td colspan="2"> | |||
<a href="http://jakarta.apache.org"><img src="http://jakarta.apache.org/images/jakarta-logo.gif" align="left" border="0"/></a> | |||
</td> | |||
</tr> | |||
</table> | |||
<table border="0" width="100%" cellspacing="4"> | |||
<tr><td colspan="2"> | |||
<hr noshade="" size="1"/> | |||
</td></tr> | |||
<tr> | |||
<!-- LEFT SIDE NAVIGATION --> | |||
<td valign="top" nowrap="true"> | |||
<p><strong>Mutant Proposal</strong></p> | |||
<ul> | |||
<li> <a href="./index.html">Introduction</a> | |||
</li> | |||
<li> <a href="./goals.html">Design Goals</a> | |||
</li> | |||
<li> <a href="./features.html">User Features</a> | |||
</li> | |||
<li> <a href="./developers.html">Task Developers</a> | |||
</li> | |||
<li> <a href="./design.html">Design Description</a> | |||
</li> | |||
</ul> | |||
</td> | |||
<td align="left" valign="top"> | |||
<table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
<tr><td bgcolor="#525D76"> | |||
<font color="#ffffff" face="arial,helvetica,sanserif"> | |||
<a name="Mutant Design Notes"><strong>Mutant Design Notes</strong></a> | |||
</font> | |||
</td></tr> | |||
<tr><td> | |||
<blockquote> | |||
<p> | |||
This is a brief, albeit rambling description of Mutant. | |||
Mutant has many experimental ideas which may or may not prove useful. | |||
I'll try to describe what is there and let anyone who is interested | |||
comment. Mutant is still immature. You'll notice that there is, at this | |||
time, just one task, a hacked version of the echo task, which I have | |||
been using to test out ideas. Most tasks would end up being pretty | |||
similar to their Ant 1.x version. | |||
</p> | |||
<p> | |||
OK, let me start with some of the motivating requirements. There are of | |||
coure many Ant2 requirements but I want to focus on these two for now. | |||
Mutant does also address many of the other Ant2 requirements. | |||
</p> | |||
<p> | |||
I'll use the terms Ant and mutant somewhat interchangeably - just | |||
habit, not an assumption of any sort. | |||
</p> | |||
<p> | |||
One of the things which is pretty difficult in Ant 1.x is the | |||
management of classpaths and classloaders. For example, today the | |||
antlr task requires the antlr classes in the classpath used to start | |||
ant. I'm talking here about the classpath built up in the ant.bat/ant | |||
script launchers. At the same time, the checkstyle task | |||
which uses antlr won't run if the antlr classes are in the classpath | |||
because then those classes cannot "see" the classes in the taskdef's | |||
classpath. | |||
</p> | |||
<p> | |||
Another requirement I have is extensibility. In Ant 1.x this is | |||
difficult because whenever a new type is created, each task which | |||
needs to support this type must be changed to provide the new addXXX | |||
method. The ejbjar task is on example of this problem with its concept of vendor | |||
specific tools. The zip/jar task, with its support for different types | |||
of fileset, is another. The addition of the classfileset to Ant requires | |||
a change to the zip task. | |||
</p> | |||
</blockquote> | |||
</td></tr> | |||
</table> | |||
<table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
<tr><td bgcolor="#525D76"> | |||
<font color="#ffffff" face="arial,helvetica,sanserif"> | |||
<a name="Mutant Initialization"><strong>Mutant Initialization</strong></a> | |||
</font> | |||
</td></tr> | |||
<tr><td> | |||
<blockquote> | |||
<p> | |||
Mutant defines a classloader hierarchy somewhat similar to that used | |||
in Tomcat 4. Tasks join into this hierarchy at a particular point to | |||
ensure they have visibility of the necessary interface classes and no | |||
visibility of the Ant core itself. There is nothing particularly novel | |||
about this approach, but tasks are able to request certain additional resources | |||
as we will see later. | |||
</p> | |||
<p> | |||
Mutant starts with two jars. One is the start.jar which contains just | |||
one class, Main.java which establishes the initial configuration and | |||
then runs the appropriate front end command line class. If a different | |||
front end was desired, a different launch class, in its own jar, would | |||
be used. This would perhaps configure the classloader hierarchy somewhat | |||
differently and start the approriate GUI front end class. | |||
</p> | |||
<p> | |||
The second jar, init.jar, provides a number of initialisation utilities. These | |||
are used by Main.java to setup Ant and would also be used by any other front end | |||
to configure Ant. The important class here is the | |||
InitConfig which communicates the state of Ant at startup into the the core of | |||
Ant when it starts up. Main determines the location of ANT_HOME based on the | |||
location of the start classes and then populates the InitConfig with both | |||
classloaders and information about the location of various jars and config | |||
files. | |||
</p> | |||
<p> | |||
At the top of the classloader hierarchy | |||
are the bootstrap and system classloaders. I won't really | |||
distinguish between these in mutant. Combined they provide the JDK | |||
classes, plus the classes from the init and start jars. One objective is | |||
to keep the footprint of the init and start jars small so they do not | |||
require any external classes, which may then become visible lower in the | |||
hierarchy. Main does not explicitly create these loaders, of course, but | |||
just adds a reference to the init config as system class loader | |||
</p> | |||
<p> | |||
The next jar is for the common area. This provides interface definitions | |||
and utility classes for use by both the core and by tasks/types etc. It | |||
is loaded from ANT_HOME/lib/common/*.jar. Typically this is just | |||
lib/common/common.jar but any other jars in here are loaded. This | |||
pattern is used in the construction of all of the classloaders. | |||
</p> | |||
<p> | |||
Next up is the core loader. It includes the lib/antcore/antcore.jar plus | |||
any others including the XML parser jars. Mutant's core does not assume that | |||
the project model will come from an XML description but XML facilities | |||
are needed in the core for reading in Ant library defs and config files. | |||
The parser jar locations are also stored in the init config. This lets | |||
the jars be added to any Ant library that wants to use Ant's XML parser | |||
rather than providing its own. Similarly tools.jar's location is | |||
determined automatically and added to the config for use by tasks which | |||
request it. I'll go into more detail when discussing the antlib processing. | |||
</p> | |||
<p> | |||
The final jar that is loaded is the jar for the frontend - cli.jar. This | |||
is not passed in init config since these classes are not visible to the | |||
core and are not needed by it. So the hierarchy is | |||
<pre> | |||
jdk classes | |||
| | |||
start/init | |||
| | |||
common | |||
| | |||
antcore | |||
| | |||
cli | |||
</pre> | |||
</p> | |||
<p> | |||
Task classloaders generally will come in at common, hiding the core classes, front | |||
end and XML parser classes from tasks. | |||
</p> | |||
<p> | |||
Once Main has setup the initConfig, it creates the front end commandline | |||
class and launches mutant proper, passing it the command line args and | |||
the init config. | |||
</p> | |||
<p> | |||
A GUI would typically replace start.jar and the cli.jar with its own | |||
versions which manage model construction from GUI processes rather than | |||
from XML files. It may be possible to move some of Main.java's | |||
processing into init.jar if it is useful to other front ends. I haven't | |||
looked at that balance. | |||
</p> | |||
</blockquote> | |||
</td></tr> | |||
</table> | |||
<table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
<tr><td bgcolor="#525D76"> | |||
<font color="#ffffff" face="arial,helvetica,sanserif"> | |||
<a name="Mutant Frontend"><strong>Mutant Frontend</strong></a> | |||
</font> | |||
</td></tr> | |||
<tr><td> | |||
<blockquote> | |||
<p> | |||
The front end is responsible for coordinating execution of Ant. It | |||
manages command line arguments, builds a model of the Project to be | |||
evaluated and coordinates the execution services of the core. cli.jar | |||
contains not only the front-end code but also the XML parsing code for | |||
building a project model from an XML description. Other front ends may | |||
choose to build project models in different ways. Commandline is pretty | |||
similar to Ant 1.x's Main.java - it handles arguments, building loggers, | |||
listeners, defines, etc - actually I haven't fully implemented | |||
command line defines in | |||
mutant yet but it would be similar to Ant 1.x. | |||
</p> | |||
<p> | |||
Commandline then moves to building a project model from the XML | |||
representation. I have just expanded the approach in Ant 1's | |||
ProjectHelper for XML parsing, moving away from a stack of inner classes. | |||
The classes in the front end XML parsing use some XML utility base | |||
classes from the core. | |||
</p> | |||
<p> | |||
The XML parsing handles two elements at parse time. One is the <ref> | |||
element which is used for project references - that is relationships | |||
between project files. The referenced project is parsed as well. The | |||
second is the <include> element which includes either another complete | |||
project or a project <fragment> directly into the project. All the other | |||
elements are used to build a project model which is later processed in | |||
the core. | |||
</p> | |||
<p> | |||
The project model itself is organized like this | |||
</p> | |||
<p> | |||
<ul> | |||
<li>A project contains</li> | |||
<ul> | |||
<li>named references to other projects</li> | |||
<li>targets</li> | |||
<li>build elements (tasks, type instances)</li> | |||
</ul> | |||
<li>A target contains</li> | |||
<ul> | |||
<li>build elements (tasks, type instances)</li> | |||
</ul> | |||
<li>A build element contains</li> | |||
<ul> | |||
<li>build elements (nested elements)</li> | |||
</ul> | |||
</ul> | |||
</p> | |||
<p> | |||
So, for now the project model contains top level tasks and type | |||
instances. I'm still thinking about those and property scoping | |||
especially in the face of project refs and property overrides. Anyway, | |||
the running of these tasks is currently disabled. | |||
</p> | |||
<p> | |||
Once the model is built, the commandline creates an execution manager | |||
instance, passing it the initConfig built by Main.jar. It adds build | |||
listeners and then starts the build using the services of the | |||
ExecutionManager. | |||
</p> | |||
</blockquote> | |||
</td></tr> | |||
</table> | |||
<table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
<tr><td bgcolor="#525D76"> | |||
<font color="#ffffff" face="arial,helvetica,sanserif"> | |||
<a name="Ant Libraries"><strong>Ant Libraries</strong></a> | |||
</font> | |||
</td></tr> | |||
<tr><td> | |||
<blockquote> | |||
<p> | |||
Before we get into execution proper, I'll deal with the structure of an | |||
ant library and how it works. An antlibrary is a jar file with a library | |||
descriptor located in META-INF/antlib.xml. This defines what | |||
typedefs/taskdefs/converters the library makes available to Ant. The | |||
classes or at least some of the classes for the library will normally be | |||
available in the jar. The descriptor looks like this (I'll provide two | |||
examples here) | |||
</p> | |||
<p> | |||
<pre> | |||
<antlib libid="ant.io" | |||
home="http://jakarta.apache.org/ant" | |||
isolated="true"> | |||
<typedef name="thread" classname="java.lang.Thread"/> | |||
<taskdef name="echo" classname="org.apache.ant.taskdef.io.Echo"/> | |||
<converter classname="org.apache.ant.taskdef.io.FileConverter"/> | |||
</antlib> | |||
<antlib libid="ant.file" | |||
home="http://jakarta.apache.org/ant" | |||
reqxml="true" reqtools="true" extends="ant.io" | |||
isolated="true"> | |||
<taskdef name="copy" classname="org.apache.ant.file.copy"/> | |||
</antlib> | |||
</pre> | |||
</p> | |||
<p> | |||
the "libid" attribute is used to globally identify a library. It is used | |||
in Ant to pick which tasks you want to make available to a build file. | |||
As the number of tasks available goes up, this is used to prevent name | |||
collisions, etc. The name is constructed similarly to a Java package name - | |||
i.e Reverse DNS order. | |||
</p> | |||
<p> | |||
The "home" attribute is a bit of fluff unused by mutant to allow tools | |||
to manage libraries and update them etc. More thought could go into | |||
this. | |||
</p> | |||
<p> | |||
"reqxml" allows a library to say that it wants to use Ant's XML parser | |||
classes. Note that these will be coming from the library's classloader | |||
so they will not, in fact, be the same runtime classes as used in Ant's core, | |||
but it saves tasks packaging their own XML parsers. | |||
</p> | |||
<p> | |||
"reqtools" allows a library to specify that it uses classes from Sun's | |||
tools.jar file. Again, if tools.jar is available it will be added to the | |||
list of classes in the library's classloader | |||
</p> | |||
<p> | |||
"extends" allows for a single "inheritance" style relationship between | |||
libraries. I'm not sure how useful this may be yet but it seems | |||
important for accessing common custom types. It basically translates | |||
into the class loader for this library using the one identified in | |||
extends as its parent. | |||
</p> | |||
<p> | |||
"isolate" specifies that each task created from this libary comes from | |||
its own classloader. This can be used with tasks derived from Java | |||
applications which have static initialisers. This used to be an issue | |||
with the Anakia task, for example. Similarly it could be used to ensure that | |||
tool.jar classes are unloaded to stop memory leaks. Again this is | |||
experimental so may not prove ultimately useful. | |||
</p> | |||
<p> | |||
The <typedef> in the example creates a <thread> type. That is just a bit of fun which | |||
I'll use in an example later. It does show the typedefing of a type from | |||
outside the ant library however. | |||
</p> | |||
<p> | |||
<taskdef> is pretty obvious. It identifies a taskname with a class from | |||
the library. The import task, which I have not yet implemented will | |||
allow this name to be aliased - something like | |||
</p> | |||
<p> | |||
<import libid="ant.file" task="echo" alias="antecho"/> | |||
</p> | |||
<p> | |||
Tasks are not made available automatically. The build file must state | |||
which tasks it wants to use using an <import> task. This is similar to | |||
Java's import statement. Similarly classes whose ids start with "ant." | |||
are fully imported at the start of execution. | |||
</p> | |||
</blockquote> | |||
</td></tr> | |||
</table> | |||
<table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
<tr><td bgcolor="#525D76"> | |||
<font color="#ffffff" face="arial,helvetica,sanserif"> | |||
<a name="Mutant Configuration"><strong>Mutant Configuration</strong></a> | |||
</font> | |||
</td></tr> | |||
<tr><td> | |||
<blockquote> | |||
<p> | |||
When mutant starts execution, it reads in a config file. Actually it | |||
attempts to read two files, one from $ANT_HOME/conf/antconfig.xml and | |||
another from $HOME/.ant/antconfig.xml. Others could be added even | |||
specified in the command line. These config files are used to provide | |||
two things - libpaths and task dirs. | |||
</p> | |||
<p> | |||
Taskdirs are locations to search for additional ant libraries. As people | |||
bundle Ant tasks and types with their products, it will not be practical | |||
to bundle all this into ANT_HOME/lib. These additional dirs are scanned | |||
for ant libraries. All .zip/.jar/.tsk files which contain the | |||
META-INF/antlib.xml file will be processed. | |||
</p> | |||
<p> | |||
Sometimes, of course, the tasks and the libraries upon which they depend | |||
are not produced by the same people. It is not feasible to go in and | |||
edit manifests to connect the ant library with its required support | |||
jars, so the libpath element in the config file is used to specify | |||
additional paths to be added to a library's classloader. An example | |||
config would be | |||
</p> | |||
<p> | |||
<pre> | |||
<antconfig> | |||
<libpath libid="ant.file" path="fubar"/> | |||
<libpath libid="ant.file" url="http://fubar"/> | |||
</antconfig> | |||
</pre> | |||
</p> | |||
<p> | |||
Obviously other information can be added to the config - standard | |||
property values, compiler prefs, etc. I haven't done that yet. User | |||
level config override system level configs. | |||
</p> | |||
<p> | |||
So, when a ant library creates a classloader, it will take a number of | |||
URLS. One is the task library itself, the XML parser classes if | |||
requested, the tools.jar if requested, and any additional libraries | |||
specified in the <antconfig>. The parent loader is the common loader | |||
from the initconfig. unless this library is an extending library. | |||
</p> | |||
</blockquote> | |||
</td></tr> | |||
</table> | |||
<table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
<tr><td bgcolor="#525D76"> | |||
<font color="#ffffff" face="arial,helvetica,sanserif"> | |||
<a name="Mutant Execution"><strong>Mutant Execution</strong></a> | |||
</font> | |||
</td></tr> | |||
<tr><td> | |||
<blockquote> | |||
<p> | |||
Execution of a build is provided by the core through two key classes. | |||
One if the ExecutionManager and the other is the ExecutionFrame. An | |||
execution frame is created for each project in the project model | |||
hierarchy. It represents the execution state of the project - data | |||
values, imported tasks, typedefs, taskdefs, etc. | |||
</p> | |||
<p> | |||
The ExecutionManager begins by reading configs, searching for ant | |||
libraries, configuring and appending any additional paths, etc. It then | |||
creates a root ExecutionFrame which represents the root project. when a | |||
build is commenced, the project model is validated and then passed to | |||
the ExecutionFrame. | |||
</p> | |||
<p> | |||
the ExecutionFrame is the main execution class. When it is created it | |||
imports all ant libraries with ids that start with ant.*. All others are | |||
available but must be explicitly imported with <import> tasks. When the | |||
project is passed in, ExecutionFrames are created for any referenced | |||
projects. This builds an ExecutionFrame hierarchy which parallels the | |||
project hierarchy. Each <ref> uses a name to identify the referenced | |||
project. All property and target references use these reference names to | |||
identify the particular frame that hold the data. As an example, look at | |||
this build file | |||
</p> | |||
<p> | |||
<pre> | |||
<project default="test" basedir=".." doc:Hello="true"> | |||
<ref project="test.ant" name="reftest"/> | |||
<target name="test" depends="reftest:test2"> | |||
<echo message="hello"/> | |||
</target> | |||
</project> | |||
</pre> | |||
</p> | |||
<p> | |||
Notice the depends reference to the test2 target in the test.ant project | |||
file. I am still using the ":" as a separator for refs. It doesn't | |||
collide with XML namespaces so that should be OK. | |||
</p> | |||
<p> | |||
Execution proceeds by determining the targets in the various frames | |||
which need to be executed. The appropriate frame is requested to execute | |||
the target's tasks and type instances. The imports for the frame are | |||
consulted to determine what is the approrpiate library and class from | |||
that library. A classloader is fetched, the class is instantiated, | |||
introspected and then configured from the corresponding part of the | |||
project model. Ant 1.x's IntrospectionHelper has been split into two - | |||
the ClassIntrospector and the Reflector. When the task is being | |||
configured, the context classloader is set. Similarly it is set when the | |||
task is being executed. Types are handled similarly. When a type in | |||
instantiated or a task executed, and they support the appropriate | |||
interface, they will be passed a context through which they can access | |||
the services of the core. Currently the context is an interface although | |||
I have wondered if an abstract class may be better to handle expansion | |||
of the services available over time. | |||
</p> | |||
</blockquote> | |||
</td></tr> | |||
</table> | |||
<table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
<tr><td bgcolor="#525D76"> | |||
<font color="#ffffff" face="arial,helvetica,sanserif"> | |||
<a name="Introspection and Polymorphism"><strong>Introspection and Polymorphism</strong></a> | |||
</font> | |||
</td></tr> | |||
<tr><td> | |||
<blockquote> | |||
<p> | |||
Introspection is not a lot different from Ant 1.x. After some thought I | |||
have dropped the createXXX method to allow for polymorphic type support, discussed | |||
below. setXXX methods, coupled with an approriate string to | |||
type converter are used for attributes. addXXX methods are used for | |||
nested elements. All of the value setting has been moved to a Reflector | |||
object. Object creation for addXXX methods is no longer provided in the | |||
reflector class, just the storage of the value. This allows support for | |||
add methods defined in terms of interfaces. For example, the hacked Echo | |||
task I am using has this definition | |||
</p> | |||
<p> | |||
<pre> | |||
/** | |||
* testing | |||
* | |||
* @param runnable testing | |||
*/ | |||
public void addRun(Runnable runnable) { | |||
log("Adding runnable of type " | |||
+ runnable.getClass().getName(), MessageLevel.MSG_WARN); | |||
} | |||
</pre> | |||
</p> | |||
<p> | |||
So when mutant encounteres a nested element it does the following checks | |||
</p> | |||
<p> | |||
Is the value specified by reference? | |||
</p> | |||
<p> | |||
<run ant:refid="test"/> | |||
</p> | |||
<p> | |||
Is it specified by as a polymorphic type? | |||
</p> | |||
<p> | |||
<run ant:type="thread"/> | |||
</p> | |||
<p> | |||
or is it just a normal run o' the mill nested element, which is | |||
instantiated by a zero arg constructor. | |||
</p> | |||
<p> | |||
Note the use of the ant namespace for the metadata. In essence the | |||
nested element name <run> identifies the add method to be used, while | |||
the refId or type elements specify the actual instance or type to be | |||
used. The ant:type identifies an Ant datatype to be instantiated. If | |||
neither is specified, the type that is expected by the identified | |||
method, addRun in this case, is used to create an instance. In this case | |||
that would fail. | |||
</p> | |||
<p> | |||
Polymorphism, coupled with typedefs is one way, and a good way IMHO, of | |||
solving the extensibility of tasks such as ejbjar. | |||
</p> | |||
<p> | |||
OK, that is about the size of it. Let me finish with two complete build | |||
files and the result of running mutant on them. | |||
</p> | |||
<h3>build.ant</h3> | |||
<p> | |||
<pre> | |||
<project default="test" basedir=".." doc:Hello="true"> | |||
<ref project="test.ant" name="reftest"/> | |||
<target name="test" depends="reftest:test2"> | |||
<echo message="hello"/> | |||
</target> | |||
</project> | |||
</pre> | |||
</p> | |||
<h3>test.ant</h3> | |||
<p> | |||
<pre> | |||
<project default="test" basedir="." doc:Hello="true"> | |||
<target name="test2"> | |||
<thread ant:id="testit"/> | |||
<echo message="hello2"> | |||
<run ant:refid="testit"> | |||
</run> | |||
</echo> | |||
<echo message="hello3"> | |||
<run ant:type="thread"> | |||
</run> | |||
</echo> | |||
</target> | |||
</project> | |||
</pre> | |||
</p> | |||
<p> | |||
If I run mutant via a simple script which has just one line | |||
</p> | |||
<p> | |||
java -jar /home/conor/dev/mutant/dist/lib/start.jar $* | |||
</p> | |||
<p> | |||
I get this | |||
</p> | |||
<p> | |||
<pre> | |||
test2: | |||
[echo] Adding runnable of type java.lang.Thread | |||
[echo] hello2 | |||
[echo] Adding runnable of type java.lang.Thread | |||
[echo] hello3 | |||
test: | |||
[echo] hello | |||
BUILD SUCCESSFUL | |||
Total time: 0 seconds | |||
</pre> | |||
</p> | |||
<p> | |||
Lets change the <run> definition to | |||
</p> | |||
<p> | |||
<run/> in test.ant and the result becomes | |||
</p> | |||
<p> | |||
<pre> | |||
test2: | |||
[echo] Adding runnable of type java.lang.Thread | |||
[echo] hello2 | |||
BUILD FAILED | |||
/home/conor/dev/mutant/test/test.ant:10: | |||
No element can be created for nested element <run>. | |||
Please provide a value by reference or specify the value type | |||
</pre> | |||
</p> | |||
</blockquote> | |||
</td></tr> | |||
</table> | |||
</td> | |||
</tr> | |||
<!-- FOOTER --> | |||
<tr><td colspan="2"> | |||
<hr noshade="" size="1"/> | |||
</td></tr> | |||
<tr><td colspan="2"> | |||
<div align="center"><font color="#525D76" size="-1"><em> | |||
Copyright © 2000-2002, Apache Software Foundation | |||
</em></font></div> | |||
</td></tr> | |||
</table> | |||
</body> | |||
</html> | |||
<!-- end the processing --> | |||
@@ -1,82 +0,0 @@ | |||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> | |||
<!-- Content Stylesheet for Site --> | |||
<!-- start the processing --> | |||
<html> | |||
<head> | |||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/> | |||
<meta name="author" value="Conor MacNeill"> | |||
<meta name="email" value=""> | |||
<title>Mutant Proposal - Developers</title> | |||
</head> | |||
<body bgcolor="#ffffff" text="#000000" link="#525D76"> | |||
<table border="0" width="100%" cellspacing="0"> | |||
<!-- TOP IMAGE --> | |||
<tr> | |||
<td colspan="2"> | |||
<a href="http://jakarta.apache.org"><img src="http://jakarta.apache.org/images/jakarta-logo.gif" align="left" border="0"/></a> | |||
</td> | |||
</tr> | |||
</table> | |||
<table border="0" width="100%" cellspacing="4"> | |||
<tr><td colspan="2"> | |||
<hr noshade="" size="1"/> | |||
</td></tr> | |||
<tr> | |||
<!-- LEFT SIDE NAVIGATION --> | |||
<td valign="top" nowrap="true"> | |||
<p><strong>Mutant Proposal</strong></p> | |||
<ul> | |||
<li> <a href="./index.html">Introduction</a> | |||
</li> | |||
<li> <a href="./goals.html">Design Goals</a> | |||
</li> | |||
<li> <a href="./features.html">User Features</a> | |||
</li> | |||
<li> <a href="./developers.html">Task Developers</a> | |||
</li> | |||
<li> <a href="./design.html">Design Description</a> | |||
</li> | |||
</ul> | |||
</td> | |||
<td align="left" valign="top"> | |||
<table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
<tr><td bgcolor="#525D76"> | |||
<font color="#ffffff" face="arial,helvetica,sanserif"> | |||
<a name="Developers"><strong>Developers</strong></a> | |||
</font> | |||
</td></tr> | |||
<tr><td> | |||
<blockquote> | |||
<p> | |||
This page will describe the design of Mutant's core. | |||
</p> | |||
</blockquote> | |||
</td></tr> | |||
</table> | |||
</td> | |||
</tr> | |||
<!-- FOOTER --> | |||
<tr><td colspan="2"> | |||
<hr noshade="" size="1"/> | |||
</td></tr> | |||
<tr><td colspan="2"> | |||
<div align="center"><font color="#525D76" size="-1"><em> | |||
Copyright © 2000-2002, Apache Software Foundation | |||
</em></font></div> | |||
</td></tr> | |||
</table> | |||
</body> | |||
</html> | |||
<!-- end the processing --> | |||
@@ -1,82 +0,0 @@ | |||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> | |||
<!-- Content Stylesheet for Site --> | |||
<!-- start the processing --> | |||
<html> | |||
<head> | |||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/> | |||
<meta name="author" value="Conor MacNeill"> | |||
<meta name="email" value=""> | |||
<title>Mutant Proposal - Developers</title> | |||
</head> | |||
<body bgcolor="#ffffff" text="#000000" link="#525D76"> | |||
<table border="0" width="100%" cellspacing="0"> | |||
<!-- TOP IMAGE --> | |||
<tr> | |||
<td colspan="2"> | |||
<a href="http://jakarta.apache.org"><img src="http://jakarta.apache.org/images/jakarta-logo.gif" align="left" border="0"/></a> | |||
</td> | |||
</tr> | |||
</table> | |||
<table border="0" width="100%" cellspacing="4"> | |||
<tr><td colspan="2"> | |||
<hr noshade="" size="1"/> | |||
</td></tr> | |||
<tr> | |||
<!-- LEFT SIDE NAVIGATION --> | |||
<td valign="top" nowrap="true"> | |||
<p><strong>Mutant Proposal</strong></p> | |||
<ul> | |||
<li> <a href="./index.html">Introduction</a> | |||
</li> | |||
<li> <a href="./goals.html">Design Goals</a> | |||
</li> | |||
<li> <a href="./features.html">User Features</a> | |||
</li> | |||
<li> <a href="./developers.html">Task Developers</a> | |||
</li> | |||
<li> <a href="./design.html">Design Description</a> | |||
</li> | |||
</ul> | |||
</td> | |||
<td align="left" valign="top"> | |||
<table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
<tr><td bgcolor="#525D76"> | |||
<font color="#ffffff" face="arial,helvetica,sanserif"> | |||
<a name="Developers"><strong>Developers</strong></a> | |||
</font> | |||
</td></tr> | |||
<tr><td> | |||
<blockquote> | |||
<p> | |||
This page will describe the operation of Mutant from a task developers perspective. | |||
</p> | |||
</blockquote> | |||
</td></tr> | |||
</table> | |||
</td> | |||
</tr> | |||
<!-- FOOTER --> | |||
<tr><td colspan="2"> | |||
<hr noshade="" size="1"/> | |||
</td></tr> | |||
<tr><td colspan="2"> | |||
<div align="center"><font color="#525D76" size="-1"><em> | |||
Copyright © 2000-2002, Apache Software Foundation | |||
</em></font></div> | |||
</td></tr> | |||
</table> | |||
</body> | |||
</html> | |||
<!-- end the processing --> | |||
@@ -1,867 +0,0 @@ | |||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> | |||
<!-- Content Stylesheet for Site --> | |||
<!-- start the processing --> | |||
<html> | |||
<head> | |||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/> | |||
<meta name="author" value="Conor MacNeill"> | |||
<meta name="email" value=""> | |||
<title>Mutant Proposal - Mutant Goals</title> | |||
</head> | |||
<body bgcolor="#ffffff" text="#000000" link="#525D76"> | |||
<table border="0" width="100%" cellspacing="0"> | |||
<!-- TOP IMAGE --> | |||
<tr> | |||
<td colspan="2"> | |||
<a href="http://jakarta.apache.org"><img src="http://jakarta.apache.org/images/jakarta-logo.gif" align="left" border="0"/></a> | |||
</td> | |||
</tr> | |||
</table> | |||
<table border="0" width="100%" cellspacing="4"> | |||
<tr><td colspan="2"> | |||
<hr noshade="" size="1"/> | |||
</td></tr> | |||
<tr> | |||
<!-- LEFT SIDE NAVIGATION --> | |||
<td valign="top" nowrap="true"> | |||
<p><strong>Mutant Proposal</strong></p> | |||
<ul> | |||
<li> <a href="./index.html">Introduction</a> | |||
</li> | |||
<li> <a href="./goals.html">Design Goals</a> | |||
</li> | |||
<li> <a href="./features.html">User Features</a> | |||
</li> | |||
<li> <a href="./developers.html">Task Developers</a> | |||
</li> | |||
<li> <a href="./design.html">Design Description</a> | |||
</li> | |||
</ul> | |||
</td> | |||
<td align="left" valign="top"> | |||
<table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
<tr><td bgcolor="#525D76"> | |||
<font color="#ffffff" face="arial,helvetica,sanserif"> | |||
<a name="Goals"><strong>Goals</strong></a> | |||
</font> | |||
</td></tr> | |||
<tr><td> | |||
<blockquote> | |||
<p> | |||
This page describes the key goals that have shaped the development of | |||
Mutant. | |||
</p> | |||
<p> | |||
The first section identifies a set of issues with Ant1 that have cropped up as | |||
Ant1 has evolved. The design implications of each issue are then summarized as a | |||
Mutant requirement. I do not want to suggest that these problems are unsolvable | |||
within the Ant1 design. Already I believe we have seen the Ant2 proposals | |||
influencing people trying to extend Ant1. These issues may be solvable, although at | |||
the risk of backward compatability impacts or further complication of the Ant1 | |||
codebase. | |||
</p> | |||
<p> | |||
The second section covers a set of additional requirements that have emerged as | |||
the whole concept of Ant2 has developed. Many of these came from the discussions | |||
on the Ant-Dev mailing list. | |||
</p> | |||
<p> | |||
The realisation of these requirements as they impact a user is on the | |||
<a href="features.html">next page</a>. Th implications for task developers and | |||
Ant developers are discussed in the following sections. | |||
</p> | |||
</blockquote> | |||
</td></tr> | |||
</table> | |||
<table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
<tr><td bgcolor="#525D76"> | |||
<font color="#ffffff" face="arial,helvetica,sanserif"> | |||
<a name="Ant1 Issues"><strong>Ant1 Issues</strong></a> | |||
</font> | |||
</td></tr> | |||
<tr><td> | |||
<blockquote> | |||
<table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
<tr><td bgcolor="#828DA6"> | |||
<font color="#ffffff" face="arial,helvetica,sanserif"> | |||
<a name="Unrestricted core access"><strong>Unrestricted core access</strong></a> | |||
</font> | |||
</td></tr> | |||
<tr><td> | |||
<blockquote> | |||
<p> | |||
The interface between the Ant core and tasks is not controlled. It | |||
allows tasks almost complete access to the internal data structures of the | |||
core. This is poor encapsulation. Whilst most tasks do not need and do not | |||
use this access, its existence nonetheless prevents changes being made to | |||
the core without raising concerns about impacting backward compatability. | |||
</p> | |||
<p> | |||
The uncontrolled nature of the task-core interface also makes it difficult | |||
to reuse tasks and types in a different context without almost completely | |||
duplicating the Ant core | |||
</p> | |||
<div align="left"> | |||
<table cellspacing="4" cellpadding="0" border="0"> | |||
<tr> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
<tr> | |||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#ffffff"> | |||
<p> | |||
A tightly defined interface between the core and the components (tasks and | |||
types) will allow the core implementation to be changed without the risk | |||
of impacting tasks. It will also allow components to be reused in other | |||
contexts. | |||
</p> | |||
</td> | |||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
<tr> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
</table> | |||
</div> | |||
</blockquote> | |||
</td></tr> | |||
</table> | |||
<table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
<tr><td bgcolor="#828DA6"> | |||
<font color="#ffffff" face="arial,helvetica,sanserif"> | |||
<a name="Lack of embedding support"><strong>Lack of embedding support</strong></a> | |||
</font> | |||
</td></tr> | |||
<tr><td> | |||
<blockquote> | |||
<p> | |||
Ant1 does not provide strong support for embedding Ant in other systems, | |||
particularly a GUI or IDE. The development of Antidote highlighted this | |||
difficultly. Antidote was forced to perform its own XML parsing so it could | |||
build its own model of the build. There is no communication medium for a GUI to | |||
communicate with the core. Without this capability any GUI will be limited to | |||
simply editing the XML representation of the build. | |||
</p> | |||
<div align="left"> | |||
<table cellspacing="4" cellpadding="0" border="0"> | |||
<tr> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
<tr> | |||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#ffffff"> | |||
<p> | |||
The definition of a project model, a Java-based object-model of a build | |||
description would decouple Ant from the XML representation. This allows | |||
other representations to be used. Such an object model also forms the basis | |||
for communications between systems which want to embed Ant. An IDE could | |||
manipulate this project object model directly and pass to the core for | |||
processing without needing to convert to and from an external | |||
representations such as XML. | |||
</p> | |||
</td> | |||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
<tr> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
</table> | |||
</div> | |||
</blockquote> | |||
</td></tr> | |||
</table> | |||
<table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
<tr><td bgcolor="#828DA6"> | |||
<font color="#ffffff" face="arial,helvetica,sanserif"> | |||
<a name="Configuration done at Parse-Time"><strong>Configuration done at Parse-Time</strong></a> | |||
</font> | |||
</td></tr> | |||
<tr><td> | |||
<blockquote> | |||
<p> | |||
The original implementation of Ant1 performed all task configuration at the | |||
time the XML description of the build was parsed (parse-time). This approach | |||
could not handle dynamically created tasks very well since in some | |||
instances the type of the task to be configured was not known at parse-time. | |||
This limitation was overcome with the introduction of the UnknownElement and | |||
RuntimeConfigurable classes. While these work well, they are confusing and at | |||
times surprising to most Ant developers. Also some operations still occur at | |||
parse-time, notably creation of nested elements of known types. This could be | |||
overcome by going to a fully dynamic model but the fear of backward | |||
incompatability constrains this change from occuring. | |||
</p> | |||
<div align="left"> | |||
<table cellspacing="4" cellpadding="0" border="0"> | |||
<tr> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
<tr> | |||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#ffffff"> | |||
<p> | |||
Execution-time configuration of tasks allows for the latest information to be | |||
used for configuration. It is also necessary to support the concept of the | |||
project model. The project model cannot contain execution-time information as it | |||
does in Ant1 | |||
</p> | |||
<p> | |||
The decoupling of the parsing and exection phases, communicating through the | |||
medium of the project model will allow the core to be modularized. The parsing | |||
and execution phases can be separated and one replaced without impacting the | |||
other. | |||
</p> | |||
</td> | |||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
<tr> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
</table> | |||
</div> | |||
</blockquote> | |||
</td></tr> | |||
</table> | |||
<table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
<tr><td bgcolor="#828DA6"> | |||
<font color="#ffffff" face="arial,helvetica,sanserif"> | |||
<a name="Multiple execution"><strong>Multiple execution</strong></a> | |||
</font> | |||
</td></tr> | |||
<tr><td> | |||
<blockquote> | |||
<p> | |||
In Ant1, a task, once configured, may be used more than once - i.e. its | |||
execute method may be called more than once. This occurs when the Ant | |||
command line specifies the evaluation of two targets. If those targets have | |||
overlapping dependencies, the tasks in those overlapping dependencies will | |||
be executed twice. This arrangement requires task writers to preserve the | |||
state configured by Ant during the execution of the task so that the next | |||
execution has the correct configuration. | |||
</p> | |||
<p> | |||
Many task writers are not aware of this requirement. Frequently the task's | |||
state is changed during the execution method, which can lead to mysterious | |||
falures during subsequent executions. This need to preserve the configuration | |||
state makes writing tasks much harder. | |||
</p> | |||
<div align="left"> | |||
<table cellspacing="4" cellpadding="0" border="0"> | |||
<tr> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
<tr> | |||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#ffffff"> | |||
<p> | |||
Once a task is configured, it should be executed once. If the execution of | |||
multiple targets is required, a new task instance should be created and | |||
configured from the same project model. If reuse of task instances is desired | |||
each instance must be reinitialized and reconfigured before use. | |||
</p> | |||
</td> | |||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
<tr> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
</table> | |||
</div> | |||
</blockquote> | |||
</td></tr> | |||
</table> | |||
<table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
<tr><td bgcolor="#828DA6"> | |||
<font color="#ffffff" face="arial,helvetica,sanserif"> | |||
<a name="No automatic deployment of tasks"><strong>No automatic deployment of tasks</strong></a> | |||
</font> | |||
</td></tr> | |||
<tr><td> | |||
<blockquote> | |||
<p> | |||
Ant1 has a set of well-known tasks (and types). A well-known task is one | |||
for which a mapping between the taskname and its implementing class is | |||
predefined in Ant. This mapping is provided by the two defaults.properties | |||
files in Ant's code. These well-known tasks do not need to be taskdef'd to | |||
make them available in a build file. Conversely tasks which are not in this | |||
list need to be explicitly taskdef'd. | |||
</p> | |||
<p> | |||
Note that this distinction is not the same as the core/optional | |||
distinction found in Ant1. An Ant1 core task is notionally supported by Ant | |||
without requiring any additional external libraries - it just requires the | |||
classes available in the 1.1 JDK, in Ant and in the libraries Ant uses such | |||
as the XML parser. An optional task is a task which requires JDK 1.2+ | |||
features or the support of an external library, such as jakarta-regexp. | |||
</p> | |||
<p> | |||
The problem with this system is that there is no namespace management. If a | |||
new task is added to Ant, it may invalidate buildfiles which are already | |||
using that taskname via a taskdef. Actually the taskdef may continue to work or | |||
it may not - it will depend on the nested elements that the task definitions | |||
support (see above discussion of regarding cofiguration at parse-time) | |||
</p> | |||
<div align="left"> | |||
<table cellspacing="4" cellpadding="0" border="0"> | |||
<tr> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
<tr> | |||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#ffffff"> | |||
<p> | |||
Tasks need to be deployed in libraries by either placing them in well known | |||
directories of an Ant install or by telling Ant where to look for them. Removing | |||
the central management of defined task names allows tasks libraries to be | |||
developed and maintained independently of Ant much more easily. | |||
</p> | |||
<p> | |||
Once centralised management of the task namespace is removed, there is, | |||
however, the possibility of name collision. A mechanism is required to allow a | |||
build file writer to select which particular tasks are assigned to which | |||
tasknames. | |||
</p> | |||
</td> | |||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
<tr> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
</table> | |||
</div> | |||
</blockquote> | |||
</td></tr> | |||
</table> | |||
<table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
<tr><td bgcolor="#828DA6"> | |||
<font color="#ffffff" face="arial,helvetica,sanserif"> | |||
<a name="Top level tasks"><strong>Top level tasks</strong></a> | |||
</font> | |||
</td></tr> | |||
<tr><td> | |||
<blockquote> | |||
<p> | |||
In Ant1 certain tasks may appear outside of any target. This is implemented as a | |||
set of hardcoded conditions in the XML parsing phase. The execution and | |||
configuration of these tasks does not involve the use of RuntimeConfigurable and | |||
UnknownElement. | |||
</p> | |||
<p> | |||
This hardcoding is not very inituitive. It is confusing to users who do not | |||
know why only some tasks may be run outside of a target. Also as the list of | |||
tasks that may be useful as a top-level task grows, further special cases must | |||
be added to the code making the code harder to maintain. | |||
</p> | |||
<div align="left"> | |||
<table cellspacing="4" cellpadding="0" border="0"> | |||
<tr> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
<tr> | |||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#ffffff"> | |||
<p> | |||
The number of special names should be kept to a minimum. Special cases should | |||
be avoided as they are not inituitive. | |||
</p> | |||
</td> | |||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
<tr> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
</table> | |||
</div> | |||
</blockquote> | |||
</td></tr> | |||
</table> | |||
<table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
<tr><td bgcolor="#828DA6"> | |||
<font color="#ffffff" face="arial,helvetica,sanserif"> | |||
<a name="Build file inclusion is cumbersome"><strong>Build file inclusion is cumbersome</strong></a> | |||
</font> | |||
</td></tr> | |||
<tr><td> | |||
<blockquote> | |||
<p> | |||
In Ant1, the inclusion of a set of build file definitions or targets is achieved | |||
through the use of XML entities. This is just cumbersome. | |||
</p> | |||
<div align="left"> | |||
<table cellspacing="4" cellpadding="0" border="0"> | |||
<tr> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
<tr> | |||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#ffffff"> | |||
<p> | |||
A simplified include mechanism is required to replace the entity based | |||
inclusion of Ant1. | |||
</p> | |||
</td> | |||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
<tr> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
</table> | |||
</div> | |||
</blockquote> | |||
</td></tr> | |||
</table> | |||
<table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
<tr><td bgcolor="#828DA6"> | |||
<font color="#ffffff" face="arial,helvetica,sanserif"> | |||
<a name="Classpath management"><strong>Classpath management</strong></a> | |||
</font> | |||
</td></tr> | |||
<tr><td> | |||
<blockquote> | |||
<p> | |||
Probably the greatest issue facing Ant1 today involves the management of the | |||
classpath and the associated visibility of classes. Most optional tasks in Ant1 | |||
require the supporting classes for the task to be available on the system | |||
classpath. For example, the JUnit task is only usable if the JUnit jar is on | |||
the classpath. If it is not, Ant will complain about being unable to create the | |||
junit task. | |||
</p> | |||
<p> | |||
The usual solution when a user runs into this problem is to put the required jar | |||
into the ANT_HOME/lib directory. This just adds the required jar to the system | |||
classpath prior to starting Ant albeit without requiring the user to explicitly | |||
set the classpath. | |||
</p> | |||
<p> | |||
There are a number of issues with this approach. The classes on the | |||
classpath share the same classloader as Ant's classes and Ant's support | |||
libraries - particularly the XML parser. If a task wishes to use a specific XML | |||
parser, it may conflict with Ant's own parser. If two tasks require different | |||
versions of a supporting jar, these will conflict. | |||
</p> | |||
<p> | |||
Many tasks make use of factory objects (dynamic class instantiation, dynamic | |||
resource loading, etc). When the factory is in the system classpath it will not | |||
be able to load resources available in a taskdef'd task's custom classpath due | |||
to the delegating nature of classloaders. Such errors can be very confusing to | |||
users. More recent code is likely to attempt use of a context classloader but | |||
this is not set by Ant1 currently. | |||
</p> | |||
<div align="left"> | |||
<table cellspacing="4" cellpadding="0" border="0"> | |||
<tr> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
<tr> | |||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#ffffff"> | |||
<p> | |||
Do not require jars to be added to ANT_HOME/lib to enable tasks. Allow users to | |||
specify the location of support jars on a per-library basis. | |||
</p> | |||
</td> | |||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
<tr> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
</table> | |||
</div> | |||
</blockquote> | |||
</td></tr> | |||
</table> | |||
<table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
<tr><td bgcolor="#828DA6"> | |||
<font color="#ffffff" face="arial,helvetica,sanserif"> | |||
<a name="Extensibility"><strong>Extensibility</strong></a> | |||
</font> | |||
</td></tr> | |||
<tr><td> | |||
<blockquote> | |||
<p> | |||
The earliest versions Ant1 did not explicitly support any datatypes. The only | |||
datatype, property, was actually created as a side-effect of running the | |||
<code><property></code> task. If it were to be implemented today, property | |||
would probably be known as a string datatype, perhaps associated with a | |||
<code><load-properties></code> task. This is also the reason property | |||
is one of those tasks which is allowed to exist outside of a target. | |||
</p> | |||
<p> As Ant1 evolved new types such as <code><path></code> and | |||
<code><fileset></code> were added. The concept of datatypes has continued | |||
to evolve to the point where users can now define new datatypes. It would be | |||
expected that in addition to new types there will be many sub-types created, | |||
such as new types of fileset. Ant1, however, does not strongly support such type | |||
extensibility. When a subtype is created by extending an existing type, Ant1 | |||
requires it to be either used by reference or all tasks which accept the base | |||
type need to be modified to support the new type. Use by reference is not always | |||
possible. It will depend on whether the base type has been coded to support | |||
references. </p> | |||
<div align="left"> | |||
<table cellspacing="4" cellpadding="0" border="0"> | |||
<tr> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
<tr> | |||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#ffffff"> | |||
<p> | |||
Support polymorphic behaviour, allowing a build file to pass a subtype to a | |||
task which is defined to accept the base type. Allow task interfaces to be | |||
defined in terms of interfaces. | |||
</p> | |||
<p> | |||
Move reference processing to the core to make it more regular removing the | |||
burden of type developers to explicitly support references. | |||
</p> | |||
</td> | |||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
<tr> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
</table> | |||
</div> | |||
</blockquote> | |||
</td></tr> | |||
</table> | |||
<table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
<tr><td bgcolor="#828DA6"> | |||
<font color="#ffffff" face="arial,helvetica,sanserif"> | |||
<a name="Project object does too much"><strong>Project object does too much</strong></a> | |||
</font> | |||
</td></tr> | |||
<tr><td> | |||
<blockquote> | |||
<p> | |||
In Ant1 the Project object takes on too many roles including all of the | |||
following: | |||
</p> | |||
<ul> | |||
<li>Holds the project model built when parsing the build file</li> | |||
<li>Holds the run-time state of the build through the properties and current | |||
task definitions</li> | |||
<li>Provides context for task execution. All tasks have a reference to their | |||
project instance and use it to access core functions</li> | |||
<li>Provides the implementation of common task operations</li> | |||
<li>Build event management</li> | |||
<li>Message logging</li> | |||
<li>Global filter definitions</li> | |||
<li>Java Version</li> | |||
<li>Property replacement</li> | |||
<li>Message Levels</li> | |||
<li>Utility functions such as boolean conversion and path translation</li> | |||
<li>Integration point for embedding Ant</li> | |||
</ul> | |||
<p> As a class, Project is not cohesive. Reuse of the Ant core functionality is | |||
difficulty as all of these concerns bring in many other support classes. | |||
</p> | |||
<div align="left"> | |||
<table cellspacing="4" cellpadding="0" border="0"> | |||
<tr> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
<tr> | |||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#ffffff"> | |||
<p> | |||
Separate the various roles of Project into more cohesive classes. | |||
</p> | |||
</td> | |||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
<tr> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
</table> | |||
</div> | |||
</blockquote> | |||
</td></tr> | |||
</table> | |||
</blockquote> | |||
</td></tr> | |||
</table> | |||
<table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
<tr><td bgcolor="#525D76"> | |||
<font color="#ffffff" face="arial,helvetica,sanserif"> | |||
<a name="Other Goals"><strong>Other Goals</strong></a> | |||
</font> | |||
</td></tr> | |||
<tr><td> | |||
<blockquote> | |||
<p> | |||
In addition to the issues which arise from Ant1 limitations, there are a number | |||
of requirements which have emerged in the mailing list discussions about Ant2. | |||
This isn't a complete list - just the ones I picked up for Mutant. | |||
</p> | |||
<table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
<tr><td bgcolor="#828DA6"> | |||
<font color="#ffffff" face="arial,helvetica,sanserif"> | |||
<a name="Limited project reuse"><strong>Limited project reuse</strong></a> | |||
</font> | |||
</td></tr> | |||
<tr><td> | |||
<blockquote> | |||
<p> In Ant1 the only way to reuse build file definitions is to use the | |||
<code><ant></code> task. While useful, it is relatively coarse-grained. It | |||
can also be tedious if you are trying to extend an existing project definition - | |||
that is, adding new targets while retaining a user's ability to access the | |||
existing targets. </p> | |||
<p> | |||
In addition to the extension of projects, it should be possible to compose | |||
projects creating dependencies between the targets of the different projects, | |||
and to access the data and definitions of one project by a controlling project | |||
</p> | |||
<div align="left"> | |||
<table cellspacing="4" cellpadding="0" border="0"> | |||
<tr> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
<tr> | |||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#ffffff"> | |||
<p> | |||
Allow a project to extend and control other projects | |||
</p> | |||
</td> | |||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
<tr> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
</table> | |||
</div> | |||
</blockquote> | |||
</td></tr> | |||
</table> | |||
<table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
<tr><td bgcolor="#828DA6"> | |||
<font color="#ffffff" face="arial,helvetica,sanserif"> | |||
<a name="Ant1 Compatibility - Zero Friction"><strong>Ant1 Compatibility - Zero Friction</strong></a> | |||
</font> | |||
</td></tr> | |||
<tr><td> | |||
<blockquote> | |||
<p> | |||
While it has always been accepted that there will be come backward compatibility | |||
breaks in moving from Ant1 to Ant2, these should be minimized. If the changeover | |||
from Ant1 to Ant2 is difficult, it may never happen. On the other hand, the | |||
openness of the Ant1 interface means that some tasks will not work as expected - | |||
the most difficult being the <code><script></code> task. | |||
</p> | |||
<div align="left"> | |||
<table cellspacing="4" cellpadding="0" border="0"> | |||
<tr> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
<tr> | |||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#ffffff"> | |||
<p> | |||
Achieve a practical level of compatability without degrading the integrity of | |||
the core's interfaces. A practical level of compatability is intentionally a | |||
vague measure but it would require the majority of projects in Gump to be built | |||
without noticeable differences from Ant1 | |||
</p> | |||
</td> | |||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
<tr> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
</table> | |||
</div> | |||
</blockquote> | |||
</td></tr> | |||
</table> | |||
<table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
<tr><td bgcolor="#828DA6"> | |||
<font color="#ffffff" face="arial,helvetica,sanserif"> | |||
<a name="XML Configuration"><strong>XML Configuration</strong></a> | |||
</font> | |||
</td></tr> | |||
<tr><td> | |||
<blockquote> | |||
<p> | |||
In Ant1 configuration of Ant is achieved either through the execution of OS | |||
dependent scripts by the launcher scripts or though properties files which have | |||
the limited capability to set properties. | |||
</p> | |||
<div align="left"> | |||
<table cellspacing="4" cellpadding="0" border="0"> | |||
<tr> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
<tr> | |||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#ffffff"> | |||
<p> | |||
Provide an XML based configuration system with rich capabilities to configure | |||
the operation of Ant. | |||
</p> | |||
</td> | |||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
<tr> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
</table> | |||
</div> | |||
</blockquote> | |||
</td></tr> | |||
</table> | |||
<table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
<tr><td bgcolor="#828DA6"> | |||
<font color="#ffffff" face="arial,helvetica,sanserif"> | |||
<a name="Aspects"><strong>Aspects</strong></a> | |||
</font> | |||
</td></tr> | |||
<tr><td> | |||
<blockquote> | |||
<p> | |||
In Ant1 there are many things which are common to a group of tasks but adding | |||
the capability to each task is repetitive and tedious. An example would be the | |||
failonerror attribute which controls whether a task will cause the build to stop | |||
when it fails. This started on just one task but has since been added to many | |||
other tasks as users want more fine control over when their builds stop. Aspects | |||
have been discussed as a mechanism for providing a single implementation of a | |||
concept or control that can then be applied to tasks independently. | |||
</p> | |||
<div align="left"> | |||
<table cellspacing="4" cellpadding="0" border="0"> | |||
<tr> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
<tr> | |||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#ffffff"> | |||
<p> | |||
Investigate the use of an Aspect approach to provide common functionality | |||
across tasks with a single implementation | |||
</p> | |||
</td> | |||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
<tr> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
</table> | |||
</div> | |||
</blockquote> | |||
</td></tr> | |||
</table> | |||
</blockquote> | |||
</td></tr> | |||
</table> | |||
</td> | |||
</tr> | |||
<!-- FOOTER --> | |||
<tr><td colspan="2"> | |||
<hr noshade="" size="1"/> | |||
</td></tr> | |||
<tr><td colspan="2"> | |||
<div align="center"><font color="#525D76" size="-1"><em> | |||
Copyright © 2002, Apache Software Foundation | |||
</em></font></div> | |||
</td></tr> | |||
</table> | |||
</body> | |||
</html> | |||
<!-- end the processing --> | |||
@@ -1,180 +0,0 @@ | |||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> | |||
<!-- Content Stylesheet for Site --> | |||
<!-- start the processing --> | |||
<html> | |||
<head> | |||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/> | |||
<meta name="author" value="Conor MacNeill"> | |||
<meta name="email" value=""> | |||
<title>Mutant Proposal - Mutant Introduction</title> | |||
</head> | |||
<body bgcolor="#ffffff" text="#000000" link="#525D76"> | |||
<table border="0" width="100%" cellspacing="0"> | |||
<!-- TOP IMAGE --> | |||
<tr> | |||
<td colspan="2"> | |||
<a href="http://jakarta.apache.org"><img src="http://jakarta.apache.org/images/jakarta-logo.gif" align="left" border="0"/></a> | |||
</td> | |||
</tr> | |||
</table> | |||
<table border="0" width="100%" cellspacing="4"> | |||
<tr><td colspan="2"> | |||
<hr noshade="" size="1"/> | |||
</td></tr> | |||
<tr> | |||
<!-- LEFT SIDE NAVIGATION --> | |||
<td valign="top" nowrap="true"> | |||
<p><strong>Mutant Proposal</strong></p> | |||
<ul> | |||
<li> <a href="./index.html">Introduction</a> | |||
</li> | |||
<li> <a href="./goals.html">Design Goals</a> | |||
</li> | |||
<li> <a href="./features.html">User Features</a> | |||
</li> | |||
<li> <a href="./developers.html">Task Developers</a> | |||
</li> | |||
<li> <a href="./design.html">Design Description</a> | |||
</li> | |||
</ul> | |||
</td> | |||
<td align="left" valign="top"> | |||
<table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
<tr><td bgcolor="#525D76"> | |||
<font color="#ffffff" face="arial,helvetica,sanserif"> | |||
<a name="Introduction"><strong>Introduction</strong></a> | |||
</font> | |||
</td></tr> | |||
<tr><td> | |||
<blockquote> | |||
<p> | |||
These pages describe the design and implementation of Mutant. | |||
</p> | |||
<p> | |||
For some time, there has been the concept of Ant 2.0. a rearchitecting of | |||
Ant designed to address the shortcomings in the design of Ant 1.x, while | |||
drawing the experience gained in that development. This rearchitecting | |||
would most likely be accompanied by at least some break in backward | |||
compatability. Over time Ant 2.0 has come to be known as Ant2 and the current | |||
Ant codebase is generally known as Ant1. | |||
</p> | |||
<p> | |||
Mutant is my proposal, a revolution, for Ant2. Actually, I consider it more | |||
an evolution of the design and implementation used for Ant1, but in Jakarta | |||
parlance, being a separate codebase, it is termed a revolution. | |||
</p> | |||
<p> | |||
There is no special significance in the name Mutant. I chose it because, as | |||
a word, it is an extension of the word Ant and it also signifies a change | |||
from the previous generation | |||
</p> | |||
</blockquote> | |||
</td></tr> | |||
</table> | |||
<table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
<tr><td bgcolor="#525D76"> | |||
<font color="#ffffff" face="arial,helvetica,sanserif"> | |||
<a name="Other Proposals"><strong>Other Proposals</strong></a> | |||
</font> | |||
</td></tr> | |||
<tr><td> | |||
<blockquote> | |||
<p> | |||
Mutant is not the only proposed revolution for Ant2. Peter Donald has | |||
developed another known as | |||
<a href="http://jakarta.apache.org/ant/myrmidon">Myrmidon</a> | |||
which presents a different view of how Ant2 could be realized. Other | |||
people hold the view that Ant1 can continue to evolve and that there | |||
is no need for rearchitecture of its codebase. I recommend you | |||
investigate all these points of view. | |||
</p> | |||
<p> | |||
As I write this, no decision has been taken as to which codebase will be | |||
adopted for Ant2. It may not be Mutant and it could even be some entirely | |||
new proposal. These pages do not compare and contrast Mutant with these | |||
other proposals or points of view, at least not explicitly. They are just | |||
intended to describe how Mutant is designed and implemented and why it is the | |||
way it is. | |||
</p> | |||
</blockquote> | |||
</td></tr> | |||
</table> | |||
<table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
<tr><td bgcolor="#525D76"> | |||
<font color="#ffffff" face="arial,helvetica,sanserif"> | |||
<a name="Getting Started"><strong>Getting Started</strong></a> | |||
</font> | |||
</td></tr> | |||
<tr><td> | |||
<blockquote> | |||
<div align="left"> | |||
<table cellspacing="4" cellpadding="0" border="0"> | |||
<tr> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
<tr> | |||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#ffffff"> | |||
<h1><font color="red">Caution</font></h1> | |||
<p> | |||
Mutant is not even an alpha release. While it is relatively stable, it is | |||
subject to change. There are no backward compatability guarantees for any of | |||
the classes, interfaces, build files, configuration, launch scripts, etc that | |||
Mutant provides. | |||
</p> | |||
<p>In particular, some features in Mutant are experimental and may not, in the | |||
long run, prove to be worthwhile.</p> | |||
</td> | |||
<td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
<tr> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
<td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td> | |||
</tr> | |||
</table> | |||
</div> | |||
<p> | |||
<a href="goals.html">Start</a> now by looking at the key requirements which have | |||
shaped the design of Mutant. | |||
</p> | |||
<div align="right"> | |||
<p>Conor MacNeill</p> | |||
</div> | |||
</blockquote> | |||
</td></tr> | |||
</table> | |||
</td> | |||
</tr> | |||
<!-- FOOTER --> | |||
<tr><td colspan="2"> | |||
<hr noshade="" size="1"/> | |||
</td></tr> | |||
<tr><td colspan="2"> | |||
<div align="center"><font color="#525D76" size="-1"><em> | |||
Copyright © 2002, Apache Software Foundation | |||
</em></font></div> | |||
</td></tr> | |||
</table> | |||
</body> | |||
</html> | |||
<!-- end the processing --> | |||
@@ -1,121 +0,0 @@ | |||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> | |||
<!-- Content Stylesheet for Site --> | |||
<!-- start the processing --> | |||
<html> | |||
<head> | |||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/> | |||
<meta name="author" value="Conor MacNeill"> | |||
<meta name="email" value=""> | |||
<title>Mutant Proposal - Mutant Introduction</title> | |||
</head> | |||
<body bgcolor="#ffffff" text="#000000" link="#525D76"> | |||
<table border="0" width="100%" cellspacing="0"> | |||
<!-- TOP IMAGE --> | |||
<tr> | |||
<td colspan="2"> | |||
<a href="http://jakarta.apache.org"><img src="http://jakarta.apache.org/images/jakarta-logo.gif" align="left" border="0"/></a> | |||
</td> | |||
</tr> | |||
</table> | |||
<table border="0" width="100%" cellspacing="4"> | |||
<tr><td colspan="2"> | |||
<hr noshade="" size="1"/> | |||
</td></tr> | |||
<tr> | |||
<!-- LEFT SIDE NAVIGATION --> | |||
<td valign="top" nowrap="true"> | |||
<p><strong>Mutant Proposal</strong></p> | |||
<ul> | |||
<li> <a href="./intro.html">Introduction</a> | |||
</li> | |||
<li> <a href="./goals.html">Design Goals</a> | |||
</li> | |||
</ul> | |||
</td> | |||
<td align="left" valign="top"> | |||
<table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
<tr><td bgcolor="#525D76"> | |||
<font color="#ffffff" face="arial,helvetica,sanserif"> | |||
<a name="Introduction"><strong>Introduction</strong></a> | |||
</font> | |||
</td></tr> | |||
<tr><td> | |||
<blockquote> | |||
<p> | |||
These pages describe the design and implementation of mutant. | |||
</p> | |||
<p> | |||
For some time, there has been the concept of Ant 2.0. a rearchitecting of | |||
Ant designed to address the shortcomings in the design of Ant 1.x while | |||
drawing the experience gained in that development. This rearchitecting | |||
would most likely be accompanied by at least some break in backward | |||
compatability. Indeed this fact was recognized by Duncan, the original | |||
author of Ant when he proposed his AntEater revolution. Over time Ant 2.0 | |||
has come to be known as Ant2 and the current Ant codebase is generally | |||
known as Ant1. | |||
</p> | |||
<p> | |||
Mutant is my proposal, a revolution, for Ant2. Actually, I consider it more | |||
an evolution of the design and implementation used for Ant1, but in Jakarta | |||
parlance, being a separate codebase, it is termed a revolution. | |||
</p> | |||
<p> | |||
There is no special significance in the name mutant. I chose it because, as | |||
a word, it is an extension of the word ant and it also signifies a change | |||
from the previos generation | |||
</p> | |||
</blockquote> | |||
</td></tr> | |||
</table> | |||
<table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
<tr><td bgcolor="#525D76"> | |||
<font color="#ffffff" face="arial,helvetica,sanserif"> | |||
<a name="Other Proposals"><strong>Other Proposals</strong></a> | |||
</font> | |||
</td></tr> | |||
<tr><td> | |||
<blockquote> | |||
<p> | |||
Mutant is not the only proposed revolution for Ant2. Peter Donald, another | |||
Ant committer, has developed another proposal known as Myrmidon, which you | |||
should also investigate if you are interested in a different view of how | |||
Ant2 should be realized. Other people hold the view that there is no need | |||
for any rearchitecting and the Ant1 codebase can continue to evolve. | |||
</p> | |||
<p> | |||
As I write this, no decision has been taken as to which codebase will be | |||
adopted for Ant2. It may not be mutant or it could be some entirely new | |||
proposal. This document does not compare and contrast mutant with these | |||
other proposals or points of view, at least not explicitly. It is just | |||
intended to describe and highlight how mutant is designed and implemented. | |||
</p> | |||
</blockquote> | |||
</td></tr> | |||
</table> | |||
</td> | |||
</tr> | |||
<!-- FOOTER --> | |||
<tr><td colspan="2"> | |||
<hr noshade="" size="1"/> | |||
</td></tr> | |||
<tr><td colspan="2"> | |||
<div align="center"><font color="#525D76" size="-1"><em> | |||
Copyright © 2000-2002, Apache Software Foundation | |||
</em></font></div> | |||
</td></tr> | |||
</table> | |||
</body> | |||
</html> | |||
<!-- end the processing --> | |||
@@ -1 +0,0 @@ | |||
Libraries required to build ant1 components go here |
@@ -1 +0,0 @@ | |||
Please any jars in here which should be used when building the script antlib |
@@ -1,49 +0,0 @@ | |||
// Mutant Policy File | |||
// | |||
// Copyright (c) 2002 The Apache Software Foundation. | |||
// All rights reserved. | |||
// Need to explicitly grant to java.home to pick up tools.jar classes | |||
grant codeBase "file:${java.home}/../lib/tools.jar" { | |||
permission java.security.AllPermission; | |||
}; | |||
// full access is granted to the core | |||
grant codeBase "file:${ant.home}/lib/core/-" { | |||
permission java.security.AllPermission; | |||
}; | |||
// grant full access to the command line front end. | |||
// All operations can be controlled by setting the appropriate | |||
// permissions on the front end. This will also affect core | |||
// functions | |||
grant codeBase "file:${ant.home}/lib/frontend/cli.jar" { | |||
permission java.security.AllPermission; | |||
}; | |||
// grant for the Ant1 compat jar. Other Ant libraries can be controlled | |||
// individually. | |||
grant codeBase "file:${ant.home}/lib/antlibs/ant1compat.jar" { | |||
permission java.security.AllPermission; | |||
// For backward compatibility the Ant1 compatabilioty is granted full | |||
// permission. This can be reduced as desired to eliminate the ability to | |||
// access the network. | |||
// | |||
// For example, the following permissions are required to build Mutant. Additional | |||
// permissions are required depending on what tasks you want to enable. | |||
// permission java.io.FilePermission "<<ALL FILES>>", "read, write, execute, delete"; | |||
// permission java.lang.RuntimePermission "accessDeclaredMembers"; | |||
// permission java.lang.RuntimePermission "createClassLoader"; | |||
// permission java.lang.RuntimePermission "getClassLoader"; | |||
// permission java.util.PropertyPermission "java.class.path", "read, write"; | |||
// permission java.util.PropertyPermission "java.home", "read"; | |||
// permission java.util.PropertyPermission "user.dir", "read"; | |||
// permission java.util.PropertyPermission "user.name", "read"; | |||
// permission java.util.PropertyPermission "sun.*", "read"; | |||
// permission java.util.PropertyPermission "java.*", "read"; | |||
// permission java.util.PropertyPermission "javac.*", "read"; | |||
// permission java.util.PropertyPermission "line.separator", "write"; | |||
// permission java.lang.RuntimePermission "accessClassInPackage.sun.*"; | |||
}; | |||
@@ -1,115 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.antlib; | |||
/** | |||
* This class represents a definition in an AntLibrary. | |||
* | |||
* @author Conor MacNeill | |||
* @created 19 January 2002 | |||
*/ | |||
public class AntLibDefinition { | |||
/** The type of element being defined int his definition */ | |||
private int definitionType; | |||
/** The default name for the defintion */ | |||
private String definitionName; | |||
/** The classname associated with the object */ | |||
private String definitionClassName; | |||
/** | |||
* Create a definition | |||
* | |||
* @param definitionName the default name of this definition when it is | |||
* imported | |||
* @param definitionClassName the name of the class which is being | |||
* defined | |||
* @param definitionType the type of the definition (taskdef, typedef, | |||
* etc) | |||
*/ | |||
public AntLibDefinition(int definitionType, String definitionName, | |||
String definitionClassName) { | |||
this.definitionName = definitionName; | |||
this.definitionType = definitionType; | |||
this.definitionClassName = definitionClassName; | |||
} | |||
/** | |||
* Get the type of this definition | |||
* | |||
* @return the definition type | |||
* @see AntLibrary for values | |||
*/ | |||
public int getDefinitionType() { | |||
return definitionType; | |||
} | |||
/** | |||
* Get the default name for this definition | |||
* | |||
* @return the default name for this definition | |||
*/ | |||
public String getDefinitionName() { | |||
return definitionName; | |||
} | |||
/** | |||
* Get the classname being defined | |||
* | |||
* @return the classname of this definition | |||
*/ | |||
public String getClassName() { | |||
return definitionClassName; | |||
} | |||
} | |||
@@ -1,134 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.antlib; | |||
import org.apache.ant.common.util.AntException; | |||
import org.apache.ant.common.util.Location; | |||
/** | |||
* An AntLibException indicates a problem in an ant library | |||
* | |||
* @author Conor MacNeill | |||
*/ | |||
public class AntLibException extends AntException { | |||
/** | |||
* Constructs an exception with the given descriptive message. | |||
* | |||
* @param msg Description of or information about the exception. | |||
*/ | |||
public AntLibException(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 AntLibException(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 AntLibException(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 AntLibException(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 AntLibException(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 AntLibException(Throwable cause, Location location) { | |||
super(cause, location); | |||
} | |||
} | |||
@@ -1,195 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.antlib; | |||
import org.apache.ant.antcore.xml.ElementHandler; | |||
import org.xml.sax.Attributes; | |||
import org.xml.sax.SAXParseException; | |||
/** | |||
* XML Element Handler for Ant library definitions | |||
* | |||
* @author Conor MacNeill | |||
* @created 13 January 2002 | |||
*/ | |||
public class AntLibHandler extends ElementHandler { | |||
/** The library identifier attribute name */ | |||
public static final String LIBID_ATTR = "libid"; | |||
/** The home attribute name */ | |||
public static final String HOME_ATTR = "home"; | |||
/** | |||
* The name of the attribute which indicates if Ant's XML parser is to | |||
* be made available | |||
*/ | |||
public static final String REQXML_ATTR = "reqxml"; | |||
/** The extends attribute name */ | |||
public static final String EXTENDS_ATTR = "extends"; | |||
/** The name of the attribute which indicates tools jar is required */ | |||
public static final String REQTOOLS_ATTR = "reqtools"; | |||
/** The extends attribute name */ | |||
public static final String ISOLATED_ATTR = "isolated"; | |||
/** The list of allowed Attributes */ | |||
public static final String[] ALLOWED_ATTRIBUTES | |||
= {LIBID_ATTR, HOME_ATTR, REQXML_ATTR, REQTOOLS_ATTR, | |||
EXTENDS_ATTR, ISOLATED_ATTR}; | |||
/** The Ant Library definition being parsed. */ | |||
private AntLibrarySpec antLibrarySpec; | |||
/** | |||
* Gets the parsed antLibrary specification | |||
* | |||
* @return the parsed antLibrary | |||
*/ | |||
public AntLibrarySpec getAntLibrarySpec() { | |||
return antLibrarySpec; | |||
} | |||
/** | |||
* Process the antlib element | |||
* | |||
* @param elementName the name of the element | |||
* @exception SAXParseException if there is a problem parsing the | |||
* element | |||
*/ | |||
public void processElement(String elementName) | |||
throws SAXParseException { | |||
antLibrarySpec = new AntLibrarySpec(); | |||
if (getAttribute(LIBID_ATTR) == null) { | |||
throw new SAXParseException("antlib must have an libid sttribute", | |||
getLocator()); | |||
} | |||
antLibrarySpec.setLibraryId(getAttribute(LIBID_ATTR)); | |||
antLibrarySpec.setHome(getAttribute(HOME_ATTR)); | |||
antLibrarySpec.setExtendsLibraryId(getAttribute(EXTENDS_ATTR)); | |||
antLibrarySpec.setIsolated(getBooleanAttribute(ISOLATED_ATTR)); | |||
antLibrarySpec.setAntXML(getBooleanAttribute(REQXML_ATTR)); | |||
antLibrarySpec.setToolsJarRequired(getBooleanAttribute(REQTOOLS_ATTR)); | |||
} | |||
/** | |||
* Start a new element in the antlibrary. | |||
* | |||
* @param uri The Namespace URI. | |||
* @param localName The local name (without prefix). | |||
* @param qualifiedName The qualified name (with prefix) | |||
* @param attributes The attributes attached to the element. | |||
* @throws SAXParseException if there is a parsing problem. | |||
*/ | |||
protected void addNestedElement(String uri, String localName, | |||
String qualifiedName, Attributes attributes) | |||
throws SAXParseException { | |||
try { | |||
if (qualifiedName.equals("taskdef") | |||
|| qualifiedName.equals("typedef")) { | |||
DefinitionHandler defnHandler | |||
= new DefinitionHandler(qualifiedName); | |||
defnHandler.start(getParseContext(), getXMLReader(), | |||
this, getLocator(), attributes, getElementSource(), | |||
qualifiedName); | |||
antLibrarySpec.addDefinition(defnHandler.getDefinitionType(), | |||
defnHandler.getName(), defnHandler.getClassName()); | |||
} else if (qualifiedName.equals("converter")) { | |||
ClassNameHandler converterHandler = new ClassNameHandler(); | |||
converterHandler.start(getParseContext(), getXMLReader(), | |||
this, getLocator(), attributes, getElementSource(), | |||
qualifiedName); | |||
antLibrarySpec.addConverter(converterHandler.getClassName()); | |||
} else if (qualifiedName.equals("aspect")) { | |||
ClassNameHandler aspectHandler = new ClassNameHandler(); | |||
aspectHandler.start(getParseContext(), getXMLReader(), | |||
this, getLocator(), attributes, getElementSource(), | |||
qualifiedName); | |||
antLibrarySpec.addAspect(aspectHandler.getClassName()); | |||
} else if (qualifiedName.equals("factory")) { | |||
ClassNameHandler factoryHandler | |||
= new ClassNameHandler(); | |||
factoryHandler.start(getParseContext(), getXMLReader(), | |||
this, getLocator(), attributes, getElementSource(), | |||
qualifiedName); | |||
String factoryClass = factoryHandler.getClassName(); | |||
antLibrarySpec.setFactory(factoryClass); | |||
} else { | |||
super.startElement(uri, localName, qualifiedName, attributes); | |||
} | |||
} catch (AntLibException e) { | |||
throw new SAXParseException(e.getMessage(), getLocator(), e); | |||
} | |||
} | |||
/** | |||
* Validate that the given attribute and value are valid. | |||
* | |||
* @param attributeName The name of the attributes | |||
* @param attributeValue The value of the attributes | |||
* @exception SAXParseException if the attribute is not allowed on the | |||
* element. | |||
*/ | |||
protected void validateAttribute(String attributeName, | |||
String attributeValue) | |||
throws SAXParseException { | |||
for (int i = 0; i < ALLOWED_ATTRIBUTES.length; ++i) { | |||
if (attributeName.equals(ALLOWED_ATTRIBUTES[i])) { | |||
return; | |||
} | |||
} | |||
throwInvalidAttribute(attributeName); | |||
} | |||
} | |||
@@ -1,418 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.antlib; | |||
import java.io.FileNotFoundException; | |||
import java.io.File; | |||
import java.net.MalformedURLException; | |||
import java.net.URL; | |||
import java.util.ArrayList; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Map; | |||
import java.util.HashMap; | |||
import org.apache.ant.antcore.xml.ParseContext; | |||
import org.apache.ant.antcore.xml.XMLParseException; | |||
import org.apache.ant.common.util.CircularDependencyChecker; | |||
import org.apache.ant.common.util.CircularDependencyException; | |||
import org.apache.ant.init.AntEnvironment; | |||
import org.apache.ant.init.LoaderUtils; | |||
/** | |||
* This class manages Ant Libraries. This class forms a global | |||
* repository of loaded libraries so that only one copy of a library is | |||
* used across all frames. | |||
* | |||
* @author Conor MacNeill | |||
* @created 29 January 2002 | |||
*/ | |||
public class AntLibManager { | |||
/** | |||
* These are AntLibraries which have been loaded into the system | |||
*/ | |||
private Map antLibraries = new HashMap(); | |||
/** The list of extensions which are examined for ant libraries */ | |||
public static final String[] ANTLIB_EXTENSIONS | |||
= new String[]{".tsk", ".jar", ".zip"}; | |||
/** Flag which indicates whether non-file URLS are used */ | |||
private boolean remoteAllowed; | |||
/** The Ant initialization config - location of vital components */ | |||
private AntEnvironment antEnv; | |||
/** | |||
* This map stores a list of additional paths for each library indexed by | |||
* the libraryId | |||
*/ | |||
private Map libPathsMap = new HashMap(); | |||
/** | |||
* Constructor for the AntLibManager object | |||
* | |||
* @param antEnv the init config of the system. | |||
* @param remoteAllowed true if remote libraries can be used and | |||
* configured | |||
*/ | |||
public AntLibManager(AntEnvironment antEnv, boolean remoteAllowed) { | |||
this.remoteAllowed = remoteAllowed; | |||
this.antEnv = antEnv; | |||
} | |||
/** | |||
* Add all the Ant libraries that can be found at the given URL | |||
* | |||
* @param librarySpecs A map to which additional library specifications | |||
* are added. | |||
* @param libURL the URL from which Ant libraries are to be loaded | |||
* @exception AntLibException if the library specs cannot be parsed | |||
*/ | |||
public void addAntLibraries(Map librarySpecs, URL libURL) | |||
throws AntLibException { | |||
try { | |||
URL[] libURLs = LoaderUtils.getLocationURLs(libURL, | |||
libURL.toString(), ANTLIB_EXTENSIONS); | |||
if (libURLs == null) { | |||
return; | |||
} | |||
// parse each task library to get its library definition | |||
for (int i = 0; i < libURLs.length; ++i) { | |||
URL antLibraryURL = new URL("jar:" + libURLs[i] | |||
+ "!/META-INF/antlib.xml"); | |||
try { | |||
AntLibrarySpec antLibrarySpec | |||
= parseLibraryDef(antLibraryURL); | |||
if (antLibrarySpec != null) { | |||
String libraryId = antLibrarySpec.getLibraryId(); | |||
if (librarySpecs.containsKey(libraryId)) { | |||
AntLibrarySpec currentSpec | |||
= (AntLibrarySpec) librarySpecs.get(libraryId); | |||
throw new AntLibException("Found more than one " | |||
+ "copy of library with id = " + libraryId | |||
+ " (" + libURLs[i] + ") + existing library " | |||
+ "at (" + currentSpec.getLibraryURL() + ")"); | |||
} | |||
antLibrarySpec.setLibraryURL(libURLs[i]); | |||
librarySpecs.put(libraryId, antLibrarySpec); | |||
} | |||
} catch (XMLParseException e) { | |||
Throwable t = e.getCause(); | |||
// ignore file not found exceptions - means the | |||
// jar does not provide META-INF/antlib.xml | |||
if (t instanceof AntLibException) { | |||
throw (AntLibException) t; | |||
} else if (!(t instanceof FileNotFoundException)) { | |||
throw new AntLibException("Unable to parse Ant " | |||
+ "library " + libURLs[i], e); | |||
} | |||
} | |||
} | |||
} catch (MalformedURLException e) { | |||
throw new AntLibException("Unable to load libraries from " | |||
+ libURL, e); | |||
} | |||
} | |||
/** | |||
* Configures the Ant Libraries. Configuration of an Ant Library | |||
* involves resolving any dependencies between libraries and then | |||
* creating the class loaders for the library | |||
* | |||
* @param librarySpecs the loaded specifications of the Ant libraries | |||
* @return A map of the newly configured libraries | |||
* @exception AntLibException if a library cannot be configured from | |||
* the given specification | |||
*/ | |||
private Map configLibraries(Map librarySpecs) | |||
throws AntLibException { | |||
// check if any already defined | |||
for (Iterator i = librarySpecs.keySet().iterator(); i.hasNext();) { | |||
String libraryId = (String) i.next(); | |||
if (antLibraries.containsKey(libraryId)) { | |||
AntLibrary currentVersion = getLibrary(libraryId); | |||
// same location? | |||
AntLibrarySpec spec | |||
= (AntLibrarySpec) librarySpecs.get(libraryId); | |||
URL specURL = spec.getLibraryURL(); | |||
if (!specURL.equals(currentVersion.getDefinitionURL())) { | |||
throw new AntLibException("Ant Library \"" + libraryId | |||
+ "\" is already loaded from " | |||
+ currentVersion.getDefinitionURL() | |||
+ " new version found at " | |||
+ specURL); | |||
} | |||
} | |||
} | |||
Map newLibraries = new HashMap(); | |||
CircularDependencyChecker configuring | |||
= new CircularDependencyChecker("configuring Ant libraries"); | |||
for (Iterator i = librarySpecs.keySet().iterator(); i.hasNext();) { | |||
String libraryId = (String) i.next(); | |||
if (!antLibraries.containsKey(libraryId)) { | |||
configLibrary(librarySpecs, libraryId, | |||
configuring, newLibraries); | |||
} | |||
} | |||
return newLibraries; | |||
} | |||
/** | |||
* Load either a set of libraries or a single library. | |||
* | |||
* @param libLocationURL URL where libraries can be found | |||
* @exception AntLibException if the libraries cannot be loaded | |||
* | |||
* @return a map containing the newly loaded libraries indexed by their | |||
* library ids. | |||
*/ | |||
public Map loadLibs(URL libLocationURL) | |||
throws AntLibException { | |||
if (!libLocationURL.getProtocol().equals("file") | |||
&& !remoteAllowed) { | |||
throw new AntLibException("The config library " | |||
+ "location \"" + libLocationURL | |||
+ "\" cannot be used because config does " | |||
+ "not allow remote libraries"); | |||
} | |||
Map librarySpecs = new HashMap(); | |||
addAntLibraries(librarySpecs, libLocationURL); | |||
Map newLibraries = configLibraries(librarySpecs); | |||
antLibraries.putAll(newLibraries); | |||
return newLibraries; | |||
} | |||
/** | |||
* Add a library path to the given library | |||
* | |||
* @param libraryId the id of the library to which the path is to be added | |||
* @param libPath the path to be added | |||
* @exception AntLibException if remote paths are not allowed by | |||
* configuration | |||
*/ | |||
public void addLibPath(String libraryId, URL libPath) | |||
throws AntLibException { | |||
if (!libPath.getProtocol().equals("file") | |||
&& !remoteAllowed) { | |||
throw new AntLibException("Remote libpaths are not" | |||
+ " allowed: " + libPath); | |||
} | |||
List libPaths = (List) libPathsMap.get(libraryId); | |||
if (libPaths == null) { | |||
libPaths = new ArrayList(); | |||
libPathsMap.put(libraryId, libPaths); | |||
} | |||
List newPaths = new ArrayList(); | |||
newPaths.add(libPath); | |||
if (libPath.getProtocol().equals("file")) { | |||
File dir = new File(libPath.getFile()); | |||
if (dir.isDirectory()) { | |||
try { | |||
URL[] pathURLs = LoaderUtils.getLocationURLs(libPath, | |||
null, ANTLIB_EXTENSIONS); | |||
for (int i = 0; i < pathURLs.length; ++i) { | |||
newPaths.add(pathURLs[i]); | |||
} | |||
} catch (MalformedURLException e) { | |||
// ignore and just use what we were given | |||
} | |||
} | |||
} | |||
AntLibrary antLibrary = getLibrary(libraryId); | |||
for (Iterator i = newPaths.iterator(); i.hasNext();) { | |||
URL newPath = (URL) i.next(); | |||
libPaths.add(newPath); | |||
if (antLibrary != null) { | |||
antLibrary.addLibraryURL(newPath); | |||
} | |||
} | |||
} | |||
/** | |||
* Configure a library from a specification and the Ant init config. | |||
* | |||
* @param librarySpecs the library specs from which this library is to | |||
* be configured. | |||
* @param libraryId the global identifier for the library | |||
* @param configuring A circualr dependency chcker for library | |||
* dependencies. | |||
* @param newLibraries the new libraries being configured. | |||
* @exception AntLibException if the library cannot be configured. | |||
*/ | |||
private void configLibrary(Map librarySpecs, String libraryId, | |||
CircularDependencyChecker configuring, | |||
Map newLibraries) | |||
throws AntLibException { | |||
try { | |||
configuring.visitNode(libraryId); | |||
AntLibrarySpec librarySpec | |||
= (AntLibrarySpec) librarySpecs.get(libraryId); | |||
String extendsId = librarySpec.getExtendsLibraryId(); | |||
if (extendsId != null) { | |||
if (!antLibraries.containsKey(extendsId) && | |||
!newLibraries.containsKey(extendsId)) { | |||
if (!librarySpecs.containsKey(extendsId)) { | |||
throw new AntLibException("Could not find library, " | |||
+ extendsId + ", upon which library " | |||
+ libraryId + " depends"); | |||
} | |||
configLibrary(librarySpecs, extendsId, | |||
configuring, newLibraries); | |||
} | |||
} | |||
// now create the library for the specification | |||
AntLibrary antLibrary = new AntLibrary(librarySpec); | |||
// determine the URLs required for this task. These are the | |||
// task URL itself, the XML parser URLs if required, the | |||
// tools jar URL if required | |||
List urlsList = new ArrayList(); | |||
if (librarySpec.getLibraryURL() != null) { | |||
urlsList.add(librarySpec.getLibraryURL()); | |||
} | |||
if (librarySpec.isToolsJarRequired() | |||
&& antEnv.getToolsJarURL() != null) { | |||
urlsList.add(antEnv.getToolsJarURL()); | |||
} | |||
if (librarySpec.usesAntXML()) { | |||
URL[] parserURLs = antEnv.getParserURLs(); | |||
for (int i = 0; i < parserURLs.length; ++i) { | |||
urlsList.add(parserURLs[i]); | |||
} | |||
} | |||
for (Iterator i = urlsList.iterator(); i.hasNext();) { | |||
antLibrary.addLibraryURL((URL) i.next()); | |||
} | |||
if (extendsId != null) { | |||
AntLibrary extendsLibrary = getLibrary(extendsId); | |||
if (extendsLibrary == null) { | |||
extendsLibrary = (AntLibrary) newLibraries.get(extendsId); | |||
} | |||
antLibrary.setExtendsLibrary(extendsLibrary); | |||
} | |||
antLibrary.setParentLoader(antEnv.getCommonLoader()); | |||
newLibraries.put(libraryId, antLibrary); | |||
if (libPathsMap != null) { | |||
List libPaths = (List) libPathsMap.get(libraryId); | |||
if (libPaths != null) { | |||
for (Iterator j = libPaths.iterator(); j.hasNext();) { | |||
URL pathURL = (URL) j.next(); | |||
antLibrary.addLibraryURL(pathURL); | |||
} | |||
} | |||
} | |||
configuring.leaveNode(libraryId); | |||
} catch (CircularDependencyException e) { | |||
throw new AntLibException(e); | |||
} | |||
} | |||
/** | |||
* Read an Ant library definition from a URL | |||
* | |||
* @param antlibURL the URL of the library definition | |||
* @return the AntLibrary specification read from the library XML | |||
* definition | |||
* @exception XMLParseException if the library cannot be parsed | |||
*/ | |||
private AntLibrarySpec parseLibraryDef(URL antlibURL) | |||
throws XMLParseException { | |||
ParseContext context = new ParseContext(); | |||
AntLibHandler libHandler = new AntLibHandler(); | |||
context.parse(antlibURL, "antlib", libHandler); | |||
return libHandler.getAntLibrarySpec(); | |||
} | |||
/** | |||
* Get a loaded library by its id. | |||
* | |||
* @param libraryId the library's global id | |||
* | |||
* @return the requested library or null if it has not been loaded | |||
*/ | |||
public AntLibrary getLibrary(String libraryId) { | |||
return (AntLibrary) antLibraries.get(libraryId); | |||
} | |||
/** | |||
* Get all the library ids of the currently loaded libraries. | |||
* | |||
* @return an iterator over the library identifier strings. | |||
*/ | |||
public Iterator getLibraryIds() { | |||
return antLibraries.keySet().iterator(); | |||
} | |||
} | |||
@@ -1,301 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.antlib; | |||
import java.net.URL; | |||
import java.net.URLClassLoader; | |||
import java.util.ArrayList; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Map; | |||
import org.apache.ant.common.antlib.AntContext; | |||
import org.apache.ant.common.antlib.AntLibFactory; | |||
import org.apache.ant.common.util.AntException; | |||
/** | |||
* This class represents the Ant library. | |||
* | |||
* @author Conor MacNeill | |||
* @created 14 January 2002 | |||
*/ | |||
public class AntLibrary implements ComponentLibrary { | |||
/** | |||
* This is the globally unique name of this library. It uses the same | |||
* conventions as the Java package space - i.e. reverse order DNS names | |||
* This name is used when importing tasks from this library | |||
*/ | |||
private String libraryId; | |||
/** THe URL of the antlib.xml library spec which defines this library */ | |||
private URL definitionURL; | |||
/** | |||
* The URLs to use when contructing a classloader for the components in | |||
* this library. | |||
*/ | |||
private List libraryURLs = new ArrayList(); | |||
/** The list of converter classnames defined in this library */ | |||
private List converterClassNames = new ArrayList(); | |||
/** The list of aspect classnames defined in this library */ | |||
private List aspectClassNames = new ArrayList(); | |||
/** The class name of this library's factory class, if any */ | |||
private String factoryClassName; | |||
/** The parent classloader to use when contructing classloaders */ | |||
private ClassLoader parentLoader; | |||
/** The library which this library extends, if any */ | |||
private AntLibrary extendsLibrary; | |||
/** Indicates if each Task Instance should use its own classloader */ | |||
private boolean isolated = false; | |||
/** The classloader for this library if it can be reused */ | |||
private ClassLoader loader = null; | |||
/** The definitions in the library */ | |||
private Map definitions = null; | |||
/** | |||
* Constructor for the AntLibrary object | |||
* | |||
* @param spec the specification from which this library is created. | |||
*/ | |||
public AntLibrary(AntLibrarySpec spec) { | |||
this.libraryId = spec.getLibraryId(); | |||
this.definitions = spec.getDefinitions(); | |||
this.isolated = spec.isIsolated(); | |||
this.converterClassNames.addAll(spec.getConverters()); | |||
this.aspectClassNames.addAll(spec.getAspects()); | |||
this.factoryClassName = spec.getFactory(); | |||
this.definitionURL = spec.getLibraryURL(); | |||
} | |||
/** | |||
* Sets the Library which this library extends | |||
* | |||
* @param extendsLibrary The new ExtendsLibrary value | |||
*/ | |||
public void setExtendsLibrary(AntLibrary extendsLibrary) { | |||
this.extendsLibrary = extendsLibrary; | |||
} | |||
/** | |||
* Sets the ParentLoader of the AntLibrary | |||
* | |||
* @param parentLoader The new ParentLoader value | |||
*/ | |||
public void setParentLoader(ClassLoader parentLoader) { | |||
this.parentLoader = parentLoader; | |||
} | |||
/** | |||
* Gets the libraryId of the AntLibrary | |||
* | |||
* @return the libraryId value | |||
*/ | |||
public String getLibraryId() { | |||
return libraryId; | |||
} | |||
/** | |||
* Gets the ClassLoader of the AntLibrary | |||
* | |||
* @return The ClassLoader value | |||
*/ | |||
public ClassLoader getClassLoader() { | |||
if (isolated) { | |||
return createLoader(); | |||
} else if (loader == null) { | |||
loader = createLoader(); | |||
} | |||
return loader; | |||
} | |||
/** | |||
* Gets the definitions (taskdefs and typedefs) of the AntLibrary | |||
* | |||
* @return an iterator over the definition names | |||
*/ | |||
public Iterator getDefinitionNames() { | |||
return definitions.keySet().iterator(); | |||
} | |||
/** | |||
* Get the definition of a particular component | |||
* | |||
* @param definitionName the name of the component within the library | |||
* @return an AntLibDefinition instance with information about the | |||
* component's definition | |||
*/ | |||
public AntLibDefinition getDefinition(String definitionName) { | |||
return (AntLibDefinition) definitions.get(definitionName); | |||
} | |||
/** | |||
* Gets the converter class names of the AntLibrary | |||
* | |||
* @return an iterator over a list of String class names | |||
*/ | |||
public Iterator getConverterClassNames() { | |||
return converterClassNames.iterator(); | |||
} | |||
/** | |||
* Gets the aspect class names of the AntLibrary | |||
* | |||
* @return an iterator over a list of String class names | |||
*/ | |||
public Iterator getAspectClassNames() { | |||
return aspectClassNames.iterator(); | |||
} | |||
/** | |||
* Get the URL to where the library was loaded from | |||
* | |||
* @return the library's URL | |||
*/ | |||
public URL getDefinitionURL() { | |||
return definitionURL; | |||
} | |||
/** | |||
* Gat an instance of a factory object for creating objects in this | |||
* library. | |||
* | |||
* @param context the context to use for the factory creation if | |||
* required | |||
* @return an instance of the factory, or null if this library does not | |||
* support a factory | |||
* @exception AntException if the factory cannot be created | |||
*/ | |||
public AntLibFactory getFactory(AntContext context) | |||
throws AntException { | |||
try { | |||
AntLibFactory libFactory = null; | |||
if (factoryClassName != null) { | |||
Class factoryClass = Class.forName(factoryClassName, | |||
true, getClassLoader()); | |||
libFactory | |||
= (AntLibFactory) factoryClass.newInstance(); | |||
libFactory.init(context); | |||
} | |||
return libFactory; | |||
} catch (ClassNotFoundException e) { | |||
throw new AntLibException("Unable to create factory " | |||
+ factoryClassName + " for the \"" + libraryId | |||
+ "\" Ant library", e); | |||
} catch (NoClassDefFoundError e) { | |||
throw new AntLibException("Could not load a dependent class (" | |||
+ e.getMessage() + ") to create the factory " | |||
+ factoryClassName + " for the \"" + libraryId | |||
+ "\" Ant library", e); | |||
} catch (InstantiationException e) { | |||
throw new AntLibException("Unable to instantiate factory " | |||
+ factoryClassName + " for the \"" + libraryId | |||
+ "\" Ant library", e); | |||
} catch (IllegalAccessException e) { | |||
throw new AntLibException("Unable to access factory " | |||
+ factoryClassName + " for the \"" + libraryId | |||
+ "\" Ant library", e); | |||
} | |||
} | |||
/** | |||
* Indicate whether this library has any converters defined | |||
* | |||
* @return true if any converters have been defined | |||
*/ | |||
public boolean hasConverters() { | |||
return !converterClassNames.isEmpty(); | |||
} | |||
/** | |||
* Indicate whether this library has any aspects defined | |||
* | |||
* @return true if any aspects have been defined | |||
*/ | |||
public boolean hasAspects() { | |||
return !aspectClassNames.isEmpty(); | |||
} | |||
/** | |||
* Add a library to path to this AntLibrary definition | |||
* | |||
* @param libraryURL the URL to the library to be added | |||
*/ | |||
public void addLibraryURL(URL libraryURL) { | |||
libraryURLs.add(libraryURL); | |||
} | |||
/** | |||
* Create classloader which can be used to load the classes of this ant | |||
* library | |||
* | |||
* @return the classloader for this ant library | |||
*/ | |||
private ClassLoader createLoader() { | |||
ClassLoader ourParent | |||
= extendsLibrary == null ? parentLoader | |||
: extendsLibrary.getClassLoader(); | |||
return new URLClassLoader((URL[]) libraryURLs.toArray(new URL[0]), | |||
ourParent); | |||
} | |||
} | |||
@@ -1,334 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.antlib; | |||
import java.net.URL; | |||
import java.util.ArrayList; | |||
import java.util.HashMap; | |||
import java.util.List; | |||
import java.util.Map; | |||
/** | |||
* This class represents the specification of an Ant library. It is merely | |||
* the internal representation of the antlib XML definition. An instance of | |||
* this class is used to contruct an AntLibrary instance. | |||
* | |||
* @author Conor MacNeill | |||
* @created 13 January 2002 | |||
*/ | |||
public class AntLibrarySpec { | |||
/** | |||
* This is the globally unique name of this library. It uses the same | |||
* conventions as the Java package space - i.e. reverse order DNS names | |||
* This name is used when importing tasks from this library | |||
*/ | |||
private String libraryId; | |||
/** | |||
* This string identifies the location where the library is maintained. | |||
* It is usually a URL to the location from which the library may be | |||
* downloaded or purchased | |||
*/ | |||
private String libraryHome; | |||
/** The list of converter classnames defined in this library */ | |||
private List converterClassNames = new ArrayList(); | |||
/** The list of aspect classnames defined in this library */ | |||
private List aspectClassNames = new ArrayList(); | |||
/** The name of the factory class for this library */ | |||
private String factoryClassName; | |||
/** | |||
* This is the optional id of another Ant library upon which this | |||
* library depends. | |||
*/ | |||
private String extendsLibraryId; | |||
/** This is the URL from which this library has been loaded */ | |||
private URL libraryURL; | |||
/** This is the list of definitions */ | |||
private Map definitions = new HashMap(); | |||
/** Indicates if each Task Instance should use its own classloader */ | |||
private boolean isolated = false; | |||
/** Flag which indicates if tools.jar is required */ | |||
private boolean toolsJarRequired = false; | |||
/** | |||
* This flag indicates that this task processes XML and wishes to use | |||
* the XML parser packaged with Ant | |||
*/ | |||
private boolean requiresAntXMLParser = false; | |||
/** | |||
* Set the library that this library extends, if any | |||
* | |||
* @param extendsLibraryId The new ExtendsLibraryId value | |||
*/ | |||
public void setExtendsLibraryId(String extendsLibraryId) { | |||
this.extendsLibraryId = extendsLibraryId; | |||
} | |||
/** | |||
* Sets the name of the factory class of the AntLibrarySpec | |||
* | |||
* @param className the new factory classname | |||
*/ | |||
public void setFactory(String className) { | |||
this.factoryClassName = className; | |||
} | |||
/** | |||
* Indicate that this library requires a separate classloader per task | |||
* instance | |||
* | |||
* @param isolated The new Isolated value | |||
*/ | |||
public void setIsolated(boolean isolated) { | |||
this.isolated = isolated; | |||
} | |||
/** | |||
* Sets the home of the AntLibrary | |||
* | |||
* @param home The new home value | |||
*/ | |||
public void setHome(String home) { | |||
this.libraryHome = libraryHome; | |||
} | |||
/** | |||
* Sets the libraryId of the AntLibrary | |||
* | |||
* @param libraryId The new libraryId value | |||
*/ | |||
public void setLibraryId(String libraryId) { | |||
this.libraryId = libraryId; | |||
} | |||
/** | |||
* Indicate that this library uses the Sun tools.jar | |||
* | |||
* @param toolsJarRequired The new ToolsJarRequired value | |||
*/ | |||
public void setToolsJarRequired(boolean toolsJarRequired) { | |||
this.toolsJarRequired = toolsJarRequired; | |||
} | |||
/** | |||
* Sets the libraryURL of the AntLibrary | |||
* | |||
* @param libraryURL The new libraryURL value | |||
*/ | |||
public void setLibraryURL(URL libraryURL) { | |||
this.libraryURL = libraryURL; | |||
} | |||
/** | |||
* Indicates that this library uses Ant's XML parser libraries | |||
* | |||
* @param requiresAntXMLParser true if this library uses Ant's XML | |||
* parser libraries | |||
*/ | |||
public void setAntXML(boolean requiresAntXMLParser) { | |||
this.requiresAntXMLParser = requiresAntXMLParser; | |||
} | |||
/** | |||
* Get the list of converter classnames defined in this library spec | |||
* | |||
* @return the converter classnames list | |||
*/ | |||
public List getConverters() { | |||
return converterClassNames; | |||
} | |||
/** | |||
* Get the list of aspect classnames defined in this library spec | |||
* | |||
* @return the aspect classnames list | |||
*/ | |||
public List getAspects() { | |||
return aspectClassNames; | |||
} | |||
/** | |||
* Gets the factory classname of the AntLibrarySpec | |||
* | |||
* @return the factory classname | |||
*/ | |||
public String getFactory() { | |||
return factoryClassName; | |||
} | |||
/** | |||
* Indicate whether this AntLibrary requires the Sun tools.jar | |||
* | |||
* @return The ToolsJarRequired value | |||
*/ | |||
public boolean isToolsJarRequired() { | |||
return toolsJarRequired; | |||
} | |||
/** | |||
* Get the id of the library that this library extends if any. | |||
* | |||
* @return The ExtendsLibraryId value | |||
*/ | |||
public String getExtendsLibraryId() { | |||
return extendsLibraryId; | |||
} | |||
/** | |||
* Indicate if this library required an classloader per instance | |||
* | |||
* @return true if a separate classloader should be used per instance. | |||
*/ | |||
public boolean isIsolated() { | |||
return isolated; | |||
} | |||
/** | |||
* Gets the libraryId of the AntLibrary | |||
* | |||
* @return The libraryId value | |||
*/ | |||
public String getLibraryId() { | |||
return libraryId; | |||
} | |||
/** | |||
* Gets the libraryURL of the AntLibrary | |||
* | |||
* @return The libraryURL value | |||
*/ | |||
public URL getLibraryURL() { | |||
return libraryURL; | |||
} | |||
/** | |||
* Gets the definitions of the AntLibrarySpec | |||
* | |||
* @return the definitions map | |||
*/ | |||
public Map getDefinitions() { | |||
return definitions; | |||
} | |||
/** | |||
* Add a converter to this library spec | |||
* | |||
* @param className the name of the converter class | |||
*/ | |||
public void addConverter(String className) { | |||
converterClassNames.add(className); | |||
} | |||
/** | |||
* Add an aspect to this the library spec | |||
* | |||
* @param className the name of the aspect class | |||
*/ | |||
public void addAspect(String className) { | |||
aspectClassNames.add(className); | |||
} | |||
/** | |||
* Indicates if this library requires Ant's XML parser | |||
* | |||
* @return true if this library requires Ant's XML parser | |||
*/ | |||
public boolean usesAntXML() { | |||
return requiresAntXMLParser; | |||
} | |||
/** | |||
* Adds a definition to the Ant Library | |||
* | |||
* @param name the name of the library definition | |||
* @param classname the name of the class implementing the element | |||
* @param definitionTypeName the name of the definition type. This is | |||
* converted to its symbolic value | |||
* @exception AntLibException if the definition has already been defined | |||
*/ | |||
public void addDefinition(String definitionTypeName, String name, | |||
String classname) | |||
throws AntLibException { | |||
if (definitions.containsKey(name)) { | |||
throw new AntLibException("More than one definition " | |||
+ "in library for " + name); | |||
} | |||
int definitionType = 0; | |||
if (definitionTypeName.equals("typedef")) { | |||
definitionType = AntLibrary.TYPEDEF; | |||
} else if (definitionTypeName.equals("taskdef")) { | |||
definitionType = AntLibrary.TASKDEF; | |||
} else { | |||
throw new AntLibException("Unknown type of definition " | |||
+ definitionTypeName); | |||
} | |||
definitions.put(name, | |||
new AntLibDefinition(definitionType, name, classname)); | |||
} | |||
} | |||
@@ -1,109 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.antlib; | |||
import org.apache.ant.antcore.xml.ElementHandler; | |||
import org.xml.sax.SAXParseException; | |||
/** | |||
* Handler for elements which specify a class | |||
* | |||
* @author Conor MacNeill | |||
*/ | |||
public class ClassNameHandler extends ElementHandler { | |||
/** The classname attribute name */ | |||
public static final String CLASSNAME_ATTR = "classname"; | |||
/** | |||
* Gets the className of the Converter | |||
* | |||
* @return the className value | |||
*/ | |||
public String getClassName() { | |||
return getAttribute(CLASSNAME_ATTR); | |||
} | |||
/** | |||
* Process the definition element | |||
* | |||
* @param elementName the name of the element | |||
* @exception SAXParseException if there is a problem parsing the | |||
* element | |||
*/ | |||
public void processElement(String elementName) | |||
throws SAXParseException { | |||
if (getClassName() == null) { | |||
throw new SAXParseException(CLASSNAME_ATTR + " must be " | |||
+ "specified for a converter", getLocator()); | |||
} | |||
} | |||
/** | |||
* Validate that the given attribute and value are valid. | |||
* | |||
* @param attributeName The name of the attributes | |||
* @param attributeValue The value of the attributes | |||
* @exception SAXParseException if the attribute is not allowed on the | |||
* element. | |||
*/ | |||
protected void validateAttribute(String attributeName, | |||
String attributeValue) | |||
throws SAXParseException { | |||
if (!attributeName.equals(CLASSNAME_ATTR)) { | |||
throwInvalidAttribute(attributeName); | |||
} | |||
} | |||
} | |||
@@ -1,106 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.antlib; | |||
import org.apache.ant.common.antlib.AntContext; | |||
import org.apache.ant.common.antlib.AntLibFactory; | |||
import org.apache.ant.common.util.AntException; | |||
/** | |||
* A Component Library supplies components to the Ant core. | |||
* | |||
* @author Conor MacNeill | |||
* @created 8 February 2002 | |||
*/ | |||
public interface ComponentLibrary { | |||
/** constant indicating a taskdef definition */ | |||
public static final int TASKDEF = 1; | |||
/** constant indicating a typedef definition */ | |||
public static final int TYPEDEF = 2; | |||
/** | |||
* Gets the ClassLoader of the AntLibrary | |||
* | |||
* @return The ClassLoader value | |||
*/ | |||
ClassLoader getClassLoader(); | |||
/** | |||
* Gat an instance of a factory object for creating objects in this | |||
* library. | |||
* | |||
* @param context the context to use for the factory creation if | |||
* required | |||
* @return an instance of the factory, or null if this library does not | |||
* support a factory | |||
* @exception AntException if the factory cannot be created | |||
*/ | |||
AntLibFactory getFactory(AntContext context) throws AntException; | |||
/** | |||
* Gets the libraryId of the AntLibrary | |||
* | |||
* @return the libraryId value | |||
*/ | |||
String getLibraryId(); | |||
/** | |||
* Get the definition of a particular component | |||
* | |||
* @param definitionName the name of the component within the library | |||
* @return an AntLibDefinition instance with information about the | |||
* component's definition | |||
*/ | |||
AntLibDefinition getDefinition(String definitionName); | |||
} | |||
@@ -1,144 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.antlib; | |||
import org.apache.ant.antcore.xml.ElementHandler; | |||
import org.xml.sax.SAXParseException; | |||
/** | |||
* Handler for definition within an Ant Library | |||
* | |||
* @author Conor MacNeill | |||
* @created 13 January 2002 | |||
*/ | |||
public class DefinitionHandler extends ElementHandler { | |||
/** The name attribute name */ | |||
public static final String NAME_ATTR = "name"; | |||
/** The classname attribute name */ | |||
public static final String CLASSNAME_ATTR = "classname"; | |||
/** the type of the definition */ | |||
private String definitionType; | |||
/** | |||
* Create a definition handler to handle a specific type of definition | |||
* | |||
* @param definitionType the type of the definition being handled | |||
*/ | |||
public DefinitionHandler(String definitionType) { | |||
this.definitionType = definitionType; | |||
} | |||
/** | |||
* Get the type of definition being handled | |||
* | |||
* @return the type of the definition | |||
*/ | |||
public String getDefinitionType() { | |||
return definitionType; | |||
} | |||
/** | |||
* Gets the name of the TaskdefHandler | |||
* | |||
* @return the name value | |||
*/ | |||
public String getName() { | |||
return getAttribute(NAME_ATTR); | |||
} | |||
/** | |||
* Gets the className of the TaskdefHandler | |||
* | |||
* @return the className value | |||
*/ | |||
public String getClassName() { | |||
return getAttribute(CLASSNAME_ATTR); | |||
} | |||
/** | |||
* Process the definition element | |||
* | |||
* @param elementName the name of the element | |||
* @exception SAXParseException if there is a problem parsing the | |||
* element | |||
*/ | |||
public void processElement(String elementName) | |||
throws SAXParseException { | |||
if (getName() == null || getClassName() == null) { | |||
throw new SAXParseException("name and classname must be " | |||
+ "specified for a " + definitionType, getLocator()); | |||
} | |||
} | |||
/** | |||
* Validate that the given attribute and value are valid. | |||
* | |||
* @param attributeName The name of the attributes | |||
* @param attributeValue The value of the attributes | |||
* @exception SAXParseException if the attribute is not allowed on the | |||
* element. | |||
*/ | |||
protected void validateAttribute(String attributeName, | |||
String attributeValue) | |||
throws SAXParseException { | |||
if (!attributeName.equals(NAME_ATTR) && | |||
!attributeName.equals(CLASSNAME_ATTR)) { | |||
throwInvalidAttribute(attributeName); | |||
} | |||
} | |||
} | |||
@@ -1,166 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.antlib; | |||
import java.util.HashMap; | |||
import java.util.Map; | |||
import org.apache.ant.common.antlib.AntContext; | |||
import org.apache.ant.common.antlib.AntLibFactory; | |||
/** | |||
* A dynamic library is created at runtime to hold newly defined components. | |||
* | |||
* @author Conor MacNeill | |||
* @created 8 February 2002 | |||
*/ | |||
public class DynamicLibrary implements ComponentLibrary { | |||
/** The name profix for naming dynamic libraries */ | |||
public static final String DYNAMIC_LIB_PREFIX = "_internal"; | |||
/** A static field used to uniquely name dynamic libraries */ | |||
private static int dynamicIdCounter = 0; | |||
/** | |||
* the factory this dynamic library will use to create instances of its | |||
* components | |||
*/ | |||
private AntLibFactory factory; | |||
/** | |||
* the classloader that will be used to create new instances of the | |||
* library's components | |||
*/ | |||
private ClassLoader loader; | |||
/** the library's unique id */ | |||
private String libraryId; | |||
/** | |||
* the component definitions of this library. This map contains | |||
* AntLibDefinition instances indexed on the definition names. | |||
*/ | |||
private Map definitions = new HashMap(); | |||
/** | |||
* Constructor for the DynamicLibrary object | |||
* | |||
* @param factory the factory to use to create instances. May be null | |||
* @param loader the loader to use to load the instance classes | |||
*/ | |||
public DynamicLibrary(AntLibFactory factory, ClassLoader loader) { | |||
int dynamicId = 0; | |||
synchronized (DynamicLibrary.class) { | |||
dynamicId = dynamicIdCounter; | |||
dynamicIdCounter++; | |||
} | |||
this.libraryId = DYNAMIC_LIB_PREFIX + dynamicId; | |||
this.loader = loader; | |||
this.factory = factory; | |||
} | |||
/** | |||
* Gets the ClassLoader of the AntLibrary | |||
* | |||
* @return The ClassLoader value | |||
*/ | |||
public ClassLoader getClassLoader() { | |||
return loader; | |||
} | |||
/** | |||
* Gat an instance of a factory object for creating objects in this | |||
* library. | |||
* | |||
* @param context the context to use for the factory creation if | |||
* required | |||
* @return an instance of the factory, or null if this library does not | |||
* support a factory | |||
*/ | |||
public AntLibFactory getFactory(AntContext context) { | |||
return factory; | |||
} | |||
/** | |||
* Gets the libraryId of the AntLibrary | |||
* | |||
* @return the libraryId value | |||
*/ | |||
public String getLibraryId() { | |||
return libraryId; | |||
} | |||
/** | |||
* Get the definition of a particular component | |||
* | |||
* @param definitionName the name of the component within the library | |||
* @return an AntLibDefinition instance with information about the | |||
* component's definition | |||
*/ | |||
public AntLibDefinition getDefinition(String definitionName) { | |||
return (AntLibDefinition) definitions.get(definitionName); | |||
} | |||
/** | |||
* Add a new component definition to this library | |||
* | |||
* @param componentType the type of the component | |||
* @param componentName the name of the component | |||
* @param componentClassName the component's class | |||
*/ | |||
public void addComponent(int componentType, String componentName, | |||
String componentClassName) { | |||
AntLibDefinition newDefinition | |||
= new AntLibDefinition(componentType, componentName, | |||
componentClassName); | |||
definitions.put(componentName, newDefinition); | |||
} | |||
} | |||
@@ -1,222 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.config; | |||
import java.util.Iterator; | |||
import org.apache.ant.common.model.BuildElement; | |||
/** | |||
* An AntConfig is the java class representation of the antconfig.xml files | |||
* used to configure Ant. | |||
* | |||
* @author Conor MacNeill | |||
* @created 20 January 2002 | |||
*/ | |||
public class AntConfig { | |||
/** Indicates if remote libraries may be used */ | |||
private boolean remoteLibs = false; | |||
/** Indicates if remote projects may be used */ | |||
private boolean remoteProjects = false; | |||
/** Indicates if unset properties are ignored */ | |||
private boolean unsetProperties = true; | |||
/** | |||
* Global Configuration tasks. These are run only once. | |||
*/ | |||
private BuildElement globalTasks; | |||
/** | |||
* Frame tasks - these are run in each new frame. | |||
*/ | |||
private BuildElement frameTasks; | |||
/** | |||
* Indicate if unset properties are OK. | |||
* | |||
* @return true if unset properties will not cause an exception | |||
*/ | |||
public boolean isUnsetPropertiesAllowed() { | |||
return unsetProperties; | |||
} | |||
/** | |||
* Indicate if the use of remote library's is allowe dby this config. | |||
* | |||
* @return true if this config allows the use of remote libraries, | |||
*/ | |||
public boolean isRemoteLibAllowed() { | |||
return remoteLibs; | |||
} | |||
/** | |||
* Indicate if this config allows the execution of a remote project | |||
* | |||
* @return true if remote projects are allowed | |||
*/ | |||
public boolean isRemoteProjectAllowed() { | |||
return remoteProjects; | |||
} | |||
/** | |||
* Get the global configuration tasks | |||
* | |||
* @return an iterator over the set of config tasks. | |||
*/ | |||
public Iterator getGlobalTasks() { | |||
if (globalTasks == null) { | |||
return null; | |||
} | |||
return globalTasks.getNestedElements(); | |||
} | |||
/** | |||
* Get the per-frame configuration tasks | |||
* | |||
* @return an iterator over the set of config tasks. | |||
*/ | |||
public Iterator getFrameTasks() { | |||
if (frameTasks == null) { | |||
return null; | |||
} | |||
return frameTasks.getNestedElements(); | |||
} | |||
/** | |||
* Add a global config task. | |||
* | |||
* @param globalTasks a collection of tasks to be executed as part of | |||
* the configuration process. | |||
*/ | |||
public void addGlobalTasks(BuildElement globalTasks) { | |||
this.globalTasks = globalTasks; | |||
} | |||
/** | |||
* Add a per-frame config task. | |||
* | |||
* @param frameTasks a collection of tasks to be executed as part of the | |||
* setup of each new frame. | |||
*/ | |||
public void addFrameTasks(BuildElement frameTasks) { | |||
this.frameTasks = frameTasks; | |||
} | |||
/** | |||
* Allow remote libraries to be used | |||
* | |||
* @param allowRemoteLibs true if remote libraries may be used. | |||
*/ | |||
public void allowRemoteLibs(boolean allowRemoteLibs) { | |||
this.remoteLibs = allowRemoteLibs; | |||
} | |||
/** | |||
* Allow remote projects to be used | |||
* | |||
* @param allowRemoteProjects true if remote projects may be executed. | |||
*/ | |||
public void allowRemoteProjects(boolean allowRemoteProjects) { | |||
this.remoteProjects = allowRemoteProjects; | |||
} | |||
/** | |||
* Allow properties to be used even when they have not been set | |||
* | |||
* @param allowUnsetProperties true if un set properties should not | |||
* cause an exception | |||
*/ | |||
public void allowUnsetProperties(boolean allowUnsetProperties) { | |||
this.unsetProperties = allowUnsetProperties; | |||
} | |||
/** | |||
* Merge in another configuration. The configuration being merged in | |||
* takes precedence | |||
* | |||
* @param otherConfig the other AntConfig to be merged. | |||
*/ | |||
public void merge(AntConfig otherConfig) { | |||
remoteLibs = otherConfig.remoteLibs; | |||
remoteProjects = otherConfig.remoteProjects; | |||
unsetProperties = otherConfig.unsetProperties; | |||
globalTasks = combineTasks(globalTasks, otherConfig.globalTasks); | |||
frameTasks = combineTasks(frameTasks, otherConfig.frameTasks); | |||
} | |||
/** | |||
* Combine two task collections | |||
* | |||
* @param lhs the lefthand collection | |||
* @param rhs the right hand collection | |||
* | |||
* @return the combined collection of tasks | |||
*/ | |||
private BuildElement combineTasks(BuildElement lhs, BuildElement rhs) { | |||
if (rhs == null) { | |||
return lhs; | |||
} | |||
if (lhs == null) { | |||
return rhs; | |||
} | |||
for (Iterator i = rhs.getNestedElements(); i.hasNext();) { | |||
lhs.addNestedElement((BuildElement) i.next()); | |||
} | |||
return lhs; | |||
} | |||
} | |||
@@ -1,169 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.config; | |||
import org.apache.ant.antcore.xml.ElementHandler; | |||
import org.apache.ant.antcore.modelparser.BuildElementHandler; | |||
import org.apache.ant.common.model.BuildElement; | |||
import org.xml.sax.Attributes; | |||
import org.xml.sax.SAXParseException; | |||
/** | |||
* XML Element Handler for Ant config files | |||
* | |||
* @author Conor MacNeill | |||
* @created 20 January 2002 | |||
*/ | |||
public class AntConfigHandler extends ElementHandler { | |||
/** The allowRemoteProject attribute name */ | |||
public static final String REMOTE_PROJECT_ATTR = "allow-remote-project"; | |||
/** The allowRemoteLibrary attribute name */ | |||
public static final String REMOTE_LIBRARY_ATTR = "allow-remote-library"; | |||
/** The allowReportProject attribute name */ | |||
public static final String UNSET_PROPS_ATTR = "allow-unset-properties"; | |||
/** The global tasks element */ | |||
public static final String GLOBAL_TASKS_ELEMENT = "global-tasks"; | |||
/** The per-frame tasks element */ | |||
public static final String PERFRAME_TASKS_ELEMENT = "project-tasks"; | |||
/** The list of allowed Attributes */ | |||
public static final String[] ALLOWED_ATTRIBUTES | |||
= {REMOTE_PROJECT_ATTR, REMOTE_LIBRARY_ATTR, UNSET_PROPS_ATTR}; | |||
/** | |||
* The config object which is contructed from the XML representation of | |||
* the config | |||
*/ | |||
private AntConfig config; | |||
/** | |||
* Get the Ant Config read in by this handler | |||
* | |||
* @return the AntConfig instance | |||
*/ | |||
public AntConfig getAntConfig() { | |||
return config; | |||
} | |||
/** | |||
* Process the antlib element | |||
* | |||
* @param elementName the name of the element | |||
* @exception SAXParseException if there is a problem parsing the | |||
* element | |||
*/ | |||
public void processElement(String elementName) | |||
throws SAXParseException { | |||
config = new AntConfig(); | |||
config.allowRemoteLibs(getBooleanAttribute(REMOTE_LIBRARY_ATTR)); | |||
config.allowRemoteProjects(getBooleanAttribute(REMOTE_PROJECT_ATTR)); | |||
boolean allowUnsetProperties = true; | |||
if (getAttribute(UNSET_PROPS_ATTR) != null) { | |||
allowUnsetProperties = getBooleanAttribute(UNSET_PROPS_ATTR); | |||
} | |||
config.allowUnsetProperties(allowUnsetProperties); | |||
} | |||
/** | |||
* Start a new element in the ant config. | |||
* | |||
* @param uri The Namespace URI. | |||
* @param localName The local name (without prefix). | |||
* @param qualifiedName The qualified name (with prefix) | |||
* @param attributes The attributes attached to the element. | |||
* @throws SAXParseException if there is a parsing problem. | |||
*/ | |||
protected void addNestedElement(String uri, String localName, | |||
String qualifiedName, Attributes attributes) | |||
throws SAXParseException { | |||
// configs support two task collections as elements | |||
BuildElementHandler buildElementHandler = new BuildElementHandler(); | |||
buildElementHandler.start(getParseContext(), getXMLReader(), | |||
this, getLocator(), attributes, getElementSource(), | |||
qualifiedName); | |||
BuildElement element = buildElementHandler.getBuildElement(); | |||
if (element.getType().equals(GLOBAL_TASKS_ELEMENT)) { | |||
config.addGlobalTasks(element); | |||
} else if (element.getType().equals(PERFRAME_TASKS_ELEMENT)) { | |||
config.addFrameTasks(element); | |||
} else { | |||
throw new SAXParseException("<antconfig> does not support the <" | |||
+ element.getType() + "> element", getLocator()); | |||
} | |||
} | |||
/** | |||
* Validate that the given attribute and value are valid. | |||
* | |||
* @param attributeName The name of the attributes | |||
* @param attributeValue The value of the attributes | |||
* @exception SAXParseException if the attribute is not allowed on the | |||
* element. | |||
*/ | |||
protected void validateAttribute(String attributeName, | |||
String attributeValue) | |||
throws SAXParseException { | |||
for (int i = 0; i < ALLOWED_ATTRIBUTES.length; ++i) { | |||
if (attributeName.equals(ALLOWED_ATTRIBUTES[i])) { | |||
return; | |||
} | |||
} | |||
throwInvalidAttribute(attributeName); | |||
} | |||
} | |||
@@ -1,176 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.execution; | |||
import java.lang.reflect.Constructor; | |||
import java.lang.reflect.InvocationTargetException; | |||
import java.lang.reflect.Method; | |||
import org.apache.ant.common.antlib.Converter; | |||
import org.apache.ant.common.util.AntException; | |||
/** | |||
* AttributeSetters are created at introspection time for each | |||
* setter method a class provides and for which a conversion from a | |||
* String value is available. | |||
* | |||
* @author Conor MacNeill | |||
* @created 19 January 2002 | |||
*/ | |||
public class AttributeSetter { | |||
/** The method that will perform the setting */ | |||
private Method method; | |||
/** | |||
* A converter to convert the string value to a value to be given to | |||
* the setter method | |||
*/ | |||
private Converter converter; | |||
/** | |||
* A constructor used to create the string value to an object to be used | |||
* by the setter | |||
*/ | |||
private Constructor valueConstructor; | |||
/** The depth of the setter in the class hierarchy */ | |||
private int depth; | |||
/** | |||
* Create a setter which just uses string values | |||
* | |||
* @param method the method to be invoked. | |||
* @param depth the depth of this method declaraion in the class hierarchy. | |||
*/ | |||
public AttributeSetter(Method method, int depth) { | |||
this.method = method; | |||
this.depth = depth; | |||
} | |||
/** | |||
* Create a setter which just uses string values | |||
* | |||
* @param method the method to be invoked. | |||
* @param depth the depth of this method declaraion in the class hierarchy. | |||
* @param converter a converter to convert string values into instances of | |||
* the type expected by the method. | |||
*/ | |||
public AttributeSetter(Method method, int depth, Converter converter) { | |||
this(method, depth); | |||
this.converter = converter; | |||
} | |||
/** | |||
* Create a setter which just uses string values | |||
* | |||
* @param method the method to be invoked. | |||
* @param depth the depth of this method declaraion in the class hierarchy. | |||
* @param valueConstructor an object constructor used to convert string | |||
* values into instances of the type expected by the method. | |||
*/ | |||
public AttributeSetter(Method method, int depth, | |||
Constructor valueConstructor) { | |||
this(method, depth); | |||
this.valueConstructor = valueConstructor; | |||
} | |||
/** | |||
* Set the attribute value on an object | |||
* | |||
* @param obj the object on which the set method is to be invoked | |||
* @param stringValue the string representation of the value | |||
* @exception InvocationTargetException if the method cannot be | |||
* invoked | |||
* @exception IllegalAccessException if the method cannot be invoked | |||
* @exception AntException if the conversion of the value | |||
* fails | |||
*/ | |||
void set(Object obj, String stringValue) | |||
throws InvocationTargetException, IllegalAccessException, | |||
AntException { | |||
Object value = null; | |||
if (converter != null) { | |||
Class type = getType(); | |||
value = converter.convert(stringValue, type); | |||
} else if (valueConstructor != null) { | |||
try { | |||
value = valueConstructor.newInstance(new String[]{stringValue}); | |||
} catch (InstantiationException e) { | |||
throw new ExecutionException(e); | |||
} | |||
} else { | |||
value = stringValue; | |||
} | |||
method.invoke(obj, new Object[]{value}); | |||
} | |||
/** | |||
* Get the declaration depth of this setter. | |||
* | |||
* @return the attribute setter's declaration depth. | |||
*/ | |||
public int getDepth() { | |||
return depth; | |||
} | |||
/** | |||
* Get the type expected by this setter's method | |||
* | |||
* @return a Class instance being the type this setter's method accepts. | |||
*/ | |||
public Class getType() { | |||
return method.getParameterTypes()[0]; | |||
} | |||
} | |||
@@ -1,257 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.execution; | |||
import java.util.ArrayList; | |||
import java.util.Iterator; | |||
import java.util.Map; | |||
import java.util.HashMap; | |||
import java.util.List; | |||
import org.apache.ant.common.antlib.Task; | |||
import org.apache.ant.common.event.BuildEvent; | |||
import org.apache.ant.common.event.BuildListener; | |||
import org.apache.ant.common.model.ModelElement; | |||
import org.apache.ant.common.util.DemuxOutputReceiver; | |||
import org.apache.ant.common.event.MessageLevel; | |||
import org.apache.ant.common.util.AntException; | |||
/** | |||
* BuildEventSupport is used by classes which which to send build events to | |||
* the BuildListeners | |||
* | |||
* @author Conor MacNeill | |||
* @created 15 January 2002 | |||
*/ | |||
public class BuildEventSupport implements DemuxOutputReceiver { | |||
/** | |||
* The listeners attached to the object which contains this support | |||
* object | |||
*/ | |||
private ArrayList listeners = new ArrayList(); | |||
/** Records the latest task to be executed on a thread (Thread to Task). */ | |||
private Map threadTasks = new HashMap(); | |||
/** | |||
* Gets the listeners of the BuildEventSupport | |||
* | |||
* @return the listeners value | |||
*/ | |||
public List getListeners() { | |||
return (List) listeners.clone(); | |||
} | |||
/** | |||
* Add a listener | |||
* | |||
* @param listener the listener to be added | |||
*/ | |||
public void addBuildListener(BuildListener listener) { | |||
listeners.add(listener); | |||
} | |||
/** | |||
* Remove a listener | |||
* | |||
* @param listener the listener to be removed | |||
*/ | |||
public void removeBuildListener(BuildListener listener) { | |||
listeners.remove(listener); | |||
} | |||
/** | |||
* Fire a build started event | |||
* | |||
* @param element the build element with which the event is associated | |||
*/ | |||
public void fireBuildStarted(ModelElement element) { | |||
BuildEvent event = new BuildEvent(element, BuildEvent.BUILD_STARTED); | |||
List listeners = getListeners(); | |||
for (Iterator i = listeners.iterator(); i.hasNext();) { | |||
BuildListener listener = (BuildListener) i.next(); | |||
listener.buildStarted(event); | |||
} | |||
} | |||
/** | |||
* Fir a build finished event | |||
* | |||
* @param element the build element with which the event is associated | |||
* @param cause an exception if there was a failure in the build | |||
*/ | |||
public void fireBuildFinished(ModelElement element, | |||
Throwable cause) { | |||
BuildEvent event = new BuildEvent(element, BuildEvent.BUILD_FINISHED, | |||
cause); | |||
List listeners = getListeners(); | |||
for (Iterator i = listeners.iterator(); i.hasNext();) { | |||
BuildListener listener = (BuildListener) i.next(); | |||
listener.buildFinished(event); | |||
} | |||
} | |||
/** | |||
* fire a target started event | |||
* | |||
* @param element the build element with which the event is associated | |||
*/ | |||
public void fireTargetStarted(ModelElement element) { | |||
BuildEvent event = new BuildEvent(element, BuildEvent.TARGET_STARTED); | |||
List listeners = getListeners(); | |||
for (Iterator i = listeners.iterator(); i.hasNext();) { | |||
BuildListener listener = (BuildListener) i.next(); | |||
listener.targetStarted(event); | |||
} | |||
} | |||
/** | |||
* fire a target finished event | |||
* | |||
* @param element the build element with which the event is associated | |||
* @param cause an exception if there was a failure in the target's task | |||
*/ | |||
public void fireTargetFinished(ModelElement element, | |||
Throwable cause) { | |||
BuildEvent event = new BuildEvent(element, BuildEvent.TARGET_FINISHED, | |||
cause); | |||
List listeners = getListeners(); | |||
for (Iterator i = listeners.iterator(); i.hasNext();) { | |||
BuildListener listener = (BuildListener) i.next(); | |||
listener.targetFinished(event); | |||
} | |||
} | |||
/** | |||
* fire a task started event | |||
* | |||
* @param task the task with which the event is associated | |||
*/ | |||
public void fireTaskStarted(Task task) { | |||
synchronized (this) { | |||
threadTasks.put(Thread.currentThread(), task); | |||
} | |||
BuildEvent event = new BuildEvent(task, BuildEvent.TASK_STARTED); | |||
List listeners = getListeners(); | |||
for (Iterator i = listeners.iterator(); i.hasNext();) { | |||
BuildListener listener = (BuildListener) i.next(); | |||
listener.taskStarted(event); | |||
} | |||
} | |||
/** | |||
* fire a task finished event | |||
* | |||
* @param task the task with which the event is associated | |||
* @param cause an exception if there was a failure in the task | |||
*/ | |||
public void fireTaskFinished(Task task, | |||
Throwable cause) { | |||
System.out.flush(); | |||
System.err.flush(); | |||
synchronized (this) { | |||
threadTasks.remove(Thread.currentThread()); | |||
} | |||
BuildEvent event = new BuildEvent(task, BuildEvent.TASK_FINISHED, | |||
cause); | |||
List listeners = getListeners(); | |||
for (Iterator i = listeners.iterator(); i.hasNext();) { | |||
BuildListener listener = (BuildListener) i.next(); | |||
listener.taskFinished(event); | |||
} | |||
} | |||
/** | |||
* Send a message event | |||
* | |||
* @param source the build element with which the event is associated | |||
* @param message the message to be sent | |||
* @param priority the priority of the message | |||
*/ | |||
public void fireMessageLogged(Object source, | |||
String message, int priority) { | |||
BuildEvent event = new BuildEvent(source, message, priority); | |||
List listeners = getListeners(); | |||
for (Iterator i = listeners.iterator(); i.hasNext();) { | |||
BuildListener listener = (BuildListener) i.next(); | |||
listener.messageLogged(event); | |||
} | |||
} | |||
/** | |||
* Demultiplexes output so that each task receives the appropriate | |||
* messages. If the current thread is not currently executing a task, | |||
* the message is logged directly. | |||
* | |||
* @param line Message to handle. Should not be <code>null</code>. | |||
* @param isError Whether the text represents an error (<code>true</code> | |||
* ) or information (<code>false</code>). | |||
*/ | |||
public void threadOutput(String line, boolean isError) { | |||
Task task = (Task) threadTasks.get(Thread.currentThread()); | |||
if (task != null) { | |||
try { | |||
if (isError) { | |||
task.handleSystemErr(line); | |||
} else { | |||
task.handleSystemOut(line); | |||
} | |||
return; | |||
} catch (AntException e) { | |||
// ignore just log as a non-task message | |||
} | |||
} | |||
fireMessageLogged(this, line, | |||
isError ? MessageLevel.ERROR : MessageLevel.INFO); | |||
} | |||
} | |||
@@ -1,171 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.execution; | |||
import java.lang.reflect.Method; | |||
import java.util.Map; | |||
import java.util.HashMap; | |||
/** | |||
* Introspects a class and builds a reflector for setting values on | |||
* instances of the class | |||
* | |||
* @author Conor MacNeill | |||
* @created 19 January 2002 | |||
*/ | |||
public class ClassIntrospector { | |||
/** The reflector that this introspector populates */ | |||
private Reflector reflector; | |||
/** | |||
* A Map which maps the classnames to their depth in the class hiearchy, | |||
* with the current class being depth=0 | |||
*/ | |||
private Map classDepth = new HashMap(); | |||
/** | |||
* Determine the class hierarchy depths for the given class. | |||
* | |||
* @param bean the class for which the class depths will be determined. | |||
*/ | |||
private void getDepths(Class bean) { | |||
Class currentClass = bean; | |||
int index = 0; | |||
while (currentClass != null) { | |||
classDepth.put(currentClass, new Integer(index++)); | |||
currentClass = currentClass.getSuperclass(); | |||
} | |||
} | |||
/** | |||
* Create a introspector for the bean | |||
* | |||
* @param bean the class which is introspected | |||
* @param converters a collection of converters for converting values | |||
* from strings | |||
*/ | |||
public ClassIntrospector(final Class bean, Map converters) { | |||
reflector = new Reflector(); | |||
getDepths(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 (name.equals("addText") | |||
&& returnType.equals(Void.TYPE) | |||
&& args.length == 1 | |||
&& args[0].equals(String.class)) { | |||
reflector.setAddTextMethod(m); | |||
} else if (name.startsWith("set") | |||
&& name.length() > 3 | |||
&& returnType.equals(Void.TYPE) | |||
&& args.length == 1 | |||
&& !args[0].isArray()) { | |||
Integer depth = (Integer) classDepth.get(m.getDeclaringClass()); | |||
reflector.addAttributeMethod(m, depth.intValue(), | |||
getPropertyName(name, "set"), converters); | |||
} else if (name.startsWith("addConfigured") | |||
&& name.length() > 13 | |||
&& returnType.equals(Void.TYPE) | |||
&& args.length == 1 | |||
&& !args[0].equals(String.class) | |||
&& !args[0].isArray() | |||
&& !args[0].isPrimitive()) { | |||
reflector.addElementMethod(m, | |||
getPropertyName(name, "addConfigured")); | |||
} else if (name.startsWith("add") | |||
&& name.length() > 3 | |||
&& returnType.equals(Void.TYPE) | |||
&& args.length == 1 | |||
&& !args[0].equals(String.class) | |||
&& !args[0].isArray() | |||
&& !args[0].isPrimitive()) { | |||
reflector.addElementMethod(m, getPropertyName(name, "add")); | |||
} else if (name.startsWith("create") | |||
&& name.length() > 6 | |||
&& !returnType.isArray() | |||
&& !returnType.isPrimitive() | |||
&& args.length == 0) { | |||
reflector.addCreateMethod(m, getPropertyName(name, "create")); | |||
} | |||
} | |||
} | |||
/** | |||
* Gets the reflector associed with the class we are introspecting | |||
* | |||
* @return the reflector | |||
*/ | |||
public Reflector getReflector() { | |||
return reflector; | |||
} | |||
/** | |||
* extract the name of a property from a method name - subtracting a | |||
* given prefix. | |||
* | |||
* @param methodName the name of the method | |||
* @param prefix the prefix to be ignored | |||
* @return the property name | |||
*/ | |||
private String getPropertyName(String methodName, String prefix) { | |||
int start = prefix.length(); | |||
return methodName.substring(start).toLowerCase(); | |||
} | |||
} | |||
@@ -1,66 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.execution; | |||
/** | |||
* Core constants | |||
* | |||
* @author Conor MacNeill | |||
* @created 20 February 2002 | |||
*/ | |||
public abstract class Constants { | |||
/** The prefix for library ids that are automatically imported */ | |||
public static final String ANT_LIB_PREFIX = "ant."; | |||
} | |||
@@ -1,525 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.execution; | |||
import java.util.ArrayList; | |||
import java.util.HashMap; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Map; | |||
import org.apache.ant.common.event.MessageLevel; | |||
import org.apache.ant.common.model.Project; | |||
import org.apache.ant.common.service.DataService; | |||
import org.apache.ant.common.util.AntException; | |||
import org.apache.ant.common.util.DataValue; | |||
import org.apache.ant.common.util.PropertyUtils; | |||
/** | |||
* This is the core's implementation of the DataService service interface. It | |||
* gives Ant libraries access to property values maintained in the Frame. | |||
* | |||
* @author Conor MacNeill | |||
* @created 31 January 2002 | |||
*/ | |||
public class CoreDataService implements DataService { | |||
/** The Frame this service instance is working for */ | |||
private Frame frame; | |||
/** all properties to be unset without throwing an exception */ | |||
private boolean allowUnsetProperties; | |||
/** | |||
* The context of this execution. This contains all data object's created | |||
* by tasks that have been executed | |||
*/ | |||
private Map dataValues = new HashMap(); | |||
/** | |||
* The property overrides for the referenced frames. This map is indexed | |||
* by the reference names of the frame. Each entry is another Map of | |||
* property values indexed by their relative name. | |||
*/ | |||
private Map overrides = new HashMap(); | |||
/** | |||
* Constructor | |||
* | |||
* @param frame the frame containing this context | |||
* @param allowUnsetProperties true if the reference to an unset property | |||
* should not throw an exception | |||
*/ | |||
protected CoreDataService(Frame frame, | |||
boolean allowUnsetProperties) { | |||
this.frame = frame; | |||
this.allowUnsetProperties = allowUnsetProperties; | |||
} | |||
/** | |||
* Get the Data service of a frame | |||
* | |||
* @param frame the frame whose data service is required. | |||
* @return the frame's data service. | |||
* @exception ExecutionException if the frame's data service cannot be | |||
* retrieved. | |||
*/ | |||
private DataService getFrameDataService(Frame frame) | |||
throws ExecutionException { | |||
return (DataService) frame.getCoreService(DataService.class); | |||
} | |||
/** | |||
* Update a DataValue in a repository. | |||
* | |||
* The value is only updated if it is a higher priority than any existing | |||
* values or the same priority and the mutable flag is set. | |||
* | |||
* @param repository the repository containing the values. | |||
* @param key the key under which the value is to be stored. | |||
* @param value the data vale instance | |||
* @param mutable true if a value of equal priority can be overwritten. | |||
*/ | |||
private void updateValue(Map repository, String key, | |||
DataValue value, boolean mutable) { | |||
int priority = value.getPriority(); | |||
DataValue currentDataValue = (DataValue) repository.get(key); | |||
if (currentDataValue != null) { | |||
int currentPriority = currentDataValue.getPriority(); | |||
if (currentPriority > priority | |||
|| (currentPriority == priority && !mutable)) { | |||
frame.log("Ignoring override for data value " + key, | |||
MessageLevel.VERBOSE); | |||
return; | |||
} | |||
} | |||
repository.put(key, value); | |||
} | |||
/** | |||
* Set a value in this frame or any of its imported frames. | |||
* | |||
* @param name the name of the value | |||
* @param value the actual value | |||
* @param mutable if true, existing values can be changed | |||
* @exception AntException if the value cannot be set. | |||
*/ | |||
public void setDataValue(String name, DataValue value, boolean mutable) | |||
throws AntException { | |||
Frame containingFrame = frame.getContainingFrame(name); | |||
if (containingFrame == null) { | |||
setOverrideProperty(name, value, mutable); | |||
return; | |||
} | |||
String localName = frame.getNameInFrame(name); | |||
if (containingFrame == frame) { | |||
updateValue(dataValues, localName, value, mutable); | |||
} else { | |||
DataService actualDataService = getFrameDataService(containingFrame); | |||
actualDataService.setDataValue(localName, value, mutable); | |||
} | |||
} | |||
/** | |||
* When a frame has not yet been referenced, this method is used to set | |||
* the initial properties for the frame when it is introduced. | |||
* | |||
* @param name the name of the value | |||
* @param value the actual value | |||
* @param mutable if true, existing values can be changed | |||
* @exception ExecutionException if attempting to override a property in | |||
* the current frame. | |||
*/ | |||
private void setOverrideProperty(String name, DataValue value, | |||
boolean mutable) | |||
throws ExecutionException { | |||
int refIndex = name.indexOf(Project.REF_DELIMITER); | |||
if (refIndex == -1) { | |||
throw new ExecutionException("Property overrides can only be set" | |||
+ " for properties in referenced projects - not " | |||
+ name); | |||
} | |||
String firstFrameName = name.substring(0, refIndex); | |||
String relativeName | |||
= name.substring(refIndex + Project.REF_DELIMITER.length()); | |||
Map frameOverrides = (Map) overrides.get(firstFrameName); | |||
if (frameOverrides == null) { | |||
frameOverrides = new HashMap(); | |||
overrides.put(firstFrameName, frameOverrides); | |||
} | |||
updateValue(frameOverrides, relativeName, value, mutable); | |||
} | |||
/** | |||
* Get a data value | |||
* | |||
* @param name the name of the data value | |||
* @return the current object associated with the name or null if no value | |||
* is currently associated with the name | |||
* @exception AntException if the value cannot be retrieved. | |||
*/ | |||
public Object getDataValue(String name) throws AntException { | |||
Frame containingFrame = frame.getContainingFrame(name); | |||
if (containingFrame == null) { | |||
return getOverrideProperty(name); | |||
} | |||
if (containingFrame == frame) { | |||
DataValue dataValue = (DataValue) dataValues.get(name); | |||
if (dataValue == null) { | |||
return null; | |||
} | |||
return dataValue.getValue(); | |||
} else { | |||
String localName = frame.getNameInFrame(name); | |||
DataService actualDataService = getFrameDataService(containingFrame); | |||
return actualDataService.getDataValue(localName); | |||
} | |||
} | |||
/** | |||
* Indicate if a data value has been set | |||
* | |||
* @param name the name of the data value - may contain reference | |||
* delimiters | |||
* @return true if the value exists | |||
* @exception AntException if the data value cannot be accessed. | |||
*/ | |||
public boolean isDataValueSet(String name) throws AntException { | |||
Frame containingFrame = frame.getContainingFrame(name); | |||
if (containingFrame == null) { | |||
return isOverrideSet(name); | |||
} | |||
if (containingFrame == frame) { | |||
return dataValues.containsKey(name); | |||
} else { | |||
String localName = frame.getNameInFrame(name); | |||
DataService actualDataService = getFrameDataService(containingFrame); | |||
return actualDataService.isDataValueSet(localName); | |||
} | |||
} | |||
/** | |||
* Get all the data values from the frame and any referenced frames. This | |||
* is an expensive operation since it must clone all of the property | |||
* stores in all frames | |||
* | |||
* @return a Map containing the frames data values indexed by their full | |||
* name. | |||
* @exception AntException if the values cannot be retrieved. | |||
*/ | |||
public Map getAllDataValues() throws AntException { | |||
Map allValues = new HashMap(); | |||
mergeDataValues(allValues, dataValues); | |||
// add in values from sub frames | |||
for (Iterator i = frame.getRefNames(); i.hasNext();) { | |||
String refName = (String) i.next(); | |||
Frame refFrame = frame.getReferencedFrame(refName); | |||
DataService refDataService = getFrameDataService(refFrame); | |||
Map refValues = refDataService.getAllDataValues(); | |||
Iterator j = refValues.keySet().iterator(); | |||
while (j.hasNext()) { | |||
String name = (String) j.next(); | |||
DataValue value = (DataValue) refValues.get(name); | |||
updateValue(allValues, refName + Project.REF_DELIMITER + name, | |||
value, false); | |||
} | |||
} | |||
// add in values from overrides which have not yet been activated | |||
for (Iterator i = overrides.keySet().iterator(); i.hasNext();) { | |||
String refName = (String) i.next(); | |||
Map refOverrides = (Map) overrides.get(refName); | |||
for (Iterator j = refOverrides.keySet().iterator(); j.hasNext();) { | |||
String name = (String) j.next(); | |||
DataValue value = (DataValue) refOverrides.get(name); | |||
updateValue(allValues, refName + Project.REF_DELIMITER + name, | |||
value, false); | |||
} | |||
} | |||
return allValues; | |||
} | |||
/** | |||
* Replace ${} style constructions in the given value with the string | |||
* value of the corresponding data values in the frame | |||
* | |||
* @param value the string to be scanned for property references. | |||
* @return the string with all property references replaced | |||
* @exception AntException if any of the properties do not exist | |||
*/ | |||
public String replacePropertyRefs(String value) | |||
throws AntException { | |||
if (value == null) { | |||
return null; | |||
} | |||
List fragments = new ArrayList(); | |||
List propertyRefs = new ArrayList(); | |||
PropertyUtils.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)) { | |||
if (!allowUnsetProperties) { | |||
throw new ExecutionException("Property \"" | |||
+ propertyName + "\" has not been set"); | |||
} | |||
fragment = "${" + propertyName + "}"; | |||
} else { | |||
fragment = getDataValue(propertyName).toString(); | |||
} | |||
} | |||
sb.append(fragment); | |||
} | |||
return sb.toString(); | |||
} | |||
/** | |||
* Replace ${} style constructions in the given value with the string | |||
* value of the objects in the given map. Any values which are not found | |||
* are left unchanged. | |||
* | |||
* @param value the string to be scanned for property references. | |||
* @param replacementValues the collection of replacement values | |||
* @return the string with all property references replaced | |||
* @exception AntException if any of the properties do not exist | |||
*/ | |||
public String replacePropertyRefs(String value, Map replacementValues) | |||
throws AntException { | |||
if (value == null) { | |||
return null; | |||
} | |||
List fragments = new ArrayList(); | |||
List propertyRefs = new ArrayList(); | |||
PropertyUtils.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 (!replacementValues.containsKey(propertyName)) { | |||
fragment = "${" + propertyName + "}"; | |||
} else { | |||
fragment | |||
= replacementValues.get(propertyName).toString(); | |||
} | |||
} | |||
sb.append(fragment); | |||
} | |||
return sb.toString(); | |||
} | |||
/** | |||
* Get the data value overrides associated with a given reference name. | |||
* | |||
* @param refName The name of the reference for which overriding datavalues | |||
* are required. | |||
* @return The map of named DataValue instances. | |||
*/ | |||
protected Map getOverrides(String refName) { | |||
return (Map) overrides.get(refName); | |||
} | |||
/** | |||
* Remove the override values associated with a given reference name. | |||
* | |||
* @param refName The name of the reference for which overriding datavalues | |||
* are required. | |||
*/ | |||
protected void removeOverrides(String refName) { | |||
overrides.remove(refName); | |||
} | |||
/** | |||
* Get a value which exists in the frame property overrides awaiting the | |||
* frame to be introduced. | |||
* | |||
* @param name the name of the value | |||
* @return the value of the property or null if the property does not | |||
* exist. | |||
* @exception ExecutionException if attempting to get an override in the | |||
* current frame. | |||
*/ | |||
private Object getOverrideProperty(String name) throws ExecutionException { | |||
int refIndex = name.indexOf(Project.REF_DELIMITER); | |||
if (refIndex == -1) { | |||
throw new ExecutionException("Property overrides can only be" | |||
+ " returned for properties in referenced projects - not " | |||
+ name); | |||
} | |||
String firstFrameName = name.substring(0, refIndex); | |||
String relativeName | |||
= name.substring(refIndex + Project.REF_DELIMITER.length()); | |||
Map frameOverrides = (Map) overrides.get(firstFrameName); | |||
if (frameOverrides == null) { | |||
return null; | |||
} | |||
return frameOverrides.get(relativeName); | |||
} | |||
/** | |||
* Get a value which exists in the frame property overrides awaiting the | |||
* frame to be introduced. | |||
* | |||
* @param name the name of the value | |||
* @return the value of the property or null if the property does not | |||
* exist. | |||
* @exception ExecutionException if attempting to check an override in the | |||
* current frame. | |||
*/ | |||
private boolean isOverrideSet(String name) throws ExecutionException { | |||
int refIndex = name.indexOf(Project.REF_DELIMITER); | |||
if (refIndex == -1) { | |||
throw new ExecutionException("Property overrides can only be" | |||
+ " returned for properties in referenced projects - not " | |||
+ name); | |||
} | |||
String firstFrameName = name.substring(0, refIndex); | |||
String relativeName | |||
= name.substring(refIndex + Project.REF_DELIMITER.length()); | |||
Map frameOverrides = (Map) overrides.get(firstFrameName); | |||
if (frameOverrides == null) { | |||
return false; | |||
} | |||
return frameOverrides.containsKey(relativeName); | |||
} | |||
/** | |||
* Add a collection of properties to this frame with a given priority. | |||
* | |||
* @param properties the collection of property values, indexed by their | |||
* names | |||
* @param priority the priority at which the values are added. | |||
* @exception AntException if the values cannot be added. | |||
*/ | |||
protected void addProperties(Map properties, int priority) | |||
throws AntException { | |||
addDataValues(DataValue.makeDataValues(properties, priority)); | |||
} | |||
/** | |||
* Add a set of data values. | |||
* | |||
* @param dataValues a collection of DataValue instances named | |||
* @exception AntException if the values cannot be added. | |||
*/ | |||
protected void addDataValues(Map values) throws AntException { | |||
mergeDataValues(dataValues, values); | |||
} | |||
/** | |||
* Merge one set of values into another | |||
* | |||
* @param values the values to which the new values are added | |||
* @param newValues the values to be added in. | |||
*/ | |||
public void mergeDataValues(Map values, Map newValues) { | |||
mergeDataValues(values, newValues, DataValue.PRIORITY_BASE); | |||
} | |||
/** | |||
* Merge in values which are of a given priority or higher. | |||
* | |||
* @param values the values to which the new values are added | |||
* @param newValues the values to be added in. | |||
* @param threshold The require data value priority for a value to be | |||
* merged. | |||
*/ | |||
public void mergeDataValues(Map values, Map newValues, int threshold) { | |||
if (newValues == null) { | |||
return; | |||
} | |||
for (Iterator i = newValues.keySet().iterator(); i.hasNext();) { | |||
String name = (String) i.next(); | |||
DataValue value = (DataValue) newValues.get(name); | |||
if (value.getPriority() >= threshold) { | |||
updateValue(values, name, value, false); | |||
} | |||
} | |||
} | |||
} | |||
@@ -1,99 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.execution; | |||
import org.apache.ant.common.event.BuildListener; | |||
import org.apache.ant.common.service.EventService; | |||
/** | |||
* Core implementation of the event service | |||
* | |||
* @author Conor MacNeill | |||
* @created 7 February 2002 | |||
*/ | |||
public class CoreEventService implements EventService { | |||
/** The Frame this service instance is working for */ | |||
private Frame frame; | |||
/** | |||
* Constructor | |||
* | |||
* @param frame the frame for which this instance is providing service | |||
*/ | |||
protected CoreEventService(Frame frame) { | |||
this.frame = frame; | |||
} | |||
/** | |||
* Add a build listener to the current frame | |||
* | |||
* @param listener the lister which will receive build events | |||
* @exception ExecutionException if the listener cannot be added | |||
*/ | |||
public void addBuildListener(BuildListener listener) | |||
throws ExecutionException { | |||
frame.addBuildListener(listener); | |||
} | |||
/** | |||
* Remove a listener from the current frame | |||
* | |||
* @param listener the listener to be removed | |||
* @exception ExecutionException if the listener could not be removed | |||
*/ | |||
public void removeBuildListener(BuildListener listener) | |||
throws ExecutionException { | |||
frame.removeBuildListener(listener); | |||
} | |||
} | |||
@@ -1,311 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.execution; | |||
import java.io.File; | |||
import java.net.MalformedURLException; | |||
import java.util.List; | |||
import java.util.Map; | |||
import org.apache.ant.antcore.modelparser.XMLProjectParser; | |||
import org.apache.ant.antcore.xml.XMLParseException; | |||
import org.apache.ant.common.antlib.Task; | |||
import org.apache.ant.common.antlib.AntContext; | |||
import org.apache.ant.common.model.Project; | |||
import org.apache.ant.common.model.BuildElement; | |||
import org.apache.ant.common.service.ExecService; | |||
import org.apache.ant.init.InitUtils; | |||
import org.apache.ant.common.model.NamespaceValueCollection; | |||
import org.apache.ant.common.event.BuildListener; | |||
import org.apache.ant.common.util.AntException; | |||
/** | |||
* This is the core's implementation of the Execution Service. | |||
* | |||
* @author Conor MacNeill | |||
* @created 8 February 2002 | |||
*/ | |||
public class CoreExecService implements ExecService { | |||
/** The Frame this service instance is working for */ | |||
private Frame frame; | |||
/** | |||
* Constructor | |||
* | |||
* @param frame the frame containing this context | |||
*/ | |||
protected CoreExecService(Frame frame) { | |||
this.frame = frame; | |||
} | |||
/** | |||
* Execute a task. The task should have already been initialised by the | |||
* core. This is checked | |||
* | |||
* @param task the task to be executed | |||
* @exception AntException if there is an execution problem | |||
*/ | |||
public void executeTask(Task task) throws AntException { | |||
ExecutionContext execContext = getTaskExecutionContext(task); | |||
BuildElement model = execContext.getModel(); | |||
NamespaceValueCollection namespaceValues = null; | |||
if (model != null) { | |||
namespaceValues = model.getNamespaceAttributes(); | |||
} | |||
frame.executeTask(task, namespaceValues); | |||
} | |||
/** | |||
* Retrieve the execution context from a task and verify that the context | |||
* is valid. | |||
* | |||
* @param task the task. | |||
* @return the task's execution context. | |||
* | |||
* @exception ExecutionException if the task's context is not valid. | |||
*/ | |||
private ExecutionContext getTaskExecutionContext(Task task) | |||
throws ExecutionException { | |||
AntContext context = task.getAntContext(); | |||
if (!(context instanceof ExecutionContext)) { | |||
throw new ExecutionException("The Task was not configured with an" | |||
+ " appropriate context"); | |||
} | |||
return (ExecutionContext) context; | |||
} | |||
/** | |||
* Execute a task with a set of aspect values. Normally aspect values come | |||
* from a build model but not all tasks will be created from a build model. | |||
* Some may be created dynamically and configured programatically. This | |||
* method allows aspect values to provided for execution of such tasks since | |||
* by their nature, aspect values are not part of the task configuration. | |||
* | |||
* @param task the task to be executed | |||
* @param aspectValues the aspect attribute values. | |||
* @exception AntException if there is an execution problem | |||
*/ | |||
public void executeTask(Task task, NamespaceValueCollection aspectValues) | |||
throws AntException { | |||
ExecutionContext execContext = getTaskExecutionContext(task); | |||
frame.executeTask(task, aspectValues); | |||
} | |||
/** | |||
* Get the base directory for this execution of this frame | |||
* | |||
* @return the base directory | |||
*/ | |||
public File getBaseDir() { | |||
return frame.getBaseDir(); | |||
} | |||
/** | |||
* Set the basedir for the current execution | |||
* | |||
* @param baseDir the new base directory for this execution of Ant | |||
* | |||
* @exception AntException if the baseDir cannot be set to the given value. | |||
*/ | |||
public void setBaseDir(File baseDir) throws AntException { | |||
frame.setBaseDir(baseDir); | |||
} | |||
/** | |||
* get the name of the project associated with this execution. | |||
* | |||
* @return the project's name | |||
*/ | |||
public String getProjectName() { | |||
return frame.getProjectName(); | |||
} | |||
/** | |||
* Handle subbuild output. | |||
* | |||
* @param subbuildKey the core's key for managing the subbuild. | |||
* @param line the content produce by the current thread. | |||
* @param isErr true if this content is from the thread's error stream. | |||
* @exception ExecutionException if the subbuild cannot be found. | |||
*/ | |||
public void handleBuildOutput(Object subbuildKey, String line, | |||
boolean isErr) throws ExecutionException { | |||
Frame subFrame = (Frame) subbuildKey; | |||
subFrame.threadOutput(line, isErr); | |||
} | |||
/** | |||
* Force initialisation of a particular ant library in the context of the | |||
* given subbuild. | |||
* | |||
* @param key the build key. | |||
* @param libraryId the id of the library to be initialized. | |||
* @exception AntException if the build cannot be run | |||
*/ | |||
public void initializeBuildLibrary(Object key, String libraryId) | |||
throws AntException { | |||
Frame subFrame = (Frame) key; | |||
subFrame.initializeLibrary(libraryId); | |||
} | |||
/** | |||
* Add a listener to a subbuild | |||
* | |||
* @param key the key identifying the build previously setup | |||
* @param listener the listener to add to the build. | |||
* | |||
* @exception ExecutionException if the build cannot be found. | |||
*/ | |||
public void addBuildListener(Object key, BuildListener listener) | |||
throws ExecutionException { | |||
Frame subFrame = (Frame) key; | |||
subFrame.addBuildListener(listener); | |||
} | |||
/** | |||
* Run a build which have been previously setup | |||
* | |||
* @param targets A list of targets to be run | |||
* @param key Description of the Parameter | |||
* @exception AntException if the build cannot be run | |||
*/ | |||
public void runBuild(Object key, List targets) throws AntException { | |||
Frame subFrame = (Frame) key; | |||
subFrame.runBuild(targets); | |||
} | |||
/** | |||
* Parse an XML file into a build model. | |||
* | |||
* @param xmlBuildFile The file containing the XML build description. | |||
* @return A Project model for the build. | |||
* @exception ExecutionException if the build cannot be parsed | |||
*/ | |||
public Project parseXMLBuildFile(File xmlBuildFile) | |||
throws ExecutionException { | |||
try { | |||
// Parse the build file into a project | |||
XMLProjectParser parser = new XMLProjectParser(); | |||
return parser.parseBuildFile(InitUtils.getFileURL(xmlBuildFile)); | |||
} catch (MalformedURLException e) { | |||
throw new ExecutionException(e); | |||
} catch (XMLParseException e) { | |||
throw new ExecutionException(e); | |||
} | |||
} | |||
/** | |||
* Create a project reference. | |||
* | |||
* @param referenceName the name under which the project will be | |||
* referenced. | |||
* @param model the project model. | |||
* @param initialData the project's initial data load. | |||
* @exception AntException if the project cannot be referenced. | |||
*/ | |||
public void createProjectReference(String referenceName, Project model, | |||
Map initialData) | |||
throws AntException { | |||
frame.createProjectReference(referenceName, model, initialData); | |||
} | |||
/** | |||
* Setup a sub-build. | |||
* | |||
* @param model the project model to be used for the build | |||
* @param dataValues the initial data values to be used in the build | |||
* @param addListeners true if the current frame's listeners should be | |||
* added to the created Frame | |||
* @return Description of the Return Value | |||
* @exception AntException if the subbuild cannot be run | |||
*/ | |||
public Object setupBuild(Project model, Map dataValues, | |||
boolean addListeners) | |||
throws AntException { | |||
Frame newFrame = frame.createFrame(model); | |||
if (addListeners) { | |||
frame.addListeners(newFrame); | |||
} | |||
newFrame.initialize(dataValues); | |||
return newFrame; | |||
} | |||
/** | |||
* Setup a sub-build using the current frame's project model | |||
* | |||
* @param dataValues the initial properties to be used in the build | |||
* @param addListeners true if the current frame's listeners should be | |||
* added to the created Frame | |||
* @return Description of the Return Value | |||
* @exception AntException if the subbuild cannot be run | |||
*/ | |||
public Object setupBuild(Map dataValues, boolean addListeners) | |||
throws AntException { | |||
return setupBuild(frame.getProject(), dataValues, addListeners); | |||
} | |||
} | |||
@@ -1,97 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.execution; | |||
import java.io.File; | |||
import org.apache.ant.common.service.FileService; | |||
import org.apache.ant.common.util.FileUtils; | |||
import org.apache.ant.common.util.AntException; | |||
/** | |||
* The core's implementation of the File Service. The File Service is used | |||
* by Ant Library components to perform operations on the local file system | |||
* | |||
* @author Conor MacNeill | |||
* @created 27 January 2002 | |||
*/ | |||
public class CoreFileService implements FileService { | |||
/** The Frame this service instance is working for */ | |||
private Frame frame; | |||
/** General file utilities */ | |||
private FileUtils fileUtils = FileUtils.newFileUtils(); | |||
/** | |||
* Constructor | |||
* | |||
* @param frame the frame containing this context | |||
*/ | |||
protected CoreFileService(Frame frame) { | |||
this.frame = frame; | |||
} | |||
/** | |||
* Resolve a file according to the base directory of the project | |||
* associated with this context | |||
* | |||
* @param fileName the file name to be resolved. | |||
* @return the file resolved to the project's base dir | |||
* @exception AntException if the file cannot be resolved. | |||
*/ | |||
public File resolveFile(String fileName) throws AntException { | |||
File base = frame.getBaseDir(); | |||
return fileUtils.resolveFile(fileUtils.normalize(base.getPath()), | |||
fileName); | |||
} | |||
} | |||
@@ -1,87 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.execution; | |||
import org.apache.ant.common.service.InputService; | |||
import org.apache.ant.common.input.InputRequest; | |||
/** | |||
* The core's implementation of the Input Service. | |||
* | |||
* @author Conor MacNeill | |||
* @created 30 April 2002 | |||
*/ | |||
public class CoreInputService implements InputService { | |||
/** The Frame this service instance is working for */ | |||
private Frame frame; | |||
/** | |||
* Constructor | |||
* | |||
* @param frame the frame containing this context | |||
*/ | |||
protected CoreInputService(Frame frame) { | |||
this.frame = frame; | |||
} | |||
/** | |||
* Handle an input request | |||
* | |||
* @param request an input request | |||
* @exception ExecutionException if the request cannot be handled | |||
*/ | |||
public void handleInput(InputRequest request) throws ExecutionException { | |||
// XXX | |||
} | |||
} | |||
@@ -1,190 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.execution; | |||
import org.apache.ant.common.antlib.DeferredTask; | |||
/** | |||
* An implementation of the Setter interface for configuring instances of | |||
* the DeferredTask interface | |||
* | |||
* @author Conor MacNeill | |||
* @created 11 February 2002 | |||
*/ | |||
public class DeferredSetter implements Setter { | |||
/** | |||
* Set an attribute value on an object | |||
* | |||
* @param obj the object on which the value is being set | |||
* @param attributeName the name of the attribute | |||
* @param value the string represenation of the attribute's value | |||
* @exception ExecutionException if the object does not support the | |||
* attribute or the object has a problem setting the value | |||
*/ | |||
public void setAttribute(Object obj, String attributeName, | |||
String value) throws ExecutionException { | |||
DeferredTask task = (DeferredTask) obj; | |||
task.setAttribute(attributeName, value); | |||
} | |||
/** | |||
* Get the type of the given nested element | |||
* | |||
* @param elementName the nested element whose type is desired | |||
* @return the class instance representing the type of the element adder | |||
*/ | |||
public Class getType(String elementName) { | |||
return null; | |||
} | |||
/** | |||
* Adds PCDATA to the element | |||
* | |||
* @param obj the instance whose content is being provided | |||
* @param text the required content | |||
* @exception ExecutionException if the object does not support | |||
* contentor the object has a problem setting the content | |||
*/ | |||
public void addText(Object obj, String text) | |||
throws ExecutionException { | |||
DeferredTask task = (DeferredTask) obj; | |||
task.addText(text); | |||
} | |||
/** | |||
* Add an element to the given object | |||
* | |||
* @param obj The object to which the element is being added | |||
* @param elementName the name of the element | |||
* @param value the object to be added - the nested element | |||
* @exception ExecutionException if the object does not support content | |||
* or the object has a problem setting the content | |||
*/ | |||
public void addElement(Object obj, String elementName, Object value) | |||
throws ExecutionException { | |||
DeferredTask task = (DeferredTask) obj; | |||
task.addElement(elementName, value); | |||
} | |||
/** | |||
* Create a nested element using the object's element factory method. | |||
* | |||
* @param container the object in which the nested element is required. | |||
* @param elementName the name of the nested element | |||
* @return the new instance of the nested element | |||
* @exception ExecutionException if the nested element cannot be | |||
* created. | |||
*/ | |||
public Object createElement(Object container, String elementName) | |||
throws ExecutionException { | |||
throw new ExecutionException("Deferred Tasks do not support " | |||
+ "creation of nested elements"); | |||
} | |||
/** | |||
* Indicate if the class assocated with this reflector supports the | |||
* addition of text content. | |||
* | |||
* @return true if the class supports an addText method | |||
*/ | |||
public boolean supportsText() { | |||
return true; | |||
} | |||
/** | |||
* Indicate if the class assocated with this reflector supports the | |||
* given attribute | |||
* | |||
* @param attributeName the name of the attribute | |||
* @return true if the given attribute is supported | |||
*/ | |||
public boolean supportsAttribute(String attributeName) { | |||
return true; | |||
} | |||
/** | |||
* Determine if the class associated with this reflector supports a | |||
* particular nested element via a create factory method | |||
* | |||
* @param elementName the name of the element | |||
* @return true if the class supports creation of that element | |||
*/ | |||
public boolean supportsNestedCreator(String elementName) { | |||
return false; | |||
} | |||
/** | |||
* Determine if the class associated with this reflector supports a | |||
* particular nested element via an add method | |||
* | |||
* @param elementName the name of the element | |||
* @return true if the class supports addition of that element | |||
*/ | |||
public boolean supportsNestedAdder(String elementName) { | |||
return true; | |||
} | |||
/** | |||
* Determine if the class associated with this reflector supports a | |||
* particular nested element | |||
* | |||
* @param elementName the name of the element | |||
* @return true if the class supports the given type of nested element | |||
*/ | |||
public boolean supportsNestedElement(String elementName) { | |||
return true; | |||
} | |||
} | |||
@@ -1,182 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.execution; | |||
import org.apache.ant.common.antlib.AntContext; | |||
import org.apache.ant.common.antlib.ExecutionComponent; | |||
import org.apache.ant.common.util.Location; | |||
import org.apache.ant.common.model.BuildElement; | |||
/** | |||
* This is the core's implementation of the AntContext for all core objects. | |||
* Specific subclasses handle types and tasks | |||
* | |||
* @author Conor MacNeill | |||
* @created 20 January 2002 | |||
*/ | |||
public class ExecutionContext implements AntContext { | |||
/** The Frame containing this context */ | |||
private Frame frame; | |||
/** the event support instance used to manage build events */ | |||
private BuildEventSupport eventSupport; | |||
/** The build model associated with this context. */ | |||
private BuildElement model; | |||
/** the execution component associated with the context, if any */ | |||
private ExecutionComponent component; | |||
/** | |||
* the loader used to load this context. Note that this is not | |||
* necessarily the loader which is used to load the component as loading | |||
* may have been delegated to a parent loader. | |||
*/ | |||
private ClassLoader loader; | |||
/** | |||
* Initilaise this context's environment | |||
* | |||
* @param frame the frame containing this context | |||
* @param component the component associated with this context - may be null | |||
* @param model the build model associated with this component if any. | |||
*/ | |||
protected ExecutionContext(Frame frame, ExecutionComponent component, | |||
BuildElement model) { | |||
this.frame = frame; | |||
this.eventSupport = frame.getEventSupport(); | |||
this.model = model; | |||
this.component = component; | |||
} | |||
/** | |||
* Get an implementation of one of the core's service interfaces | |||
* | |||
* @param serviceInterfaceClass the interface class for which an | |||
* implementation is required | |||
* @return the core's implementation of the interface. | |||
* @exception ExecutionException if there is a problem finding the | |||
* interface | |||
*/ | |||
public Object getCoreService(Class serviceInterfaceClass) | |||
throws ExecutionException { | |||
return frame.getCoreService(serviceInterfaceClass); | |||
} | |||
/** | |||
* Gets the location associated with the ExecutionContext | |||
* | |||
* @return the location in the build model associated with this context. | |||
*/ | |||
public Location getLocation() { | |||
if (model == null) { | |||
return Location.UNKNOWN_LOCATION; | |||
} | |||
return model.getLocation(); | |||
} | |||
/** | |||
* Log a message as a build event | |||
* | |||
* @param message the message to be logged | |||
* @param level the priority level of the message | |||
*/ | |||
public void log(String message, int level) { | |||
Object source = component; | |||
if (source == null) { | |||
source = frame.getProject(); | |||
if (source == null) { | |||
source = frame; | |||
} | |||
} | |||
eventSupport.fireMessageLogged(source, message, level); | |||
} | |||
/** | |||
* Sets the classLoader of the ExecutionContext | |||
* | |||
* @param loader the new classLoader value | |||
*/ | |||
protected void setClassLoader(ClassLoader loader) { | |||
this.loader = loader; | |||
} | |||
/** | |||
* Gets the loader for this context | |||
* | |||
* @return the context's loader | |||
*/ | |||
public ClassLoader getClassLoader() { | |||
return loader; | |||
} | |||
/** | |||
* Gets the executionComponent of the ExecutionContext | |||
* | |||
* @return the executionComponent value | |||
*/ | |||
protected ExecutionComponent getExecutionComponent() { | |||
return component; | |||
} | |||
/** | |||
* Get the build model associated with this context. | |||
* | |||
* @return the build model or null if there is no build model. | |||
*/ | |||
public BuildElement getModel() { | |||
return model; | |||
} | |||
} | |||
@@ -1,136 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.execution; | |||
import org.apache.ant.common.util.AntException; | |||
import org.apache.ant.common.util.Location; | |||
/** | |||
* An ExecutionException indicates a problem while executing tasks in a | |||
* build | |||
* | |||
* @author Conor MacNeill | |||
* @created 20 January 2002 | |||
*/ | |||
public class ExecutionException extends AntException { | |||
/** | |||
* Constructs an exception with the given descriptive message. | |||
* | |||
* @param msg Description of or information about the exception. | |||
*/ | |||
public ExecutionException(String msg) { | |||
super(msg); | |||
} | |||
/** | |||
* Constructs an exception with the given descriptive message and a | |||
* location in a file. | |||
* | |||
* @param msg Description of or information about the exception. | |||
* @param location Location in the project file where the error occured. | |||
*/ | |||
public ExecutionException(String msg, Location location) { | |||
super(msg, location); | |||
} | |||
/** | |||
* Constructs an exception with the given message and exception as a | |||
* root cause. | |||
* | |||
* @param msg Description of or information about the exception. | |||
* @param cause Throwable that might have cause this one. | |||
*/ | |||
public ExecutionException(String msg, Throwable cause) { | |||
super(msg, cause); | |||
} | |||
/** | |||
* Constructs an exception with the given message and exception as a | |||
* root cause and a location in a file. | |||
* | |||
* @param msg Description of or information about the exception. | |||
* @param cause Exception that might have cause this one. | |||
* @param location Location in the project file where the error occured. | |||
*/ | |||
public ExecutionException(String msg, Throwable cause, Location location) { | |||
super(msg, cause, location); | |||
} | |||
/** | |||
* Constructs an exception with the given exception as a root cause. | |||
* | |||
* @param cause Exception that might have caused this one. | |||
*/ | |||
public ExecutionException(Throwable cause) { | |||
super(cause); | |||
} | |||
/** | |||
* Constructs an exception with the given exception as a root cause and | |||
* a location in a file. | |||
* | |||
* @param cause Exception that might have cause this one. | |||
* @param location Location in the project file where the error occured. | |||
*/ | |||
public ExecutionException(Throwable cause, Location location) { | |||
super(cause, location); | |||
} | |||
} | |||
@@ -1,128 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.execution; | |||
import org.apache.ant.antcore.antlib.AntLibDefinition; | |||
import org.apache.ant.antcore.antlib.ComponentLibrary; | |||
/** | |||
* This class is used to maintain information about imports | |||
* | |||
* @author Conor MacNeill | |||
* @created 16 January 2002 | |||
*/ | |||
public class ImportInfo { | |||
/** the component library from which the import is made */ | |||
private ComponentLibrary library; | |||
/** the library definition information */ | |||
private AntLibDefinition libDefinition; | |||
/** | |||
* ImportInfo records what has been imported from an Ant Library | |||
* | |||
* @param library The library from which the import was made | |||
* @param libDefinition the library definition information | |||
*/ | |||
public ImportInfo(ComponentLibrary library, | |||
AntLibDefinition libDefinition) { | |||
this.library = library; | |||
this.libDefinition = libDefinition; | |||
} | |||
/** | |||
* Get the classname that has been imported | |||
* | |||
* @return the classname that was imported. | |||
*/ | |||
public String getClassName() { | |||
return libDefinition.getClassName(); | |||
} | |||
/** | |||
* Get the library from which the import was made | |||
* | |||
* @return the library from which the import was made | |||
*/ | |||
public ComponentLibrary getComponentLibrary() { | |||
return library; | |||
} | |||
/** | |||
* Get the type of the definition that was imported | |||
* | |||
* @return the type of definition | |||
*/ | |||
public int getDefinitionType() { | |||
return libDefinition.getDefinitionType(); | |||
} | |||
/** | |||
* Get the name of the component within its library. | |||
* | |||
* @return the name of the component within its library | |||
*/ | |||
public String getLocalName() { | |||
return libDefinition.getDefinitionName(); | |||
} | |||
/** | |||
* Get the definition of the imported component. | |||
* | |||
* @return the component's library definition. | |||
*/ | |||
public AntLibDefinition getDefinition() { | |||
return libDefinition; | |||
} | |||
} | |||
@@ -1,486 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.execution; | |||
import java.lang.reflect.Constructor; | |||
import java.lang.reflect.InvocationTargetException; | |||
import java.lang.reflect.Method; | |||
import java.util.HashMap; | |||
import java.util.Iterator; | |||
import java.util.Map; | |||
import org.apache.ant.common.antlib.Converter; | |||
import org.apache.ant.common.util.AntException; | |||
/** | |||
* A reflector is used to set attributes and add nested elements to an | |||
* instance of an object using reflection. It is the result of class | |||
* introspection. | |||
* | |||
* @author Conor MacNeill | |||
* @created 19 January 2002 | |||
*/ | |||
public class Reflector implements Setter { | |||
/** | |||
* An element adder is used to add an instance of an element to an of an | |||
* object. The object being added will have been fully configured by Ant | |||
* prior to calling this method. | |||
* | |||
* @author Conor MacNeill | |||
* @created 19 January 2002 | |||
*/ | |||
private interface ElementAdder { | |||
/** | |||
* Add an object to the this container object | |||
* | |||
* @param container the object to which the element is the be added | |||
* @param obj an instance of the nested element | |||
* @exception InvocationTargetException if the method cannot be | |||
* invoked | |||
* @exception IllegalAccessException if the method cannot be invoked | |||
*/ | |||
void add(Object container, Object obj) | |||
throws InvocationTargetException, IllegalAccessException; | |||
} | |||
/** | |||
* Element Creator's a factory method provided by an Ant Library | |||
* Component for creating its own nested element instances. These | |||
* methods are now deprecated. It is better to use the add style methods | |||
* and support polymorphic interfaces. | |||
* | |||
* @author Conor MacNeill | |||
* @created 31 January 2002 | |||
*/ | |||
private interface ElementCreator { | |||
/** | |||
* Create a nested element object for the given container object | |||
* | |||
* @param container the object in which the nested element is to be | |||
* created. | |||
* @return the nested element. | |||
* @exception InvocationTargetException if the create method fails | |||
* @exception IllegalAccessException if the create method cannot be | |||
* accessed | |||
* @exception InstantiationException if the nested element instance | |||
* cannot be created. | |||
*/ | |||
Object create(Object container) | |||
throws InvocationTargetException, IllegalAccessException, | |||
InstantiationException; | |||
} | |||
/** The method used to add content to the element */ | |||
private Method addTextMethod; | |||
/** the list of attribute setters indexed by their property name */ | |||
private Map attributeSetters = new HashMap(); | |||
/** | |||
* A list of the Java class or interface accetpted by each element adder | |||
* indexed by the element name | |||
*/ | |||
private Map elementTypes = new HashMap(); | |||
/** the collection of element adders indexed by their element names */ | |||
private Map elementAdders = new HashMap(); | |||
/** the collection of element creators indexed by their element names */ | |||
private Map elementCreators = new HashMap(); | |||
/** | |||
* Set an attribute value on an object | |||
* | |||
* @param obj the object on which the value is being set | |||
* @param attributeName the name of the attribute | |||
* @param value the string represenation of the attribute's value | |||
* @exception AntException if the object does not support the | |||
* attribute or the object has a problem setting the value | |||
*/ | |||
public void setAttribute(Object obj, String attributeName, | |||
String value) | |||
throws AntException { | |||
String name = attributeName.toLowerCase(); | |||
AttributeSetter as | |||
= (AttributeSetter) attributeSetters.get(name); | |||
if (as == null) { | |||
throw new ExecutionException("Class " + obj.getClass().getName() | |||
+ " doesn't support the \"" + attributeName + "\" attribute"); | |||
} | |||
try { | |||
as.set(obj, value); | |||
} catch (IllegalAccessException e) { | |||
// impossible as getMethods should only return public methods | |||
throw new ExecutionException(e); | |||
} catch (InvocationTargetException ite) { | |||
Throwable t = ite.getTargetException(); | |||
if (t instanceof ExecutionException) { | |||
throw (ExecutionException) t; | |||
} | |||
throw new ExecutionException(t); | |||
} | |||
} | |||
/** | |||
* Set the method used to add content to the element | |||
* | |||
* @param addTextMethod the new addTextMethod value | |||
*/ | |||
public void setAddTextMethod(Method addTextMethod) { | |||
this.addTextMethod = addTextMethod; | |||
} | |||
/** | |||
* Get the type of the given nested element | |||
* | |||
* @param elementName the nested element whose type is desired | |||
* @return the class instance representing the type of the element adder | |||
*/ | |||
public Class getType(String elementName) { | |||
return (Class) elementTypes.get(elementName); | |||
} | |||
/** | |||
* Adds PCDATA to the element | |||
* | |||
* @param obj the instance whose content is being provided | |||
* @param text the required content | |||
* @exception ExecutionException if the object does not support | |||
* contentor the object has a problem setting the content | |||
*/ | |||
public void addText(Object obj, String text) | |||
throws ExecutionException { | |||
if (addTextMethod == null) { | |||
throw new ExecutionException("Class " + obj.getClass().getName() + | |||
" doesn't support content"); | |||
} | |||
try { | |||
addTextMethod.invoke(obj, new String[]{text}); | |||
} catch (IllegalAccessException ie) { | |||
// impossible as getMethods should only return public methods | |||
throw new ExecutionException(ie); | |||
} catch (InvocationTargetException ite) { | |||
Throwable t = ite.getTargetException(); | |||
if (t instanceof ExecutionException) { | |||
throw (ExecutionException) t; | |||
} | |||
throw new ExecutionException(t); | |||
} | |||
} | |||
/** | |||
* Add an element to the given object | |||
* | |||
* @param obj The object to which the element is being added | |||
* @param elementName the name of the element | |||
* @param value the object to be added - the nested element | |||
* @exception ExecutionException if the object does not support content | |||
* or the object has a problem setting the content | |||
*/ | |||
public void addElement(Object obj, String elementName, Object value) | |||
throws ExecutionException { | |||
String name = elementName.toLowerCase(); | |||
ElementAdder adder = (ElementAdder) elementAdders.get(name); | |||
if (adder == null) { | |||
throw new ExecutionException("Class " + obj.getClass().getName() | |||
+ " doesn't support the \"" + elementName | |||
+ "\" nested element"); | |||
} | |||
try { | |||
adder.add(obj, value); | |||
} catch (IllegalAccessException ie) { | |||
// impossible as getMethods should only return public methods | |||
throw new ExecutionException(ie); | |||
} catch (InvocationTargetException ite) { | |||
Throwable t = ite.getTargetException(); | |||
if (t instanceof ExecutionException) { | |||
throw (ExecutionException) t; | |||
} | |||
throw new ExecutionException(t); | |||
} | |||
} | |||
/** | |||
* Create a nested element using the object's element factory method. | |||
* | |||
* @param container the object in which the nested element is required. | |||
* @param elementName the name of the nested element | |||
* @return the new instance of the nested element | |||
* @exception ExecutionException if the nested element cannot be | |||
* created. | |||
*/ | |||
public Object createElement(Object container, String elementName) | |||
throws ExecutionException { | |||
ElementCreator creator | |||
= (ElementCreator) elementCreators.get(elementName.toLowerCase()); | |||
if (creator == null) { | |||
throw new ExecutionException("Class " | |||
+ container.getClass().getName() | |||
+ " doesn't support the \"" + elementName | |||
+ "\" nested element"); | |||
} | |||
try { | |||
return creator.create(container); | |||
} catch (IllegalAccessException e) { | |||
// impossible as getMethods should only return public methods | |||
throw new ExecutionException(e); | |||
} catch (InstantiationException e) { | |||
// impossible as getMethods should only return public methods | |||
throw new ExecutionException(e); | |||
} catch (InvocationTargetException e) { | |||
Throwable t = e.getTargetException(); | |||
if (t instanceof ExecutionException) { | |||
throw (ExecutionException) t; | |||
} | |||
throw new ExecutionException(t); | |||
} | |||
} | |||
/** | |||
* Indicate if the class assocated with this reflector supports the | |||
* addition of text content. | |||
* | |||
* @return true if the class supports an addText method | |||
*/ | |||
public boolean supportsText() { | |||
return addTextMethod != null; | |||
} | |||
/** | |||
* Indicate if the class assocated with this reflector supports the | |||
* given attribute | |||
* | |||
* @param attributeName the name of the attribute | |||
* @return true if the given attribute is supported | |||
*/ | |||
public boolean supportsAttribute(String attributeName) { | |||
return attributeSetters.containsKey(attributeName.toLowerCase()); | |||
} | |||
/** | |||
* Determine if the class associated with this reflector supports a | |||
* particular nested element via a create factory method | |||
* | |||
* @param elementName the name of the element | |||
* @return true if the class supports creation of that element | |||
*/ | |||
public boolean supportsNestedCreator(String elementName) { | |||
return elementCreators.containsKey(elementName.toLowerCase()); | |||
} | |||
/** | |||
* Determine if the class associated with this reflector supports a | |||
* particular nested element via an add method | |||
* | |||
* @param elementName the name of the element | |||
* @return true if the class supports addition of that element | |||
*/ | |||
public boolean supportsNestedAdder(String elementName) { | |||
return elementAdders.containsKey(elementName.toLowerCase()); | |||
} | |||
/** | |||
* Add an attribute setter for the given property. The setter will only | |||
* be added if it does not override a higher priorty setter | |||
* | |||
* @param attributeName the name of the attribute that the setter operates | |||
* upon. | |||
* @param setter the AttribnuteSetter instance to use. | |||
*/ | |||
private void addAttributeSetter(String attributeName, | |||
AttributeSetter setter) { | |||
String name = attributeName.toLowerCase(); | |||
AttributeSetter currentSetter | |||
= (AttributeSetter) attributeSetters.get(name); | |||
if (currentSetter != null) { | |||
// there is a setter, is it lower down in the class hierarchy | |||
int currentDepth = currentSetter.getDepth(); | |||
if (currentDepth < setter.getDepth()) { | |||
return; | |||
} else if (currentDepth == setter.getDepth()) { | |||
// now check the types | |||
Class currentType = currentSetter.getType(); | |||
if (currentType != String.class) { | |||
return; | |||
} | |||
} | |||
} | |||
attributeSetters.put(name, setter); | |||
} | |||
/** | |||
* Determine if the class associated with this reflector supports a | |||
* particular nested element | |||
* | |||
* @param elementName the name of the element | |||
* @return true if the class supports the given type of nested element | |||
*/ | |||
public boolean supportsNestedElement(String elementName) { | |||
return supportsNestedAdder(elementName) | |||
|| supportsNestedCreator(elementName); | |||
} | |||
/** | |||
* Add a method to the reflector for setting an attribute value | |||
* | |||
* @param m the method, obtained by introspection. | |||
* @param depth the depth of this method's declaration in the class | |||
* hierarchy | |||
* @param propertyName the property name the method will set. | |||
* @param converters A map of converter classes used to convert strings | |||
* to different types. | |||
*/ | |||
public void addAttributeMethod(Method m, int depth, | |||
String propertyName, Map converters) { | |||
Class type = m.getParameterTypes()[0]; | |||
if (converters != null && converters.containsKey(type)) { | |||
// we have a converter to use to convert the String | |||
// value into something the set method expects. | |||
Converter converter = (Converter) converters.get(type); | |||
addConvertingSetter(m, depth, propertyName, converter); | |||
return; | |||
} | |||
if (type.equals(String.class)) { | |||
addAttributeSetter(propertyName, new AttributeSetter(m, depth)); | |||
return; | |||
} | |||
try { | |||
final Constructor c = | |||
type.getConstructor(new Class[]{java.lang.String.class}); | |||
addAttributeSetter(propertyName, new AttributeSetter(m, depth, c)); | |||
return; | |||
} catch (NoSuchMethodException nme) { | |||
// ignore | |||
} | |||
if (converters != null) { | |||
// desparate by now - try top find a converter which handles a super | |||
// class of this type and which supports subclass instantiation | |||
for (Iterator i = converters.keySet().iterator(); i.hasNext();) { | |||
Class converterType = (Class) i.next(); | |||
if (converterType.isAssignableFrom(type)) { | |||
// could be a candidate | |||
Converter converter | |||
= (Converter) converters.get(converterType); | |||
if (converter.canConvertSubType(type)) { | |||
addConvertingSetter(m, depth, propertyName, converter); | |||
return; | |||
} | |||
} | |||
} | |||
} | |||
} | |||
/** | |||
* Add an element adder method to the list of element adders in the | |||
* reflector | |||
* | |||
* @param m the adder method | |||
* @param elementName The name of the element for which this adder works | |||
*/ | |||
public void addElementMethod(final Method m, String elementName) { | |||
final Class type = m.getParameterTypes()[0]; | |||
elementTypes.put(elementName, type); | |||
elementAdders.put(elementName.toLowerCase(), | |||
new ElementAdder() { | |||
public void add(Object container, Object obj) | |||
throws InvocationTargetException, IllegalAccessException { | |||
m.invoke(container, new Object[]{obj}); | |||
} | |||
}); | |||
} | |||
/** | |||
* Add a create factory method. | |||
* | |||
* @param m the create method | |||
* @param elementName the name of the nested element the create method | |||
* supports. | |||
*/ | |||
public void addCreateMethod(final Method m, String elementName) { | |||
elementCreators.put(elementName.toLowerCase(), | |||
new ElementCreator() { | |||
public Object create(Object container) | |||
throws InvocationTargetException, IllegalAccessException { | |||
return m.invoke(container, new Object[]{}); | |||
} | |||
}); | |||
} | |||
/** | |||
* Add an attribute setter with an associated converter | |||
* | |||
* @param m the attribute setter method | |||
* @param depth the depth of this method's declaration in the class | |||
* hierarchy | |||
* @param propertyName the name of the attribute this method supports | |||
* @param converter the converter to be used to construct the value | |||
* expected by the method. | |||
*/ | |||
private void addConvertingSetter(Method m, int depth, | |||
String propertyName, Converter converter) { | |||
addAttributeSetter(propertyName, | |||
new AttributeSetter(m, depth, converter)); | |||
} | |||
} | |||
@@ -1,166 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.execution; | |||
import org.apache.ant.common.util.AntException; | |||
/** | |||
* The Setter interface is used by the Ant core to set values and nested | |||
* elements in objects being configured. | |||
* | |||
* @author Conor MacNeill | |||
* @created 11 February 2002 | |||
*/ | |||
public interface Setter { | |||
/** | |||
* Set an attribute value on an object | |||
* | |||
* @param obj the object on which the value is being set | |||
* @param attributeName the name of the attribute | |||
* @param value the string represenation of the attribute's value | |||
* @exception AntException if the object does not support the | |||
* attribute or the object has a problem setting the value | |||
*/ | |||
void setAttribute(Object obj, String attributeName, | |||
String value) | |||
throws AntException; | |||
/** | |||
* Get the type of the given nested element | |||
* | |||
* @param elementName the nested element whose type is desired | |||
* @return the class instance representing the type of the element adder | |||
*/ | |||
Class getType(String elementName); | |||
/** | |||
* Adds PCDATA to the element | |||
* | |||
* @param obj the instance whose content is being provided | |||
* @param text the required content | |||
* @exception ExecutionException if the object does not support | |||
* contentor the object has a problem setting the content | |||
*/ | |||
void addText(Object obj, String text) | |||
throws ExecutionException; | |||
/** | |||
* Add an element to the given object | |||
* | |||
* @param obj The object to which the element is being added | |||
* @param elementName the name of the element | |||
* @param value the object to be added - the nested element | |||
* @exception ExecutionException if the object does not support content | |||
* or the object has a problem setting the content | |||
*/ | |||
void addElement(Object obj, String elementName, Object value) | |||
throws ExecutionException; | |||
/** | |||
* Create a nested element using the object's element factory method. | |||
* | |||
* @param container the object in which the nested element is required. | |||
* @param elementName the name of the nested element | |||
* @return the new instance of the nested element | |||
* @exception ExecutionException if the nested element cannot be | |||
* created. | |||
*/ | |||
Object createElement(Object container, String elementName) | |||
throws ExecutionException; | |||
/** | |||
* Indicate if the class assocated with this reflector supports the | |||
* addition of text content. | |||
* | |||
* @return true if the class supports an addText method | |||
*/ | |||
boolean supportsText(); | |||
/** | |||
* Indicate if the class assocated with this reflector supports the | |||
* given attribute | |||
* | |||
* @param attributeName the name of the attribute | |||
* @return true if the given attribute is supported | |||
*/ | |||
boolean supportsAttribute(String attributeName); | |||
/** | |||
* Determine if the class associated with this reflector supports a | |||
* particular nested element via a create factory method | |||
* | |||
* @param elementName the name of the element | |||
* @return true if the class supports creation of that element | |||
*/ | |||
boolean supportsNestedCreator(String elementName); | |||
/** | |||
* Determine if the class associated with this reflector supports a | |||
* particular nested element via an add method | |||
* | |||
* @param elementName the name of the element | |||
* @return true if the class supports addition of that element | |||
*/ | |||
boolean supportsNestedAdder(String elementName); | |||
/** | |||
* Determine if the class associated with this reflector supports a | |||
* particular nested element | |||
* | |||
* @param elementName the name of the element | |||
* @return true if the class supports the given type of nested element | |||
*/ | |||
boolean supportsNestedElement(String elementName); | |||
} | |||
@@ -1,122 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.execution; | |||
import java.lang.reflect.Method; | |||
import java.lang.reflect.InvocationTargetException; | |||
import org.apache.ant.common.antlib.AbstractTask; | |||
import org.apache.ant.common.event.MessageLevel; | |||
/** | |||
* Use introspection to "adapt" an arbitrary Bean (not extending Task, but | |||
* with similar patterns). | |||
* | |||
* @author Conor MacNeill | |||
* @created 16 January 2002 | |||
*/ | |||
public class TaskAdapter extends AbstractTask { | |||
/** The real object that is performing the work */ | |||
private Object worker; | |||
/** the execute method of the real object */ | |||
private Method executeMethod = null; | |||
/** | |||
* Create an adapter for an arbitraty bean | |||
* | |||
* @param taskType the name of the task | |||
* @param worker an instance of the actual object that does the work | |||
* @exception ExecutionException if the worker object does not support | |||
* an execute method | |||
*/ | |||
public TaskAdapter(String taskType, Object worker) | |||
throws ExecutionException { | |||
this.worker = worker; | |||
try { | |||
Class workerClass = worker.getClass(); | |||
executeMethod = workerClass.getMethod("execute", new Class[0]); | |||
if (executeMethod == null) { | |||
throw new ExecutionException("No execute method in the class" | |||
+ " for the <" + taskType + "> task."); | |||
} | |||
} catch (NoSuchMethodException e) { | |||
throw new ExecutionException(e); | |||
} | |||
} | |||
/** | |||
* Standard Task execute method. This invokes the execute method of the | |||
* worker instance | |||
* | |||
* @exception ExecutionException if the proxied object throws an exception | |||
*/ | |||
public void execute() throws ExecutionException { | |||
try { | |||
executeMethod.invoke(worker, null); | |||
} catch (InvocationTargetException e) { | |||
log("Error in " + worker.getClass(), MessageLevel.ERROR); | |||
Throwable t = e.getTargetException(); | |||
if (t instanceof ExecutionException) { | |||
throw (ExecutionException) t; | |||
} else { | |||
throw new ExecutionException(t); | |||
} | |||
} catch (Throwable t) { | |||
log("Error in " + worker.getClass(), MessageLevel.ERROR); | |||
throw new ExecutionException(t); | |||
} | |||
} | |||
} | |||
@@ -1,129 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.frontend; | |||
import org.apache.ant.common.util.AntException; | |||
import org.apache.ant.common.util.Location; | |||
/** | |||
* An exception in the frontend set up of an Ant run | |||
* | |||
* @author Conor MacNeill | |||
*/ | |||
public class FrontendException extends AntException { | |||
/** | |||
* Constructs an exception with the given descriptive message. | |||
* | |||
* @param msg Description of or information about the exception. | |||
*/ | |||
public FrontendException(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 FrontendException(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 FrontendException(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 FrontendException(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 FrontendException(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 FrontendException(Throwable cause, Location location) { | |||
super(cause, location); | |||
} | |||
} | |||
@@ -1,137 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.frontend; | |||
import java.io.File; | |||
import java.io.FileNotFoundException; | |||
import java.net.MalformedURLException; | |||
import java.net.URL; | |||
import org.apache.ant.antcore.config.AntConfig; | |||
import org.apache.ant.antcore.config.AntConfigHandler; | |||
import org.apache.ant.antcore.xml.ParseContext; | |||
import org.apache.ant.antcore.xml.XMLParseException; | |||
import org.apache.ant.init.InitUtils; | |||
import org.apache.ant.common.constants.Namespace; | |||
/** | |||
* Frontend Utilities methods and constants. | |||
* | |||
* @author Conor MacNeill | |||
* @created 16 April 2002 | |||
*/ | |||
public class FrontendUtils { | |||
/** The default build file name */ | |||
public static final String DEFAULT_BUILD_FILENAME = "build.ant"; | |||
/** The default build file name */ | |||
public static final String DEFAULT_ANT1_FILENAME = "build.xml"; | |||
/** | |||
* Get the AntConfig from the given config area if it is available | |||
* | |||
* @param configArea the config area from which the config may be read | |||
* @return the AntConfig instance representing the config info read in | |||
* from the config area. May be null if the AntConfig is not present | |||
* @exception FrontendException if the URL for the config file cannotbe | |||
* formed. | |||
*/ | |||
public static AntConfig getAntConfig(File configArea) | |||
throws FrontendException { | |||
File configFile = new File(configArea, "antconfig.xml"); | |||
try { | |||
return getAntConfigFile(configFile); | |||
} catch (FileNotFoundException e) { | |||
// ignore if files are not present | |||
return null; | |||
} | |||
} | |||
/** | |||
* Read in a config file | |||
* | |||
* @param configFile the file containing the XML config | |||
* @return the parsed config object | |||
* @exception FrontendException if the config cannot be parsed | |||
* @exception FileNotFoundException if the file cannot be found. | |||
*/ | |||
public static AntConfig getAntConfigFile(File configFile) | |||
throws FrontendException, FileNotFoundException { | |||
try { | |||
URL configFileURL = InitUtils.getFileURL(configFile); | |||
ParseContext context = new ParseContext(); | |||
AntConfigHandler configHandler = new AntConfigHandler(); | |||
context.parse(configFileURL, "antconfig", configHandler); | |||
return configHandler.getAntConfig(); | |||
} catch (MalformedURLException e) { | |||
throw new FrontendException("Unable to form URL to read " | |||
+ "config from " + configFile, e); | |||
} catch (XMLParseException e) { | |||
if (e.getCause() instanceof FileNotFoundException) { | |||
throw (FileNotFoundException) e.getCause(); | |||
} | |||
throw new FrontendException("Unable to parse config file from " | |||
+ configFile, e, e.getLocation()); | |||
} | |||
} | |||
} | |||
@@ -1,146 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.modelparser; | |||
import java.util.Iterator; | |||
import org.apache.ant.common.model.BuildElement; | |||
import org.xml.sax.Attributes; | |||
import org.xml.sax.SAXParseException; | |||
/** | |||
* A BuildElementHandler parses the task elements of a build. Task elements | |||
* include tasks themselves plus all their nested elements to any depth. | |||
* | |||
* @author Conor MacNeill | |||
* @created 9 January 2002 | |||
*/ | |||
public class BuildElementHandler extends ModelElementHandler { | |||
/** The task element being parsed by this handler. */ | |||
private BuildElement buildElement; | |||
/** | |||
* Get the task element being parsed by this handler. | |||
* | |||
* @return the BuildElement being parsed. | |||
*/ | |||
public BuildElement getBuildElement() { | |||
return buildElement; | |||
} | |||
/** | |||
* Create a task element handler to parse a task element | |||
* | |||
* @param elementName the name of the element - always target | |||
*/ | |||
public void processElement(String elementName) { | |||
buildElement | |||
= new BuildElement(getLocation(), elementName); | |||
setModelElement(buildElement); | |||
for (Iterator i = getAttributes(); i.hasNext();) { | |||
String attributeName = (String) i.next(); | |||
buildElement.addAttribute(attributeName, | |||
getAttribute(attributeName)); | |||
} | |||
addNamespaceAttributes(); | |||
} | |||
/** | |||
* Process a nested element of this task element. All nested elements of | |||
* a buildElement are themselves buildElements. | |||
* | |||
* @param uri The Namespace URI. | |||
* @param localName The local name (without prefix). | |||
* @param qualifiedName The qualified name (with prefix) | |||
* @param attributes The attributes attached to the element. | |||
* @throws SAXParseException if there is a parsing problem. | |||
*/ | |||
protected void addNestedElement(String uri, String localName, | |||
String qualifiedName, Attributes attributes) | |||
throws SAXParseException { | |||
// everything within a task element is also a task element | |||
BuildElementHandler nestedHandler | |||
= new BuildElementHandler(); | |||
nestedHandler.start(getParseContext(), getXMLReader(), | |||
this, getLocator(), attributes, getElementSource(), qualifiedName); | |||
buildElement.addNestedElement(nestedHandler.getBuildElement()); | |||
} | |||
/** | |||
* This method is called when this element is finished being processed. | |||
* This is a template method allowing subclasses to complete any | |||
* necessary processing. | |||
*/ | |||
protected void finish() { | |||
String content = getContent(); | |||
if (content != null && content.trim().length() != 0) { | |||
buildElement.addText(getContent()); | |||
} | |||
} | |||
/** | |||
* Validate that the given attribute and value are valid. | |||
* | |||
* @param attributeName The name of the attributes | |||
* @param attributeValue The value of the attributes | |||
*/ | |||
protected void validateAttribute(String attributeName, | |||
String attributeValue) { | |||
// do nothing - all attributes are OK by default. | |||
} | |||
} | |||
@@ -1,139 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.modelparser; | |||
import java.net.MalformedURLException; | |||
import java.net.URL; | |||
import org.apache.ant.common.model.Project; | |||
import org.apache.ant.antcore.xml.ElementHandler; | |||
import org.apache.ant.antcore.xml.XMLParseException; | |||
import org.xml.sax.SAXParseException; | |||
/** | |||
* The include handler is used to read in included projects or fragments | |||
* into a project. | |||
* | |||
* @author Conor MacNeill | |||
* @created 11 January 2002 | |||
*/ | |||
public class IncludeHandler extends ElementHandler { | |||
/** The attribute name which identifies the fragment to be included */ | |||
public static final String SYSTEMID_ATTR = "fragment"; | |||
/** The including project */ | |||
private Project project; | |||
/** | |||
* Create an IncludeHandler. | |||
* | |||
* @param project the project into which the include fragment is to be | |||
* placed | |||
*/ | |||
public IncludeHandler(Project project) { | |||
this.project = project; | |||
} | |||
/** | |||
* Process the element. | |||
* | |||
* @param elementName the name of the element | |||
* @exception SAXParseException if there is a problem parsing the | |||
* element | |||
*/ | |||
public void processElement(String elementName) | |||
throws SAXParseException { | |||
String includeSystemId = getAttribute(SYSTEMID_ATTR); | |||
if (includeSystemId == null) { | |||
throw new SAXParseException("Attribute " + SYSTEMID_ATTR + | |||
" is required in an <include> element", getLocator()); | |||
} | |||
// create a new parser to read this project relative to the | |||
// project's URI | |||
try { | |||
URL includeURL = new URL(getElementSource(), includeSystemId); | |||
ProjectHandler includedProjectHandler = new ProjectHandler(project); | |||
getParseContext().parse(includeURL, | |||
new String[]{"project", "fragment"}, | |||
includedProjectHandler); | |||
} catch (MalformedURLException e) { | |||
throw new SAXParseException("Unable to include " + includeSystemId | |||
+ ": " + e.getMessage(), getLocator()); | |||
} catch (XMLParseException e) { | |||
throw new SAXParseException("Error parsing included project " | |||
+ includeSystemId + ": " + e.getMessage(), getLocator()); | |||
} | |||
} | |||
/** | |||
* Validate that the given attribute and value are valid. | |||
* | |||
* @param attributeName The name of the attributes | |||
* @param attributeValue The value of the attributes | |||
* @exception SAXParseException if the attribute is not allowed on the | |||
* element. | |||
*/ | |||
protected void validateAttribute(String attributeName, | |||
String attributeValue) | |||
throws SAXParseException { | |||
if (!attributeName.equals(SYSTEMID_ATTR)) { | |||
throwInvalidAttribute(attributeName); | |||
} | |||
} | |||
} | |||
@@ -1,103 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.modelparser; | |||
import org.apache.ant.antcore.xml.ElementHandler; | |||
import org.apache.ant.common.model.ModelElement; | |||
import java.util.Iterator; | |||
import org.apache.ant.common.util.AttributeCollection; | |||
/** | |||
* A BuildElementHandler parses the task elements of a build. Task elements | |||
* include tasks themselves plus all their nested elements to any depth. | |||
* | |||
* @author Conor MacNeill | |||
* @created 9 January 2002 | |||
*/ | |||
public abstract class ModelElementHandler extends ElementHandler { | |||
/** The model element being parsed by this handler. */ | |||
private ModelElement modelElement; | |||
/** | |||
* Set the model element being handled by this handler | |||
* | |||
* @param modelElement The new modelElement value | |||
*/ | |||
protected void setModelElement(ModelElement modelElement) { | |||
this.modelElement = modelElement; | |||
} | |||
/** Set the end location of the element. */ | |||
protected void finish() { | |||
if (modelElement != null) { | |||
modelElement.setEndLocation(getLocation()); | |||
} | |||
} | |||
/** | |||
* Add all attributes which belong to namespaces rather than the default | |||
* namespace for the build files. | |||
*/ | |||
protected void addNamespaceAttributes() { | |||
for (Iterator i = getNamespaces(); i.hasNext();) { | |||
String uri = (String) i.next(); | |||
AttributeCollection namespaceValues = getNamespaceAttributes(uri); | |||
modelElement.addNamespaceAttributes(uri, namespaceValues); | |||
} | |||
} | |||
} | |||
@@ -1,65 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.modelparser; | |||
/** | |||
* A NoProjectReadException is used to indicate that a project was not read | |||
* from the particular source. This will happen if the source is empty. | |||
* | |||
* @author Conor MacNeill | |||
* @created 15 January 2002 | |||
*/ | |||
public class NoProjectReadException extends Exception { | |||
} | |||
@@ -1,202 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.modelparser; | |||
import org.apache.ant.common.model.ModelException; | |||
import org.apache.ant.common.model.Project; | |||
import org.xml.sax.Attributes; | |||
import org.xml.sax.SAXParseException; | |||
/** | |||
* Element to parse the project element. The project handler creates a | |||
* number of different handlers to which it delegates processing of child | |||
* elements. | |||
* | |||
* @author Conor MacNeill | |||
* @created 9 January 2002 | |||
*/ | |||
public class ProjectHandler extends ModelElementHandler { | |||
/** The basedir attribute tag */ | |||
public static final String BASEDIR_ATTR = "basedir"; | |||
/** The name attribute */ | |||
public static final String NAME_ATTR = "name"; | |||
/** The default attribute name */ | |||
public static final String DEFAULT_ATTR = "default"; | |||
/** The name of the element used to define includes */ | |||
public static final String INCLUDE_ELEMENT = "ant:include"; | |||
/** The name of the element used to define references */ | |||
public static final String TARGET_ELEMENT = "target"; | |||
/** The project being parsed. */ | |||
private Project project; | |||
/** Constructor parsing a new project */ | |||
public ProjectHandler() { | |||
project = null; | |||
} | |||
/** | |||
* Constructor for including a project or fragment into an existing | |||
* project | |||
* | |||
* @param project The project to be configured by the handler | |||
*/ | |||
public ProjectHandler(Project project) { | |||
this.project = project; | |||
} | |||
/** | |||
* Get the project that has been parsed from the element | |||
* | |||
* @return the project that has been parsed from the build source | |||
* @throws NoProjectReadException thrown if no project was read in. | |||
*/ | |||
public Project getProject() | |||
throws NoProjectReadException { | |||
if (project == null) { | |||
throw new NoProjectReadException(); | |||
} | |||
return project; | |||
} | |||
/** | |||
* Process the project element | |||
* | |||
* @param elementName the name of the element | |||
* @exception SAXParseException if there is a problem parsing the | |||
* element | |||
*/ | |||
public void processElement(String elementName) | |||
throws SAXParseException { | |||
if (project == null) { | |||
project = new Project(getElementSource(), getLocation()); | |||
setModelElement(project); | |||
project.setDefaultTarget(getAttribute(DEFAULT_ATTR)); | |||
project.setBase(getAttribute(BASEDIR_ATTR)); | |||
project.setName(getAttribute(NAME_ATTR)); | |||
addNamespaceAttributes(); | |||
} | |||
} | |||
/** | |||
* Start a new element in the project. Project currently handles the | |||
* following elements | |||
* <ul> | |||
* <li> ref</li> | |||
* <li> include</li> | |||
* <li> target</li> | |||
* </ul> | |||
* Everything else is treated as a task. | |||
* | |||
* @param uri The Namespace URI. | |||
* @param localName The local name (without prefix). | |||
* @param qualifiedName The qualified name (with prefix) | |||
* @param attributes The attributes attached to the element. | |||
* @throws SAXParseException if there is a parsing problem. | |||
*/ | |||
protected void addNestedElement(String uri, String localName, | |||
String qualifiedName, Attributes attributes) | |||
throws SAXParseException { | |||
if (qualifiedName.equals(INCLUDE_ELEMENT)) { | |||
IncludeHandler includeHandler = new IncludeHandler(project); | |||
includeHandler.start(getParseContext(), getXMLReader(), | |||
this, getLocator(), attributes, getElementSource(), | |||
qualifiedName); | |||
} else if (qualifiedName.equals(TARGET_ELEMENT)) { | |||
TargetHandler targetHandler = new TargetHandler(); | |||
targetHandler.start(getParseContext(), getXMLReader(), | |||
this, getLocator(), attributes, | |||
getElementSource(), qualifiedName); | |||
try { | |||
project.addTarget(targetHandler.getTarget()); | |||
} catch (ModelException e) { | |||
throw new SAXParseException(e.getMessage(), getLocator(), e); | |||
} | |||
} else { | |||
// everything else is a task | |||
BuildElementHandler buildElementHandler = new BuildElementHandler(); | |||
buildElementHandler.start(getParseContext(), getXMLReader(), | |||
this, getLocator(), attributes, getElementSource(), | |||
qualifiedName); | |||
project.addTask(buildElementHandler.getBuildElement()); | |||
} | |||
} | |||
/** | |||
* Validate that the given attribute and value are valid. | |||
* | |||
* @param attributeName The name of the attributes | |||
* @param attributeValue The value of the attributes | |||
* @exception SAXParseException if the attribute is not allowed on the | |||
* element. | |||
*/ | |||
protected void validateAttribute(String attributeName, | |||
String attributeValue) | |||
throws SAXParseException { | |||
if (!attributeName.equals(BASEDIR_ATTR) && | |||
!attributeName.equals(NAME_ATTR) && | |||
!attributeName.equals(DEFAULT_ATTR)) { | |||
throwInvalidAttribute(attributeName); | |||
} | |||
} | |||
} | |||
@@ -1,164 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.modelparser; | |||
import java.util.StringTokenizer; | |||
import org.apache.ant.common.model.Target; | |||
import org.xml.sax.Attributes; | |||
import org.xml.sax.SAXParseException; | |||
/** | |||
* Element handler for the target element | |||
* | |||
* @author Conor MacNeill | |||
* @created 9 January 2002 | |||
*/ | |||
public class TargetHandler extends ModelElementHandler { | |||
/** The name attribute */ | |||
public static final String NAME_ATTR = "name"; | |||
/** The depends attribute name */ | |||
public static final String DEPENDS_ATTR = "depends"; | |||
/** The depends attribute name */ | |||
public static final String DESC_ATTR = "description"; | |||
/** The if attribute name */ | |||
public static final String IF_ATTR = "if"; | |||
/** The unless attribute name */ | |||
public static final String UNLESS_ATTR = "unless"; | |||
/** The target being configured. */ | |||
private Target target; | |||
/** | |||
* Get the target parsed by this handler. | |||
* | |||
* @return the Target model object parsed by this handler. | |||
*/ | |||
public Target getTarget() { | |||
return target; | |||
} | |||
/** | |||
* Process the target element. | |||
* | |||
* @param elementName the name of the element | |||
* @exception SAXParseException if there is a problem parsing the | |||
* element | |||
*/ | |||
public void processElement(String elementName) | |||
throws SAXParseException { | |||
target = new Target(getLocation(), getAttribute(NAME_ATTR)); | |||
setModelElement(target); | |||
target.setDescription(getAttribute(DESC_ATTR)); | |||
addNamespaceAttributes(); | |||
String depends = getAttribute(DEPENDS_ATTR); | |||
if (depends != null) { | |||
StringTokenizer tokenizer = new StringTokenizer(depends, ","); | |||
while (tokenizer.hasMoreTokens()) { | |||
String dependency = tokenizer.nextToken().trim(); | |||
target.addDependency(dependency); | |||
} | |||
} | |||
target.setIfCondition(getAttribute(IF_ATTR)); | |||
target.setUnlessCondition(getAttribute(UNLESS_ATTR)); | |||
} | |||
/** | |||
* 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. | |||
*/ | |||
protected void addNestedElement(String uri, String localName, | |||
String qualifiedName, Attributes attributes) | |||
throws SAXParseException { | |||
// everything is a task | |||
BuildElementHandler taskHandler = new BuildElementHandler(); | |||
taskHandler.start(getParseContext(), getXMLReader(), this, getLocator(), | |||
attributes, getElementSource(), qualifiedName); | |||
target.addTask(taskHandler.getBuildElement()); | |||
} | |||
/** | |||
* Validate that the given attribute and value are valid. | |||
* | |||
* @param attributeName The name of the attributes | |||
* @param attributeValue The value of the attributes | |||
* @exception SAXParseException if the attribute is not allowed on the | |||
* element. | |||
*/ | |||
protected void validateAttribute(String attributeName, | |||
String attributeValue) | |||
throws SAXParseException { | |||
if (!attributeName.equals(NAME_ATTR) | |||
&& !attributeName.equals(DEPENDS_ATTR) | |||
&& !attributeName.equals(DESC_ATTR) | |||
&& !attributeName.equals(IF_ATTR) | |||
&& !attributeName.equals(UNLESS_ATTR)) { | |||
throwInvalidAttribute(attributeName); | |||
} | |||
} | |||
} | |||
@@ -1,94 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.modelparser; | |||
import java.net.URL; | |||
import org.apache.ant.common.util.Location; | |||
import org.apache.ant.common.model.Project; | |||
import org.apache.ant.antcore.xml.ParseContext; | |||
import org.apache.ant.antcore.xml.XMLParseException; | |||
import org.apache.ant.common.constants.Namespace; | |||
/** | |||
* Parses an Ant project model from an XML source using a SAX Parser. | |||
* | |||
* @author Conor MacNeill | |||
* @created 9 January 2002 | |||
*/ | |||
public class XMLProjectParser { | |||
/** | |||
* Parse a build file from the given URL. | |||
* | |||
* @param buildSource the URL from where the build source may be read. | |||
* @return a project model representing the project | |||
* @exception XMLParseException if there is an problem parsing the XML | |||
* representation | |||
*/ | |||
public Project parseBuildFile(URL buildSource) | |||
throws XMLParseException { | |||
try { | |||
ParseContext context = new ParseContext(); | |||
ProjectHandler projectHandler = new ProjectHandler(); | |||
context.parse(buildSource, "project", projectHandler); | |||
return projectHandler.getProject(); | |||
} catch (NoProjectReadException e) { | |||
throw new XMLParseException("No project defined in build source ", | |||
e, new Location(buildSource.toString())); | |||
} | |||
} | |||
} | |||
@@ -1,411 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.xml; | |||
import java.net.URL; | |||
import java.util.HashMap; | |||
import java.util.Iterator; | |||
import java.util.Map; | |||
import org.apache.ant.common.util.AttributeCollection; | |||
import org.apache.ant.common.util.Location; | |||
import org.apache.ant.common.util.PropertyUtils; | |||
import org.xml.sax.Attributes; | |||
import org.xml.sax.ContentHandler; | |||
import org.xml.sax.Locator; | |||
import org.xml.sax.SAXParseException; | |||
import org.xml.sax.XMLReader; | |||
import org.xml.sax.helpers.DefaultHandler; | |||
/** | |||
* An Element Handler is a handler which handles a single element by becoming | |||
* the handler for the parser while processing the element. Any sub elements | |||
* must be delegated to separate handlers. When this element is finished, | |||
* control returns to the parent handler. | |||
* | |||
* @author Conor MacNeill | |||
* @created 9 January 2002 | |||
*/ | |||
public abstract class ElementHandler extends DefaultHandler { | |||
/** The parsing context for parsing this element */ | |||
private ParseContext context; | |||
/** | |||
* Locator used to identify where in the build source particular elements | |||
* occur. | |||
*/ | |||
private Locator locator; | |||
/** The actual XML parser used to parse the build source */ | |||
private XMLReader reader; | |||
/** The parent element handler */ | |||
private ContentHandler parent; | |||
/** The URL from which we are reading source */ | |||
private URL source; | |||
/** The name of this element */ | |||
private String elementName; | |||
/** The attributes read from this element */ | |||
private AttributeCollection elementAttributes; | |||
/** | |||
* This map contains a set of attribute collections for each namespace | |||
* encountered. | |||
*/ | |||
private Map namespaces; | |||
/** The content of this element */ | |||
private String content; | |||
/** | |||
* Get the source which contains this element | |||
* | |||
* @return the URL from which this element is being read | |||
*/ | |||
public URL getElementSource() { | |||
return source; | |||
} | |||
/** | |||
* Get an interator over the namespace URIs encountered in the processing | |||
* of the element | |||
* | |||
* @return an iterator over the namespace URIs. | |||
*/ | |||
public Iterator getNamespaces() { | |||
return namespaces.keySet().iterator(); | |||
} | |||
/** | |||
* Get the collection of namespace attributes for a given namespace. | |||
* | |||
* @param uri the URI of the namespace from which the attribute collection | |||
* is required. | |||
* @return an attribute collection if any attributes of the requested | |||
* namespace have beebn encountered - otherwise null. | |||
*/ | |||
public AttributeCollection getNamespaceAttributes(String uri) { | |||
return (AttributeCollection) namespaces.get(uri); | |||
} | |||
/** | |||
* Gets the attributeValue attribute of the ElementHandler object | |||
* | |||
* @param attributeName th name of the attribute | |||
* @return The corresponding attribute value or null if the attribute wa | |||
* snot defined. | |||
*/ | |||
public String getAttribute(String attributeName) { | |||
return elementAttributes.getAttribute(attributeName); | |||
} | |||
/** | |||
* Get an attribute as a boolean value | |||
* | |||
* @param attributeName the name of the attribute | |||
* @return the attribute value as a boolean | |||
*/ | |||
protected boolean getBooleanAttribute(String attributeName) { | |||
return PropertyUtils.toBoolean(getAttribute(attributeName)); | |||
} | |||
/** | |||
* Get an iterator to this elements attributes | |||
* | |||
* @return an iterator over the attribute names | |||
*/ | |||
public Iterator getAttributes() { | |||
return elementAttributes.getAttributeNames(); | |||
} | |||
/** | |||
* Gets the content of the element | |||
* | |||
* @return The content value | |||
*/ | |||
public String getContent() { | |||
return content; | |||
} | |||
/** | |||
* Start this element handler. | |||
* | |||
* @param parent the element handler for the element which contains this | |||
* one. | |||
* @param locator the locator is used to get location information from | |||
* elements. | |||
* @param attributes the element's attributes. | |||
* @param source the URL from which the XML source is being parsed. | |||
* @param xmlReader the parser being used | |||
* @param context the parser context for this element | |||
* @param elementName the actual element Name for this element in the XML | |||
* @exception SAXParseException if there is a problem parsing the element | |||
*/ | |||
public final void start(ParseContext context, XMLReader xmlReader, | |||
ContentHandler parent, Locator locator, | |||
Attributes attributes, URL source, | |||
String elementName) | |||
throws SAXParseException { | |||
this.context = context; | |||
this.reader = xmlReader; | |||
this.parent = parent; | |||
this.locator = locator; | |||
this.source = source; | |||
this.elementName = elementName; | |||
processAttributes(attributes); | |||
processElement(elementName); | |||
reader.setContentHandler(this); | |||
} | |||
/** | |||
* Process an element. This resolves any namespaces against prefixes | |||
* declared in the ParseContext. | |||
* | |||
* @param uri The Namespace URI. | |||
* @param localName The local name (without prefix). | |||
* @param qualifiedName The qualified name (with prefix) | |||
* @param attributes The attributes attached to the element. | |||
* @throws SAXParseException if there is a problem parsng the subelement | |||
*/ | |||
public final void startElement(String uri, String localName, | |||
String qualifiedName, Attributes attributes) | |||
throws SAXParseException { | |||
addNestedElement(uri, localName, qualifiedName, attributes); | |||
} | |||
/** | |||
* By default an element handler does not support nested elements. This | |||
* method will always throw an exception. Subclasses should override this | |||
* method to support their own nested elements | |||
* | |||
* @param uri The Namespace URI. | |||
* @param localName The local name (without prefix). | |||
* @param qualifiedName The qualified name (with prefix) | |||
* @param attributes The attributes attached to the element. | |||
* @throws SAXParseException if there is a problem parsng the subelement | |||
*/ | |||
protected void addNestedElement(String uri, String localName, | |||
String qualifiedName, | |||
Attributes attributes) | |||
throws SAXParseException { | |||
throw new SAXParseException("<" + elementName + "> does not support a <" | |||
+ qualifiedName + "> nested element", getLocator()); | |||
} | |||
/** | |||
* Handle the end of this element by making the parent element handler the | |||
* current content handler | |||
* | |||
* @param localName The local name (without prefix). | |||
* @param namespaceURI The Namespace URI. | |||
* @param qName the qualified name of the element | |||
*/ | |||
public final void endElement(String namespaceURI, String localName, | |||
String qName) { | |||
finish(); | |||
reader.setContentHandler(parent); | |||
} | |||
/** | |||
* Record content of this element | |||
* | |||
* @param buf the buffer containing the content to be added | |||
* @param start start position in the buffer | |||
* @param end end position in the buffer | |||
* @exception SAXParseException if there is a parsing error. | |||
* @see org.xml.sax.ContentHandler.characters() | |||
*/ | |||
public void characters(char[] buf, int start, int end) | |||
throws SAXParseException { | |||
if (content == null) { | |||
content = ""; | |||
} | |||
content += new String(buf, start, end); | |||
} | |||
/** | |||
* Get the current parsing location | |||
* | |||
* @return a location instance representing the current parse position | |||
*/ | |||
protected Location getLocation() { | |||
return new Location(locator.getSystemId(), locator.getLineNumber(), | |||
locator.getColumnNumber()); | |||
} | |||
/** | |||
* Get the XML Reader being used to parse the XML. | |||
* | |||
* @return the XML Reader. | |||
*/ | |||
protected XMLReader getXMLReader() { | |||
return reader; | |||
} | |||
/** | |||
* Get the parsing context | |||
* | |||
* @return the parsing context of this element | |||
*/ | |||
protected ParseContext getParseContext() { | |||
return context; | |||
} | |||
/** | |||
* Get the locator used to locate elements in the XML source as they are | |||
* parsed. | |||
* | |||
* @return the locator object which can be used to determine an elements | |||
* location within the XML source | |||
*/ | |||
protected Locator getLocator() { | |||
return locator; | |||
} | |||
/** | |||
* Process the element. | |||
* | |||
* @param elementName the name of the element | |||
* @exception SAXParseException if there is a problem parsing the element | |||
*/ | |||
protected abstract void processElement(String elementName) | |||
throws SAXParseException; | |||
/** | |||
* Process all of the attributes of the element into maps, one for aspects | |||
* and one for other attributes | |||
* | |||
* @param attributes The SAX attributes collection for the element | |||
* @exception SAXParseException if there is a problem reading the | |||
* attributes | |||
*/ | |||
protected final void processAttributes(Attributes attributes) | |||
throws SAXParseException { | |||
namespaces = new HashMap(); | |||
elementAttributes = new AttributeCollection(); | |||
int length = attributes.getLength(); | |||
for (int i = 0; i < length; ++i) { | |||
String localName = attributes.getLocalName(i); | |||
String qName = attributes.getQName(i); | |||
String uri = attributes.getURI(i); | |||
if (uri != null && uri.trim().length() == 0) { | |||
uri = null; | |||
} | |||
String attributeValue = attributes.getValue(i); | |||
if (uri != null) { | |||
AttributeCollection namespaceAttributes | |||
= (AttributeCollection) namespaces.get(uri); | |||
if (namespaceAttributes == null) { | |||
namespaceAttributes = new AttributeCollection(); | |||
namespaces.put(uri, namespaceAttributes); | |||
} | |||
namespaceAttributes.putAttribute(localName, attributeValue); | |||
} else { | |||
validateAttribute(localName, attributeValue); | |||
elementAttributes.putAttribute(localName, attributeValue); | |||
} | |||
} | |||
} | |||
/** | |||
* Validate that the given attribute and value are valid. By default all | |||
* attributes are considered invalid. This method should be overrider by | |||
* subclasses to allow specific attributes | |||
* | |||
* @param attributeName The name of the attributes | |||
* @param attributeValue The value of the attributes | |||
* @exception SAXParseException if the attribute is not allowed on the | |||
* element. | |||
*/ | |||
protected void validateAttribute(String attributeName, | |||
String attributeValue) | |||
throws SAXParseException { | |||
throwInvalidAttribute(attributeName); | |||
} | |||
/** | |||
* Throws an invalid attribute exception | |||
* | |||
* @param attributeName The name of the invalid attribute | |||
* @exception SAXParseException always - indicating attribute is invalid | |||
*/ | |||
protected final void throwInvalidAttribute(String attributeName) | |||
throws SAXParseException { | |||
throw new SAXParseException("The attribute '" + attributeName | |||
+ "' is not " + "supported by the <" + elementName | |||
+ "> element", getLocator()); | |||
} | |||
/** | |||
* This method is called when this element is finished being processed. | |||
* This is a template method allowing subclasses to complete any necessary | |||
* processing. | |||
*/ | |||
protected void finish() { | |||
} | |||
} | |||
@@ -1,183 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.xml; | |||
import java.io.IOException; | |||
import java.util.Map; | |||
import java.util.HashMap; | |||
import java.net.URL; | |||
import javax.xml.parsers.ParserConfigurationException; | |||
import javax.xml.parsers.SAXParser; | |||
import javax.xml.parsers.SAXParserFactory; | |||
import org.apache.ant.common.util.Location; | |||
import org.apache.ant.common.util.CircularDependencyChecker; | |||
import org.apache.ant.common.util.CircularDependencyException; | |||
import org.apache.ant.common.util.AntException; | |||
import org.xml.sax.SAXException; | |||
import org.xml.sax.SAXParseException; | |||
import org.xml.sax.XMLReader; | |||
/** | |||
* Holds the current parsing context. | |||
* | |||
* @author Conor MacNeill | |||
* @created 9 January 2002 | |||
*/ | |||
public class ParseContext { | |||
/** These are namespace to URIs which need not be declared in the XML */ | |||
private Map knownNamespaces = new HashMap(); | |||
/** | |||
* Used to check if we are trying to parse a build file within its own | |||
* context. | |||
*/ | |||
private CircularDependencyChecker checker | |||
= new CircularDependencyChecker("parsing XML"); | |||
/** The factory used to create SAX parsers. */ | |||
private SAXParserFactory parserFactory; | |||
/** | |||
* Initialize a parse context. | |||
* | |||
* This method creates the Parser Factory for which it sets the | |||
* context classloader. | |||
*/ | |||
public ParseContext() { | |||
Thread thread = Thread.currentThread(); | |||
ClassLoader currentContextLoader = thread.getContextClassLoader(); | |||
try { | |||
ClassLoader thisLoader = this.getClass().getClassLoader(); | |||
thread.setContextClassLoader(thisLoader); | |||
parserFactory = SAXParserFactory.newInstance(); | |||
parserFactory.setNamespaceAware(true); | |||
} finally { | |||
thread.setContextClassLoader(currentContextLoader); | |||
} | |||
} | |||
/** | |||
* Parse a URL using the given root handler | |||
* | |||
* @param source The URL to the source to be parsed | |||
* @param rootElementName The required root element name | |||
* @param rootElementHandler The handler for the root element | |||
* @exception XMLParseException if the element cannot be parsed | |||
*/ | |||
public void parse(URL source, String rootElementName, | |||
ElementHandler rootElementHandler) | |||
throws XMLParseException { | |||
parse(source, new String[]{rootElementName}, rootElementHandler); | |||
} | |||
/** | |||
* Parse a URL using the given root handler | |||
* | |||
* @param source The URL to the source to be parsed | |||
* @param rootElementNames The allowable root element names | |||
* @param rootElementHandler The handler for the root element | |||
* @exception XMLParseException if the element cannot be parsed | |||
*/ | |||
public void parse(URL source, String[] rootElementNames, | |||
ElementHandler rootElementHandler) | |||
throws XMLParseException { | |||
try { | |||
checker.visitNode(source); | |||
// create a parser for this source | |||
SAXParser saxParser = null; | |||
Thread thread = Thread.currentThread(); | |||
ClassLoader currentContextLoader = thread.getContextClassLoader(); | |||
try { | |||
ClassLoader thisLoader = this.getClass().getClassLoader(); | |||
thread.setContextClassLoader(thisLoader); | |||
saxParser = parserFactory.newSAXParser(); | |||
} finally { | |||
thread.setContextClassLoader(currentContextLoader); | |||
} | |||
XMLReader xmlReader = saxParser.getXMLReader(); | |||
// create a root handler for this | |||
RootHandler rootHandler = new RootHandler(this, source, xmlReader, | |||
rootElementNames, rootElementHandler); | |||
saxParser.parse(source.toString(), rootHandler); | |||
checker.leaveNode(source); | |||
} catch (ParserConfigurationException e) { | |||
throw new XMLParseException(e); | |||
} catch (SAXParseException e) { | |||
Location location = new Location(e.getSystemId(), | |||
e.getLineNumber(), e.getColumnNumber()); | |||
if (e.getException() != null) { | |||
Throwable nestedException = e.getException(); | |||
if (nestedException instanceof AntException) { | |||
location = ((AntException) nestedException).getLocation(); | |||
} | |||
throw new XMLParseException(nestedException, location); | |||
} else { | |||
throw new XMLParseException(e, location); | |||
} | |||
} catch (SAXException e) { | |||
throw new XMLParseException(e); | |||
} catch (IOException e) { | |||
throw new XMLParseException(e); | |||
} catch (CircularDependencyException e) { | |||
throw new XMLParseException(e); | |||
} | |||
} | |||
} | |||
@@ -1,154 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.xml; | |||
import java.net.URL; | |||
import org.xml.sax.Attributes; | |||
import org.xml.sax.Locator; | |||
import org.xml.sax.SAXParseException; | |||
import org.xml.sax.XMLReader; | |||
import org.xml.sax.helpers.DefaultHandler; | |||
/** | |||
* Handle the root of an XML parse. This class recognizes the root document | |||
* element and then passes control to the handler for that root element. | |||
* | |||
* @author Conor MacNeill | |||
* @created 9 January 2002 | |||
*/ | |||
public class RootHandler extends DefaultHandler { | |||
/** The parsing context for this document */ | |||
private ParseContext context; | |||
/** | |||
* Locator used to identify where in the build source particular | |||
* elements occur. | |||
*/ | |||
private Locator locator; | |||
/** The actual XML parser used to parse the build source */ | |||
private XMLReader reader; | |||
/** The URL from which the XML source is being read. */ | |||
private URL sourceURL; | |||
/** The allowed names of the root element in this document */ | |||
private String[] allowedRootNames; | |||
/** The handler for the root element */ | |||
private ElementHandler rootElementHandler; | |||
/** | |||
* Handler to handle the document root. | |||
* | |||
* @param context The Parser context for this parse operation | |||
* @param sourceURL URL of the source containing the XML definition | |||
* @param reader XML parser | |||
* @param allowedRootNames An array of allowed element names | |||
* @param rootElementHandler The element handler for the root element | |||
*/ | |||
public RootHandler(ParseContext context, URL sourceURL, XMLReader reader, | |||
String[] allowedRootNames, | |||
ElementHandler rootElementHandler) { | |||
this.context = context; | |||
this.sourceURL = sourceURL; | |||
this.reader = reader; | |||
this.allowedRootNames = allowedRootNames; | |||
this.rootElementHandler = rootElementHandler; | |||
} | |||
/** | |||
* Set the locator to use when parsing elements. This is passed onto | |||
* child elements. | |||
* | |||
* @param locator the locator for locating elements in the build source. | |||
*/ | |||
public void setDocumentLocator(Locator locator) { | |||
this.locator = locator; | |||
} | |||
/** | |||
* Start a new element in the root. This must be an allowed root element. | |||
* All other elements are invalid. | |||
* | |||
* @param uri The Namespace URI. | |||
* @param localName The local name (without prefix). | |||
* @param qualifiedName The qualified name (with prefix) | |||
* @param attributes The attributes attached to the element. | |||
* @throws SAXParseException if there is a parsing problem. | |||
*/ | |||
public void startElement(String uri, String localName, String qualifiedName, | |||
Attributes attributes) | |||
throws SAXParseException { | |||
boolean allowed = false; | |||
for (int i = 0; i < allowedRootNames.length; ++i) { | |||
if (qualifiedName.equals(allowedRootNames[i])) { | |||
allowed = true; | |||
break; | |||
} | |||
} | |||
if (allowed) { | |||
rootElementHandler.start(context, reader, this, | |||
locator, attributes, sourceURL, qualifiedName); | |||
} else { | |||
throw new SAXParseException("<" + qualifiedName | |||
+ "> element was not expected as the root element", locator); | |||
} | |||
} | |||
} | |||
@@ -1,130 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antcore.xml; | |||
import org.apache.ant.common.util.AntException; | |||
import org.apache.ant.common.util.Location; | |||
/** | |||
* An XMLParseException is thrown when there is an error parsing the XML | |||
* representation of an Ant build file. | |||
* | |||
* @author Conor MacNeill | |||
* @created 11 January 2002 | |||
*/ | |||
public class XMLParseException extends AntException { | |||
/** | |||
* Constructs an exception with the given descriptive message. | |||
* | |||
* @param msg Description of or information about the exception. | |||
*/ | |||
public XMLParseException(String msg) { | |||
super(msg); | |||
} | |||
/** | |||
* Constructs an exception with the given descriptive message and a | |||
* location in a file. | |||
* | |||
* @param msg Description of or information about the exception. | |||
* @param location Location in the project file where the error occured. | |||
*/ | |||
public XMLParseException(String msg, Location location) { | |||
super(msg, location); | |||
} | |||
/** | |||
* Constructs an exception with the given message and exception as a | |||
* root cause. | |||
* | |||
* @param msg Description of or information about the exception. | |||
* @param cause Throwable that might have cause this one. | |||
*/ | |||
public XMLParseException(String msg, Throwable cause) { | |||
super(msg, cause); | |||
} | |||
/** | |||
* Constructs an exception with the given message and exception as a | |||
* root cause and a location in a file. | |||
* | |||
* @param msg Description of or information about the exception. | |||
* @param cause Exception that might have cause this one. | |||
* @param location Location in the project file where the error occured. | |||
*/ | |||
public XMLParseException(String msg, Throwable cause, Location location) { | |||
super(msg, cause, location); | |||
} | |||
/** | |||
* Constructs an exception with the given exception as a root cause. | |||
* | |||
* @param cause Exception that might have caused this one. | |||
*/ | |||
public XMLParseException(Throwable cause) { | |||
super(cause); | |||
} | |||
/** | |||
* Constructs an exception with the given exception as a root cause and | |||
* a location in a file. | |||
* | |||
* @param cause Exception that might have cause this one. | |||
* @param location Location in the project file where the error occured. | |||
*/ | |||
public XMLParseException(Throwable cause, Location location) { | |||
super(cause, location); | |||
} | |||
} | |||
@@ -1,194 +0,0 @@ | |||
<antlib libid="ant.ant1compat" | |||
home="http://jakarta.apache.org/ant" | |||
reqxml="true" reqtools="true" | |||
extends="ant.system"> | |||
<factory classname="org.apache.tools.ant.Ant1Factory"/> | |||
<converter classname="org.apache.tools.ant.Ant1Converter"/> | |||
<!-- taskdefs --> | |||
<taskdef name="WsdlToDotnet" classname="org.apache.tools.ant.taskdefs.optional.dotnet.WsdlToDotnet"/> | |||
<taskdef name="antlr" classname="org.apache.tools.ant.taskdefs.optional.ANTLR"/> | |||
<taskdef name="antstructure" classname="org.apache.tools.ant.taskdefs.AntStructure"/> | |||
<taskdef name="apply" classname="org.apache.tools.ant.taskdefs.Transform"/> | |||
<taskdef name="available" classname="org.apache.tools.ant.taskdefs.Available"/> | |||
<taskdef name="basename" classname="org.apache.tools.ant.taskdefs.Basename"/> | |||
<taskdef name="blgenclient" classname="org.apache.tools.ant.taskdefs.optional.ejb.BorlandGenerateClient"/> | |||
<taskdef name="buildnumber" classname="org.apache.tools.ant.taskdefs.BuildNumber"/> | |||
<taskdef name="bunzip2" classname="org.apache.tools.ant.taskdefs.BUnzip2"/> | |||
<taskdef name="bzip2" classname="org.apache.tools.ant.taskdefs.BZip2"/> | |||
<taskdef name="cab" classname="org.apache.tools.ant.taskdefs.optional.Cab"/> | |||
<taskdef name="cccheckin" classname="org.apache.tools.ant.taskdefs.optional.clearcase.CCCheckin"/> | |||
<taskdef name="cccheckout" classname="org.apache.tools.ant.taskdefs.optional.clearcase.CCCheckout"/> | |||
<taskdef name="ccmcheckin" classname="org.apache.tools.ant.taskdefs.optional.ccm.CCMCheckin"/> | |||
<taskdef name="ccmcheckintask" classname="org.apache.tools.ant.taskdefs.optional.ccm.CCMCheckinDefault"/> | |||
<taskdef name="ccmcheckout" classname="org.apache.tools.ant.taskdefs.optional.ccm.CCMCheckout"/> | |||
<taskdef name="ccmcreatetask" classname="org.apache.tools.ant.taskdefs.optional.ccm.CCMCreateTask"/> | |||
<taskdef name="ccmreconfigure" classname="org.apache.tools.ant.taskdefs.optional.ccm.CCMReconfigure"/> | |||
<taskdef name="ccuncheckout" classname="org.apache.tools.ant.taskdefs.optional.clearcase.CCUnCheckout"/> | |||
<taskdef name="ccupdate" classname="org.apache.tools.ant.taskdefs.optional.clearcase.CCUpdate"/> | |||
<taskdef name="checksum" classname="org.apache.tools.ant.taskdefs.Checksum"/> | |||
<taskdef name="chmod" classname="org.apache.tools.ant.taskdefs.Chmod"/> | |||
<taskdef name="concat" classname="org.apache.tools.ant.taskdefs.Concat"/> | |||
<taskdef name="condition" classname="org.apache.tools.ant.taskdefs.ConditionTask"/> | |||
<taskdef name="copy" classname="org.apache.tools.ant.taskdefs.Copy"/> | |||
<taskdef name="csc" classname="org.apache.tools.ant.taskdefs.optional.dotnet.CSharp"/> | |||
<taskdef name="cvs" classname="org.apache.tools.ant.taskdefs.Cvs"/> | |||
<taskdef name="cvschangelog" classname="org.apache.tools.ant.taskdefs.cvslib.ChangeLogTask"/> | |||
<taskdef name="cvspass" classname="org.apache.tools.ant.taskdefs.CVSPass"/> | |||
<taskdef name="cvstagdiff" classname="org.apache.tools.ant.taskdefs.cvslib.CvsTagDiff"/> | |||
<taskdef name="ddcreator" classname="org.apache.tools.ant.taskdefs.optional.ejb.DDCreator"/> | |||
<taskdef name="delete" classname="org.apache.tools.ant.taskdefs.Delete"/> | |||
<taskdef name="depend" classname="org.apache.tools.ant.taskdefs.optional.depend.Depend"/> | |||
<taskdef name="dependset" classname="org.apache.tools.ant.taskdefs.DependSet"/> | |||
<taskdef name="dirname" classname="org.apache.tools.ant.taskdefs.Dirname"/> | |||
<taskdef name="ear" classname="org.apache.tools.ant.taskdefs.Ear"/> | |||
<taskdef name="echo" classname="org.apache.tools.ant.taskdefs.Echo"/> | |||
<taskdef name="echoproperties" classname="org.apache.tools.ant.taskdefs.optional.EchoProperties"/> | |||
<taskdef name="ejbc" classname="org.apache.tools.ant.taskdefs.optional.ejb.Ejbc"/> | |||
<taskdef name="ejbjar" classname="org.apache.tools.ant.taskdefs.optional.ejb.EjbJar"/> | |||
<taskdef name="exec" classname="org.apache.tools.ant.taskdefs.ExecTask"/> | |||
<taskdef name="execon" classname="org.apache.tools.ant.taskdefs.ExecuteOn"/> | |||
<taskdef name="fail" classname="org.apache.tools.ant.taskdefs.Exit"/> | |||
<taskdef name="filter" classname="org.apache.tools.ant.taskdefs.Filter"/> | |||
<taskdef name="fixcrlf" classname="org.apache.tools.ant.taskdefs.FixCRLF"/> | |||
<taskdef name="ftp" classname="org.apache.tools.ant.taskdefs.optional.net.FTP"/> | |||
<taskdef name="genkey" classname="org.apache.tools.ant.taskdefs.GenerateKey"/> | |||
<taskdef name="get" classname="org.apache.tools.ant.taskdefs.Get"/> | |||
<taskdef name="gunzip" classname="org.apache.tools.ant.taskdefs.GUnzip"/> | |||
<taskdef name="gzip" classname="org.apache.tools.ant.taskdefs.GZip"/> | |||
<taskdef name="icontract" classname="org.apache.tools.ant.taskdefs.optional.IContract"/> | |||
<taskdef name="ilasm" classname="org.apache.tools.ant.taskdefs.optional.dotnet.Ilasm"/> | |||
<taskdef name="input" classname="org.apache.tools.ant.taskdefs.Input"/> | |||
<taskdef name="iplanet-ejbc" classname="org.apache.tools.ant.taskdefs.optional.ejb.IPlanetEjbcTask"/> | |||
<taskdef name="jar" classname="org.apache.tools.ant.taskdefs.Jar"/> | |||
<taskdef name="jarlib-available" classname="org.apache.tools.ant.taskdefs.optional.extension.JarLibAvailableTask"/> | |||
<taskdef name="jarlib-display" classname="org.apache.tools.ant.taskdefs.optional.extension.JarLibDisplayTask"/> | |||
<taskdef name="jarlib-manifest" classname="org.apache.tools.ant.taskdefs.optional.extension.JarLibManifestTask"/> | |||
<taskdef name="jarlib-resolve" classname="org.apache.tools.ant.taskdefs.optional.extension.JarLibResolveTask"/> | |||
<taskdef name="java" classname="org.apache.tools.ant.taskdefs.Java"/> | |||
<taskdef name="javac" classname="org.apache.tools.ant.taskdefs.Javac"/> | |||
<taskdef name="javacc" classname="org.apache.tools.ant.taskdefs.optional.javacc.JavaCC"/> | |||
<taskdef name="javadoc" classname="org.apache.tools.ant.taskdefs.Javadoc"/> | |||
<taskdef name="javah" classname="org.apache.tools.ant.taskdefs.optional.Javah"/> | |||
<taskdef name="jdepend" classname="org.apache.tools.ant.taskdefs.optional.jdepend.JDependTask"/> | |||
<taskdef name="jjtree" classname="org.apache.tools.ant.taskdefs.optional.javacc.JJTree"/> | |||
<taskdef name="jlink" classname="org.apache.tools.ant.taskdefs.optional.jlink.JlinkTask"/> | |||
<taskdef name="jpcoverage" classname="org.apache.tools.ant.taskdefs.optional.sitraka.Coverage"/> | |||
<taskdef name="jpcovreport" classname="org.apache.tools.ant.taskdefs.optional.sitraka.CovReport"/> | |||
<taskdef name="jspc" classname="org.apache.tools.ant.taskdefs.optional.jsp.JspC"/> | |||
<taskdef name="junit" classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTask"/> | |||
<taskdef name="junitreport" classname="org.apache.tools.ant.taskdefs.optional.junit.XMLResultAggregator"/> | |||
<taskdef name="loadfile" classname="org.apache.tools.ant.taskdefs.LoadFile"/> | |||
<taskdef name="loadproperties" classname="org.apache.tools.ant.taskdefs.LoadProperties"/> | |||
<taskdef name="mail" classname="org.apache.tools.ant.taskdefs.email.EmailTask"/> | |||
<taskdef name="manifest" classname="org.apache.tools.ant.taskdefs.Manifest"/> | |||
<taskdef name="maudit" classname="org.apache.tools.ant.taskdefs.optional.metamata.MAudit"/> | |||
<taskdef name="mimemail" classname="org.apache.tools.ant.taskdefs.optional.net.MimeMail"/> | |||
<taskdef name="mkdir" classname="org.apache.tools.ant.taskdefs.Mkdir"/> | |||
<taskdef name="mmetrics" classname="org.apache.tools.ant.taskdefs.optional.metamata.MMetrics"/> | |||
<taskdef name="move" classname="org.apache.tools.ant.taskdefs.Move"/> | |||
<taskdef name="mparse" classname="org.apache.tools.ant.taskdefs.optional.metamata.MParse"/> | |||
<taskdef name="native2ascii" classname="org.apache.tools.ant.taskdefs.optional.Native2Ascii"/> | |||
<taskdef name="netrexxc" classname="org.apache.tools.ant.taskdefs.optional.NetRexxC"/> | |||
<taskdef name="p4add" classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Add"/> | |||
<taskdef name="p4change" classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Change"/> | |||
<taskdef name="p4counter" classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Counter"/> | |||
<taskdef name="p4edit" classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Edit"/> | |||
<taskdef name="p4have" classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Have"/> | |||
<taskdef name="p4label" classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Label"/> | |||
<taskdef name="p4submit" classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Submit"/> | |||
<taskdef name="p4sync" classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Sync"/> | |||
<taskdef name="patch" classname="org.apache.tools.ant.taskdefs.Patch"/> | |||
<taskdef name="pathconvert" classname="org.apache.tools.ant.taskdefs.PathConvert"/> | |||
<taskdef name="property" classname="org.apache.tools.ant.taskdefs.Property"/> | |||
<taskdef name="propertyfile" classname="org.apache.tools.ant.taskdefs.optional.PropertyFile"/> | |||
<taskdef name="pvcs" classname="org.apache.tools.ant.taskdefs.optional.pvcs.Pvcs"/> | |||
<taskdef name="record" classname="org.apache.tools.ant.taskdefs.Recorder"/> | |||
<taskdef name="renameext" classname="org.apache.tools.ant.taskdefs.optional.RenameExtensions"/> | |||
<taskdef name="replace" classname="org.apache.tools.ant.taskdefs.Replace"/> | |||
<taskdef name="replaceregexp" classname="org.apache.tools.ant.taskdefs.optional.ReplaceRegExp"/> | |||
<taskdef name="rmic" classname="org.apache.tools.ant.taskdefs.Rmic"/> | |||
<taskdef name="rpm" classname="org.apache.tools.ant.taskdefs.optional.Rpm"/> | |||
<taskdef name="script" classname="org.apache.tools.ant.taskdefs.optional.Script"/> | |||
<taskdef name="serverdeploy" classname="org.apache.tools.ant.taskdefs.optional.j2ee.ServerDeploy"/> | |||
<taskdef name="setproxy" classname="org.apache.tools.ant.taskdefs.optional.net.SetProxy"/> | |||
<taskdef name="signjar" classname="org.apache.tools.ant.taskdefs.SignJar"/> | |||
<taskdef name="sleep" classname="org.apache.tools.ant.taskdefs.Sleep"/> | |||
<taskdef name="soscheckin" classname="org.apache.tools.ant.taskdefs.optional.sos.SOSCheckin"/> | |||
<taskdef name="soscheckout" classname="org.apache.tools.ant.taskdefs.optional.sos.SOSCheckout"/> | |||
<taskdef name="sosget" classname="org.apache.tools.ant.taskdefs.optional.sos.SOSGet"/> | |||
<taskdef name="soslabel" classname="org.apache.tools.ant.taskdefs.optional.sos.SOSLabel"/> | |||
<taskdef name="sound" classname="org.apache.tools.ant.taskdefs.optional.sound.SoundTask"/> | |||
<taskdef name="splash" classname="org.apache.tools.ant.taskdefs.optional.splash.SplashTask"/> | |||
<taskdef name="sql" classname="org.apache.tools.ant.taskdefs.SQLExec"/> | |||
<taskdef name="stcheckin" classname="org.apache.tools.ant.taskdefs.optional.starteam.StarTeamCheckin"/> | |||
<taskdef name="stcheckout" classname="org.apache.tools.ant.taskdefs.optional.starteam.StarTeamCheckout"/> | |||
<taskdef name="stlabel" classname="org.apache.tools.ant.taskdefs.optional.starteam.StarTeamLabel"/> | |||
<taskdef name="stlist" classname="org.apache.tools.ant.taskdefs.optional.starteam.StarTeamList"/> | |||
<taskdef name="style" classname="org.apache.tools.ant.taskdefs.XSLTProcess"/> | |||
<taskdef name="stylebook" classname="org.apache.tools.ant.taskdefs.optional.StyleBook"/> | |||
<taskdef name="tar" classname="org.apache.tools.ant.taskdefs.Tar"/> | |||
<taskdef name="taskdef" classname="org.apache.tools.ant.taskdefs.Taskdef"/> | |||
<taskdef name="telnet" classname="org.apache.tools.ant.taskdefs.optional.net.TelnetTask"/> | |||
<taskdef name="tempfile" classname="org.apache.tools.ant.taskdefs.TempFile"/> | |||
<taskdef name="test" classname="org.apache.tools.ant.taskdefs.optional.Test"/> | |||
<taskdef name="touch" classname="org.apache.tools.ant.taskdefs.Touch"/> | |||
<taskdef name="translate" classname="org.apache.tools.ant.taskdefs.optional.i18n.Translate"/> | |||
<taskdef name="tstamp" classname="org.apache.tools.ant.taskdefs.Tstamp"/> | |||
<taskdef name="typedef" classname="org.apache.tools.ant.taskdefs.Typedef"/> | |||
<taskdef name="unjar" classname="org.apache.tools.ant.taskdefs.Expand"/> | |||
<taskdef name="untar" classname="org.apache.tools.ant.taskdefs.Untar"/> | |||
<taskdef name="unwar" classname="org.apache.tools.ant.taskdefs.Expand"/> | |||
<taskdef name="unzip" classname="org.apache.tools.ant.taskdefs.Expand"/> | |||
<taskdef name="uptodate" classname="org.apache.tools.ant.taskdefs.UpToDate"/> | |||
<taskdef name="vajexport" classname="org.apache.tools.ant.taskdefs.optional.ide.VAJExport"/> | |||
<taskdef name="vajimport" classname="org.apache.tools.ant.taskdefs.optional.ide.VAJImport"/> | |||
<taskdef name="vajload" classname="org.apache.tools.ant.taskdefs.optional.ide.VAJLoadProjects"/> | |||
<taskdef name="vssadd" classname="org.apache.tools.ant.taskdefs.optional.vss.MSVSSADD"/> | |||
<taskdef name="vsscheckin" classname="org.apache.tools.ant.taskdefs.optional.vss.MSVSSCHECKIN"/> | |||
<taskdef name="vsscheckout" classname="org.apache.tools.ant.taskdefs.optional.vss.MSVSSCHECKOUT"/> | |||
<taskdef name="vsscp" classname="org.apache.tools.ant.taskdefs.optional.vss.MSVSSCP"/> | |||
<taskdef name="vsscreate" classname="org.apache.tools.ant.taskdefs.optional.vss.MSVSSCREATE"/> | |||
<taskdef name="vssget" classname="org.apache.tools.ant.taskdefs.optional.vss.MSVSSGET"/> | |||
<taskdef name="vsshistory" classname="org.apache.tools.ant.taskdefs.optional.vss.MSVSSHISTORY"/> | |||
<taskdef name="vsslabel" classname="org.apache.tools.ant.taskdefs.optional.vss.MSVSSLABEL"/> | |||
<taskdef name="waitfor" classname="org.apache.tools.ant.taskdefs.WaitFor"/> | |||
<taskdef name="war" classname="org.apache.tools.ant.taskdefs.War"/> | |||
<taskdef name="wljspc" classname="org.apache.tools.ant.taskdefs.optional.jsp.WLJspc"/> | |||
<taskdef name="wlrun" classname="org.apache.tools.ant.taskdefs.optional.ejb.WLRun"/> | |||
<taskdef name="wlstop" classname="org.apache.tools.ant.taskdefs.optional.ejb.WLStop"/> | |||
<taskdef name="wsdltodotnet" classname="org.apache.tools.ant.taskdefs.optional.dotnet.WsdlToDotnet"/> | |||
<taskdef name="xmlproperty" classname="org.apache.tools.ant.taskdefs.XmlProperty"/> | |||
<taskdef name="xmlvalidate" classname="org.apache.tools.ant.taskdefs.optional.XMLValidateTask"/> | |||
<taskdef name="xslt" classname="org.apache.tools.ant.taskdefs.XSLTProcess"/> | |||
<taskdef name="zip" classname="org.apache.tools.ant.taskdefs.Zip"/> | |||
<!-- Deprecated tasks --> | |||
<taskdef name="copydir" classname="org.apache.tools.ant.taskdefs.Copydir"/> | |||
<taskdef name="copyfile" classname="org.apache.tools.ant.taskdefs.Copyfile"/> | |||
<taskdef name="deltree" classname="org.apache.tools.ant.taskdefs.Deltree"/> | |||
<taskdef name="rename" classname="org.apache.tools.ant.taskdefs.Rename"/> | |||
<taskdef name="starteam" classname="org.apache.tools.ant.taskdefs.optional.scm.AntStarTeamCheckOut"/> | |||
<!-- typedefs --> | |||
<typedef name="classfileset" classname="org.apache.tools.ant.types.optional.depend.ClassfileSet"/> | |||
<typedef name="description" classname="org.apache.tools.ant.types.Description"/> | |||
<typedef name="dirset" classname="org.apache.tools.ant.types.DirSet"/> | |||
<typedef name="extension" classname="org.apache.tools.ant.taskdefs.optional.extension.ExtensionAdapter"/> | |||
<typedef name="extensionSet" classname="org.apache.tools.ant.taskdefs.optional.extension.ExtensionSet"/> | |||
<typedef name="filelist" classname="org.apache.tools.ant.types.FileList"/> | |||
<typedef name="fileset" classname="org.apache.tools.ant.types.FileSet"/> | |||
<typedef name="filterchain" classname="org.apache.tools.ant.types.FilterChain"/> | |||
<typedef name="filterreader" classname="org.apache.tools.ant.types.AntFilterReader"/> | |||
<typedef name="filterset" classname="org.apache.tools.ant.types.FilterSet"/> | |||
<typedef name="libfileset" classname="org.apache.tools.ant.taskdefs.optional.extension.LibFileSet"/> | |||
<typedef name="mapper" classname="org.apache.tools.ant.types.Mapper"/> | |||
<typedef name="path" classname="org.apache.tools.ant.types.Path"/> | |||
<typedef name="patternset" classname="org.apache.tools.ant.types.PatternSet"/> | |||
<typedef name="regexp" classname="org.apache.tools.ant.types.RegularExpression"/> | |||
<typedef name="selector" classname="org.apache.tools.ant.types.selectors.SelectSelector"/> | |||
<typedef name="substitution" classname="org.apache.tools.ant.types.Substitution"/> | |||
<typedef name="xmlcatalog" classname="org.apache.tools.ant.types.XMLCatalog"/> | |||
</antlib> |
@@ -1,129 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.tools.ant; | |||
import org.apache.ant.common.util.Location; | |||
import org.apache.ant.common.util.AntException; | |||
/** | |||
* An exception in the Ant1 compatability layer. | |||
* | |||
* @author Conor MacNeill | |||
*/ | |||
public class Ant1CompatException extends AntException { | |||
/** | |||
* Constructs an exception with the given descriptive message. | |||
* | |||
* @param msg Description of or information about the exception. | |||
*/ | |||
public Ant1CompatException(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 Ant1CompatException(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 Ant1CompatException(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 Ant1CompatException(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 Ant1CompatException(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 Ant1CompatException(Throwable cause, Location location) { | |||
super(cause, location); | |||
} | |||
} | |||
@@ -1,136 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.tools.ant; | |||
import org.apache.ant.common.antlib.AbstractConverter; | |||
import org.apache.ant.common.antlib.ConverterException; | |||
import org.apache.tools.ant.types.EnumeratedAttribute; | |||
import org.apache.tools.ant.types.Path; | |||
/** | |||
* A converter to convert to the types supported by the Ant1 Ant library | |||
* | |||
* @author Conor MacNeill | |||
* @created 1 February 2002 | |||
*/ | |||
public class Ant1Converter extends AbstractConverter { | |||
/** The project instance for this converter */ | |||
private Project project; | |||
/** | |||
* Constructor for the Ant1Converter object | |||
* | |||
* @param project the project for this converter. It is used in the | |||
* conversion of some of the supported types. | |||
*/ | |||
public Ant1Converter(Project project) { | |||
this.project = project; | |||
} | |||
/** | |||
* Get the list of classes this converter is able to convert to. | |||
* | |||
* @return an array of Class objects representing the classes this | |||
* converter handles. | |||
*/ | |||
public Class[] getTypes() { | |||
return new Class[]{Path.class, EnumeratedAttribute.class}; | |||
} | |||
/** | |||
* Convert a string from the value given to an instance of the given | |||
* type. | |||
* | |||
* @param value The value to be converted | |||
* @param type the desired type of the converted object | |||
* @return the value of the converted object | |||
* @exception ConverterException if the conversion cannot be made | |||
*/ | |||
public Object convert(String value, Class type) throws ConverterException { | |||
if (type.equals(Path.class)) { | |||
return new Path(project, value); | |||
} else if (EnumeratedAttribute.class.isAssignableFrom(type)) { | |||
try { | |||
EnumeratedAttribute ea | |||
= (EnumeratedAttribute) type.newInstance(); | |||
ea.setValue(value); | |||
return ea; | |||
} catch (InstantiationException e) { | |||
throw new ConverterException(e); | |||
} catch (IllegalAccessException e) { | |||
throw new ConverterException(e); | |||
} | |||
} else { | |||
throw new ConverterException("This converter does not handle " | |||
+ type.getName()); | |||
} | |||
} | |||
/** | |||
* This method allows a converter to indicate whether it can create the | |||
* given type which is a sub-type of one of the converter's main types | |||
* indicated in getTypes. Most converters can return false here. | |||
* | |||
* @param subType the sub-type | |||
* @return true if this converter can convert a string representation to | |||
* the given subclass of one of its main class | |||
*/ | |||
public boolean canConvertSubType(Class subType) { | |||
return EnumeratedAttribute.class.isAssignableFrom(subType); | |||
} | |||
} | |||
@@ -1,212 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.tools.ant; | |||
import org.apache.ant.common.antlib.AntContext; | |||
import org.apache.ant.common.antlib.StandardLibFactory; | |||
import org.apache.ant.common.service.EventService; | |||
import org.apache.ant.common.util.AntException; | |||
import org.apache.ant.init.LoaderUtils; | |||
import java.lang.reflect.InvocationTargetException; | |||
/** | |||
* The factory object for the Ant1 compatability Ant library | |||
* | |||
* @author Conor MacNeill | |||
* @created 31 January 2002 | |||
*/ | |||
public class Ant1Factory extends StandardLibFactory { | |||
/** | |||
* A Project instance associated with the factory - used in the creation | |||
* of tasks and types | |||
*/ | |||
private Project project; | |||
/** The Ant context for this factory */ | |||
private AntContext context; | |||
/** | |||
* Initialise the factory | |||
* | |||
* @param context the context for this factory to use to access core | |||
* services. | |||
* @exception AntException if the factory cannot be initialised. | |||
*/ | |||
public void init(AntContext context) throws AntException { | |||
if (project != null) { | |||
return; | |||
} | |||
this.context = context; | |||
// set the system classpath. In Ant2, the system classpath will not | |||
// in general, have any useful information. For Ant1 compatability | |||
// we set it now to include the Ant1 facade classes | |||
System.setProperty("java.class.path", getAnt1Classpath()); | |||
project = new Project(this); | |||
project.init(context); | |||
EventService eventService = | |||
(EventService) context.getCoreService(EventService.class); | |||
eventService.addBuildListener(project); | |||
} | |||
/** | |||
* Create an instance of the given component class | |||
* | |||
* @param componentClass the class for which an instance is required | |||
* @param localName the name within the library under which the task is | |||
* defined | |||
* @return an instance of the required class | |||
* @exception InstantiationException if the class cannot be instantiated | |||
* @exception IllegalAccessException if the instance cannot be accessed | |||
* @exception Ant1CompatException if there is a problem creating the task | |||
*/ | |||
public Object createComponent(Class componentClass, String localName) | |||
throws InstantiationException, IllegalAccessException, | |||
Ant1CompatException { | |||
try { | |||
java.lang.reflect.Constructor constructor = null; | |||
// DataType can have a "no arg" constructor or take a single | |||
// Project argument. | |||
Object component = null; | |||
try { | |||
constructor = componentClass.getConstructor(new Class[0]); | |||
component = constructor.newInstance(new Object[0]); | |||
} catch (NoSuchMethodException nse) { | |||
constructor | |||
= componentClass.getConstructor(new Class[]{Project.class}); | |||
component = constructor.newInstance(new Object[]{project}); | |||
} | |||
if (component instanceof ProjectComponent) { | |||
((ProjectComponent) component).setProject(project); | |||
} | |||
return component; | |||
} catch (InvocationTargetException ite) { | |||
Throwable t = ite.getTargetException(); | |||
String msg = "Could not create component of type: " | |||
+ componentClass.getName() + " due to " + t; | |||
throw new Ant1CompatException(msg, t); | |||
} catch (NoSuchMethodException e) { | |||
throw new Ant1CompatException("Unable to find an appropriate " | |||
+ "constructor for component " + componentClass.getName(), e); | |||
} | |||
} | |||
/** | |||
* Create an instance of the given class | |||
* | |||
* @param requiredClass the class for which an instance is | |||
* required | |||
* @return a instance of the required class | |||
* @exception InstantiationException if the class cannot be instantiated | |||
* @exception IllegalAccessException if the instance cannot be accessed | |||
* @exception Ant1CompatException if there is a problem creating the | |||
* converter | |||
*/ | |||
public Object createInstance(Class requiredClass) | |||
throws InstantiationException, IllegalAccessException, | |||
Ant1CompatException { | |||
java.lang.reflect.Constructor c = null; | |||
Object instance = null; | |||
try { | |||
try { | |||
c = requiredClass.getConstructor(new Class[0]); | |||
instance = c.newInstance(new Object[0]); | |||
} catch (NoSuchMethodException nse) { | |||
c = requiredClass.getConstructor(new Class[]{Project.class}); | |||
instance = c.newInstance(new Object[]{project}); | |||
} | |||
return instance; | |||
} catch (java.lang.reflect.InvocationTargetException ite) { | |||
Throwable t = ite.getTargetException(); | |||
String msg = "Could not create instance of type: " | |||
+ requiredClass.getName() + " due to " + t; | |||
throw new Ant1CompatException(msg, t); | |||
} catch (NoSuchMethodException e) { | |||
throw new Ant1CompatException("Unable to find an appropriate " | |||
+ "constructor for class " + requiredClass.getName(), e); | |||
} | |||
} | |||
/** | |||
* Register an element which has been created as the result of calling a | |||
* create method. | |||
* | |||
* @param createdElement the element that the component created | |||
* @exception AntException if there is a problem registering the | |||
* element | |||
*/ | |||
public void registerCreatedElement(Object createdElement) | |||
throws AntException { | |||
if (createdElement instanceof ProjectComponent) { | |||
ProjectComponent component = (ProjectComponent) createdElement; | |||
component.setProject(project); | |||
} | |||
} | |||
/** | |||
* Get an Ant1 equivalent classpath | |||
* | |||
* @return an Ant1 suitable classpath | |||
*/ | |||
String getAnt1Classpath() { | |||
ClassLoader classLoader = getClass().getClassLoader(); | |||
String path = LoaderUtils.getClasspath(classLoader); | |||
return path; | |||
} | |||
} | |||
@@ -1,95 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.tools.ant; | |||
import org.apache.ant.common.service.InputService; | |||
import org.apache.ant.common.util.AntException; | |||
import org.apache.tools.ant.input.InputHandler; | |||
import org.apache.tools.ant.input.InputRequest; | |||
/** | |||
* Uses the core's input service to handle input | |||
* | |||
* @author Conor MacNeill | |||
* @created 30 April 2002 | |||
*/ | |||
public class Ant1InputHandler implements InputHandler { | |||
/** Core's input service instance */ | |||
private InputService inputService; | |||
/** | |||
* Constructor for the Ant1InputHandler | |||
* | |||
* @param inputService the core's input service instance to which input | |||
* requests will be delgated. | |||
*/ | |||
public Ant1InputHandler(InputService inputService) { | |||
this.inputService = inputService; | |||
} | |||
/** | |||
* Pass input request into the core service | |||
* | |||
* @param request the input request | |||
* @exception BuildException if there is a problem handling the request. | |||
*/ | |||
public void handleInput(InputRequest request) throws BuildException { | |||
try { | |||
inputService.handleInput(request); | |||
} catch (AntException e) { | |||
throw new BuildException(e); | |||
} | |||
} | |||
} | |||
@@ -1,146 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.tools.ant; | |||
import org.apache.ant.common.antlib.AntContext; | |||
import org.apache.ant.common.util.AntException; | |||
/** | |||
* ProjectComponent facade | |||
* | |||
* @author Conor MacNeill | |||
* @created 31 January 2002 | |||
*/ | |||
public abstract class ProjectComponent { | |||
/** The project in which the project component operates */ | |||
protected Project project; | |||
/** The core context for this component */ | |||
private AntContext context; | |||
/** The type of the component bneing created */ | |||
private String componentType; | |||
/** | |||
* Sets the project of the ProjectComponent | |||
* | |||
* @param project the project object with which this component is | |||
* associated | |||
*/ | |||
public void setProject(Project project) { | |||
this.project = project; | |||
} | |||
/** | |||
* Gets the project of the ProjectComponent | |||
* | |||
* @return the project | |||
*/ | |||
public Project getProject() { | |||
return project; | |||
} | |||
/** | |||
* Gets the componentType of the ProjectComponent | |||
* | |||
* @return the componentType value | |||
*/ | |||
public String getComponentType() { | |||
return componentType; | |||
} | |||
/** | |||
* Get the context associated with this component | |||
* | |||
* @return the AntContext | |||
*/ | |||
public AntContext getAntContext() { | |||
return context; | |||
} | |||
/** | |||
* Initialise this component | |||
* | |||
* @param context the core context for this component | |||
* @param componentType the component type of this component | |||
* @exception AntException if the component cannot be initialized | |||
*/ | |||
public void init(AntContext context, String componentType) | |||
throws AntException { | |||
this.context = context; | |||
this.componentType = componentType; | |||
} | |||
/** | |||
* Log a message as a build event | |||
* | |||
* @param message the message to be logged | |||
* @param level the priority level of the message | |||
*/ | |||
public void log(String message, int level) { | |||
if (context != null) { | |||
context.log(message, level); | |||
} | |||
} | |||
/** | |||
* Log a message as a build event | |||
* | |||
* @param message the message to be logged | |||
*/ | |||
public void log(String message) { | |||
log(message, Project.MSG_INFO); | |||
} | |||
} | |||
@@ -1,150 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.tools.ant; | |||
import java.util.Hashtable; | |||
import java.util.Vector; | |||
import java.io.File; | |||
import org.apache.ant.common.antlib.AntContext; | |||
import org.apache.ant.common.service.DataService; | |||
import org.apache.ant.common.util.AntException; | |||
import org.apache.ant.common.util.PropertyUtils; | |||
/** | |||
* Ant1 ProjectHelper facade | |||
* | |||
* @author Conor MacNeill | |||
* @created 31 January 2002 | |||
*/ | |||
public class ProjectHelper { | |||
/** | |||
* This method will parse a string containing ${value} style property | |||
* values into two lists. 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. | |||
* | |||
* @param value the string to be parsed | |||
* @param fragments the fragments parsed out of the string | |||
* @param propertyRefs the property refs to be replaced | |||
*/ | |||
public static void parsePropertyString(String value, Vector fragments, | |||
Vector propertyRefs) { | |||
try { | |||
PropertyUtils.parsePropertyString(value, fragments, propertyRefs); | |||
} catch (AntException e) { | |||
throw new BuildException(e); | |||
} | |||
} | |||
/** | |||
* 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. | |||
* @param project the project object which contains the property values | |||
* @return the string with the property references replaced with their | |||
* project values | |||
* @exception BuildException if there is a problem replacing the | |||
* property values. | |||
*/ | |||
public static String replaceProperties(Project project, String value) | |||
throws BuildException { | |||
try { | |||
AntContext context = project.getContext(); | |||
DataService dataService | |||
= (DataService) context.getCoreService(DataService.class); | |||
return dataService.replacePropertyRefs(value); | |||
} catch (AntException e) { | |||
throw new BuildException(e); | |||
} | |||
} | |||
/** | |||
* 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. | |||
* @param project the project object | |||
* @param keys the collection of property values to use | |||
* @return the string with the property references replaced with their | |||
* project values | |||
*/ | |||
public static String replaceProperties(Project project, String value, | |||
Hashtable keys) { | |||
try { | |||
AntContext context = project.getContext(); | |||
DataService dataService | |||
= (DataService) context.getCoreService(DataService.class); | |||
return dataService.replacePropertyRefs(value, keys); | |||
} catch (AntException e) { | |||
throw new BuildException(e); | |||
} | |||
} | |||
/** | |||
* Old method to build a project. | |||
* | |||
* @param project The project to configure. Must not be <code>null</code>. | |||
* @param buildFile An XML file giving the project's configuration. | |||
* Must not be <code>null</code>. | |||
* | |||
* @exception BuildException always | |||
* @deprecated | |||
*/ | |||
public static void configureProject(Project project, File buildFile) | |||
throws BuildException { | |||
project.configure(buildFile); | |||
} | |||
} | |||
@@ -1,191 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2000-2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.tools.ant; | |||
import org.xml.sax.AttributeList; | |||
/** | |||
* Implementation shell of the corresponding Ant1 class | |||
* | |||
* @author Conor MacNeill | |||
* @created 26 June 2002 | |||
*/ | |||
public class RuntimeConfigurable { | |||
/** | |||
* Sole constructor creating a wrapper for the specified object. | |||
* | |||
* @param proxy The element to configure. Must not be <code>null</code>. | |||
* @param elementTag The tag name generating this element. Should not be | |||
* <code>null</code>. | |||
*/ | |||
public RuntimeConfigurable(Object proxy, String elementTag) { | |||
} | |||
/** | |||
* Sets the element to configure. This is used when the real type of an | |||
* element isn't known at the time of wrapper creation. | |||
* | |||
* @param proxy The element to configure. Must not be <code>null</code>. | |||
*/ | |||
void setProxy(Object proxy) { | |||
} | |||
/** | |||
* Sets the attributes for the wrapped element. | |||
* | |||
* @param attributes List of attributes defined in the XML for this | |||
* element. May be <code>null</code>. | |||
*/ | |||
public void setAttributes(AttributeList attributes) { | |||
} | |||
/** | |||
* Returns the list of attributes for the wrapped element. | |||
* | |||
* @return An AttributeList representing the attributes defined in the XML | |||
* for this element. May be <code>null</code>. | |||
*/ | |||
public AttributeList getAttributes() { | |||
return null; | |||
} | |||
/** | |||
* Adds a child element to the wrapped element. | |||
* | |||
* @param child The child element wrapper to add to this one. Must not be | |||
* <code>null</code>. | |||
*/ | |||
public void addChild(RuntimeConfigurable child) { | |||
} | |||
/** | |||
* Returns the child wrapper at the specified position within the list. | |||
* | |||
* @param index The index of the child to return. | |||
* @return The child wrapper at position <code>index</code> within the | |||
* list. | |||
*/ | |||
RuntimeConfigurable getChild(int index) { | |||
return null; | |||
} | |||
/** | |||
* Adds characters from #PCDATA areas to the wrapped element. | |||
* | |||
* @param data Text to add to the wrapped element. Should not | |||
* be <code>null</code>. | |||
*/ | |||
public void addText(String data) { | |||
} | |||
/** | |||
* Adds characters from #PCDATA areas to the wrapped element. | |||
* | |||
* @param buf A character array of the text within the element. Must not | |||
* be <code>null</code>. | |||
* @param start The start element in the array. | |||
* @param count The number of characters to read from the array. | |||
*/ | |||
public void addText(char[] buf, int start, int count) { | |||
} | |||
/** | |||
* Returns the tag name of the wrapped element. | |||
* | |||
* @return The tag name of the wrapped element. This is unlikely to be | |||
* <code>null</code>, but may be. | |||
*/ | |||
public String getElementTag() { | |||
return null; | |||
} | |||
/** | |||
* Configures the wrapped element and all its children. The attributes and | |||
* text for the wrapped element are configured, and then each child is | |||
* configured and added. Each time the wrapper is configured, the | |||
* attributes and text for it are reset. If the element has an | |||
* <code>id</code> attribute, a reference is added to the project as well. | |||
* | |||
* @param p The project containing the wrapped element. Must not be | |||
* <code>null</code>. | |||
* @exception BuildException if the configuration fails, for instance due | |||
* to invalid attributes or children, or text being added to an | |||
* element which doesn't accept it. | |||
*/ | |||
public void maybeConfigure(Project p) throws BuildException { | |||
maybeConfigure(p, true); | |||
} | |||
/** | |||
* Configures the wrapped element. The attributes and text for the wrapped | |||
* element are configured. Each time the wrapper is configured, the | |||
* attributes and text for it are reset. If the element has an | |||
* <code>id</code> attribute, a reference is added to the project as well. | |||
* | |||
* @param p The project containing the wrapped element. Must not be | |||
* <code>null</code>. | |||
* @param configureChildren Whether to configure child elements as well. | |||
* if true, child elements will be configured after the wrapped | |||
* element. | |||
* @exception BuildException if the configuration fails, for instance due | |||
* to invalid attributes or children, or text being added to an | |||
* element which doesn't accept it. | |||
*/ | |||
public void maybeConfigure(Project p, boolean configureChildren) | |||
throws BuildException { | |||
} | |||
} | |||
@@ -1,106 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.tools.ant; | |||
/** | |||
* Ant1 Target facade. | |||
* | |||
* @author Conor MacNeill | |||
* @created 31 January 2002 | |||
*/ | |||
public class Target { | |||
/** The project to which this target belongs */ | |||
private Project project; | |||
/** The name of this target */ | |||
private String name; | |||
/** | |||
* Construct a Target that is part of the project | |||
* | |||
* @param project the target's project | |||
*/ | |||
public Target(Project project) { | |||
this.project = project; | |||
} | |||
/** | |||
* set the name of the target | |||
* | |||
* @param name the new name value | |||
*/ | |||
public void setName(String name) { | |||
this.name = name; | |||
} | |||
/** | |||
* get the project to which this target belongs | |||
* | |||
* @return the target's project. | |||
*/ | |||
public Project getProject() { | |||
return project; | |||
} | |||
/** | |||
* Gets the name of the Target | |||
* | |||
* @return the target's name | |||
*/ | |||
public String getName() { | |||
return name; | |||
} | |||
} | |||
@@ -1,322 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.tools.ant; | |||
import org.apache.ant.common.antlib.AntContext; | |||
import org.apache.ant.common.service.ExecService; | |||
import org.apache.ant.common.util.AntException; | |||
/** | |||
* Ant1 Task facade | |||
* | |||
* @author Conor MacNeill | |||
* @created 31 January 2002 | |||
*/ | |||
public abstract class Task extends ProjectComponent | |||
implements org.apache.ant.common.antlib.Task { | |||
/** the name of this task */ | |||
protected String taskName; | |||
/** The target with which this target is associated */ | |||
protected Target target = null; | |||
/** The type of this target */ | |||
protected String taskType = null; | |||
/** The description of this task */ | |||
protected String description = null; | |||
/** The location within the build file of this project component */ | |||
protected Location location; | |||
/** | |||
* Called by the project to let the task do its work. This method may be | |||
* called more than once, if the task is invoked more than once. | |||
* For example, | |||
* if target1 and target2 both depend on target3, then running | |||
* "ant target1 target2" will run all tasks in target3 twice. | |||
* | |||
* @exception BuildException if something goes wrong with the build | |||
*/ | |||
public void execute() throws BuildException {} | |||
/** | |||
* Set the name to use in logging messages. | |||
* | |||
* @param name the name to use in logging messages. | |||
*/ | |||
public void setTaskName(String name) { | |||
this.taskName = name; | |||
} | |||
/** | |||
* Sets the target object of this task. | |||
* | |||
* @param target Target in whose scope this task belongs. | |||
*/ | |||
public void setOwningTarget(Target target) { | |||
this.target = target; | |||
} | |||
/** | |||
* Has this task been marked invalid? | |||
* | |||
* @since Ant 1.5 | |||
*/ | |||
protected final boolean isInvalid() { | |||
return false; | |||
} | |||
public void maybeConfigure() throws BuildException { | |||
// XXX | |||
throw new BuildException("Not supported"); | |||
} | |||
/** | |||
* Returns the wrapper used for runtime configuration. | |||
* | |||
* @return the wrapper used for runtime configuration. This | |||
* method will generate a new wrapper (and cache it) | |||
* if one isn't set already. | |||
*/ | |||
public RuntimeConfigurable getRuntimeConfigurableWrapper() { | |||
// XXX | |||
throw new BuildException("Not supported"); | |||
} | |||
/** | |||
* Sets a description of the current action. It will be usefull in | |||
* commenting what we are doing. | |||
* | |||
* @param desc the new description value | |||
*/ | |||
public void setDescription(String desc) { | |||
description = desc; | |||
} | |||
/** | |||
* Get the name to use in logging messages. | |||
* | |||
* @return the name to use in logging messages. | |||
*/ | |||
public String getTaskName() { | |||
return taskName; | |||
} | |||
/** | |||
* Get the Target to which this task belongs | |||
* | |||
* @return the task's target. | |||
*/ | |||
public Target getOwningTarget() { | |||
return target; | |||
} | |||
/** | |||
* Gets the description of the Task | |||
* | |||
* @return the task's description | |||
*/ | |||
public String getDescription() { | |||
return description; | |||
} | |||
/** | |||
* Gets the location of the ProjectComponent's associated model element | |||
* in the build file | |||
* | |||
* @return the location of the associated model element | |||
*/ | |||
public Location getLocation() { | |||
return location; | |||
} | |||
/** | |||
* Add a nested task to this Ant1 task. | |||
* | |||
* @param task The task to be added | |||
* @exception AntException if the task cannot be added. | |||
*/ | |||
public void addNestedTask(org.apache.ant.common.antlib.Task task) | |||
throws AntException { | |||
if (!(this instanceof TaskContainer)) { | |||
throw new BuildException("Can't add tasks to this task"); | |||
} | |||
// wrap the Ant2 task in a TaskAdapter | |||
TaskContainer container = (TaskContainer) this; | |||
if (task instanceof Task) { | |||
container.addTask((Task) task); | |||
} else { | |||
TaskAdapter adapter = new TaskAdapter(); | |||
adapter.setProxy(task); | |||
adapter.setProject(getProject()); | |||
adapter.init(task.getAntContext(), task.getComponentType()); | |||
container.addTask(adapter); | |||
} | |||
} | |||
/** | |||
* Initialise this component | |||
* | |||
* @param context the core context for this component | |||
* @param componentType the component type of this component | |||
* @exception AntException if the component cannot be initialized | |||
*/ | |||
public void init(AntContext context, String componentType) | |||
throws AntException { | |||
super.init(context, componentType); | |||
taskType = componentType; | |||
taskName = componentType; | |||
org.apache.ant.common.util.Location contextLocation | |||
= context.getLocation(); | |||
if (contextLocation | |||
== org.apache.ant.common.util.Location.UNKNOWN_LOCATION) { | |||
location = Location.UNKNOWN_LOCATION; | |||
} else { | |||
location = new Location(contextLocation.getSource(), | |||
contextLocation.getLineNumber(), | |||
contextLocation.getColumnNumber()); | |||
} | |||
init(); | |||
} | |||
/** Initialise this task */ | |||
public void init() { | |||
} | |||
/** Validate this component */ | |||
public void validateComponent() { | |||
// no default validation for Ant1 tasks | |||
} | |||
/** Execute this task sending the appropriate build events */ | |||
public final void perform() { | |||
try { | |||
AntContext context = getAntContext(); | |||
ExecService execService | |||
= (ExecService) context.getCoreService(ExecService.class); | |||
execService.executeTask(this); | |||
} catch (AntException e) { | |||
throw new BuildException(e); | |||
} | |||
} | |||
/** | |||
* Handle Output produced by the task. When a task prints to System.out | |||
* the container may catch this and redirect the content back to the | |||
* task by invoking this method. This method must NOT call System.out, | |||
* directly or indirectly. | |||
* | |||
* @param line The line of content produce by the task | |||
*/ | |||
public void handleSystemOut(String line) { | |||
handleOutput(line); | |||
} | |||
/** | |||
* Handle error information produced by the task. When a task prints to | |||
* System.err the container may catch this and redirect the content back | |||
* to the task by invoking this method. This method must NOT call | |||
* System.err, directly or indirectly. | |||
* | |||
* @param line The line of error info produce by the task | |||
*/ | |||
public void handleSystemErr(String line) { | |||
// default behaviout is to log at WARN level | |||
handleErrorOutput(line); | |||
} | |||
/** | |||
* Handle output captured for this task | |||
* | |||
* @param line the captured output | |||
*/ | |||
protected void handleOutput(String line) { | |||
log(line, Project.MSG_INFO); | |||
} | |||
/** | |||
* Handle error output captured for this task | |||
* | |||
* @param line the captured error output | |||
*/ | |||
protected void handleErrorOutput(String line) { | |||
log(line, Project.MSG_ERR); | |||
} | |||
/** | |||
* Set the name with which the task has been invoked. | |||
* | |||
* @param type the name the task has been invoked as. | |||
*/ | |||
void setTaskType(String type) { | |||
this.taskType = type; | |||
} | |||
/** | |||
* Sets the file location where this task was defined. | |||
* | |||
* @param location the new location value | |||
*/ | |||
public void setLocation(Location location) { | |||
this.location = location; | |||
} | |||
} | |||
@@ -1,71 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.tools.ant; | |||
/** | |||
* TaskContainer facade | |||
* | |||
* @author Conor MacNeill | |||
* @created 31 January 2002 | |||
*/ | |||
public interface TaskContainer | |||
extends org.apache.ant.common.antlib.TaskContainer { | |||
/** | |||
* Add a task to this container | |||
* | |||
* @param task the task to be added | |||
*/ | |||
void addTask(Task task); | |||
} | |||
@@ -1,71 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.tools.ant.input; | |||
/** | |||
* Encapsulates an input request. | |||
* | |||
* @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
* @version $Revision$ | |||
* @since Ant 1.5 | |||
*/ | |||
public class InputRequest extends org.apache.ant.common.input.InputRequest { | |||
/** | |||
* @param prompt The prompt to show to the user. Must not be null. | |||
*/ | |||
public InputRequest(String prompt) { | |||
super(prompt); | |||
} | |||
} |
@@ -1,215 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.tools.ant.taskdefs; | |||
import java.io.File; | |||
import java.util.ArrayList; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import org.apache.ant.antlib.system.AntBase; | |||
import org.apache.ant.common.antlib.AntContext; | |||
import org.apache.ant.common.antlib.AntLibFactory; | |||
import org.apache.ant.common.service.ComponentService; | |||
import org.apache.ant.common.util.AntException; | |||
import org.apache.tools.ant.BuildException; | |||
import org.apache.tools.ant.Task; | |||
/** | |||
* Ant facade over system version of Ant | |||
* | |||
* @author Conor MacNeill | |||
* @created 31 January 2002 | |||
*/ | |||
public class Ant extends Task { | |||
/** The core Ant implementation to actually use */ | |||
private org.apache.ant.antlib.system.Ant realAnt = null; | |||
/** The properties created by this task */ | |||
private List properties = new ArrayList(); | |||
/** | |||
* If true, inherit all properties from parent Project If false, inherit | |||
* only userProperties and those defined inside the ant call itself | |||
* | |||
* @param value true if the sub-build should receive all properties from | |||
* this build | |||
*/ | |||
public void setInheritAll(boolean value) { | |||
realAnt.setInheritAll(value); | |||
} | |||
/** | |||
* If true, inherit all references from parent Project If false, inherit | |||
* only those defined inside the ant call itself | |||
* | |||
* @param value true if the subbuild should receive all references from | |||
* the current build. | |||
*/ | |||
public void setInheritRefs(boolean value) { | |||
realAnt.setInheritRefs(value); | |||
} | |||
/** | |||
* The directory which will be the base directory for the build | |||
* | |||
* @param d the base directory for the new build | |||
*/ | |||
public void setDir(File d) { | |||
realAnt.setDir(d); | |||
} | |||
/** | |||
* set the build file, it can be either absolute or relative. If it is | |||
* absolute, <tt>dir</tt> will be ignored, if it is relative it will be | |||
* resolved relative to <tt>dir</tt> . | |||
* | |||
* @param s the name of the ant file either absolute or relative to the | |||
* sub-build's basedir | |||
*/ | |||
public void setAntfile(String s) { | |||
realAnt.setAntFile(s); | |||
} | |||
/** | |||
* set the target to execute. If none is defined it will execute the | |||
* default target of the build file | |||
* | |||
* @param s the target to eb executed in the sub-build | |||
*/ | |||
public void setTarget(String s) { | |||
realAnt.setTarget(s); | |||
} | |||
/** | |||
* Set the output file in which Ant stores output | |||
* | |||
* @param s name of the file to store output. | |||
*/ | |||
public void setOutput(String s) { | |||
// realAnt.setOutput(s); | |||
} | |||
/** Initialize the task */ | |||
public void init() { | |||
AntContext context = getAntContext(); | |||
try { | |||
ComponentService componentService = getComponentService(); | |||
AntLibFactory factory = getProject().getFactory(); | |||
realAnt = (org.apache.ant.antlib.system.Ant) | |||
componentService.createComponent("ant.system", "ant"); | |||
} catch (AntException e) { | |||
throw new BuildException(e); | |||
} | |||
} | |||
/** | |||
* Do the execution. | |||
* | |||
* @exception BuildException if the execution of the sub-build has a | |||
* problem | |||
*/ | |||
public void execute() throws BuildException { | |||
for (Iterator i = properties.iterator(); i.hasNext();) { | |||
Property property = (Property) i.next(); | |||
AntBase.Property newProperty = new AntBase.Property(); | |||
newProperty.setName(property.getName()); | |||
newProperty.setValue(property.getValue()); | |||
realAnt.addProperty(newProperty); | |||
} | |||
try { | |||
realAnt.execute(); | |||
} catch (AntException e) { | |||
throw new BuildException(e); | |||
} | |||
} | |||
/** | |||
* Create a nested property element. | |||
* | |||
* @return the Property object to be configured. | |||
*/ | |||
public Property createProperty() { | |||
Property property = new Property(); | |||
properties.add(property); | |||
return property; | |||
} | |||
/** | |||
* create a reference element that identifies a data type that should be | |||
* carried over to the new project. | |||
* | |||
* @param r the reference to be added to the call | |||
*/ | |||
public void addReference(AntBase.Reference r) { | |||
try { | |||
realAnt.addReference(r); | |||
} catch (AntException e) { | |||
throw new BuildException(e); | |||
} | |||
} | |||
/** | |||
* Gets the componentService | |||
* | |||
* @return the componentService instance provided by the core | |||
* @exception AntException if the service is not available. | |||
*/ | |||
private ComponentService getComponentService() throws AntException { | |||
AntContext context = getAntContext(); | |||
return (ComponentService) | |||
context.getCoreService(ComponentService.class); | |||
} | |||
} | |||
@@ -1,165 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.tools.ant.taskdefs; | |||
import java.util.ArrayList; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import org.apache.ant.antlib.system.AntBase; | |||
import org.apache.ant.antlib.system.AntCall; | |||
import org.apache.ant.common.antlib.AntContext; | |||
import org.apache.ant.common.antlib.AntLibFactory; | |||
import org.apache.ant.common.service.ComponentService; | |||
import org.apache.ant.common.util.AntException; | |||
import org.apache.tools.ant.BuildException; | |||
import org.apache.tools.ant.Task; | |||
/** | |||
* CallTarget facade over AntCall | |||
* | |||
* @author Conor MacNeill | |||
* @created 31 January 2002 | |||
*/ | |||
public class CallTarget extends Task { | |||
/** The core AntCall implementation to actually use */ | |||
private AntCall antCall = null; | |||
/** The properties created by this task */ | |||
private List properties = new ArrayList(); | |||
/** | |||
* If true, inherit all properties from parent Project If false, inherit | |||
* only userProperties and those defined inside the antcall call itself | |||
* | |||
* @param inherit the new inheritAll value | |||
*/ | |||
public void setInheritAll(boolean inherit) { | |||
antCall.setInheritAll(inherit); | |||
} | |||
/** | |||
* Sets the target of the CallTarget | |||
* | |||
* @param target the new target value | |||
*/ | |||
public void setTarget(String target) { | |||
antCall.setTarget(target); | |||
} | |||
/** Initialize the task */ | |||
public void init() { | |||
AntContext context = getAntContext(); | |||
try { | |||
ComponentService componentService = getComponentService(); | |||
AntLibFactory factory = getProject().getFactory(); | |||
antCall = (AntCall) componentService.createComponent("ant.system", | |||
"antcall"); | |||
} catch (AntException e) { | |||
throw new BuildException(e); | |||
} | |||
} | |||
/** execute the call */ | |||
public void execute() { | |||
for (Iterator i = properties.iterator(); i.hasNext();) { | |||
Property property = (Property) i.next(); | |||
AntBase.Property newProperty = new AntBase.Property(); | |||
newProperty.setName(property.getName()); | |||
newProperty.setValue(property.getValue()); | |||
antCall.addProperty(newProperty); | |||
} | |||
try { | |||
antCall.execute(); | |||
} catch (AntException e) { | |||
throw new BuildException(e); | |||
} | |||
} | |||
/** | |||
* Create a nested param element. | |||
* | |||
* @return the Property object to be configured. | |||
*/ | |||
public Property createParam() { | |||
Property property = new Property(); | |||
properties.add(property); | |||
return property; | |||
} | |||
/** | |||
* create a reference element that identifies a data type that should be | |||
* carried over to the new project. | |||
* | |||
* @param r the reference to be added to the call | |||
*/ | |||
public void addReference(AntBase.Reference r) { | |||
try { | |||
antCall.addReference(r); | |||
} catch (AntException e) { | |||
throw new BuildException(e); | |||
} | |||
} | |||
/** | |||
* Gets the componentService | |||
* | |||
* @return the componentService instance provided by the core | |||
* @exception AntException if the service is not available. | |||
*/ | |||
private ComponentService getComponentService() throws AntException { | |||
AntContext context = getAntContext(); | |||
return | |||
(ComponentService) context.getCoreService(ComponentService.class); | |||
} | |||
} | |||
@@ -1,240 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.tools.ant.types; | |||
import java.util.Stack; | |||
import org.apache.tools.ant.BuildException; | |||
import org.apache.tools.ant.Project; | |||
import org.apache.tools.ant.ProjectComponent; | |||
/** | |||
* Ant1 DataType facade | |||
* | |||
* @author Conor MacNeill | |||
* @created 31 January 2002 | |||
*/ | |||
public abstract class DataType extends ProjectComponent | |||
implements org.apache.ant.common.antlib.DataType { | |||
/** The description the user has set. */ | |||
protected String description = null; | |||
/** Value to the refid attribute. */ | |||
protected Reference ref = null; | |||
/** | |||
* Are we sure we don't hold circular references? <p> | |||
* | |||
* Subclasses are responsible for setting this value to false if we'd | |||
* need to investigate this condition (usually because a child element | |||
* has been added that is a subclass of DataType).</p> | |||
*/ | |||
protected boolean checked = true; | |||
/** | |||
* Sets a description of the current data type. It will be useful in | |||
* commenting what we are doing. | |||
* | |||
* @param desc the new description value | |||
*/ | |||
public void setDescription(String desc) { | |||
description = desc; | |||
} | |||
/** | |||
* Set the value of the refid attribute. <p> | |||
* | |||
* Subclasses may need to check whether any other attributes have been | |||
* set as well or child elements have been created and thus override | |||
* this method. if they do the must call <code>super.setRefid</code>. | |||
* </p> | |||
* | |||
* @param ref the new refid value | |||
*/ | |||
public void setRefid(Reference ref) { | |||
this.ref = ref; | |||
checked = false; | |||
} | |||
/** | |||
* Sets the id of the DataType | |||
* | |||
* @param id the name under which the data type is to be referenced | |||
*/ | |||
public void setId(String id) { | |||
project.addReference(id, this); | |||
} | |||
/** | |||
* Return the description for the current data type. | |||
* | |||
* @return the data type's description | |||
*/ | |||
public String getDescription() { | |||
return description; | |||
} | |||
/** | |||
* Has the refid attribute of this element been set? | |||
* | |||
* @return true if this data type is a refeence to another instance | |||
*/ | |||
public boolean isReference() { | |||
return ref != null; | |||
} | |||
/** Validate this component */ | |||
public void validateComponent() { | |||
// no default validation for Ant1 types | |||
} | |||
/** | |||
* Performs the check for circular references and returns the referenced | |||
* object. | |||
* | |||
* @param requiredClass the class which the object being referenced must | |||
* support | |||
* @param dataTypeName the name of the data type | |||
* @return the refenced object | |||
*/ | |||
protected Object getCheckedRef(Class requiredClass, String dataTypeName) { | |||
if (!checked) { | |||
Stack stk = new Stack(); | |||
stk.push(this); | |||
dieOnCircularReference(stk, getProject()); | |||
} | |||
Object o = ref.getReferencedObject(getProject()); | |||
if (!(requiredClass.isAssignableFrom(o.getClass()))) { | |||
String msg = ref.getRefId() + " doesn\'t denote a " + dataTypeName; | |||
throw new BuildException(msg); | |||
} else { | |||
return o; | |||
} | |||
} | |||
/** | |||
* Check to see whether any DataType we hold references to is included | |||
* in the Stack (which holds all DataType instances that directly or | |||
* indirectly reference this instance, including this instance itself). | |||
* <p> | |||
* | |||
* If one is included, throw a BuildException created by {@link | |||
* #circularReference circularReference}.</p> <p> | |||
* | |||
* This implementation is appropriate only for a DataType that cannot | |||
* hold other DataTypes as children.</p> <p> | |||
* | |||
* The general contract of this method is that it shouldn't do anything | |||
* if {@link #checked <code>checked</code>} is true and set it to true | |||
* on exit.</p> | |||
* | |||
* @param stk stack used to check for a circular reference | |||
* @param p the project | |||
* @exception BuildException if this data type is a reference to an | |||
* instance which depends on this data type | |||
*/ | |||
protected void dieOnCircularReference(Stack stk, Project p) | |||
throws BuildException { | |||
if (checked || !isReference()) { | |||
return; | |||
} | |||
Object o = ref.getReferencedObject(p); | |||
if (o instanceof DataType) { | |||
if (stk.contains(o)) { | |||
throw circularReference(); | |||
} else { | |||
stk.push(o); | |||
((DataType) o).dieOnCircularReference(stk, p); | |||
stk.pop(); | |||
} | |||
} | |||
checked = true; | |||
} | |||
/** | |||
* Creates an exception that indicates that refid has to be the only | |||
* attribute if it is set. | |||
* | |||
* @return an appropriate excpetion instance | |||
*/ | |||
protected BuildException tooManyAttributes() { | |||
return new BuildException("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. | |||
* | |||
* @return an appropriate excpetion instance | |||
*/ | |||
protected BuildException noChildrenAllowed() { | |||
return new BuildException("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. | |||
* | |||
* @return an appropriate excpetion instance | |||
*/ | |||
protected BuildException circularReference() { | |||
return new BuildException("This data type contains a " | |||
+ "circular reference."); | |||
} | |||
} | |||
@@ -1,4 +0,0 @@ | |||
<antlib libid="antopt.monitor" | |||
home="http://jakarta.apache.org/ant"> | |||
<aspect classname="org.apache.ant.antlib.monitor.MonitorAspect"/> | |||
</antlib> |
@@ -1,135 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antlib.monitor; | |||
import org.apache.ant.common.antlib.AbstractAspect; | |||
import org.apache.ant.common.antlib.Task; | |||
import org.apache.ant.common.antlib.AntContext; | |||
import org.apache.ant.common.model.BuildElement; | |||
import org.apache.ant.common.model.NamespaceValueCollection; | |||
import org.apache.ant.common.util.AntException; | |||
import org.apache.ant.common.event.MessageLevel; | |||
import java.util.Date; | |||
import java.io.PrintStream; | |||
import java.io.FileOutputStream; | |||
import java.io.IOException; | |||
/** | |||
* A monitoring aspect to help understand memory and performance | |||
* characteristics. | |||
* | |||
* @author Conor MacNeill | |||
*/ | |||
public class MonitorAspect extends AbstractAspect { | |||
/** The log into which monitoring info is written */ | |||
private static PrintStream monitorLog; | |||
/** | |||
* Create a monitoring aspect instance. There will be one instance per | |||
* active frame but they all share the same log output. | |||
*/ | |||
public MonitorAspect() { | |||
synchronized (MonitorAspect.class) { | |||
if (monitorLog == null) { | |||
try { | |||
monitorLog | |||
= new PrintStream(new FileOutputStream("monitor.log")); | |||
monitorLog.println("Logging started at " + new Date()); | |||
} catch (IOException e) { | |||
log("Unable to open monitor log", MessageLevel.WARNING); | |||
} | |||
} | |||
} | |||
} | |||
/** | |||
* This join point is activated just prior to task execution. | |||
* | |||
* @param task the task being executed. | |||
* @param namespaceValues a collection of namesapce attribute values for use | |||
* during the task execution - may be null if no namespace values are | |||
* provided. | |||
* @return an object which indicates that this aspect wishes to | |||
* be notified after execution has been completed, in which case the obkect | |||
* is returned to provide the aspect its context. If this returns null | |||
* the aspect's postExecuteTask method will not be invoked. | |||
* @exception AntException if the aspect cannot process the task. | |||
*/ | |||
public Object preExecuteTask(Task task, | |||
NamespaceValueCollection namespaceValues) | |||
throws AntException { | |||
System.gc(); | |||
AntContext taskContext = task.getAntContext(); | |||
BuildElement model = taskContext.getModel(); | |||
String name = (model == null) ? task.getClass().getName() | |||
: model.getType(); | |||
return new MonitorRecord(name, taskContext.getLocation()); | |||
} | |||
/** | |||
* This join point is activated after a task has executed. The aspect | |||
* may override the task's failure cause by returning a new failure. | |||
* | |||
* @param context the context the aspect provided in preExecuteTask. | |||
* @param failureCause the current failure reason for the task. | |||
* | |||
* @return a new failure reason or null if the task is not to fail. | |||
*/ | |||
public Throwable postExecuteTask(Object context, Throwable failureCause) { | |||
MonitorRecord record = (MonitorRecord) context; | |||
System.gc(); | |||
record.print(monitorLog); | |||
return failureCause; | |||
} | |||
} |
@@ -1,112 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antlib.monitor; | |||
import org.apache.ant.common.util.Location; | |||
import java.io.PrintStream; | |||
/** | |||
* A record of some performance values at a particular time | |||
* | |||
* @author Conor MacNeill | |||
*/ | |||
public class MonitorRecord { | |||
/** The element name being monitored */ | |||
private String elementName; | |||
/** The location in the build file */ | |||
private Location location; | |||
/** System clock when task started */ | |||
private long startMillis; | |||
/** Starting memory when task started */ | |||
private long startMemory; | |||
/** | |||
* Get the current used memory from the runtime | |||
* | |||
* @return the amount of memory in use. | |||
*/ | |||
private long getMemoryUsage() { | |||
Runtime rt = Runtime.getRuntime(); | |||
return rt.totalMemory() - rt.freeMemory(); | |||
} | |||
/** | |||
* Create a monitoring record. | |||
* | |||
* @param elementName the name of the element. | |||
* @param location the build file location of the element. | |||
*/ | |||
public MonitorRecord(String elementName, Location location) { | |||
this.elementName = elementName; | |||
this.location = location; | |||
startMillis = System.currentTimeMillis(); | |||
startMemory = getMemoryUsage(); | |||
} | |||
/** | |||
* Print a summary of the monitor | |||
* | |||
* @param stream the stream onto which the summary is printed. | |||
*/ | |||
public void print(PrintStream stream) { | |||
long timeDiff = System.currentTimeMillis() - startMillis; | |||
long memDiff = getMemoryUsage() - startMemory; | |||
stream.println(location + elementName + " took " + timeDiff | |||
+ " milliseconds, memory used at start " + startMemory | |||
+ " which changed by " + memDiff); | |||
} | |||
} |
@@ -1,6 +0,0 @@ | |||
<antlib libid="antopt.script" | |||
home="http://jakarta.apache.org/ant"> | |||
<factory classname="org.apache.ant.antlib.script.ScriptFactory"/> | |||
<taskdef name="scriptdef" classname="org.apache.ant.antlib.script.ScriptDef"/> | |||
</antlib> |
@@ -1,191 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antlib.script; | |||
import com.ibm.bsf.BSFEngine; | |||
import com.ibm.bsf.BSFException; | |||
import com.ibm.bsf.BSFManager; | |||
import java.util.ArrayList; | |||
import java.util.HashMap; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Map; | |||
import org.apache.ant.common.antlib.AbstractTask; | |||
import org.apache.ant.common.antlib.DeferredTask; | |||
import org.apache.ant.common.antlib.AntContext; | |||
/** | |||
* Task to import a component or components from a library | |||
* | |||
* @author Conor MacNeill | |||
* @created 27 January 2002 | |||
*/ | |||
public class ScriptBase extends AbstractTask implements DeferredTask { | |||
/** The script factory instance to be used by this script */ | |||
private ScriptFactory factory; | |||
/** the name to which this script has been defined */ | |||
private String scriptName; | |||
/** the attribute values set by the core */ | |||
private Map attributes = new HashMap(); | |||
/** Any embedded set by the core */ | |||
private String text = ""; | |||
/** A list of the nested element names which have been configured */ | |||
private List nestedElementNames = new ArrayList(); | |||
/** A list of the nested elements objects which have been configured */ | |||
private List nestedElements = new ArrayList(); | |||
/** | |||
* Set the given attribute | |||
* | |||
* @param name the name of the attribute | |||
* @param attributeValue the new attribute value | |||
*/ | |||
public void setAttribute(String name, String attributeValue) { | |||
attributes.put(name, attributeValue); | |||
} | |||
/** | |||
* Add a nested element | |||
* | |||
* @param nestedElementName the nested element's name | |||
* @param value the object being added | |||
*/ | |||
public void addElement(String nestedElementName, Object value) { | |||
nestedElementNames.add(nestedElementName); | |||
nestedElements.add(value); | |||
} | |||
/** | |||
* Execute the script | |||
* | |||
* @exception ScriptException if tghe script execution fails | |||
*/ | |||
public void execute() throws ScriptException { | |||
String language = factory.getScriptLanguage(scriptName); | |||
String script = factory.getScript(scriptName); | |||
try { | |||
BSFManager manager = new BSFManager(); | |||
manager.declareBean("self", this, getClass()); | |||
manager.declareBean("context", getAntContext(), AntContext.class); | |||
// execute the script | |||
BSFEngine engine = manager.loadScriptingEngine(language); | |||
engine.exec(scriptName, 0, 0, script); | |||
for (Iterator i = attributes.keySet().iterator(); i.hasNext();) { | |||
String attributeName = (String) i.next(); | |||
String value = (String) attributes.get(attributeName); | |||
StringBuffer setter = new StringBuffer(attributeName); | |||
setter.setCharAt(0, Character.toUpperCase(setter.charAt(0))); | |||
engine.call(null, "set" + setter, new Object[]{value}); | |||
} | |||
Iterator i = nestedElementNames.iterator(); | |||
Iterator j = nestedElements.iterator(); | |||
while (i.hasNext()) { | |||
String nestedName = (String) i.next(); | |||
Object nestedElement = j.next(); | |||
StringBuffer adder = new StringBuffer(nestedName); | |||
adder.setCharAt(0, Character.toUpperCase(adder.charAt(0))); | |||
engine.call(null, "add" + adder, new Object[]{nestedElement}); | |||
} | |||
engine.call(null, "execute", new Object[]{}); | |||
} catch (BSFException e) { | |||
Throwable t = e; | |||
Throwable te = e.getTargetException(); | |||
if (te != null) { | |||
if (te instanceof ScriptException) { | |||
throw (ScriptException) te; | |||
} else { | |||
t = te; | |||
} | |||
} | |||
throw new ScriptException(t); | |||
} | |||
} | |||
/** | |||
* Defines the script. | |||
* | |||
* @param text Sets the value for the script variable. | |||
*/ | |||
public void addText(String text) { | |||
this.text += text; | |||
} | |||
/** | |||
* Sets the factory of the ScriptBase | |||
* | |||
* @param factory the script factory this script instance will use | |||
*/ | |||
protected void setFactory(ScriptFactory factory) { | |||
this.factory = factory; | |||
} | |||
/** | |||
* set the name of the script | |||
* | |||
* @param scriptName the script's defined name | |||
*/ | |||
protected void setScriptName(String scriptName) { | |||
this.scriptName = scriptName; | |||
} | |||
} | |||
@@ -1,128 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antlib.script; | |||
import org.apache.ant.common.antlib.AbstractTask; | |||
import org.apache.ant.common.util.AntException; | |||
/** | |||
* Define a task using a script | |||
* | |||
* @author Conor MacNeill | |||
* @created 11 February 2002 | |||
*/ | |||
public class ScriptDef extends AbstractTask { | |||
/** The script factor to use */ | |||
private ScriptFactory factory; | |||
/** the name by which this script will be activated */ | |||
private String name; | |||
/** the scripting language used by the script */ | |||
private String language; | |||
/** the script itself */ | |||
private String script = ""; | |||
/** | |||
* set the name under which this script will be activated in a build | |||
* file | |||
* | |||
* @param name the name of the script | |||
*/ | |||
public void setName(String name) { | |||
this.name = name; | |||
} | |||
/** | |||
* Set the scripting language used by this script | |||
* | |||
* @param language the scripting language used by this script. | |||
*/ | |||
public void setLanguage(String language) { | |||
this.language = language; | |||
} | |||
/** | |||
* Define the script. The script itself is stored in the factory where | |||
* it is retried by the ScriptBase instance | |||
* | |||
* @exception AntException if the script cannot be defined | |||
*/ | |||
public void execute() throws AntException { | |||
// tell the factory about this script, under this name. | |||
factory.defineScript(name, language, script); | |||
} | |||
/** | |||
* Defines the script. | |||
* | |||
* @param text Sets the value for the script variable. | |||
*/ | |||
public void addText(String text) { | |||
this.script += text; | |||
} | |||
/** | |||
* Set the script factory that will be used to store the script for | |||
* later execution | |||
* | |||
* @param factory the script factory used to store script information. | |||
*/ | |||
protected void setFactory(ScriptFactory factory) { | |||
this.factory = factory; | |||
} | |||
} | |||
@@ -1,129 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antlib.script; | |||
import org.apache.ant.common.util.Location; | |||
import org.apache.ant.common.util.AntException; | |||
/** | |||
* A Script related exception | |||
* | |||
* @author Conor MacNeill | |||
*/ | |||
public class ScriptException extends AntException { | |||
/** | |||
* Constructs an exception with the given descriptive message. | |||
* | |||
* @param msg Description of or information about the exception. | |||
*/ | |||
public ScriptException(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 ScriptException(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 ScriptException(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 ScriptException(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 ScriptException(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 ScriptException(Throwable cause, Location location) { | |||
super(cause, location); | |||
} | |||
} | |||
@@ -1,205 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antlib.script; | |||
import java.util.HashMap; | |||
import java.util.Map; | |||
import org.apache.ant.common.antlib.AntContext; | |||
import org.apache.ant.common.antlib.StandardLibFactory; | |||
import org.apache.ant.common.service.ComponentService; | |||
import org.apache.ant.common.util.AntException; | |||
/** | |||
* The ScriptFactory class is a factory for the Scripting tasks. It stores | |||
* the scripts as they are defined | |||
* | |||
* @author Conor MacNeill | |||
* @created 11 February 2002 | |||
*/ | |||
public class ScriptFactory extends StandardLibFactory { | |||
/** | |||
* An inner class used to record information about defined scripts. | |||
* | |||
* @author Conor MacNeill | |||
* @created 11 February 2002 | |||
*/ | |||
private static class ScriptInfo { | |||
/** the scripting langauge to use */ | |||
private String language; | |||
/** the script itself */ | |||
private String script; | |||
/** | |||
* Constructor for the ScriptInfo object | |||
* | |||
* @param language the language the script is written in | |||
* @param script the script | |||
*/ | |||
public ScriptInfo(String language, String script) { | |||
this.language = language; | |||
this.script = script; | |||
} | |||
/** | |||
* Gets the language of the Script | |||
* | |||
* @return the language value | |||
*/ | |||
public String getLanguage() { | |||
return language; | |||
} | |||
/** | |||
* Gets the script. | |||
* | |||
* @return the script text | |||
*/ | |||
public String getScript() { | |||
return script; | |||
} | |||
} | |||
/** The core's Component Service instance */ | |||
private ComponentService componentService; | |||
/** the scripts that have been defined */ | |||
private Map scripts = new HashMap(); | |||
/** | |||
* Initialise the factory | |||
* | |||
* @param context the factory's context | |||
* @exception AntException if the factory cannot be initialized | |||
*/ | |||
public void init(AntContext context) throws AntException { | |||
super.init(context); | |||
componentService = (ComponentService) | |||
context.getCoreService(ComponentService.class); | |||
try { | |||
Class.forName("com.ibm.bsf.BSFManager"); | |||
} catch (ClassNotFoundException e) { | |||
throw new ScriptException("The script Ant library requires " | |||
+ "bsf.jar to be available"); | |||
} catch (NoClassDefFoundError e) { | |||
throw new ScriptException("The script Ant library requires " | |||
+ "bsf.jar to be available. The class " + e.getMessage() | |||
+ "appears to be missing"); | |||
} | |||
} | |||
/** | |||
* Create an instance of the given component class | |||
* | |||
* @param componentClass the class for which an instance is required | |||
* @param localName the name within the library undeer which the task is | |||
* defined | |||
* @return an instance of the required class | |||
* @exception InstantiationException if the class cannot be instantiated | |||
* @exception IllegalAccessException if the instance cannot be accessed | |||
* @exception AntException if there is a problem creating the task | |||
*/ | |||
public Object createComponent(Class componentClass, String localName) | |||
throws InstantiationException, IllegalAccessException, AntException { | |||
Object component = super.createComponent(componentClass, localName); | |||
if (component instanceof ScriptDef) { | |||
ScriptDef scriptDef = (ScriptDef) component; | |||
scriptDef.setFactory(this); | |||
} else if (component instanceof ScriptBase) { | |||
ScriptBase scriptBase = (ScriptBase) component; | |||
scriptBase.setFactory(this); | |||
scriptBase.setScriptName(localName); | |||
} | |||
return component; | |||
} | |||
/** | |||
* Get the script language of a script | |||
* | |||
* @param scriptName the name the script is defined under | |||
* @return the script language name | |||
*/ | |||
protected String getScriptLanguage(String scriptName) { | |||
ScriptInfo scriptInfo = (ScriptInfo) scripts.get(scriptName); | |||
return scriptInfo.getLanguage(); | |||
} | |||
/** | |||
* Get a script. | |||
* | |||
* @param scriptName the name the script is defined under | |||
* @return the script text | |||
*/ | |||
protected String getScript(String scriptName) { | |||
ScriptInfo scriptInfo = (ScriptInfo) scripts.get(scriptName); | |||
return scriptInfo.getScript(); | |||
} | |||
/** | |||
* Define a script | |||
* | |||
* @param name the name the script is to be defined under | |||
* @param language the language of the scripr | |||
* @param script the script text | |||
* @exception AntException if the script cannot be defined | |||
*/ | |||
protected void defineScript(String name, String language, String script) | |||
throws AntException { | |||
ScriptInfo scriptDefinition = new ScriptInfo(language, script); | |||
scripts.put(name, scriptDefinition); | |||
componentService.taskdef(this, ScriptBase.class.getClassLoader(), | |||
name, ScriptBase.class.getName()); | |||
} | |||
} | |||
@@ -1,21 +0,0 @@ | |||
<antlib libid="ant.system" | |||
home="http://jakarta.apache.org/ant"> | |||
<taskdef name="libpath" classname="org.apache.ant.antlib.system.LibPath"/> | |||
<taskdef name="loadlib" classname="org.apache.ant.antlib.system.LoadLib"/> | |||
<taskdef name="import" classname="org.apache.ant.antlib.system.Import"/> | |||
<taskdef name="ant" classname="org.apache.ant.antlib.system.Ant"/> | |||
<taskdef name="antcall" classname="org.apache.ant.antlib.system.AntCall"/> | |||
<taskdef name="ref" classname="org.apache.ant.antlib.system.Ref"/> | |||
<taskdef name="parallel" classname="org.apache.ant.antlib.system.Parallel"/> | |||
<taskdef name="sequential" classname="org.apache.ant.antlib.system.Sequential"/> | |||
<converter classname="org.apache.ant.antlib.system.FileConverter"/> | |||
<converter classname="org.apache.ant.antlib.system.URLConverter"/> | |||
<converter classname="org.apache.ant.antlib.system.PrimitiveConverter"/> | |||
<aspect classname="org.apache.ant.antlib.system.AntAspect"/> | |||
</antlib> |
@@ -1,171 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antlib.system; | |||
import java.io.File; | |||
import java.io.PrintStream; | |||
import java.io.FileOutputStream; | |||
import java.io.IOException; | |||
import org.apache.ant.common.model.Project; | |||
import org.apache.ant.common.service.ExecService; | |||
import org.apache.ant.common.service.FileService; | |||
import org.apache.ant.common.service.MagicProperties; | |||
import org.apache.ant.common.util.AntException; | |||
import org.apache.ant.common.util.FileUtils; | |||
import org.apache.ant.common.logger.DefaultLogger; | |||
import org.apache.ant.common.event.MessageLevel; | |||
/** | |||
* The Ant task - used to execute a different build file | |||
* | |||
* @author Conor MacNeill | |||
* @created 4 February 2002 | |||
*/ | |||
public class Ant extends AntBase { | |||
/** The ant file to be run */ | |||
private String antFileName; | |||
/** the base directory to use for the run */ | |||
private File baseDir; | |||
/** File to capture any output */ | |||
private String output; | |||
/** | |||
* sets the file containing the XML representation model to build | |||
* | |||
* @param antFileName the file to build | |||
*/ | |||
public void setAntFile(String antFileName) { | |||
this.antFileName = antFileName; | |||
} | |||
/** | |||
* Set the base directory for the execution of the build | |||
* | |||
* @param baseDir the base directory for the build | |||
*/ | |||
public void setDir(File baseDir) { | |||
this.baseDir = baseDir; | |||
} | |||
/** | |||
* The output file for capturing the build output | |||
* | |||
* @param output the output file for capturing the build output | |||
*/ | |||
public void setOutput(String output) { | |||
this.output = output; | |||
} | |||
/** | |||
* Run the sub-build | |||
* | |||
* @exception AntException if the build can't be run | |||
*/ | |||
public void execute() throws AntException { | |||
if (baseDir == null) { | |||
baseDir = getExecService().getBaseDir(); | |||
} | |||
File antFile = null; | |||
if (antFileName == null) { | |||
antFile = new File(baseDir, "build.ant"); | |||
if (!antFile.exists()) { | |||
antFile = new File(baseDir, "build.xml"); | |||
} | |||
} else { | |||
antFile | |||
= FileUtils.newFileUtils().resolveFile(baseDir, antFileName); | |||
} | |||
setProperty(MagicProperties.BASEDIR, baseDir.getAbsolutePath()); | |||
ExecService execService = getExecService(); | |||
Project model = execService.parseXMLBuildFile(antFile); | |||
Object key = execService.setupBuild(model, getDataValues(), true); | |||
setSubBuildKey(key); | |||
if (output != null) { | |||
FileService fileService | |||
= (FileService) getCoreService(FileService.class); | |||
File outfile = null; | |||
if (baseDir != null) { | |||
outfile = FileUtils.newFileUtils().resolveFile(baseDir, output); | |||
} else { | |||
outfile = fileService.resolveFile(output); | |||
} | |||
try { | |||
PrintStream out | |||
= new PrintStream(new FileOutputStream(outfile)); | |||
DefaultLogger logger = new DefaultLogger(); | |||
logger.setMessageOutputLevel(MessageLevel.INFO); | |||
logger.setOutputPrintStream(out); | |||
logger.setErrorPrintStream(out); | |||
execService.addBuildListener(key, logger); | |||
} catch (IOException ex) { | |||
log("Ant: Can't set output to " + output, | |||
MessageLevel.INFO); | |||
} | |||
} | |||
execService.runBuild(key, getTargets()); | |||
setSubBuildKey(null); | |||
} | |||
} | |||
@@ -1,204 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antlib.system; | |||
import org.apache.ant.common.antlib.AbstractAspect; | |||
import org.apache.ant.common.antlib.AntContext; | |||
import org.apache.ant.common.antlib.Task; | |||
import org.apache.ant.common.antlib.AspectException; | |||
import org.apache.ant.common.service.DataService; | |||
import org.apache.ant.common.service.ComponentService; | |||
import org.apache.ant.common.util.AntException; | |||
import org.apache.ant.common.model.BuildElement; | |||
import org.apache.ant.common.model.NamespaceValueCollection; | |||
import org.apache.ant.common.util.AttributeCollection; | |||
import org.apache.ant.common.constants.Namespace; | |||
import org.apache.ant.common.util.DataValue; | |||
/** | |||
* The Ant aspect - handles all ant aspects | |||
* | |||
* @author Conor MacNeill | |||
*/ | |||
public class AntAspect extends AbstractAspect { | |||
/** The core's data service implementation */ | |||
private DataService dataService = null; | |||
/** The core's component service */ | |||
private ComponentService componentService = null; | |||
/** | |||
* Initialise the aspect with a context. | |||
* | |||
* @param context the aspect's context | |||
* @exception AntException if the aspect cannot be initialised | |||
*/ | |||
public void init(AntContext context) throws AntException { | |||
super.init(context); | |||
dataService = (DataService) context.getCoreService(DataService.class); | |||
componentService | |||
= (ComponentService) context.getCoreService(ComponentService.class); | |||
} | |||
/** | |||
* This join point is activated before a component has been created. | |||
* The aspect can return an object to be used rather than the core creating | |||
* the object. | |||
* | |||
* @param component the component that has been created. This will be null | |||
* unless another aspect has created the component | |||
* @param model the Build model that applies to the component | |||
* | |||
* @return a component to use. | |||
* @exception AntException if the aspect cannot process the component. | |||
*/ | |||
public Object preCreateComponent(Object component, BuildElement model) | |||
throws AntException { | |||
String refId | |||
= model.getNamespaceAttributeValue(Namespace.ANT_META_URI, "refid"); | |||
if (refId != null) { | |||
if (model.getAttributeNames().hasNext() || | |||
model.getNestedElements().hasNext() || | |||
model.getText().length() != 0) { | |||
throw new AspectException("Element <" + model.getType() | |||
+ "> is defined by reference and hence may not specify " | |||
+ "any attributes, nested elements or content", | |||
model.getLocation()); | |||
} | |||
Object referredComponent = dataService.getDataValue(refId); | |||
if (referredComponent == null) { | |||
throw new AspectException("The given ant:refid value '" | |||
+ refId + "' is not defined", model.getLocation()); | |||
} | |||
return referredComponent; | |||
} | |||
return component; | |||
} | |||
/** | |||
* This join point is activated after a component has been created and | |||
* configured. If the aspect wishes, an object can be returned in place | |||
* of the one created by Ant. | |||
* | |||
* @param component the component that has been created. | |||
* @param model the Build model used to create the component. | |||
* | |||
* @return a replacement for the component if desired. If null is returned | |||
* the current component is used. | |||
* @exception AntException if the component cannot be processed. | |||
*/ | |||
public Object postCreateComponent(Object component, BuildElement model) | |||
throws AntException { | |||
String typeId | |||
= model.getNamespaceAttributeValue(Namespace.ANT_META_URI, "id"); | |||
if (typeId != null) { | |||
dataService.setDataValue(typeId, | |||
new DataValue(component, DataValue.PRIORITY_BASE), true); | |||
} | |||
return super.postCreateComponent(component, model); | |||
} | |||
/** | |||
* This join point is activated just prior to task execution. | |||
* | |||
* @param task the task being executed. | |||
* @param namespaceValues a collection of namespace attribute values for use | |||
* during the task execution. | |||
* | |||
* @return an objectwhich indicates that this aspect wishes to | |||
* be notified after execution has been completed, in which case the obkect | |||
* is returned to provide the aspect its context. If this returns null | |||
* the aspect's postExecuteTask method will not be invoked. | |||
* @exception AntException if the aspect cannot process the task. | |||
*/ | |||
public Object preExecuteTask(Task task, | |||
NamespaceValueCollection namespaceValues) | |||
throws AntException { | |||
AntAspectContext aspectContext = new AntAspectContext(); | |||
AttributeCollection antAspectValues | |||
= namespaceValues.getAttributes(Namespace.ANT_META_URI); | |||
if (antAspectValues == null) { | |||
return null; | |||
} | |||
componentService.configureAttributes(aspectContext, antAspectValues, | |||
true); | |||
if (aspectContext.isRequired()) { | |||
return aspectContext; | |||
} | |||
return null; | |||
} | |||
/** | |||
* This join point is activated after a task has executed. The aspect | |||
* may override the task's failure cause by returning a new failure. | |||
* | |||
* @param context the context the aspect provided in preExecuteTask. | |||
* @param failureCause the current failure reason for the task. | |||
* | |||
* @return a new failure reason or null if the task is not to fail. | |||
*/ | |||
public Throwable postExecuteTask(Object context, Throwable failureCause) { | |||
AntAspectContext aspectContext = (AntAspectContext) context; | |||
if (!aspectContext.getFailOnError()) { | |||
return null; | |||
} | |||
return super.postExecuteTask(context, failureCause); | |||
} | |||
} | |||
@@ -1,94 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antlib.system; | |||
/** | |||
* The context for the Ant Aspect | |||
* | |||
* @author Conor MacNeill | |||
*/ | |||
public class AntAspectContext { | |||
/** Indicates if the task's execution should not fail */ | |||
private boolean failOnError = true; | |||
/** | |||
* Set the flag covering whether a task failure halts the build. | |||
* | |||
* @param failOnError false if the build should continue. | |||
*/ | |||
public void setFailOnError(boolean failOnError) { | |||
this.failOnError = failOnError; | |||
} | |||
/** | |||
* Indicate whether a task failure halts the build. | |||
* | |||
* @return true if a task error causes the build to fail. | |||
*/ | |||
public boolean getFailOnError() { | |||
return failOnError; | |||
} | |||
/** | |||
* Indicate if this aspect context is required - i.e. whether the | |||
* aspect needs to be reactivated after task execution | |||
* | |||
* @return true if the context should be used and the aspect reactivated | |||
* after task execution. | |||
*/ | |||
public boolean isRequired() { | |||
return failOnError != true; | |||
} | |||
} | |||
@@ -1,201 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antlib.system; | |||
import java.util.ArrayList; | |||
import java.util.HashMap; | |||
import java.util.List; | |||
import java.util.Map; | |||
import org.apache.ant.common.service.DataService; | |||
import org.apache.ant.common.util.AntException; | |||
import org.apache.ant.common.util.DataValue; | |||
/** | |||
* Common Base class for the Ant and AntCall tasks | |||
* | |||
* @author Conor MacNeill | |||
* @created 4 February 2002 | |||
*/ | |||
public abstract class AntBase extends SubBuild { | |||
/** | |||
* flag which indicates if all current properties should be passed to the | |||
* subbuild | |||
*/ | |||
private boolean inheritAll = true; | |||
/** | |||
* flag which indicates if all current references should be passed to the | |||
* subbuild | |||
*/ | |||
private boolean inheritRefs = false; | |||
/** | |||
* The key to the subbuild with which the Ant task can manage the subbuild | |||
*/ | |||
private Object subbuildKey; | |||
/** The name of the target to be evaluated in the sub-build */ | |||
private String targetName; | |||
/** | |||
* Get the properties to be used with the sub-build | |||
* | |||
* @return the properties the sub-build will start with | |||
* @exception AntException if the data values cannot be combined with | |||
* existing values. | |||
*/ | |||
protected Map getDataValues() throws AntException { | |||
DataService dataService = getDataService(); | |||
int priority = inheritAll ? DataValue.PRIORITY_BASE | |||
: DataValue.PRIORITY_INHERIT; | |||
Map values = new HashMap(super.getDataValues()); | |||
dataService.mergeDataValues(values, dataService.getAllDataValues(), | |||
priority); | |||
return values; | |||
} | |||
/** | |||
* Get the list of targets to be executed | |||
* | |||
* @return A List of string target names. | |||
*/ | |||
protected List getTargets() { | |||
List targets = new ArrayList(); | |||
if (targetName != null) { | |||
targets.add(targetName); | |||
} | |||
return targets; | |||
} | |||
/** | |||
* Handle error information produced by the task. When a task prints to | |||
* System.err the container may catch this and redirect the content back | |||
* to the task by invoking this method. This method must NOT call | |||
* System.err, directly or indirectly. | |||
* | |||
* @param line The line of error info produce by the task | |||
* @exception AntException if the output cannot be handled. | |||
*/ | |||
public void handleSystemErr(String line) throws AntException { | |||
if (subbuildKey == null) { | |||
super.handleSystemErr(line); | |||
} else { | |||
getExecService().handleBuildOutput(subbuildKey, line, true); | |||
} | |||
} | |||
/** | |||
* Handle Output produced by the task. When a task prints to System.out | |||
* the container may catch this and redirect the content back to the task | |||
* by invoking this method. This method must NOT call System.out, directly | |||
* or indirectly. | |||
* | |||
* @param line The line of content produce by the task | |||
* @exception AntException if the output cannot be handled. | |||
*/ | |||
public void handleSystemOut(String line) throws AntException { | |||
if (subbuildKey == null) { | |||
super.handleSystemOut(line); | |||
} else { | |||
getExecService().handleBuildOutput(subbuildKey, line, false); | |||
} | |||
} | |||
/** | |||
* Indicate if all properties should be passed | |||
* | |||
* @param inheritAll true if all properties should be passed | |||
*/ | |||
public void setInheritAll(boolean inheritAll) { | |||
this.inheritAll = inheritAll; | |||
} | |||
/** | |||
* Indicate if all references are to be passed to the subbuild | |||
* | |||
* @param inheritRefs true if the sub-build should be given all the | |||
* current references | |||
*/ | |||
public void setInheritRefs(boolean inheritRefs) { | |||
this.inheritRefs = inheritRefs; | |||
} | |||
/** | |||
* Set the key of the subbuild | |||
* | |||
* @param key the key returned by the Ant core for managing the subbuild | |||
*/ | |||
protected void setSubBuildKey(Object key) { | |||
this.subbuildKey = key; | |||
} | |||
/** | |||
* Sets the target to be executed in the subbuild | |||
* | |||
* @param targetName the name of the target to build | |||
*/ | |||
public void setTarget(String targetName) { | |||
this.targetName = targetName; | |||
} | |||
} | |||
@@ -1,90 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antlib.system; | |||
import org.apache.ant.common.util.AntException; | |||
import org.apache.ant.common.service.MagicProperties; | |||
/** | |||
* The Ant task - used to execute a different build file | |||
* | |||
* @author Conor MacNeill | |||
* @created 4 February 2002 | |||
*/ | |||
public class AntCall extends AntBase { | |||
/** | |||
* Execute the sub-build | |||
* | |||
* @exception AntException if the build fails | |||
*/ | |||
public void execute() throws AntException { | |||
setProperty(MagicProperties.BASEDIR, | |||
getExecService().getBaseDir().getAbsolutePath()); | |||
Object key = getExecService().setupBuild(getDataValues(), true); | |||
setSubBuildKey(key); | |||
getExecService().runBuild(key, getTargets()); | |||
setSubBuildKey(null); | |||
} | |||
/** | |||
* Alias to add a property to the sub-build | |||
* | |||
* @param param descriptor for the property to be passed | |||
*/ | |||
public void addParam(Property param) { | |||
super.addProperty(param); | |||
} | |||
} | |||
@@ -1,101 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antlib.system; | |||
import java.io.File; | |||
import org.apache.ant.common.antlib.AbstractConverter; | |||
import org.apache.ant.common.antlib.ConverterException; | |||
import org.apache.ant.common.util.AntException; | |||
import org.apache.ant.common.service.FileService; | |||
/** | |||
* A converter to convert to File objects, resolving against the | |||
* project's basedir | |||
* | |||
* @author Conor MacNeill | |||
* @created 21 January 2002 | |||
*/ | |||
public class FileConverter extends AbstractConverter { | |||
/** | |||
* Get the list of classes this converter is able to convert to. | |||
* | |||
* @return an array of Class objects representing the classes this | |||
* converter handles. | |||
*/ | |||
public Class[] getTypes() { | |||
return new Class[]{File.class}; | |||
} | |||
/** | |||
* Convert a string from the value given to an instance of the given | |||
* type. | |||
* | |||
* @param value The value to be converted | |||
* @param type the desired type of the converted object | |||
* @return the value of the converted object | |||
* @exception ConverterException if the conversion cannot be made | |||
*/ | |||
public Object convert(String value, Class type) throws ConverterException { | |||
try { | |||
FileService fileService | |||
= (FileService) getContext().getCoreService(FileService.class); | |||
return fileService.resolveFile(value); | |||
} catch (AntException e) { | |||
throw new ConverterException("Unable to resolve file: " | |||
+ value, e); | |||
} | |||
} | |||
} | |||
@@ -1,159 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antlib.system; | |||
import org.apache.ant.common.antlib.AbstractTask; | |||
import org.apache.ant.common.antlib.AntContext; | |||
import org.apache.ant.common.antlib.ValidationException; | |||
import org.apache.ant.common.service.ComponentService; | |||
import org.apache.ant.common.util.AntException; | |||
/** | |||
* Task to import a component or components from a library | |||
* | |||
* @author Conor MacNeill | |||
* @created 27 January 2002 | |||
*/ | |||
public class Import extends AbstractTask { | |||
/** The Ant LIbrary Id from which the component must be imported */ | |||
private String libraryId = null; | |||
/** The name of the component to be imported */ | |||
private String name = null; | |||
/** | |||
* A ref is used to import a task which has been declared in another | |||
* project | |||
*/ | |||
private String ref = null; | |||
/** The alias that is to be used for the name */ | |||
private String alias = null; | |||
/** | |||
* Sets the libraryId of the Import | |||
* | |||
* @param libraryId the new libraryId value | |||
*/ | |||
public void setLibraryId(String libraryId) { | |||
this.libraryId = libraryId; | |||
} | |||
/** | |||
* Sets the name of the Import | |||
* | |||
* @param name the new name value | |||
*/ | |||
public void setName(String name) { | |||
this.name = name; | |||
} | |||
/** | |||
* Set the reference name of a task defined in a referenced frame | |||
* | |||
* @param ref the new ref value | |||
*/ | |||
public void setRef(String ref) { | |||
this.ref = ref; | |||
} | |||
/** | |||
* Sets the alias of the Import | |||
* | |||
* @param alias the new alias value | |||
*/ | |||
public void setAlias(String alias) { | |||
this.alias = alias; | |||
} | |||
/** | |||
* Validate this task is properly configured | |||
* | |||
* @exception ValidationException if the task is not configured correctly | |||
*/ | |||
public void validateComponent() throws ValidationException { | |||
if (ref != null) { | |||
if (libraryId != null || name != null) { | |||
throw new ValidationException("The \"ref\" attribute can only " | |||
+ "be used when \"libraryId\" and \"name\" attributes are " | |||
+ "not present"); | |||
} | |||
} else { | |||
if (libraryId == null) { | |||
throw new ValidationException("You must specify a library " | |||
+ "identifier with the \"libraryid\" attribute"); | |||
} | |||
if (alias != null && name == null) { | |||
throw new ValidationException("You may only specify an alias" | |||
+ " when you specify the \"name\" or \"ref\" attributes"); | |||
} | |||
} | |||
} | |||
/** | |||
* Do the work and import the component or components | |||
* | |||
* @exception AntException if the components cannot be imported | |||
*/ | |||
public void execute() throws AntException { | |||
AntContext context = getAntContext(); | |||
ComponentService componentService = (ComponentService) | |||
context.getCoreService(ComponentService.class); | |||
if (ref != null) { | |||
componentService.importFrameComponent(ref, alias); | |||
} else if (name == null) { | |||
componentService.importLibrary(libraryId); | |||
} else { | |||
componentService.importComponent(libraryId, name, alias); | |||
} | |||
} | |||
} | |||
@@ -1,177 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antlib.system; | |||
import java.io.File; | |||
import java.net.MalformedURLException; | |||
import java.net.URL; | |||
import org.apache.ant.common.antlib.AbstractTask; | |||
import org.apache.ant.common.antlib.AntContext; | |||
import org.apache.ant.common.antlib.ValidationException; | |||
import org.apache.ant.common.service.ComponentService; | |||
import org.apache.ant.common.util.AntException; | |||
import org.apache.ant.common.event.MessageLevel; | |||
import org.apache.ant.init.InitUtils; | |||
/** | |||
* Task to add an additional classpath to the given library | |||
* | |||
* @author Conor MacNeill | |||
* @created 27 January 2002 | |||
*/ | |||
public class LibPath extends AbstractTask { | |||
/** The id of the library for which this additional path is being set */ | |||
private String libraryId; | |||
/** | |||
* This is the location, either file or URL of the library or libraries | |||
* to be loaded | |||
*/ | |||
private URL url; | |||
/** | |||
* Sets the libraryId of the LibPath | |||
* | |||
* @param libraryId the new libraryId value | |||
*/ | |||
public void setLibraryId(String libraryId) { | |||
this.libraryId = libraryId; | |||
} | |||
/** | |||
* Sets the URL of the library to be loaded | |||
* | |||
* @param url the URL from which the library is to be loaded | |||
* @exception ValidationException if the URL cannot be set | |||
*/ | |||
public void setURL(URL url) throws ValidationException { | |||
checkNullURL(); | |||
this.url = url; | |||
} | |||
/** | |||
* Set the file from which the library should be loaded. | |||
* | |||
* @param file the file from which the library should be loaded | |||
* @exception ValidationException if the file attribute cannot be set | |||
*/ | |||
public void setFile(File file) throws ValidationException { | |||
checkNullURL(); | |||
try { | |||
this.url = InitUtils.getFileURL(file); | |||
} catch (MalformedURLException e) { | |||
throw new ValidationException(e); | |||
} | |||
} | |||
/** | |||
* Set the dir in which to search for AntLibraries. | |||
* | |||
* @param dir the dir from which all Ant Libraries found will be loaded. | |||
* @exception ValidationException if the dir attribute cannot be set | |||
*/ | |||
public void setDir(File dir) throws ValidationException { | |||
checkNullURL(); | |||
try { | |||
this.url = InitUtils.getFileURL(dir); | |||
} catch (MalformedURLException e) { | |||
throw new ValidationException(e); | |||
} | |||
} | |||
/** | |||
* Validate this task is configured correctly | |||
* | |||
* @exception ValidationException if the task is not configured correctly | |||
*/ | |||
public void validateComponent() throws ValidationException { | |||
if (libraryId == null) { | |||
throw new ValidationException("You must specify the id of the" | |||
+ "library for which you are providing additional classpaths"); | |||
} | |||
if (url == null) { | |||
throw new ValidationException("You must provide an additional " | |||
+ "classpath using one of the file, dir or url attributes"); | |||
} | |||
} | |||
/** | |||
* Add the libpath to the set of paths associated with the library | |||
* | |||
* @exception AntException if the library path cannot be addded to | |||
* the library | |||
*/ | |||
public void execute() throws AntException { | |||
AntContext context = getAntContext(); | |||
ComponentService componentService = (ComponentService) | |||
context.getCoreService(ComponentService.class); | |||
log("Adding lib path " + url + " for " + libraryId, | |||
MessageLevel.DEBUG); | |||
componentService.addLibPath(libraryId, url); | |||
} | |||
/** | |||
* Check if any of the location specifying attributes have already been | |||
* set. | |||
* | |||
* @exception ValidationException if the search URL has already been set | |||
*/ | |||
private void checkNullURL() throws ValidationException { | |||
if (url != null) { | |||
throw new ValidationException("Location of library has already " | |||
+ "been set. Please use only one of file, dir or url " | |||
+ "attributes"); | |||
} | |||
} | |||
} | |||
@@ -1,172 +0,0 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.ant.antlib.system; | |||
import java.io.File; | |||
import java.net.MalformedURLException; | |||
import java.net.URL; | |||
import org.apache.ant.common.antlib.AbstractTask; | |||
import org.apache.ant.common.antlib.AntContext; | |||
import org.apache.ant.common.service.ComponentService; | |||
import org.apache.ant.common.antlib.ValidationException; | |||
import org.apache.ant.common.util.AntException; | |||
import org.apache.ant.init.InitUtils; | |||
/** | |||
* Load an AntLibrary and optionally import all its components | |||
* | |||
* @author Conor MacNeill | |||
* @created 29 January 2002 | |||
*/ | |||
public class LoadLib extends AbstractTask { | |||
/** Flag which indicates if all components should be imported */ | |||
private boolean importAll; | |||
/** | |||
* This is the location, either file or URL of the library or libraries | |||
* to be loaded | |||
*/ | |||
private URL url; | |||
/** | |||
* Sets the URL of the library to be loaded | |||
* | |||
* @param url the URL from which the library is to be loaded | |||
* @exception ValidationException if the URL cannot be set | |||
*/ | |||
public void setURL(URL url) throws ValidationException { | |||
checkNullURL(); | |||
this.url = url; | |||
} | |||
/** | |||
* Set the file from which the library should be loaded. | |||
* | |||
* @param file the file from which the library should be loaded | |||
* @exception ValidationException if the file attribute cannot be set | |||
*/ | |||
public void setFile(File file) throws ValidationException { | |||
checkNullURL(); | |||
try { | |||
this.url = InitUtils.getFileURL(file); | |||
} catch (MalformedURLException e) { | |||
throw new ValidationException(e); | |||
} | |||
} | |||
/** | |||
* Set the dir in which to search for AntLibraries. | |||
* | |||
* @param dir the dir from which all Ant Libraries found will be loaded. | |||
* @exception ValidationException if the dir attribute cannot be set | |||
*/ | |||
public void setDir(File dir) throws ValidationException { | |||
checkNullURL(); | |||
try { | |||
this.url = InitUtils.getFileURL(dir); | |||
} catch (MalformedURLException e) { | |||
throw new ValidationException(e); | |||
} | |||
} | |||
/** | |||
* Indicate whether all components from the library should be imported | |||
* | |||
* @param importAll true if all components in the library should be | |||
* imported. | |||
*/ | |||
public void setImportAll(boolean importAll) { | |||
this.importAll = importAll; | |||
} | |||
/** | |||
* Validate this task is configured correctly | |||
* | |||
* @exception ValidationException if the task is not configured correctly | |||
*/ | |||
public void validateComponent() throws ValidationException { | |||
if (url == null) { | |||
throw new ValidationException("A location from which to load " | |||
+ "libraries must be provided"); | |||
} | |||
} | |||
/** | |||
* Load the library or libraries and optiinally import their components | |||
* | |||
* @exception AntException if the library or libraries cannot be | |||
* loaded. | |||
*/ | |||
public void execute() throws AntException { | |||
AntContext context = getAntContext(); | |||
ComponentService componentService = (ComponentService) | |||
context.getCoreService(ComponentService.class); | |||
componentService.loadLib(url, importAll); | |||
} | |||
/** | |||
* Check if any of the location specifying attributes have already been | |||
* set. | |||
* | |||
* @exception ValidationException if the search URL has already been set | |||
*/ | |||
private void checkNullURL() throws ValidationException { | |||
if (url != null) { | |||
throw new ValidationException("Location of library has already " | |||
+ "been set. Please use only one of file, dir or url " | |||
+ "attributes"); | |||
} | |||
} | |||
} | |||
@@ -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.antlib.system; | |||
import java.util.ArrayList; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import org.apache.ant.common.antlib.AbstractTask; | |||
import org.apache.ant.common.antlib.AntContext; | |||
import org.apache.ant.common.antlib.Task; | |||
import org.apache.ant.common.antlib.TaskContainer; | |||
import org.apache.ant.common.service.ExecService; | |||
import org.apache.ant.common.util.AntException; | |||
import org.apache.ant.common.util.Location; | |||
/** | |||
* Implements a multi threaded task execution. | |||
* | |||
* @author Thomas Christen <a href="mailto:chr@active.ch">chr@active.ch</a> | |||
* @author Conor MacNeill | |||
* @created 27 February 2002 | |||
*/ | |||
public class Parallel extends AbstractTask | |||
implements TaskContainer { | |||
/** | |||
* Class which stores information about the thread to which each task is | |||
* associated | |||
* | |||
* @author Conor MacNeill | |||
* @created 27 February 2002 | |||
*/ | |||
private class TaskThread extends Thread { | |||
/** The exception thrown, if any, by the task running in this thread */ | |||
private Throwable exception; | |||
/** The task running is this thread */ | |||
private Task task; | |||
/** An identifier for the thread */ | |||
private int taskNumber; | |||
/** | |||
* Construct a new TaskThread | |||
* | |||
* @param task the Task to be executed in a seperate thread | |||
* @param taskNumber the thread's identifier | |||
*/ | |||
TaskThread(int taskNumber, Task task) { | |||
this.task = task; | |||
this.taskNumber = taskNumber; | |||
} | |||
/** | |||
* Get the exception thrown by the task, if any. | |||
* | |||
* @return the Throwable instance thrown by the task or null if | |||
* nothing was thrown. | |||
*/ | |||
public Throwable getException() { | |||
return exception; | |||
} | |||
/** | |||
* Executes the task within a thread and takes care about Exceptions | |||
* raised within the task. | |||
*/ | |||
public void run() { | |||
try { | |||
AntContext context = getAntContext(); | |||
ExecService execService | |||
= (ExecService) context.getCoreService(ExecService.class); | |||
execService.executeTask(task); | |||
} catch (Throwable t) { | |||
exception = t; | |||
} | |||
} | |||
} | |||
/** Collection holding the nested tasks */ | |||
private List nestedTasks = new ArrayList(); | |||
/** | |||
* Add a nested task to execute parallel (asynchron). | |||
* | |||
* @param nestedTask Nested task to be executed in parallel | |||
*/ | |||
public void addNestedTask(Task nestedTask) { | |||
nestedTasks.add(nestedTask); | |||
} | |||
/** | |||
* Block execution until the specified time or for a specified amount of | |||
* milliseconds and if defined, execute the wait status. | |||
* | |||
* @exception AntException if any of the nested tasks throws an | |||
* exception | |||
*/ | |||
public void execute() throws AntException { | |||
TaskThread[] threads = new TaskThread[nestedTasks.size()]; | |||
int threadNumber = 0; | |||
for (Iterator i = nestedTasks.iterator(); i.hasNext(); threadNumber++) { | |||
Task nestedTask = (Task) i.next(); | |||
threads[threadNumber] = new TaskThread(threadNumber, nestedTask); | |||
} | |||
// now start all threads | |||
for (int i = 0; i < threads.length; ++i) { | |||
threads[i].start(); | |||
} | |||
// now join to all the threads | |||
for (int i = 0; i < threads.length; ++i) { | |||
try { | |||
threads[i].join(); | |||
} catch (InterruptedException ie) { | |||
// who would interrupt me at a time like this? | |||
} | |||
} | |||
// now did any of the threads throw an exception | |||
StringBuffer exceptionMessage = new StringBuffer(); | |||
String lSep = System.getProperty("line.separator"); | |||
int numExceptions = 0; | |||
Throwable firstException = null; | |||
Location firstLocation = Location.UNKNOWN_LOCATION; | |||
for (int i = 0; i < threads.length; ++i) { | |||
Throwable t = threads[i].getException(); | |||
if (t != null) { | |||
numExceptions++; | |||
if (firstException == null) { | |||
firstException = t; | |||
} | |||
if (t instanceof AntException && | |||
firstLocation == Location.UNKNOWN_LOCATION) { | |||
firstLocation = ((AntException) t).getLocation(); | |||
} | |||
exceptionMessage.append(lSep); | |||
exceptionMessage.append(t.getMessage()); | |||
} | |||
} | |||
if (numExceptions == 1) { | |||
if (firstException instanceof AntException) { | |||
throw (AntException) firstException; | |||
} else { | |||
throw new SystemException(firstException); | |||
} | |||
} else if (numExceptions > 1) { | |||
throw new SystemException(exceptionMessage.toString(), | |||
firstLocation); | |||
} | |||
} | |||
} | |||