Tag data values with a priority to support the Ant1 property menagerie Add a policy to the mutant launch script (somewhat experimental) Improved bootstrap Directory reorg to facilitate policy declarations git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@273030 13f79535-47bb-0310-9956-ffa450edef68master
@@ -1,4 +1,4 @@ | |||||
#!/bin/sh | |||||
#!/bin/sh | |||||
# Copyright (c) 2000-2001 The Apache Software Foundation. All rights | # Copyright (c) 2000-2001 The Apache Software Foundation. All rights | ||||
# reserved. | # reserved. | ||||
@@ -22,7 +22,7 @@ javac -classpath bin/init:bin/bootstrap -d bin/builder src/java/bootstrap/org/ap | |||||
java -classpath bin/init:bin/bootstrap org.apache.ant.bootstrap.Bootstrap | java -classpath bin/init:bin/bootstrap org.apache.ant.bootstrap.Bootstrap | ||||
# run full build using bootstrapped version | # run full build using bootstrapped version | ||||
java -jar bootstrap/lib/start.jar $* | |||||
java -jar bootstrap/lib/core/start/start.jar $* | |||||
# Use the full build as the build used by the build script | # Use the full build as the build used by the build script | ||||
cp -r dist/lib bootstrap | cp -r dist/lib bootstrap | ||||
@@ -1,6 +1,6 @@ | |||||
#!/bin/sh -x | |||||
#!/bin/sh | |||||
# Copyright (c) 2002 The Apache Software Foundation. All rights | # Copyright (c) 2002 The Apache Software Foundation. All rights | ||||
# reserved. | # reserved. | ||||
java -jar bootstrap/lib/start.jar $@ | |||||
java -jar bootstrap/lib/core/start/start.jar $@ |
@@ -1,117 +1,127 @@ | |||||
<project default="main" name="Mutant"> | |||||
<project default="dist-lite" name="Mutant"> | |||||
<!-- source locations --> | |||||
<property name="src.dir" value="src"/> | <property name="src.dir" value="src"/> | ||||
<property name="lib.dir" value="lib"/> | <property name="lib.dir" value="lib"/> | ||||
<property name="java.dir" value="${src.dir}/java"/> | <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="bin.dir" value="bin"/> | ||||
<property name="dist.dir" value="dist"/> | <property name="dist.dir" value="dist"/> | ||||
<property name="javadocs.dir" value="${dist.dir}/javadocs"/> | |||||
<property name="distlib.dir" value="${dist.dir}/lib"/> | |||||
<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="debug" value="true"/> | ||||
<property name="chmod.fail" value="true" /> | |||||
<path id="classpath.parser"> | <path id="classpath.parser"> | ||||
<fileset dir="${lib.dir}/parser" includes="*.jar"/> | <fileset dir="${lib.dir}/parser" includes="*.jar"/> | ||||
</path> | </path> | ||||
<path id="classpath.common"> | <path id="classpath.common"> | ||||
<pathelement location="${distlib.dir}/init.jar"/> | |||||
<pathelement location="${dist.core.dir}/start/init.jar"/> | |||||
</path> | </path> | ||||
<path id="classpath.antcore"> | <path id="classpath.antcore"> | ||||
<path refid="classpath.common"/> | <path refid="classpath.common"/> | ||||
<pathelement location="${distlib.dir}/common/common.jar"/> | |||||
<pathelement location="${dist.core.dir}/common/common.jar"/> | |||||
<path refid="classpath.parser"/> | <path refid="classpath.parser"/> | ||||
</path> | </path> | ||||
<path id="classpath.frontend"> | <path id="classpath.frontend"> | ||||
<path refid="classpath.antcore"/> | <path refid="classpath.antcore"/> | ||||
<pathelement location="${distlib.dir}/antcore/antcore.jar"/> | |||||
<pathelement location="${dist.core.dir}/antcore/antcore.jar"/> | |||||
</path> | </path> | ||||
<path id="classpath.start"> | <path id="classpath.start"> | ||||
<pathelement location="${distlib.dir}/init.jar"/> | |||||
<pathelement location="${dist.core.dir}/start/init.jar"/> | |||||
</path> | </path> | ||||
<target name="buildsetup"> | <target name="buildsetup"> | ||||
<available classname="com.puppycrawl.tools.checkstyle.CheckStyleTask" | <available classname="com.puppycrawl.tools.checkstyle.CheckStyleTask" | ||||
property="checkstyle.available"/> | property="checkstyle.available"/> | ||||
<mkdir dir="${bin.dir}"/> | <mkdir dir="${bin.dir}"/> | ||||
<mkdir dir="${distlib.dir}"/> | |||||
<copy todir="${distlib.dir}/parser"> | |||||
<mkdir dir="${dist.core.dir}"/> | |||||
<copy todir="${dist.core.dir}/parser"> | |||||
<fileset dir="${lib.dir}/parser"/> | <fileset dir="${lib.dir}/parser"/> | ||||
</copy> | </copy> | ||||
</target> | </target> | ||||
<target name="init" depends="buildsetup"> | |||||
<target name="initjar" depends="buildsetup"> | |||||
<mkdir dir="${bin.dir}/init"/> | <mkdir dir="${bin.dir}/init"/> | ||||
<mkdir dir="${dist.core.dir}/start"/> | |||||
<depend destdir="${bin.dir}/init" srcdir="${java.dir}/init" closure="yes"/> | <depend destdir="${bin.dir}/init" srcdir="${java.dir}/init" closure="yes"/> | ||||
<javac destdir="${bin.dir}/init" srcdir="${java.dir}/init" debug="${debug}"/> | <javac destdir="${bin.dir}/init" srcdir="${java.dir}/init" debug="${debug}"/> | ||||
<jar basedir="${bin.dir}/init" jarfile="${distlib.dir}/init.jar"/> | |||||
<jar basedir="${bin.dir}/init" jarfile="${dist.core.dir}/start/init.jar"/> | |||||
</target> | </target> | ||||
<target name="common" depends="init"> | |||||
<target name="common" depends="initjar"> | |||||
<mkdir dir="${bin.dir}/common"/> | <mkdir dir="${bin.dir}/common"/> | ||||
<mkdir dir="${distlib.dir}/common"/> | |||||
<mkdir dir="${dist.core.dir}/common"/> | |||||
<depend destdir="${bin.dir}/common" srcdir="${java.dir}/common" closure="yes"> | <depend destdir="${bin.dir}/common" srcdir="${java.dir}/common" closure="yes"> | ||||
<classpath refid="classpath.common"/> | <classpath refid="classpath.common"/> | ||||
</depend> | </depend> | ||||
<javac destdir="${bin.dir}/common" srcdir="${java.dir}/common" debug="${debug}"> | <javac destdir="${bin.dir}/common" srcdir="${java.dir}/common" debug="${debug}"> | ||||
<classpath refid="classpath.common"/> | <classpath refid="classpath.common"/> | ||||
</javac> | </javac> | ||||
<jar basedir="${bin.dir}/common" jarfile="${distlib.dir}/common/common.jar"/> | |||||
<jar basedir="${bin.dir}/common" jarfile="${dist.core.dir}/common/common.jar"/> | |||||
</target> | </target> | ||||
<target name="antcore" depends="common"> | <target name="antcore" depends="common"> | ||||
<mkdir dir="${bin.dir}/antcore"/> | <mkdir dir="${bin.dir}/antcore"/> | ||||
<mkdir dir="${distlib.dir}/antcore"/> | |||||
<mkdir dir="${dist.core.dir}/antcore"/> | |||||
<depend destdir="${bin.dir}/antcore" srcdir="${java.dir}/antcore" closure="yes"> | <depend destdir="${bin.dir}/antcore" srcdir="${java.dir}/antcore" closure="yes"> | ||||
<classpath refid="classpath.antcore"/> | <classpath refid="classpath.antcore"/> | ||||
</depend> | </depend> | ||||
<javac destdir="${bin.dir}/antcore" srcdir="${java.dir}/antcore" debug="${debug}"> | <javac destdir="${bin.dir}/antcore" srcdir="${java.dir}/antcore" debug="${debug}"> | ||||
<classpath refid="classpath.antcore"/> | <classpath refid="classpath.antcore"/> | ||||
</javac> | </javac> | ||||
<jar basedir="${bin.dir}/antcore" jarfile="${distlib.dir}/antcore/antcore.jar"/> | |||||
<jar basedir="${bin.dir}/antcore" jarfile="${dist.core.dir}/antcore/antcore.jar"/> | |||||
</target> | </target> | ||||
<target name="frontend" depends="antcore, start"> | |||||
<target name="frontend" depends="antcore, startjar"> | |||||
<mkdir dir="${bin.dir}/frontend"/> | <mkdir dir="${bin.dir}/frontend"/> | ||||
<mkdir dir="${distlib.dir}/frontend"/> | |||||
<mkdir dir="${dist.frontend.dir}"/> | |||||
<depend destdir="${bin.dir}/frontend" srcdir="${java.dir}/frontend" closure="yes"> | <depend destdir="${bin.dir}/frontend" srcdir="${java.dir}/frontend" closure="yes"> | ||||
<classpath refid="classpath.frontend"/> | <classpath refid="classpath.frontend"/> | ||||
</depend> | </depend> | ||||
<javac destdir="${bin.dir}/frontend" srcdir="${java.dir}/frontend" debug="${debug}"> | <javac destdir="${bin.dir}/frontend" srcdir="${java.dir}/frontend" debug="${debug}"> | ||||
<classpath refid="classpath.frontend"/> | <classpath refid="classpath.frontend"/> | ||||
</javac> | </javac> | ||||
<jar basedir="${bin.dir}/frontend" jarfile="${distlib.dir}/frontend/frontend.jar"> | |||||
<include name="**/frontend/*.class"/> | |||||
</jar> | |||||
<jar basedir="${bin.dir}/frontend" jarfile="${distlib.dir}/frontend/cli.jar"> | |||||
<jar basedir="${bin.dir}/frontend" jarfile="${dist.frontend.dir}/cli.jar"> | |||||
<include name="**/cli/*.class"/> | <include name="**/cli/*.class"/> | ||||
<manifest> | <manifest> | ||||
<attribute name="Main-Class" value="org.apache.ant.cli.Commandline"/> | <attribute name="Main-Class" value="org.apache.ant.cli.Commandline"/> | ||||
<attribute name="Class-Path" value="frontend.jar"/> | |||||
</manifest> | </manifest> | ||||
</jar> | </jar> | ||||
</target> | </target> | ||||
<target name="start" depends="init"> | |||||
<target name="startjar" depends="initjar"> | |||||
<mkdir dir="${bin.dir}/start"/> | <mkdir dir="${bin.dir}/start"/> | ||||
<mkdir dir="${dist.core.dir}/start"/> | |||||
<depend destdir="${bin.dir}/start" srcdir="${java.dir}/start" closure="yes"> | <depend destdir="${bin.dir}/start" srcdir="${java.dir}/start" closure="yes"> | ||||
<classpath refid="classpath.start"/> | <classpath refid="classpath.start"/> | ||||
</depend> | </depend> | ||||
<javac destdir="${bin.dir}/start" srcdir="${java.dir}/start" debug="${debug}"> | <javac destdir="${bin.dir}/start" srcdir="${java.dir}/start" debug="${debug}"> | ||||
<classpath refid="classpath.start"/> | <classpath refid="classpath.start"/> | ||||
</javac> | </javac> | ||||
<jar basedir="${bin.dir}/start" jarfile="${distlib.dir}/start.jar"> | |||||
<jar basedir="${bin.dir}/start" jarfile="${dist.core.dir}/start/start.jar"> | |||||
<manifest> | <manifest> | ||||
<attribute name="Main-Class" value="org.apache.ant.start.Main"/> | <attribute name="Main-Class" value="org.apache.ant.start.Main"/> | ||||
<attribute name="Class-Path" value="init.jar"/> | <attribute name="Class-Path" value="init.jar"/> | ||||
</manifest> | </manifest> | ||||
<include name="org/apache/ant/**/*"/> | <include name="org/apache/ant/**/*"/> | ||||
</jar> | </jar> | ||||
<jar basedir="${bin.dir}/start" jarfile="${distlib.dir}/ant.jar"> | |||||
<jar basedir="${bin.dir}/start" jarfile="${dist.core.dir}/start/ant.jar"> | |||||
<manifest> | <manifest> | ||||
<attribute name="Main-Class" value="org.apache.tools.ant.Main"/> | <attribute name="Main-Class" value="org.apache.tools.ant.Main"/> | ||||
<attribute name="Class-Path" value="start.jar"/> | <attribute name="Class-Path" value="start.jar"/> | ||||
@@ -120,11 +130,8 @@ | |||||
</jar> | </jar> | ||||
</target> | </target> | ||||
<target name="ant1compat" depends="common"> | |||||
<ant antfile="build/ant1compat.xml" /> | |||||
</target> | |||||
<target name="remote" depends="init"> | |||||
<!-- | |||||
<target name="remote" depends="initjar"> | |||||
<mkdir dir="${bin.dir}/remote"/> | <mkdir dir="${bin.dir}/remote"/> | ||||
<depend destdir="${bin.dir}/remote" srcdir="${java.dir}/remote" closure="yes"> | <depend destdir="${bin.dir}/remote" srcdir="${java.dir}/remote" closure="yes"> | ||||
<classpath refid="classpath.start"/> | <classpath refid="classpath.start"/> | ||||
@@ -138,46 +145,85 @@ | |||||
</manifest> | </manifest> | ||||
</jar> | </jar> | ||||
</target> | </target> | ||||
<target name="clean"> | |||||
<delete dir="${bin.dir}"/> | |||||
<delete dir="${dist.dir}"/> | |||||
</target> | |||||
--> | |||||
<target name="antlibs" depends="common"> | <target name="antlibs" depends="common"> | ||||
<ant antfile="build/script.xml"/> | |||||
<!-- <ant antfile="build/script.xml"/> --> | |||||
<antcall target="buildlib"> | <antcall target="buildlib"> | ||||
<param name="libid" value="system"/> | |||||
<param name="libarea" value="syslibs"/> | |||||
<param name="libname" value="system"/> | |||||
<param name="antlibdir" value="${dist.syslibs.dir}"/> | |||||
</antcall> | </antcall> | ||||
<antcall target="buildlib"> | <antcall target="buildlib"> | ||||
<param name="libid" value="monitor"/> | |||||
<param name="libarea" value="syslibs"/> | |||||
<param name="libname" value="monitor"/> | |||||
<param name="antlibdir" value="${dist.syslibs.dir}"/> | |||||
</antcall> | </antcall> | ||||
<ant antfile="build/ant1compat.xml"/> | |||||
</target> | </target> | ||||
<target name="buildlib"> | <target name="buildlib"> | ||||
<mkdir dir="${bin.dir}/${libarea}/${libid}"/> | |||||
<mkdir dir="${distlib.dir}/${libarea}"/> | |||||
<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 id="classpath.antlibs"> | ||||
<path refid="classpath.common"/> | <path refid="classpath.common"/> | ||||
<pathelement location="${distlib.dir}/common/common.jar"/> | |||||
<pathelement location="${dist.core.dir}/common/common.jar"/> | |||||
</path> | </path> | ||||
<depend destdir="${bin.dir}/${libarea}/${libid}" srcdir="${java.dir}/antlibs/${libid}" closure="yes"> | |||||
<depend destdir="${antlib.build.dir}" srcdir="${antlib.src.dir}" closure="yes"> | |||||
<classpath refid="classpath.antlibs"/> | <classpath refid="classpath.antlibs"/> | ||||
</depend> | </depend> | ||||
<javac destdir="${bin.dir}/${libarea}/${libid}" srcdir="${java.dir}/antlibs/${libid}" debug="${debug}"> | |||||
<javac destdir="${antlib.build.dir}" srcdir="${antlib.src.dir}" debug="${debug}"> | |||||
<classpath refid="classpath.antlibs"/> | <classpath refid="classpath.antlibs"/> | ||||
</javac> | </javac> | ||||
<jar basedir="${bin.dir}/${libarea}/${libid}" jarfile="${distlib.dir}/${libarea}/${libid}.jar"> | |||||
<metainf dir="${java.dir}/antlibs/${libid}" | |||||
<jar basedir="${antlib.build.dir}" jarfile="${antlibdir}/${libname}.jar"> | |||||
<metainf dir="${antlib.src.dir}" | |||||
includes="antlib.xml"/> | includes="antlib.xml"/> | ||||
</jar> | </jar> | ||||
</target> | </target> | ||||
<target name="main" depends="frontend, antlibs, ant1compat, remote, checkstyle"/> | |||||
<target name="checkstyle" if="xxcheckstyle.available"> | |||||
<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" | <taskdef name="checkstyle" | ||||
classname="com.puppycrawl.tools.checkstyle.CheckStyleTask"/> | classname="com.puppycrawl.tools.checkstyle.CheckStyleTask"/> | ||||
<mkdir dir="${bin.dir}/check"/> | <mkdir dir="${bin.dir}/check"/> | ||||
@@ -230,6 +276,10 @@ | |||||
<ant antfile="build/ant1compat.xml" target="test"/> | <ant antfile="build/ant1compat.xml" target="test"/> | ||||
</target> | </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> | </project> |
@@ -1,9 +1,9 @@ | |||||
<project default="ant1compat" name="Ant1Compat" basedir=".."> | <project default="ant1compat" name="Ant1Compat" basedir=".."> | ||||
<property name="debug" value="true" /> | <property name="debug" value="true" /> | ||||
<property name="chmod.fail" value="true" /> | |||||
<property name="deprecation" value="false" /> | <property name="deprecation" value="false" /> | ||||
<property name="optimize" value="true" /> | <property name="optimize" value="true" /> | ||||
<property name="junit.fork" value="false" /> | <property name="junit.fork" value="false" /> | ||||
<property name="junit.filtertrace" value="off"/> | <property name="junit.filtertrace" value="off"/> | ||||
<property name="junit.summary" value="no"/> | <property name="junit.summary" value="no"/> | ||||
@@ -16,14 +16,16 @@ | |||||
<property name="src.dir" value="src"/> | <property name="src.dir" value="src"/> | ||||
<property name="java.dir" value="${src.dir}/java"/> | <property name="java.dir" value="${src.dir}/java"/> | ||||
<property name="script.dir" value="${src.dir}/script"/> | |||||
<property name="lib.dir" value="lib"/> | <property name="lib.dir" value="lib"/> | ||||
<property name="tests.dir" value="${ant1src.dir}/testcases"/> | <property name="tests.dir" value="${ant1src.dir}/testcases"/> | ||||
<property name="tests.etc.dir" value="${src.dir}/etc/testcases"/> | <property name="tests.etc.dir" value="${src.dir}/etc/testcases"/> | ||||
<property name="bin.dir" value="bin"/> | <property name="bin.dir" value="bin"/> | ||||
<property name="dist.dir" value="dist"/> | <property name="dist.dir" value="dist"/> | ||||
<property name="distlib.dir" value="${dist.dir}/lib"/> | |||||
<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="ant.package" value="org/apache/tools/ant"/> | ||||
<property name="optional.package" value="${ant.package}/taskdefs/optional"/> | <property name="optional.package" value="${ant.package}/taskdefs/optional"/> | ||||
@@ -40,11 +42,11 @@ | |||||
<path id="classpath"> | <path id="classpath"> | ||||
<pathelement location="${distlib.dir}/init.jar"/> | |||||
<fileset dir="${lib.dir}/parser" includes="*.jar"/> | |||||
<fileset dir="${lib.dir}/ant1compat" includes="*.jar"/> | |||||
<pathelement location="${distlib.dir}/common/common.jar"/> | |||||
<pathelement location="${distlib.dir}/syslibs/system.jar"/> | |||||
<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> | ||||
<path id="tests-classpath"> | <path id="tests-classpath"> | ||||
@@ -561,8 +563,8 @@ | |||||
</fileset> | </fileset> | ||||
</copy> | </copy> | ||||
<mkdir dir="${distlib.dir}/antlibs/"/> | |||||
<jar basedir="${bin.dir}/ant1compat" jarfile="${distlib.dir}/antlibs/ant1compat.jar"> | |||||
<mkdir dir="${dist.antlibs.dir}"/> | |||||
<jar basedir="${bin.dir}/ant1compat" jarfile="${dist.antlibs.dir}/ant1compat.jar"> | |||||
<metainf dir="${java.dir}/antlibs/ant1compat" | <metainf dir="${java.dir}/antlibs/ant1compat" | ||||
includes="antlib.xml"/> | includes="antlib.xml"/> | ||||
</jar> | </jar> | ||||
@@ -14,7 +14,7 @@ | |||||
<xsl:apply-templates select="target"/> | <xsl:apply-templates select="target"/> | ||||
<xsl:text>} </xsl:text> | <xsl:text>} </xsl:text> | ||||
</xsl:template> | </xsl:template> | ||||
<xsl:template match="property"> | <xsl:template match="property"> | ||||
<xsl:text> helper.setProperty("</xsl:text> | <xsl:text> helper.setProperty("</xsl:text> | ||||
<xsl:value-of select="attribute::name"/> | <xsl:value-of select="attribute::name"/> | ||||
@@ -23,15 +23,33 @@ | |||||
<xsl:text>"); </xsl:text> | <xsl:text>"); </xsl:text> | ||||
</xsl:template> | </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 match="echo"> | ||||
</xsl:template> | </xsl:template> | ||||
<xsl:template match="path"> | <xsl:template match="path"> | ||||
<xsl:text> helper.createPath("</xsl:text> | <xsl:text> helper.createPath("</xsl:text> | ||||
<xsl:variable name="pathName" select="attribute::id"/> | <xsl:variable name="pathName" select="attribute::id"/> | ||||
<xsl:value-of select="$pathName"/> | <xsl:value-of select="$pathName"/> | ||||
<xsl:text>"); </xsl:text> | <xsl:text>"); </xsl:text> | ||||
<xsl:for-each select="fileset"> | <xsl:for-each select="fileset"> | ||||
<xsl:text> </xsl:text> | <xsl:text> </xsl:text> | ||||
<xsl:text>helper.addFileSetToPath("</xsl:text> | <xsl:text>helper.addFileSetToPath("</xsl:text> | ||||
@@ -52,7 +70,7 @@ | |||||
</xsl:choose> | </xsl:choose> | ||||
<xsl:text>); </xsl:text> | <xsl:text>); </xsl:text> | ||||
</xsl:for-each> | </xsl:for-each> | ||||
<xsl:for-each select="pathelement"> | <xsl:for-each select="pathelement"> | ||||
<xsl:text> </xsl:text> | <xsl:text> </xsl:text> | ||||
<xsl:text>helper.addPathElementToPath("</xsl:text> | <xsl:text>helper.addPathElementToPath("</xsl:text> | ||||
@@ -61,7 +79,7 @@ | |||||
<xsl:value-of select="attribute::location"/> | <xsl:value-of select="attribute::location"/> | ||||
<xsl:text>"); </xsl:text> | <xsl:text>"); </xsl:text> | ||||
</xsl:for-each> | </xsl:for-each> | ||||
<xsl:for-each select="path"> | <xsl:for-each select="path"> | ||||
<xsl:text> </xsl:text> | <xsl:text> </xsl:text> | ||||
<xsl:text>helper.addPathToPath("</xsl:text> | <xsl:text>helper.addPathToPath("</xsl:text> | ||||
@@ -76,16 +94,24 @@ | |||||
<xsl:text> protected void </xsl:text> | <xsl:text> protected void </xsl:text> | ||||
<xsl:value-of select="translate(attribute::name, '-', '_')"/> | <xsl:value-of select="translate(attribute::name, '-', '_')"/> | ||||
<xsl:text>(BuildHelper helper) { </xsl:text> | <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:apply-templates/> | ||||
<xsl:text> } </xsl:text> | <xsl:text> } </xsl:text> | ||||
</xsl:template> | </xsl:template> | ||||
<xsl:template match="mkdir"> | <xsl:template match="mkdir"> | ||||
<xsl:text> helper.mkdir("</xsl:text> | <xsl:text> helper.mkdir("</xsl:text> | ||||
<xsl:value-of select="attribute::dir"/> | <xsl:value-of select="attribute::dir"/> | ||||
<xsl:text>"); </xsl:text> | <xsl:text>"); </xsl:text> | ||||
</xsl:template> | </xsl:template> | ||||
<xsl:template match="javac"> | <xsl:template match="javac"> | ||||
<xsl:text> helper.javac("</xsl:text> | <xsl:text> helper.javac("</xsl:text> | ||||
<xsl:value-of select="attribute::srcdir"/> | <xsl:value-of select="attribute::srcdir"/> | ||||
@@ -150,7 +176,7 @@ | |||||
<xsl:text>); </xsl:text> | <xsl:text>); </xsl:text> | ||||
</xsl:template> | </xsl:template> | ||||
<xsl:template match="copy/fileset"> | <xsl:template match="copy/fileset"> | ||||
<xsl:choose> | <xsl:choose> | ||||
<xsl:when test="attribute::refid"> | <xsl:when test="attribute::refid"> | ||||
@@ -0,0 +1,49 @@ | |||||
// 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.*"; | |||||
}; | |||||
@@ -251,7 +251,7 @@ public class BuildEventSupport implements DemuxOutputReceiver { | |||||
} | } | ||||
} | } | ||||
fireMessageLogged(this, line, | fireMessageLogged(this, line, | ||||
isError ? MessageLevel.MSG_ERR : MessageLevel.MSG_INFO); | |||||
isError ? MessageLevel.ERROR : MessageLevel.INFO); | |||||
} | } | ||||
} | } | ||||
@@ -299,7 +299,7 @@ public class ComponentManager implements ComponentService { | |||||
frame.log("Adding referenced component <" + definition.getLocalName() | frame.log("Adding referenced component <" + definition.getLocalName() | ||||
+ "> as <" + label + "> from library \"" | + "> as <" + label + "> from library \"" | ||||
+ definition.getComponentLibrary().getLibraryId() + "\", class: " | + definition.getComponentLibrary().getLibraryId() + "\", class: " | ||||
+ definition.getClassName(), MessageLevel.MSG_DEBUG); | |||||
+ definition.getClassName(), MessageLevel.DEBUG); | |||||
imports.put(label, definition); | imports.put(label, definition); | ||||
} | } | ||||
@@ -631,7 +631,7 @@ public class ComponentManager implements ComponentService { | |||||
AntLibDefinition libDef = library.getDefinition(defName); | AntLibDefinition libDef = library.getDefinition(defName); | ||||
frame.log("Adding component <" + defName + "> as <" + label | frame.log("Adding component <" + defName + "> as <" + label | ||||
+ "> from library \"" + library.getLibraryId() + "\", class: " | + "> from library \"" + library.getLibraryId() + "\", class: " | ||||
+ libDef.getClassName(), MessageLevel.MSG_DEBUG); | |||||
+ libDef.getClassName(), MessageLevel.DEBUG); | |||||
imports.put(label, new ImportInfo(library, libDef)); | imports.put(label, new ImportInfo(library, libDef)); | ||||
} | } | ||||
@@ -53,76 +53,184 @@ | |||||
*/ | */ | ||||
package org.apache.ant.antcore.execution; | package org.apache.ant.antcore.execution; | ||||
import java.util.ArrayList; | import java.util.ArrayList; | ||||
import java.util.HashMap; | |||||
import java.util.Iterator; | import java.util.Iterator; | ||||
import java.util.List; | import java.util.List; | ||||
import java.util.Map; | 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.service.DataService; | ||||
import org.apache.ant.common.util.PropertyUtils; | |||||
import org.apache.ant.common.util.AntException; | 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. | |||||
* 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 | * @author Conor MacNeill | ||||
* @created 31 January 2002 | * @created 31 January 2002 | ||||
*/ | */ | ||||
public class CoreDataService implements DataService { | public class CoreDataService implements DataService { | ||||
/** The Frame this service instance is working for */ | /** The Frame this service instance is working for */ | ||||
private Frame frame; | private Frame frame; | ||||
/** all properties to be unset without throwing an exception */ | /** all properties to be unset without throwing an exception */ | ||||
private boolean allowUnsetProperties; | 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 | * Constructor | ||||
* | * | ||||
* @param frame the frame containing this context | * @param frame the frame containing this context | ||||
* @param allowUnsetProperties true if the reference to an unset | |||||
* property should not throw an exception | |||||
* @param allowUnsetProperties true if the reference to an unset property | |||||
* should not throw an exception | |||||
*/ | */ | ||||
protected CoreDataService(Frame frame, | protected CoreDataService(Frame frame, | ||||
boolean allowUnsetProperties) { | |||||
boolean allowUnsetProperties) { | |||||
this.frame = frame; | this.frame = frame; | ||||
this.allowUnsetProperties = allowUnsetProperties; | this.allowUnsetProperties = allowUnsetProperties; | ||||
} | } | ||||
/** | /** | ||||
* Set a data value. If an existing data value exists, associated with | |||||
* the given name, the value will not be changed | |||||
* Get the Data service of a frame | |||||
* | * | ||||
* @param valueName the name of the data value | |||||
* @param value the value to be associated with the name | |||||
* @exception ExecutionException if the value cannot be set | |||||
* @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. | |||||
*/ | */ | ||||
public void setDataValue(String valueName, Object value) | |||||
private DataService getFrameDataService(Frame frame) | |||||
throws ExecutionException { | throws ExecutionException { | ||||
frame.setDataValue(valueName, value, false); | |||||
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); | |||||
} | |||||
} | } | ||||
/** | /** | ||||
* Set a data value which can be overwritten | |||||
* 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 valueName the name of the data value | |||||
* @param value the value to be associated with the name | |||||
* @exception ExecutionException if the value cannot be set | |||||
* @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. | |||||
*/ | */ | ||||
public void setMutableDataValue(String valueName, Object value) | |||||
private void setOverrideProperty(String name, DataValue value, | |||||
boolean mutable) | |||||
throws ExecutionException { | throws ExecutionException { | ||||
frame.setDataValue(valueName, value, true); | |||||
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 | * Get a data value | ||||
* | * | ||||
* @param valueName 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 ExecutionException if the value cannot be retrieved. | |||||
* @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 valueName) throws ExecutionException { | |||||
return frame.getDataValue(valueName); | |||||
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); | |||||
} | |||||
} | } | ||||
/** | /** | ||||
@@ -131,25 +239,69 @@ public class CoreDataService implements DataService { | |||||
* @param name the name of the data value - may contain reference | * @param name the name of the data value - may contain reference | ||||
* delimiters | * delimiters | ||||
* @return true if the value exists | * @return true if the value exists | ||||
* @exception ExecutionException if the containing frame for the value | |||||
* does not exist | |||||
* @exception AntException if the data value cannot be accessed. | |||||
*/ | */ | ||||
public boolean isDataValueSet(String name) throws ExecutionException { | |||||
return frame.isDataValueSet(name); | |||||
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 properties from the frame and any references frames. This | |||||
* 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 | * is an expensive operation since it must clone all of the property | ||||
* stores in all frames | * stores in all frames | ||||
* | * | ||||
* @return a Map containing the frames properties indexed by their full | |||||
* @return a Map containing the frames data values indexed by their full | |||||
* name. | * name. | ||||
* @exception AntException if the values cannot be retrieved. | |||||
*/ | */ | ||||
public Map getAllProperties() { | |||||
return frame.getAllProperties(); | |||||
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 | * Replace ${} style constructions in the given value with the string | ||||
* value of the corresponding data values in the frame | * value of the corresponding data values in the frame | ||||
@@ -230,5 +382,144 @@ public class CoreDataService implements DataService { | |||||
return sb.toString(); | 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); | |||||
} | |||||
} | |||||
} | |||||
} | } | ||||
@@ -275,20 +275,20 @@ public class CoreExecService implements ExecService { | |||||
* Setup a sub-build. | * Setup a sub-build. | ||||
* | * | ||||
* @param model the project model to be used for the build | * @param model the project model to be used for the build | ||||
* @param properties the initiali properties to be used in 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 | * @param addListeners true if the current frame's listeners should be | ||||
* added to the created Frame | * added to the created Frame | ||||
* @return Description of the Return Value | * @return Description of the Return Value | ||||
* @exception AntException if the subbuild cannot be run | * @exception AntException if the subbuild cannot be run | ||||
*/ | */ | ||||
public Object setupBuild(Project model, Map properties, | |||||
public Object setupBuild(Project model, Map dataValues, | |||||
boolean addListeners) | boolean addListeners) | ||||
throws AntException { | throws AntException { | ||||
Frame newFrame = frame.createFrame(model); | Frame newFrame = frame.createFrame(model); | ||||
if (addListeners) { | if (addListeners) { | ||||
frame.addListeners(newFrame); | frame.addListeners(newFrame); | ||||
} | } | ||||
newFrame.initialize(properties); | |||||
newFrame.initialize(dataValues); | |||||
return newFrame; | return newFrame; | ||||
} | } | ||||
@@ -297,15 +297,15 @@ public class CoreExecService implements ExecService { | |||||
/** | /** | ||||
* Setup a sub-build using the current frame's project model | * Setup a sub-build using the current frame's project model | ||||
* | * | ||||
* @param properties the initiali properties to be used in the build | |||||
* @param dataValues the initial properties to be used in the build | |||||
* @param addListeners true if the current frame's listeners should be | * @param addListeners true if the current frame's listeners should be | ||||
* added to the created Frame | * added to the created Frame | ||||
* @return Description of the Return Value | * @return Description of the Return Value | ||||
* @exception AntException if the subbuild cannot be run | * @exception AntException if the subbuild cannot be run | ||||
*/ | */ | ||||
public Object setupBuild(Map properties, boolean addListeners) | |||||
public Object setupBuild(Map dataValues, boolean addListeners) | |||||
throws AntException { | throws AntException { | ||||
return setupBuild(frame.getProject(), properties, addListeners); | |||||
return setupBuild(frame.getProject(), dataValues, addListeners); | |||||
} | } | ||||
} | } | ||||
@@ -54,7 +54,6 @@ | |||||
package org.apache.ant.antcore.execution; | package org.apache.ant.antcore.execution; | ||||
import java.io.File; | import java.io.File; | ||||
import java.net.URL; | import java.net.URL; | ||||
import java.net.MalformedURLException; | |||||
import java.util.HashMap; | import java.util.HashMap; | ||||
import java.util.Iterator; | import java.util.Iterator; | ||||
import java.util.Map; | import java.util.Map; | ||||
@@ -81,6 +80,7 @@ import org.apache.ant.common.service.FileService; | |||||
import org.apache.ant.common.service.InputService; | import org.apache.ant.common.service.InputService; | ||||
import org.apache.ant.common.service.MagicProperties; | import org.apache.ant.common.service.MagicProperties; | ||||
import org.apache.ant.common.util.DemuxOutputReceiver; | import org.apache.ant.common.util.DemuxOutputReceiver; | ||||
import org.apache.ant.common.util.DataValue; | |||||
import org.apache.ant.common.util.FileUtils; | import org.apache.ant.common.util.FileUtils; | ||||
import org.apache.ant.common.util.Location; | import org.apache.ant.common.util.Location; | ||||
import org.apache.ant.common.util.AntException; | import org.apache.ant.common.util.AntException; | ||||
@@ -112,19 +112,6 @@ public class Frame implements DemuxOutputReceiver { | |||||
*/ | */ | ||||
private Map aspectContextsMap = new HashMap(); | private Map aspectContextsMap = 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(); | |||||
/** | |||||
* The context of this execution. This contains all data object's created | |||||
* by tasks that have been executed | |||||
*/ | |||||
private Map dataValues = new HashMap(); | |||||
/** | /** | ||||
* Ant's initialization configuration with information on the location of | * Ant's initialization configuration with information on the location of | ||||
* Ant and its libraries. | * Ant and its libraries. | ||||
@@ -242,153 +229,22 @@ public class Frame implements DemuxOutputReceiver { | |||||
/** | /** | ||||
* 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 ExecutionException if the value name is invalid | |||||
*/ | |||||
protected void setDataValue(String name, Object value, boolean mutable) | |||||
throws ExecutionException { | |||||
Frame frame = getContainingFrame(name); | |||||
if (frame == null) { | |||||
setOverrideProperty(name, value, mutable); | |||||
return; | |||||
} | |||||
if (frame == this) { | |||||
if (dataValues.containsKey(name) && !mutable) { | |||||
log("Ignoring override for data value " + name, | |||||
MessageLevel.MSG_VERBOSE); | |||||
} else { | |||||
dataValues.put(name, value); | |||||
} | |||||
} else { | |||||
frame.setDataValue(getNameInFrame(name), 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. | |||||
* Initialize the frame. | |||||
* | * | ||||
* @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, Object 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); | |||||
} | |||||
if (mutable || !frameOverrides.containsKey(relativeName)) { | |||||
frameOverrides.put(relativeName, value); | |||||
} | |||||
} | |||||
/** | |||||
* 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); | |||||
} | |||||
/** | |||||
* Initialize the frame setting any initial properties. | |||||
* | |||||
* @param properties a Map of named properties which may in fact be any | |||||
* object | |||||
* @exception AntException if the properties cannot be set | |||||
* @param initialDataValues a Map of named DataValue instances. | |||||
* @exception AntException if the frame cannot be initialized. | |||||
*/ | */ | ||||
public void initialize(Map properties) | |||||
throws AntException { | |||||
public void initialize(Map initialDataValues) throws AntException { | |||||
configureServices(); | configureServices(); | ||||
if (properties != null) { | |||||
addProperties(properties); | |||||
} | |||||
// add in system properties | // add in system properties | ||||
addProperties(System.getProperties()); | |||||
dataService.addProperties(System.getProperties(), | |||||
DataValue.PRIORITY_BASE); | |||||
if (initialDataValues != null) { | |||||
dataService.addDataValues(initialDataValues); | |||||
} | |||||
setMagicProperties(); | setMagicProperties(); | ||||
} | } | ||||
/** | /** | ||||
* Set the values of various magic properties | * Set the values of various magic properties | ||||
* | * | ||||
@@ -406,14 +262,19 @@ public class Frame implements DemuxOutputReceiver { | |||||
} else { | } else { | ||||
antHomeString = antHomeURL.toString(); | antHomeString = antHomeURL.toString(); | ||||
} | } | ||||
setDataValue(MagicProperties.ANT_HOME, antHomeString, false); | |||||
DataValue antHomeValue | |||||
= new DataValue(antHomeString, DataValue.PRIORITY_USER); | |||||
dataService.setDataValue(MagicProperties.ANT_HOME, antHomeValue, | |||||
false); | |||||
// ant.file | // ant.file | ||||
URL projectSource = project.getSourceURL(); | URL projectSource = project.getSourceURL(); | ||||
if (projectSource != null | if (projectSource != null | ||||
&& projectSource.getProtocol().equals("file")) { | && projectSource.getProtocol().equals("file")) { | ||||
setDataValue(MagicProperties.ANT_FILE, projectSource.getFile(), | |||||
true); | |||||
DataValue antFileValue = new DataValue(projectSource.getFile(), | |||||
DataValue.PRIORITY_USER); | |||||
dataService.setDataValue(MagicProperties.ANT_FILE, | |||||
antFileValue, true); | |||||
} | } | ||||
// basedir | // basedir | ||||
@@ -422,7 +283,9 @@ public class Frame implements DemuxOutputReceiver { | |||||
// ant.project.name | // ant.project.name | ||||
String projectName = project.getName(); | String projectName = project.getName(); | ||||
if (projectName != null) { | if (projectName != null) { | ||||
setDataValue(MagicProperties.ANT_PROJECT_NAME, projectName, true); | |||||
dataService.setDataValue(MagicProperties.ANT_PROJECT_NAME, | |||||
new DataValue(projectName, DataValue.PRIORITY_USER), | |||||
true); | |||||
} | } | ||||
} | } | ||||
@@ -464,36 +327,6 @@ public class Frame implements DemuxOutputReceiver { | |||||
} | } | ||||
/** | |||||
* Get all the properties from the frame and any references frames. This | |||||
* is an expensive operation since it must clone all of the property | |||||
* stores in all frames | |||||
* | |||||
* @return a Map containing the frames properties indexed by their full | |||||
* name. | |||||
*/ | |||||
protected Map getAllProperties() { | |||||
Map allProperties = new HashMap(dataValues); | |||||
Iterator i = referencedFrames.keySet().iterator(); | |||||
while (i.hasNext()) { | |||||
String refName = (String) i.next(); | |||||
Frame refFrame = getReferencedFrame(refName); | |||||
Map refProperties = refFrame.getAllProperties(); | |||||
Iterator j = refProperties.keySet().iterator(); | |||||
while (j.hasNext()) { | |||||
String name = (String) j.next(); | |||||
Object value = refProperties.get(name); | |||||
allProperties.put(refName + Project.REF_DELIMITER + name, | |||||
value); | |||||
} | |||||
} | |||||
return allProperties; | |||||
} | |||||
/** | /** | ||||
* Get the Ant initialization configuration for this frame. | * Get the Ant initialization configuration for this frame. | ||||
@@ -572,12 +405,20 @@ public class Frame implements DemuxOutputReceiver { | |||||
/** | /** | ||||
* Get the frames representing referenced projects. | * Get the frames representing referenced projects. | ||||
* | * | ||||
* @return an iterator which returns the referenced ExeuctionFrames.. | |||||
* @return an iterator which returns the referenced ExeuctionFrames. | |||||
*/ | */ | ||||
protected Iterator getReferencedFrames() { | protected Iterator getReferencedFrames() { | ||||
return referencedFrames.values().iterator(); | return referencedFrames.values().iterator(); | ||||
} | } | ||||
/** | |||||
* Get the names used for referenced projects | |||||
* | |||||
* @return an iterator which returns the referenced frame names. | |||||
*/ | |||||
protected Iterator getRefNames() { | |||||
return referencedFrames.keySet().iterator(); | |||||
} | |||||
/** | /** | ||||
* Get the name of an object in its frame | * Get the name of an object in its frame | ||||
@@ -595,51 +436,6 @@ public class Frame implements DemuxOutputReceiver { | |||||
} | } | ||||
/** | |||||
* Get a value from this frame or any imported frame | |||||
* | |||||
* @param name the name of the data value - may contain reference | |||||
* delimiters | |||||
* @return the data value fetched from the appropriate frame | |||||
* @exception ExecutionException if the value is not defined | |||||
*/ | |||||
protected Object getDataValue(String name) throws ExecutionException { | |||||
Frame frame = getContainingFrame(name); | |||||
if (frame == null) { | |||||
return getOverrideProperty(name); | |||||
} | |||||
if (frame == this) { | |||||
return dataValues.get(name); | |||||
} else { | |||||
return frame.getDataValue(getNameInFrame(name)); | |||||
} | |||||
} | |||||
/** | |||||
* 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 ExecutionException if the containing frame for the value | |||||
* does not exist | |||||
*/ | |||||
protected boolean isDataValueSet(String name) throws ExecutionException { | |||||
Frame frame = getContainingFrame(name); | |||||
if (frame == null) { | |||||
return isOverrideSet(name); | |||||
} | |||||
if (frame == this) { | |||||
return dataValues.containsKey(name); | |||||
} else { | |||||
return frame.isDataValueSet(getNameInFrame(name)); | |||||
} | |||||
} | |||||
/** | /** | ||||
* Get the execution frame which contains, directly, the named element | * Get the execution frame which contains, directly, the named element | ||||
* where the name is relative to this frame | * where the name is relative to this frame | ||||
@@ -672,23 +468,6 @@ public class Frame implements DemuxOutputReceiver { | |||||
return currentFrame; | return currentFrame; | ||||
} | } | ||||
/** | |||||
* Add a collection of properties to this frame | |||||
* | |||||
* @param properties the collection of property values, indexed by their | |||||
* names | |||||
* @exception ExecutionException if the frame cannot be created. | |||||
*/ | |||||
protected void addProperties(Map properties) throws ExecutionException { | |||||
for (Iterator i = properties.keySet().iterator(); i.hasNext();) { | |||||
String name = (String) i.next(); | |||||
Object value = properties.get(name); | |||||
setDataValue(name, value, false); | |||||
} | |||||
} | |||||
/** | /** | ||||
* Create a project reference. | * Create a project reference. | ||||
* | * | ||||
@@ -701,19 +480,20 @@ public class Frame implements DemuxOutputReceiver { | |||||
protected void createProjectReference(String name, Project project, | protected void createProjectReference(String name, Project project, | ||||
Map initialData) | Map initialData) | ||||
throws AntException { | throws AntException { | ||||
Frame referencedFrame = createFrame(project); | |||||
addListeners(referencedFrame); | |||||
Frame referencedFrame = createFrame(project); | |||||
addListeners(referencedFrame); | |||||
referencedFrame.initialize(initialData); | |||||
// does the frame have any overrides? | |||||
Map initialProperties = (Map) overrides.get(name); | |||||
referencedFrame.initialize(initialProperties); | |||||
overrides.remove(name); | |||||
Map overrideProperties = dataService.getOverrides(name); | |||||
Map values = new HashMap(); | |||||
dataService.mergeDataValues(values, initialData); | |||||
dataService.mergeDataValues(values, overrideProperties); | |||||
referencedFrame.initialize(values); | |||||
dataService.removeOverrides(name); | |||||
referencedFrames.put(name, referencedFrame); | |||||
referencedFrame.importStandardComponents(); | |||||
referencedFrame.runGlobalTasks(); | |||||
referencedFrames.put(name, referencedFrame); | |||||
referencedFrame.importStandardComponents(); | |||||
referencedFrame.runGlobalTasks(); | |||||
} | } | ||||
/** | /** | ||||
@@ -807,6 +587,7 @@ public class Frame implements DemuxOutputReceiver { | |||||
* @exception AntException if there is a problem in the build | * @exception AntException if there is a problem in the build | ||||
*/ | */ | ||||
protected void runBuild(List targets) throws AntException { | protected void runBuild(List targets) throws AntException { | ||||
log("Running build.", MessageLevel.DEBUG); | |||||
importStandardComponents(); | importStandardComponents(); | ||||
runGlobalTasks(); | runGlobalTasks(); | ||||
if (targets.isEmpty()) { | if (targets.isEmpty()) { | ||||
@@ -815,14 +596,14 @@ public class Frame implements DemuxOutputReceiver { | |||||
if (defaultTarget != null) { | if (defaultTarget != null) { | ||||
log("Executing default target: " + defaultTarget, | log("Executing default target: " + defaultTarget, | ||||
MessageLevel.MSG_DEBUG); | |||||
MessageLevel.DEBUG); | |||||
executeTarget(defaultTarget); | executeTarget(defaultTarget); | ||||
} | } | ||||
} else { | } else { | ||||
for (Iterator i = targets.iterator(); i.hasNext();) { | for (Iterator i = targets.iterator(); i.hasNext();) { | ||||
String targetName = (String) i.next(); | String targetName = (String) i.next(); | ||||
log("Executing target: " + targetName, MessageLevel.MSG_DEBUG); | |||||
log("Executing target: " + targetName, MessageLevel.DEBUG); | |||||
executeTarget(targetName); | executeTarget(targetName); | ||||
} | } | ||||
} | } | ||||
@@ -1108,7 +889,7 @@ public class Frame implements DemuxOutputReceiver { | |||||
if (ifCondition != null) { | if (ifCondition != null) { | ||||
ifCondition = dataService.replacePropertyRefs(ifCondition.trim()); | ifCondition = dataService.replacePropertyRefs(ifCondition.trim()); | ||||
if (!isDataValueSet(ifCondition)) { | |||||
if (!dataService.isDataValueSet(ifCondition)) { | |||||
return; | return; | ||||
} | } | ||||
} | } | ||||
@@ -1116,7 +897,7 @@ public class Frame implements DemuxOutputReceiver { | |||||
if (unlessCondition != null) { | if (unlessCondition != null) { | ||||
unlessCondition | unlessCondition | ||||
= dataService.replacePropertyRefs(unlessCondition.trim()); | = dataService.replacePropertyRefs(unlessCondition.trim()); | ||||
if (isDataValueSet(unlessCondition)) { | |||||
if (dataService.isDataValueSet(unlessCondition)) { | |||||
return; | return; | ||||
} | } | ||||
} | } | ||||
@@ -1161,29 +942,32 @@ public class Frame implements DemuxOutputReceiver { | |||||
Throwable buildFailureCause = null; | Throwable buildFailureCause = null; | ||||
try { | try { | ||||
// load system ant lib | // load system ant lib | ||||
URL systemLibs | |||||
= new URL(antEnv.getLibraryURL(), "syslibs/"); | |||||
componentManager.loadLib(systemLibs, false); | |||||
log("Loading system antlibs.", MessageLevel.DEBUG); | |||||
URL systemLibsURL = antEnv.getSyslibsURL(); | |||||
componentManager.loadLib(systemLibsURL, false); | |||||
log("Importing standard components.", MessageLevel.DEBUG); | |||||
importStandardComponents(); | importStandardComponents(); | ||||
log("Executing global configuration tasks", MessageLevel.DEBUG); | |||||
executeTasks(config.getGlobalTasks()); | executeTasks(config.getGlobalTasks()); | ||||
// now load other system libraries | // now load other system libraries | ||||
URL antLibs = new URL(antEnv.getLibraryURL(), "antlibs/"); | |||||
componentManager.loadLib(antLibs, false); | |||||
log("Loading standard antlibs.", MessageLevel.DEBUG); | |||||
URL antLibsURL = antEnv.getAntlibsURL(); | |||||
componentManager.loadLib(antLibsURL, false); | |||||
runBuild(targets); | runBuild(targets); | ||||
} catch (MalformedURLException e) { | |||||
ExecutionException ee = | |||||
new ExecutionException("Unable to initialize antlibs", e); | |||||
buildFailureCause = ee; | |||||
throw ee; | |||||
} catch (RuntimeException e) { | } catch (RuntimeException e) { | ||||
buildFailureCause = e; | buildFailureCause = e; | ||||
throw e; | throw e; | ||||
} catch (AntException e) { | } catch (AntException e) { | ||||
buildFailureCause = e; | buildFailureCause = e; | ||||
throw e; | throw e; | ||||
} catch (Throwable e) { | |||||
ExecutionException ee = | |||||
new ExecutionException("Unable to initialize antlibs", e); | |||||
buildFailureCause = ee; | |||||
throw ee; | |||||
} finally { | } finally { | ||||
eventSupport.fireBuildFinished(project, buildFailureCause); | eventSupport.fireBuildFinished(project, buildFailureCause); | ||||
} | } | ||||
@@ -1220,9 +1004,11 @@ public class Frame implements DemuxOutputReceiver { | |||||
+ " is not a directory"); | + " is not a directory"); | ||||
} | } | ||||
this.baseDir = baseDir; | this.baseDir = baseDir; | ||||
setDataValue(MagicProperties.BASEDIR, baseDir.getPath(), false); | |||||
dataService.setDataValue(MagicProperties.BASEDIR, | |||||
new DataValue(baseDir.getPath(), DataValue.PRIORITY_USER), | |||||
false); | |||||
log("Project base dir set to: " + this.baseDir, | log("Project base dir set to: " + this.baseDir, | ||||
MessageLevel.MSG_VERBOSE); | |||||
MessageLevel.VERBOSE); | |||||
} | } | ||||
@@ -1233,9 +1019,9 @@ public class Frame implements DemuxOutputReceiver { | |||||
* determined | * determined | ||||
*/ | */ | ||||
private void determineBaseDir() throws AntException { | private void determineBaseDir() throws AntException { | ||||
if (isDataValueSet(MagicProperties.BASEDIR)) { | |||||
if (dataService.isDataValueSet(MagicProperties.BASEDIR)) { | |||||
String baseDirString | String baseDirString | ||||
= getDataValue(MagicProperties.BASEDIR).toString(); | |||||
= dataService.getDataValue(MagicProperties.BASEDIR).toString(); | |||||
setBaseDir(new File(baseDirString)); | setBaseDir(new File(baseDirString)); | ||||
} else { | } else { | ||||
URL projectURL = project.getSourceURL(); | URL projectURL = project.getSourceURL(); | ||||
@@ -106,7 +106,7 @@ public class TaskAdapter extends AbstractTask { | |||||
try { | try { | ||||
executeMethod.invoke(worker, null); | executeMethod.invoke(worker, null); | ||||
} catch (InvocationTargetException e) { | } catch (InvocationTargetException e) { | ||||
log("Error in " + worker.getClass(), MessageLevel.MSG_ERR); | |||||
log("Error in " + worker.getClass(), MessageLevel.ERROR); | |||||
Throwable t = e.getTargetException(); | Throwable t = e.getTargetException(); | ||||
if (t instanceof ExecutionException) { | if (t instanceof ExecutionException) { | ||||
throw (ExecutionException) t; | throw (ExecutionException) t; | ||||
@@ -114,7 +114,7 @@ public class TaskAdapter extends AbstractTask { | |||||
throw new ExecutionException(t); | throw new ExecutionException(t); | ||||
} | } | ||||
} catch (Throwable t) { | } catch (Throwable t) { | ||||
log("Error in " + worker.getClass(), MessageLevel.MSG_ERR); | |||||
log("Error in " + worker.getClass(), MessageLevel.ERROR); | |||||
throw new ExecutionException(t); | throw new ExecutionException(t); | ||||
} | } | ||||
} | } | ||||
@@ -51,7 +51,7 @@ | |||||
* information on the Apache Software Foundation, please see | * information on the Apache Software Foundation, please see | ||||
* <http://www.apache.org/>. | * <http://www.apache.org/>. | ||||
*/ | */ | ||||
package org.apache.ant.frontend; | |||||
package org.apache.ant.antcore.frontend; | |||||
import org.apache.ant.common.util.AntException; | import org.apache.ant.common.util.AntException; | ||||
import org.apache.ant.common.util.Location; | import org.apache.ant.common.util.Location; |
@@ -51,7 +51,7 @@ | |||||
* information on the Apache Software Foundation, please see | * information on the Apache Software Foundation, please see | ||||
* <http://www.apache.org/>. | * <http://www.apache.org/>. | ||||
*/ | */ | ||||
package org.apache.ant.frontend; | |||||
package org.apache.ant.antcore.frontend; | |||||
import java.io.File; | import java.io.File; | ||||
import java.io.FileNotFoundException; | import java.io.FileNotFoundException; | ||||
@@ -114,10 +114,6 @@ public class FrontendUtils { | |||||
URL configFileURL = InitUtils.getFileURL(configFile); | URL configFileURL = InitUtils.getFileURL(configFile); | ||||
ParseContext context = new ParseContext(); | ParseContext context = new ParseContext(); | ||||
context.declareNamespace(Namespace.ANT_META_PREFIX, | |||||
Namespace.ANT_META_URI); | |||||
context.declareNamespace(Namespace.XSI_PREFIX, | |||||
Namespace.XSI_URI); | |||||
AntConfigHandler configHandler = new AntConfigHandler(); | AntConfigHandler configHandler = new AntConfigHandler(); | ||||
@@ -75,10 +75,7 @@ public class ProjectHandler extends ModelElementHandler { | |||||
/** The default attribute name */ | /** The default attribute name */ | ||||
public static final String DEFAULT_ATTR = "default"; | public static final String DEFAULT_ATTR = "default"; | ||||
/** The name of the element used to define references */ | |||||
public static final String REF_ELEMENT = "ant:ref"; | |||||
/** The name of the element used to define references */ | |||||
/** The name of the element used to define includes */ | |||||
public static final String INCLUDE_ELEMENT = "ant:include"; | public static final String INCLUDE_ELEMENT = "ant:include"; | ||||
/** The name of the element used to define references */ | /** The name of the element used to define references */ | ||||
@@ -79,10 +79,6 @@ public class XMLProjectParser { | |||||
throws XMLParseException { | throws XMLParseException { | ||||
try { | try { | ||||
ParseContext context = new ParseContext(); | ParseContext context = new ParseContext(); | ||||
context.declareNamespace(Namespace.ANT_META_PREFIX, | |||||
Namespace.ANT_META_URI); | |||||
context.declareNamespace(Namespace.XSI_PREFIX, | |||||
Namespace.XSI_URI); | |||||
ProjectHandler projectHandler = new ProjectHandler(); | ProjectHandler projectHandler = new ProjectHandler(); | ||||
@@ -56,22 +56,22 @@ import java.net.URL; | |||||
import java.util.HashMap; | import java.util.HashMap; | ||||
import java.util.Iterator; | import java.util.Iterator; | ||||
import java.util.Map; | import java.util.Map; | ||||
import org.apache.ant.common.util.AttributeCollection; | |||||
import org.apache.ant.common.util.Location; | import org.apache.ant.common.util.Location; | ||||
import org.apache.ant.common.util.AttributeCollection; | |||||
import org.apache.ant.common.util.PropertyUtils; | |||||
import org.xml.sax.Attributes; | import org.xml.sax.Attributes; | ||||
import org.xml.sax.ContentHandler; | import org.xml.sax.ContentHandler; | ||||
import org.xml.sax.Locator; | import org.xml.sax.Locator; | ||||
import org.xml.sax.SAXParseException; | import org.xml.sax.SAXParseException; | ||||
import org.xml.sax.XMLReader; | import org.xml.sax.XMLReader; | ||||
import org.xml.sax.helpers.DefaultHandler; | import org.xml.sax.helpers.DefaultHandler; | ||||
import org.apache.ant.common.util.PropertyUtils; | |||||
/** | /** | ||||
* 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. | |||||
* 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 | * @author Conor MacNeill | ||||
* @created 9 January 2002 | * @created 9 January 2002 | ||||
@@ -81,8 +81,8 @@ public abstract class ElementHandler extends DefaultHandler { | |||||
private ParseContext context; | private ParseContext context; | ||||
/** | /** | ||||
* Locator used to identify where in the build source particular | |||||
* elements occur. | |||||
* Locator used to identify where in the build source particular elements | |||||
* occur. | |||||
*/ | */ | ||||
private Locator locator; | private Locator locator; | ||||
@@ -133,10 +133,9 @@ public abstract class ElementHandler extends DefaultHandler { | |||||
* Get the collection of namespace attributes for a given namespace. | * Get the collection of namespace attributes for a given namespace. | ||||
* | * | ||||
* @param uri the URI of the namespace from which the attribute collection | * @param uri the URI of the namespace from which the attribute collection | ||||
* is required. | |||||
* | |||||
* is required. | |||||
* @return an attribute collection if any attributes of the requested | * @return an attribute collection if any attributes of the requested | ||||
* namespace have beebn encountered - otherwise null. | |||||
* namespace have beebn encountered - otherwise null. | |||||
*/ | */ | ||||
public AttributeCollection getNamespaceAttributes(String uri) { | public AttributeCollection getNamespaceAttributes(String uri) { | ||||
return (AttributeCollection) namespaces.get(uri); | return (AttributeCollection) namespaces.get(uri); | ||||
@@ -193,10 +192,8 @@ public abstract class ElementHandler extends DefaultHandler { | |||||
* @param source the URL from which the XML source is being parsed. | * @param source the URL from which the XML source is being parsed. | ||||
* @param xmlReader the parser being used | * @param xmlReader the parser being used | ||||
* @param context the parser context for this element | * @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 | |||||
* @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, | public final void start(ParseContext context, XMLReader xmlReader, | ||||
ContentHandler parent, Locator locator, | ContentHandler parent, Locator locator, | ||||
@@ -216,8 +213,8 @@ public abstract class ElementHandler extends DefaultHandler { | |||||
/** | /** | ||||
* Process an element. This resolves any namespaces against | |||||
* prefixes declared in the ParseContext. | |||||
* Process an element. This resolves any namespaces against prefixes | |||||
* declared in the ParseContext. | |||||
* | * | ||||
* @param uri The Namespace URI. | * @param uri The Namespace URI. | ||||
* @param localName The local name (without prefix). | * @param localName The local name (without prefix). | ||||
@@ -225,7 +222,7 @@ public abstract class ElementHandler extends DefaultHandler { | |||||
* @param attributes The attributes attached to the element. | * @param attributes The attributes attached to the element. | ||||
* @throws SAXParseException if there is a problem parsng the subelement | * @throws SAXParseException if there is a problem parsng the subelement | ||||
*/ | */ | ||||
final public void startElement(String uri, String localName, | |||||
public final void startElement(String uri, String localName, | |||||
String qualifiedName, Attributes attributes) | String qualifiedName, Attributes attributes) | ||||
throws SAXParseException { | throws SAXParseException { | ||||
addNestedElement(uri, localName, qualifiedName, attributes); | addNestedElement(uri, localName, qualifiedName, attributes); | ||||
@@ -233,8 +230,8 @@ public abstract class ElementHandler extends DefaultHandler { | |||||
/** | /** | ||||
* By default an element handler does not support nested elements. This | * By default an element handler does not support nested elements. This | ||||
* method will always throw an exception. Subclasses should override | |||||
* this method to support their own nested elements | |||||
* method will always throw an exception. Subclasses should override this | |||||
* method to support their own nested elements | |||||
* | * | ||||
* @param uri The Namespace URI. | * @param uri The Namespace URI. | ||||
* @param localName The local name (without prefix). | * @param localName The local name (without prefix). | ||||
@@ -252,8 +249,8 @@ public abstract class ElementHandler extends DefaultHandler { | |||||
/** | /** | ||||
* Handle the end of this element by making the parent element handler | |||||
* the current content handler | |||||
* Handle the end of this element by making the parent element handler the | |||||
* current content handler | |||||
* | * | ||||
* @param localName The local name (without prefix). | * @param localName The local name (without prefix). | ||||
* @param namespaceURI The Namespace URI. | * @param namespaceURI The Namespace URI. | ||||
@@ -330,15 +327,14 @@ public abstract class ElementHandler extends DefaultHandler { | |||||
* Process the element. | * Process the element. | ||||
* | * | ||||
* @param elementName the name of the element | * @param elementName the name of the element | ||||
* @exception SAXParseException if there is a problem parsing the | |||||
* element | |||||
* @exception SAXParseException if there is a problem parsing the element | |||||
*/ | */ | ||||
protected abstract void processElement(String elementName) | protected abstract void processElement(String elementName) | ||||
throws SAXParseException; | throws SAXParseException; | ||||
/** | /** | ||||
* Process all of the attributes of the element into maps, one for | |||||
* aspects and one for other attributes | |||||
* 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 | * @param attributes The SAX attributes collection for the element | ||||
* @exception SAXParseException if there is a problem reading the | * @exception SAXParseException if there is a problem reading the | ||||
@@ -357,21 +353,10 @@ public abstract class ElementHandler extends DefaultHandler { | |||||
uri = null; | uri = null; | ||||
} | } | ||||
if (uri == null) { | |||||
if (qName.indexOf(":") != -1) { | |||||
// try to resolve through known namespaces | |||||
uri = context.resolveNamespace(qName); | |||||
localName = qName.substring(qName.indexOf(":") + 1); | |||||
} else { | |||||
localName = qName; | |||||
} | |||||
} | |||||
String attributeValue = attributes.getValue(i); | String attributeValue = attributes.getValue(i); | ||||
if (uri != null) { | if (uri != null) { | ||||
AttributeCollection namespaceAttributes | AttributeCollection namespaceAttributes | ||||
= (AttributeCollection) namespaces.get(uri); | |||||
= (AttributeCollection) namespaces.get(uri); | |||||
if (namespaceAttributes == null) { | if (namespaceAttributes == null) { | ||||
namespaceAttributes = new AttributeCollection(); | namespaceAttributes = new AttributeCollection(); | ||||
namespaces.put(uri, namespaceAttributes); | namespaces.put(uri, namespaceAttributes); | ||||
@@ -417,8 +402,8 @@ public abstract class ElementHandler extends DefaultHandler { | |||||
/** | /** | ||||
* This method is called when this element is finished being processed. | * This method is called when this element is finished being processed. | ||||
* This is a template method allowing subclasses to complete any | |||||
* necessary processing. | |||||
* This is a template method allowing subclasses to complete any necessary | |||||
* processing. | |||||
*/ | */ | ||||
protected void finish() { | protected void finish() { | ||||
} | } | ||||
@@ -88,6 +88,12 @@ public class ParseContext { | |||||
/** The factory used to create SAX parsers. */ | /** The factory used to create SAX parsers. */ | ||||
private SAXParserFactory parserFactory; | private SAXParserFactory parserFactory; | ||||
/** | |||||
* Initialize a parse context. | |||||
* | |||||
* This method creates the Parser Factory for which it sets the | |||||
* context classloader. | |||||
*/ | |||||
public ParseContext() { | public ParseContext() { | ||||
Thread thread = Thread.currentThread(); | Thread thread = Thread.currentThread(); | ||||
ClassLoader currentContextLoader = thread.getContextClassLoader(); | ClassLoader currentContextLoader = thread.getContextClassLoader(); | ||||
@@ -173,29 +179,5 @@ public class ParseContext { | |||||
throw new XMLParseException(e); | throw new XMLParseException(e); | ||||
} | } | ||||
} | } | ||||
/** | |||||
* Given an XML qName, this method tries to resolve a name into a URI | |||||
* using the map of well known namespaces. | |||||
* | |||||
* @param qName the XML qName | |||||
* @return the namespace URI for the given name. If the namespace | |||||
* prefix is unknown the prefix is returned. | |||||
*/ | |||||
public String resolveNamespace(String qName) { | |||||
String namespaceId = qName.substring(0, qName.indexOf(":")); | |||||
String namespaceURI = (String) knownNamespaces.get(namespaceId); | |||||
return namespaceURI == null ? namespaceId : namespaceURI; | |||||
} | |||||
/** | |||||
* Declare a namespace | |||||
* | |||||
* @param prefix the prefix that is used in the XML for the namespace. | |||||
* @param uri the namespace's unique URI. | |||||
*/ | |||||
public void declareNamespace(String prefix, String uri) { | |||||
knownNamespaces.put(prefix, uri); | |||||
} | |||||
} | } | ||||
@@ -57,11 +57,11 @@ import java.io.IOException; | |||||
import java.io.InputStream; | import java.io.InputStream; | ||||
import java.util.ArrayList; | import java.util.ArrayList; | ||||
import java.util.Enumeration; | import java.util.Enumeration; | ||||
import java.util.HashMap; | |||||
import java.util.Hashtable; | import java.util.Hashtable; | ||||
import java.util.Iterator; | import java.util.Iterator; | ||||
import java.util.List; | import java.util.List; | ||||
import java.util.Map; | import java.util.Map; | ||||
import java.util.HashMap; | |||||
import java.util.Properties; | import java.util.Properties; | ||||
import java.util.Stack; | import java.util.Stack; | ||||
import java.util.Vector; | import java.util.Vector; | ||||
@@ -74,6 +74,7 @@ import org.apache.ant.common.service.ExecService; | |||||
import org.apache.ant.common.service.FileService; | import org.apache.ant.common.service.FileService; | ||||
import org.apache.ant.common.service.InputService; | import org.apache.ant.common.service.InputService; | ||||
import org.apache.ant.common.util.AntException; | import org.apache.ant.common.util.AntException; | ||||
import org.apache.ant.common.util.DataValue; | |||||
import org.apache.ant.common.util.PropertyUtils; | import org.apache.ant.common.util.PropertyUtils; | ||||
import org.apache.tools.ant.input.InputHandler; | import org.apache.tools.ant.input.InputHandler; | ||||
import org.apache.tools.ant.types.FilterSet; | import org.apache.tools.ant.types.FilterSet; | ||||
@@ -88,8 +89,8 @@ import org.apache.tools.ant.util.FileUtils; | |||||
*/ | */ | ||||
public class Project implements org.apache.ant.common.event.BuildListener { | public class Project implements org.apache.ant.common.event.BuildListener { | ||||
/** | /** | ||||
* A Property key which identifies the Project actiong as proxy for a | |||||
* a project. | |||||
* A Property key which identifies the Project actiong as proxy for a a | |||||
* project. | |||||
*/ | */ | ||||
private static final String PROXY_KEY = "_ant.proxy"; | private static final String PROXY_KEY = "_ant.proxy"; | ||||
@@ -105,29 +106,35 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||||
public static final String JAVA_1_4 = "1.4"; | public static final String JAVA_1_4 = "1.4"; | ||||
/** | /** | ||||
* @see MessageLevel.MSG_ERR | |||||
* @see MessageLevel.ERR | |||||
*/ | */ | ||||
public static final int MSG_ERR = MessageLevel.MSG_ERR; | |||||
public static final int MSG_ERR = MessageLevel.ERROR; | |||||
/** | /** | ||||
* @see MessageLevel.MSG_WARN | |||||
* @see MessageLevel.WARN | |||||
*/ | */ | ||||
public static final int MSG_WARN = MessageLevel.MSG_WARN; | |||||
public static final int MSG_WARN = MessageLevel.WARNING; | |||||
/** | /** | ||||
* @see MessageLevel.MSG_INFO | |||||
* @see MessageLevel.INFO | |||||
*/ | */ | ||||
public static final int MSG_INFO = MessageLevel.MSG_INFO; | |||||
public static final int MSG_INFO = MessageLevel.INFO; | |||||
/** | /** | ||||
* @see MessageLevel.MSG_VERBOSE | |||||
* @see MessageLevel.VERBOSE | |||||
*/ | */ | ||||
public static final int MSG_VERBOSE = MessageLevel.MSG_VERBOSE; | |||||
public static final int MSG_VERBOSE = MessageLevel.VERBOSE; | |||||
/** | /** | ||||
* @see MessageLevel.MSG_DEBUG | |||||
* @see MessageLevel.DEBUG | |||||
*/ | */ | ||||
public static final int MSG_DEBUG = MessageLevel.MSG_DEBUG; | |||||
public static final int MSG_DEBUG = MessageLevel.DEBUG; | |||||
/** The java version detected that Ant is running on */ | /** The java version detected that Ant is running on */ | ||||
private static String javaVersion; | private static String javaVersion; | ||||
/** | |||||
* A static copy of a context used fro Projects which have been created on | |||||
* the fly. It is used to access the required core services | |||||
*/ | |||||
private static AntContext sharedContext = null; | |||||
/** Called to handle any input requests. */ | /** Called to handle any input requests. */ | ||||
private InputHandler inputHandler = null; | private InputHandler inputHandler = null; | ||||
@@ -163,12 +170,6 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||||
/** The core's Component Service instance */ | /** The core's Component Service instance */ | ||||
private ComponentService componentService; | private ComponentService componentService; | ||||
/** | |||||
* A static copy of a context used fro Projects which have been created on | |||||
* the fly. It is used to access the required core services | |||||
*/ | |||||
private static AntContext sharedContext = null; | |||||
/** Ant1 FileUtils instance for manipulating files */ | /** Ant1 FileUtils instance for manipulating files */ | ||||
private FileUtils fileUtils; | private FileUtils fileUtils; | ||||
/** The collection of global filters */ | /** The collection of global filters */ | ||||
@@ -182,30 +183,24 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||||
private Stack targetStack = new Stack(); | private Stack targetStack = new Stack(); | ||||
/** | /** | ||||
* Flag which indicates if this project object is proxing for a subordinate | |||||
* project which has not yet been created. | |||||
* Flag which indicates if this project object is proxing for a | |||||
* subordinate project which has not yet been created. | |||||
*/ | */ | ||||
private boolean proxying; | private boolean proxying; | ||||
/** | /** | ||||
* The properties which will be passed to the project instance for which we | |||||
* are proxing. | |||||
* The properties which will be passed to the project instance for which | |||||
* we are proxing. | |||||
*/ | */ | ||||
private Map proxyProperties = new HashMap(); | private Map proxyProperties = new HashMap(); | ||||
/** | |||||
* The build key used to control the proxied build. | |||||
*/ | |||||
/** The build key used to control the proxied build. */ | |||||
private Object proxyBuildKey; | private Object proxyBuildKey; | ||||
/** | |||||
* The subordinate project if proxying | |||||
*/ | |||||
/** The subordinate project if proxying */ | |||||
private Project subordinate; | private Project subordinate; | ||||
/** | |||||
* The requested base dir | |||||
*/ | |||||
/** The requested base dir */ | |||||
private File baseDir = null; | private File baseDir = null; | ||||
static { | static { | ||||
@@ -251,33 +246,11 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||||
public Project() { | public Project() { | ||||
if (sharedContext == null) { | if (sharedContext == null) { | ||||
throw new BuildException("Project object can no longer be " | throw new BuildException("Project object can no longer be " | ||||
+ "constructed outside Ant execution"); | |||||
+ "constructed outside Ant execution"); | |||||
} | } | ||||
proxying = true; | proxying = true; | ||||
} | } | ||||
/** | |||||
* Configure a new project | |||||
* | |||||
* @param buildFile the file containing the XML build definition. | |||||
*/ | |||||
protected void configure(File buildFile) { | |||||
try { | |||||
// we create an execution frame and link ourselves to the Project | |||||
// object created in that frame | |||||
ExecService sharedExec | |||||
= (ExecService) sharedContext.getCoreService(ExecService.class); | |||||
org.apache.ant.common.model.Project subProject | |||||
= sharedExec.parseXMLBuildFile(buildFile); | |||||
proxyProperties.put(PROXY_KEY, this); | |||||
proxyBuildKey | |||||
= sharedExec.setupBuild(subProject, proxyProperties, false); | |||||
sharedExec.initializeBuildLibrary(proxyBuildKey, "ant.ant1compat"); | |||||
} catch (AntException e) { | |||||
throw new BuildException(e.getMessage(), e); | |||||
} | |||||
} | |||||
/** | /** | ||||
* static query of the java version | * static query of the java version | ||||
* | * | ||||
@@ -330,6 +303,29 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||||
return path.toString(); | return path.toString(); | ||||
} | } | ||||
/** | |||||
* Configure a new project | |||||
* | |||||
* @param buildFile the file containing the XML build definition. | |||||
*/ | |||||
protected void configure(File buildFile) { | |||||
try { | |||||
// we create an execution frame and link ourselves to the Project | |||||
// object created in that frame | |||||
ExecService sharedExec = (ExecService) | |||||
sharedContext.getCoreService(ExecService.class); | |||||
org.apache.ant.common.model.Project subProject | |||||
= sharedExec.parseXMLBuildFile(buildFile); | |||||
proxyProperties.put(PROXY_KEY, | |||||
new DataValue(this, DataValue.PRIORITY_USER)); | |||||
proxyBuildKey | |||||
= sharedExec.setupBuild(subProject, proxyProperties, false); | |||||
sharedExec.initializeBuildLibrary(proxyBuildKey, "ant.ant1compat"); | |||||
} catch (AntException e) { | |||||
throw new BuildException(e.getMessage(), e); | |||||
} | |||||
} | |||||
/** | /** | ||||
* The old initialisation method for Projects. Not used now | * The old initialisation method for Projects. Not used now | ||||
* | * | ||||
@@ -418,8 +414,8 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||||
targets.add(i.next()); | targets.add(i.next()); | ||||
} | } | ||||
ExecService execService | |||||
= (ExecService) sharedContext.getCoreService(ExecService.class); | |||||
ExecService sharedExec = (ExecService) | |||||
sharedContext.getCoreService(ExecService.class); | |||||
execService.runBuild(proxyBuildKey, targets); | execService.runBuild(proxyBuildKey, targets); | ||||
} catch (AntException e) { | } catch (AntException e) { | ||||
throw new BuildException(e.getMessage(), e); | throw new BuildException(e.getMessage(), e); | ||||
@@ -429,8 +425,8 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||||
/** | /** | ||||
* Executes the specified target and any targets it depends on. | * Executes the specified target and any targets it depends on. | ||||
* | * | ||||
* @param targetName The name of the target to execute. | |||||
* Must not be <code>null</code>. | |||||
* @param targetName The name of the target to execute. Must not be | |||||
* <code>null</code>. | |||||
* | * | ||||
* @exception BuildException if the build failed | * @exception BuildException if the build failed | ||||
*/ | */ | ||||
@@ -452,8 +448,8 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||||
List targets = new ArrayList(); | List targets = new ArrayList(); | ||||
targets.add(targetName); | targets.add(targetName); | ||||
ExecService execService | |||||
= (ExecService) sharedContext.getCoreService(ExecService.class); | |||||
ExecService sharedExec = (ExecService) | |||||
sharedContext.getCoreService(ExecService.class); | |||||
execService.runBuild(proxyBuildKey, targets); | execService.runBuild(proxyBuildKey, targets); | ||||
} catch (AntException e) { | } catch (AntException e) { | ||||
throw new BuildException(e.getMessage(), e); | throw new BuildException(e.getMessage(), e); | ||||
@@ -469,6 +465,38 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||||
this.description = description; | this.description = description; | ||||
} | } | ||||
/** | |||||
* Set a DataValue with the given name. | |||||
* | |||||
* @param name the name of the datavalue | |||||
* @param value the datavalue itself | |||||
* @param mutable true if a value at the same priority can be overwritten. | |||||
*/ | |||||
private synchronized void setDataValue(String name, DataValue value, | |||||
boolean mutable) { | |||||
if (dataService == null) { | |||||
if (proxyProperties.containsKey(name)) { | |||||
int priority = value.getPriority(); | |||||
DataValue current = (DataValue) proxyProperties.get(name); | |||||
int currentPriority = current.getPriority(); | |||||
if (currentPriority > priority | |||||
|| (currentPriority == priority && !mutable)) { | |||||
log("Ignoring override for data value " + name, | |||||
MessageLevel.VERBOSE); | |||||
return; | |||||
} | |||||
} | |||||
proxyProperties.put(name, value); | |||||
} else { | |||||
try { | |||||
dataService.setDataValue(name, value, true); | |||||
} catch (AntException e) { | |||||
throw new BuildException(e.getMessage(), e); | |||||
} | |||||
} | |||||
} | |||||
/** | /** | ||||
* Set a project property | * Set a project property | ||||
* | * | ||||
@@ -476,11 +504,8 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||||
* @param value the property value | * @param value the property value | ||||
*/ | */ | ||||
public void setProperty(String name, String value) { | public void setProperty(String name, String value) { | ||||
try { | |||||
dataService.setMutableDataValue(name, value); | |||||
} catch (AntException e) { | |||||
throw new BuildException(e.getMessage(), e); | |||||
} | |||||
setDataValue(name, new DataValue(value, DataValue.PRIORITY_BASE), | |||||
true); | |||||
} | } | ||||
/** | /** | ||||
@@ -489,51 +514,41 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||||
* @param name the property name | * @param name the property name | ||||
* @param value the property value | * @param value the property value | ||||
*/ | */ | ||||
public void setNewProperty(String name, String value) { | |||||
if (dataService == null) { | |||||
if (!proxyProperties.containsKey(name)) { | |||||
proxyProperties.put(name, value); | |||||
} | |||||
return; | |||||
} | |||||
try { | |||||
dataService.setDataValue(name, value); | |||||
} catch (AntException e) { | |||||
throw new BuildException(e.getMessage(), e); | |||||
} | |||||
public synchronized void setNewProperty(String name, String value) { | |||||
setDataValue(name, new DataValue(value, DataValue.PRIORITY_BASE), | |||||
false); | |||||
} | } | ||||
/** | /** | ||||
* Sets a userProperty of the Project. Note under Ant2, there is no | |||||
* distinction between user and system properties | |||||
* Sets an inherited property of the Project. | |||||
* | * | ||||
* @param name the property name | * @param name the property name | ||||
* @param value the property value | * @param value the property value | ||||
*/ | */ | ||||
public void setUserProperty(String name, String value) { | |||||
if (dataService == null) { | |||||
proxyProperties.put(name, value); | |||||
return; | |||||
} | |||||
public synchronized void setInheritedProperty(String name, String value) { | |||||
setDataValue(name, new DataValue(value, DataValue.PRIORITY_INHERIT), | |||||
false); | |||||
} | |||||
try { | |||||
dataService.setMutableDataValue(name, value); | |||||
} catch (AntException e) { | |||||
throw new BuildException(e.getMessage(), e); | |||||
} | |||||
/** | |||||
* Sets a userProperty of the Project. | |||||
* | |||||
* @param name the property name | |||||
* @param value the property value | |||||
*/ | |||||
public synchronized void setUserProperty(String name, String value) { | |||||
setDataValue(name, new DataValue(value, DataValue.PRIORITY_USER), | |||||
false); | |||||
} | } | ||||
/** | /** | ||||
* Returns a description of the type of the given element, with | |||||
* special handling for instances of tasks and data types. | |||||
* <p> | |||||
* This is useful for logging purposes. | |||||
* Returns a description of the type of the given element, with special | |||||
* handling for instances of tasks and data types. <p> | |||||
* | * | ||||
* @param element The element to describe. | |||||
* Must not be <code>null</code>. | |||||
* This is useful for logging purposes. | |||||
* | * | ||||
* @param element The element to describe. Must not be <code>null</code>. | |||||
* @return a description of the element type | * @return a description of the element type | ||||
* | |||||
* @since 1.95, Ant 1.5 | * @since 1.95, Ant 1.5 | ||||
*/ | */ | ||||
public String getElementName(Object element) { | public String getElementName(Object element) { | ||||
@@ -608,7 +623,7 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||||
* @return A Vector of BuildListener instances | * @return A Vector of BuildListener instances | ||||
*/ | */ | ||||
public Vector getBuildListeners() { | public Vector getBuildListeners() { | ||||
return listeners; | |||||
return (Vector) listeners.clone(); | |||||
} | } | ||||
/** | /** | ||||
@@ -718,17 +733,21 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||||
* @return the hashtable containing all properties, user included | * @return the hashtable containing all properties, user included | ||||
*/ | */ | ||||
public Hashtable getProperties() { | public Hashtable getProperties() { | ||||
Map properties = dataService.getAllProperties(); | |||||
Hashtable result = new Hashtable(); | |||||
for (Iterator i = properties.keySet().iterator(); i.hasNext();) { | |||||
String name = (String) i.next(); | |||||
Object value = properties.get(name); | |||||
if (value instanceof String) { | |||||
result.put(name, value); | |||||
try { | |||||
Map dataValues = dataService.getAllDataValues(); | |||||
Hashtable result = new Hashtable(); | |||||
for (Iterator i = dataValues.keySet().iterator(); i.hasNext();) { | |||||
String name = (String) i.next(); | |||||
DataValue dataValue = (DataValue) dataValues.get(name); | |||||
if (dataValue.getValue() instanceof String) { | |||||
result.put(name, dataValue.getValue()); | |||||
} | |||||
} | } | ||||
} | |||||
return result; | |||||
return result; | |||||
} catch (AntException e) { | |||||
throw new BuildException(e); | |||||
} | |||||
} | } | ||||
/** | /** | ||||
@@ -746,17 +765,21 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||||
* @return the hashtable containing all references | * @return the hashtable containing all references | ||||
*/ | */ | ||||
public Hashtable getReferences() { | public Hashtable getReferences() { | ||||
Map properties = dataService.getAllProperties(); | |||||
Hashtable result = new Hashtable(); | |||||
for (Iterator i = properties.keySet().iterator(); i.hasNext();) { | |||||
String name = (String) i.next(); | |||||
Object value = properties.get(name); | |||||
if (!(value instanceof String)) { | |||||
result.put(name, value); | |||||
try { | |||||
Map dataValues = dataService.getAllDataValues(); | |||||
Hashtable result = new Hashtable(); | |||||
for (Iterator i = dataValues.keySet().iterator(); i.hasNext();) { | |||||
String name = (String) i.next(); | |||||
DataValue dataValue = (DataValue) dataValues.get(name); | |||||
if (!(dataValue.getValue() instanceof String)) { | |||||
result.put(name, dataValue.getValue()); | |||||
} | |||||
} | } | ||||
} | |||||
return result; | |||||
return result; | |||||
} catch (AntException e) { | |||||
throw new BuildException(e); | |||||
} | |||||
} | } | ||||
/** | /** | ||||
@@ -866,10 +889,10 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||||
Object source = event.getSource(); | Object source = event.getSource(); | ||||
if (source instanceof Task) { | if (source instanceof Task) { | ||||
fireMessageLogged((Task) source, event.getMessage(), | fireMessageLogged((Task) source, event.getMessage(), | ||||
event.getPriority()); | |||||
event.getPriority()); | |||||
} else { | } else { | ||||
fireMessageLogged(this, event.getMessage(), | fireMessageLogged(this, event.getMessage(), | ||||
event.getPriority()); | |||||
event.getPriority()); | |||||
} | } | ||||
} | } | ||||
@@ -896,18 +919,15 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||||
} | } | ||||
/** | /** | ||||
* Add a reference to an object. NOte that in Ant2 objects and properties | |||||
* Add a reference to an object. Note that in Ant2 objects and properties | |||||
* occupy the same namespace. | * occupy the same namespace. | ||||
* | * | ||||
* @param name the reference name | * @param name the reference name | ||||
* @param value the object to be associated with the given name. | |||||
* @param reference the reference to be added. | |||||
*/ | */ | ||||
public void addReference(String name, Object value) { | |||||
try { | |||||
dataService.setDataValue(name, value); | |||||
} catch (AntException e) { | |||||
throw new BuildException(e.getMessage(), e); | |||||
} | |||||
public void addReference(String name, Object reference) { | |||||
DataValue value = new DataValue(reference, DataValue.PRIORITY_BASE); | |||||
setDataValue(name, value, false); | |||||
} | } | ||||
@@ -962,8 +982,8 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||||
/** | /** | ||||
* Convienence method to copy a file from a source to a destination | * Convienence method to copy a file from a source to a destination | ||||
* specifying if token filtering must be used, if source files may | * specifying if token filtering must be used, if source files may | ||||
* overwrite newer destination files and the last modified time | |||||
* of <code>destFile</code> file should be made equal to the last | |||||
* overwrite newer destination files and the last modified time of | |||||
* <code>destFile</code> file should be made equal to the last | |||||
* modified time of <code>sourceFile</code>. | * modified time of <code>sourceFile</code>. | ||||
* | * | ||||
* @param sourceFile the source file to be copied | * @param sourceFile the source file to be copied | ||||
@@ -1034,8 +1054,8 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||||
* Convienence method to copy a file from a source to a destination | * Convienence method to copy a file from a source to a destination | ||||
* specifying if token filtering must be used, if source files may | * specifying if token filtering must be used, if source files may | ||||
* overwrite newer destination files and the last modified time of | * overwrite newer destination files and the last modified time of | ||||
* <code>destFile</code> file should be made equal to the last | |||||
* modified time of <code>sourceFile</code>. | |||||
* <code>destFile</code> file should be made equal to the last modified | |||||
* time of <code>sourceFile</code>. | |||||
* | * | ||||
* @param sourceFile the source file to be copied | * @param sourceFile the source file to be copied | ||||
* @param destFile the destination to which the file is copied | * @param destFile the destination to which the file is copied | ||||
@@ -1054,7 +1074,6 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||||
} | } | ||||
/** | /** | ||||
* Initialise this project | * Initialise this project | ||||
* | * | ||||
@@ -1072,16 +1091,14 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||||
} | } | ||||
/** | /** | ||||
* Connect this project to its subordinate. | |||||
* | |||||
* When the subordinate project is created it will call this method to | |||||
* inform this project. The core services are then initialised using the | |||||
* context of the subordinate project | |||||
* Connect this project to its subordinate. When the subordinate project | |||||
* is created it will call this method to inform this project. The core | |||||
* services are then initialised using the context of the subordinate | |||||
* project | |||||
* | * | ||||
* @param subordinate the subordinate project | * @param subordinate the subordinate project | ||||
* | |||||
* @exception AntException if there is a problem configuring this project to | |||||
* use the subordinate's context. | |||||
* @exception AntException if there is a problem configuring this project | |||||
* to use the subordinate's context. | |||||
*/ | */ | ||||
private void setSubordinate(Project subordinate) throws AntException { | private void setSubordinate(Project subordinate) throws AntException { | ||||
initContext(subordinate.getContext()); | initContext(subordinate.getContext()); | ||||
@@ -1097,12 +1114,11 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||||
} | } | ||||
/** | /** | ||||
* Sets the base directory for the project, checking that | |||||
* the given filename exists and is a directory. | |||||
* | |||||
* @param baseDir The project base directory. | |||||
* Must not be <code>null</code>. | |||||
* Sets the base directory for the project, checking that the given | |||||
* filename exists and is a directory. | |||||
* | * | ||||
* @param baseDir The project base directory. Must not be <code>null</code> | |||||
* . | |||||
* @exception BuildException if the directory if invalid | * @exception BuildException if the directory if invalid | ||||
*/ | */ | ||||
public void setBasedir(String baseDir) throws BuildException { | public void setBasedir(String baseDir) throws BuildException { | ||||
@@ -1110,13 +1126,13 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||||
} | } | ||||
/** | /** | ||||
* Sets the base directory for the project, checking that | |||||
* the given file exists and is a directory. | |||||
* Sets the base directory for the project, checking that the given file | |||||
* exists and is a directory. | |||||
* | * | ||||
* @param baseDir The project base directory. | |||||
* Must not be <code>null</code>. | |||||
* @exception BuildException if the specified file doesn't exist or | |||||
* isn't a directory | |||||
* @param baseDir The project base directory. Must not be <code>null</code> | |||||
* . | |||||
* @exception BuildException if the specified file doesn't exist or isn't | |||||
* a directory | |||||
*/ | */ | ||||
public void setBaseDir(File baseDir) throws BuildException { | public void setBaseDir(File baseDir) throws BuildException { | ||||
try { | try { | ||||
@@ -1214,20 +1230,17 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||||
/** | /** | ||||
* Returns the canonical form of a filename. | |||||
* <p> | |||||
* If the specified file name is relative it is resolved | |||||
* with respect to the given root directory. | |||||
* | |||||
* @param fileName The name of the file to resolve. | |||||
* Must not be <code>null</code>. | |||||
* Returns the canonical form of a filename. <p> | |||||
* | * | ||||
* @param rootDir The directory to resolve relative file names with | |||||
* respect to. May be <code>null</code>, in which case | |||||
* the current directory is used. | |||||
* If the specified file name is relative it is resolved with respect to | |||||
* the given root directory. | |||||
* | * | ||||
* @param fileName The name of the file to resolve. Must not be | |||||
* <code>null</code>. | |||||
* @param rootDir The directory to resolve relative file names with | |||||
* respect to. May be <code>null</code>, in which case the current | |||||
* directory is used. | |||||
* @return the resolved File. | * @return the resolved File. | ||||
* | |||||
* @deprecated | * @deprecated | ||||
*/ | */ | ||||
public File resolveFile(String fileName, File rootDir) { | public File resolveFile(String fileName, File rootDir) { | ||||
@@ -1356,6 +1369,7 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||||
/** send build started event to the listeners */ | /** send build started event to the listeners */ | ||||
protected void fireBuildStarted() { | protected void fireBuildStarted() { | ||||
BuildEvent event = new BuildEvent(this); | BuildEvent event = new BuildEvent(this); | ||||
Vector listeners = getBuildListeners(); | |||||
for (int i = 0; i < listeners.size(); i++) { | for (int i = 0; i < listeners.size(); i++) { | ||||
BuildListener listener = (BuildListener) listeners.elementAt(i); | BuildListener listener = (BuildListener) listeners.elementAt(i); | ||||
listener.buildStarted(event); | listener.buildStarted(event); | ||||
@@ -1370,6 +1384,7 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||||
protected void fireBuildFinished(Throwable exception) { | protected void fireBuildFinished(Throwable exception) { | ||||
BuildEvent event = new BuildEvent(this); | BuildEvent event = new BuildEvent(this); | ||||
event.setException(exception); | event.setException(exception); | ||||
Vector listeners = getBuildListeners(); | |||||
for (int i = 0; i < listeners.size(); i++) { | for (int i = 0; i < listeners.size(); i++) { | ||||
BuildListener listener = (BuildListener) listeners.elementAt(i); | BuildListener listener = (BuildListener) listeners.elementAt(i); | ||||
listener.buildFinished(event); | listener.buildFinished(event); | ||||
@@ -1384,6 +1399,7 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||||
*/ | */ | ||||
protected void fireTargetStarted(Target target) { | protected void fireTargetStarted(Target target) { | ||||
BuildEvent event = new BuildEvent(target); | BuildEvent event = new BuildEvent(target); | ||||
Vector listeners = getBuildListeners(); | |||||
for (int i = 0; i < listeners.size(); i++) { | for (int i = 0; i < listeners.size(); i++) { | ||||
BuildListener listener = (BuildListener) listeners.elementAt(i); | BuildListener listener = (BuildListener) listeners.elementAt(i); | ||||
listener.targetStarted(event); | listener.targetStarted(event); | ||||
@@ -1399,6 +1415,7 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||||
protected void fireTargetFinished(Target target, Throwable exception) { | protected void fireTargetFinished(Target target, Throwable exception) { | ||||
BuildEvent event = new BuildEvent(target); | BuildEvent event = new BuildEvent(target); | ||||
event.setException(exception); | event.setException(exception); | ||||
Vector listeners = getBuildListeners(); | |||||
for (int i = 0; i < listeners.size(); i++) { | for (int i = 0; i < listeners.size(); i++) { | ||||
BuildListener listener = (BuildListener) listeners.elementAt(i); | BuildListener listener = (BuildListener) listeners.elementAt(i); | ||||
listener.targetFinished(event); | listener.targetFinished(event); | ||||
@@ -1414,6 +1431,7 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||||
// register this as the current task on the current thread. | // register this as the current task on the current thread. | ||||
// threadTasks.put(Thread.currentThread(), task); | // threadTasks.put(Thread.currentThread(), task); | ||||
BuildEvent event = new BuildEvent(task); | BuildEvent event = new BuildEvent(task); | ||||
Vector listeners = getBuildListeners(); | |||||
for (int i = 0; i < listeners.size(); i++) { | for (int i = 0; i < listeners.size(); i++) { | ||||
BuildListener listener = (BuildListener) listeners.elementAt(i); | BuildListener listener = (BuildListener) listeners.elementAt(i); | ||||
listener.taskStarted(event); | listener.taskStarted(event); | ||||
@@ -1432,6 +1450,7 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||||
// System.err.flush(); | // System.err.flush(); | ||||
BuildEvent event = new BuildEvent(task); | BuildEvent event = new BuildEvent(task); | ||||
event.setException(exception); | event.setException(exception); | ||||
Vector listeners = getBuildListeners(); | |||||
for (int i = 0; i < listeners.size(); i++) { | for (int i = 0; i < listeners.size(); i++) { | ||||
BuildListener listener = (BuildListener) listeners.elementAt(i); | BuildListener listener = (BuildListener) listeners.elementAt(i); | ||||
listener.taskFinished(event); | listener.taskFinished(event); | ||||
@@ -1487,6 +1506,7 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||||
private void fireMessageLoggedEvent(BuildEvent event, String message, | private void fireMessageLoggedEvent(BuildEvent event, String message, | ||||
int priority) { | int priority) { | ||||
event.setMessage(message, priority); | event.setMessage(message, priority); | ||||
Vector listeners = getBuildListeners(); | |||||
for (int i = 0; i < listeners.size(); i++) { | for (int i = 0; i < listeners.size(); i++) { | ||||
BuildListener listener = (BuildListener) listeners.elementAt(i); | BuildListener listener = (BuildListener) listeners.elementAt(i); | ||||
listener.messageLogged(event); | listener.messageLogged(event); | ||||
@@ -0,0 +1,191 @@ | |||||
/* | |||||
* 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 { | |||||
} | |||||
} | |||||
@@ -106,6 +106,33 @@ public abstract class Task extends ProjectComponent | |||||
this.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 | * Sets a description of the current action. It will be usefull in | ||||
* commenting what we are doing. | * commenting what we are doing. | ||||
@@ -87,7 +87,7 @@ public class MonitorAspect extends AbstractAspect { | |||||
= new PrintStream(new FileOutputStream("monitor.log")); | = new PrintStream(new FileOutputStream("monitor.log")); | ||||
monitorLog.println("Logging started at " + new Date()); | monitorLog.println("Logging started at " + new Date()); | ||||
} catch (IOException e) { | } catch (IOException e) { | ||||
log("Unable to open monitor log", MessageLevel.MSG_WARN); | |||||
log("Unable to open monitor log", MessageLevel.WARNING); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -136,7 +136,7 @@ public class Ant extends AntBase { | |||||
ExecService execService = getExecService(); | ExecService execService = getExecService(); | ||||
Project model = execService.parseXMLBuildFile(antFile); | Project model = execService.parseXMLBuildFile(antFile); | ||||
Object key = execService.setupBuild(model, getProperties(), true); | |||||
Object key = execService.setupBuild(model, getDataValues(), true); | |||||
setSubBuildKey(key); | setSubBuildKey(key); | ||||
@@ -154,13 +154,13 @@ public class Ant extends AntBase { | |||||
PrintStream out | PrintStream out | ||||
= new PrintStream(new FileOutputStream(outfile)); | = new PrintStream(new FileOutputStream(outfile)); | ||||
DefaultLogger logger = new DefaultLogger(); | DefaultLogger logger = new DefaultLogger(); | ||||
logger.setMessageOutputLevel(MessageLevel.MSG_INFO); | |||||
logger.setMessageOutputLevel(MessageLevel.INFO); | |||||
logger.setOutputPrintStream(out); | logger.setOutputPrintStream(out); | ||||
logger.setErrorPrintStream(out); | logger.setErrorPrintStream(out); | ||||
execService.addBuildListener(key, logger); | execService.addBuildListener(key, logger); | ||||
} catch (IOException ex) { | } catch (IOException ex) { | ||||
log("Ant: Can't set output to " + output, | log("Ant: Can't set output to " + output, | ||||
MessageLevel.MSG_INFO); | |||||
MessageLevel.INFO); | |||||
} | } | ||||
} | } | ||||
@@ -64,6 +64,7 @@ import org.apache.ant.common.model.BuildElement; | |||||
import org.apache.ant.common.model.NamespaceValueCollection; | import org.apache.ant.common.model.NamespaceValueCollection; | ||||
import org.apache.ant.common.util.AttributeCollection; | import org.apache.ant.common.util.AttributeCollection; | ||||
import org.apache.ant.common.constants.Namespace; | import org.apache.ant.common.constants.Namespace; | ||||
import org.apache.ant.common.util.DataValue; | |||||
/** | /** | ||||
* The Ant aspect - handles all ant aspects | * The Ant aspect - handles all ant aspects | ||||
@@ -144,7 +145,8 @@ public class AntAspect extends AbstractAspect { | |||||
= model.getNamespaceAttributeValue(Namespace.ANT_META_URI, "id"); | = model.getNamespaceAttributeValue(Namespace.ANT_META_URI, "id"); | ||||
if (typeId != null) { | if (typeId != null) { | ||||
dataService.setMutableDataValue(typeId, component); | |||||
dataService.setDataValue(typeId, | |||||
new DataValue(component, DataValue.PRIORITY_BASE), true); | |||||
} | } | ||||
return super.postCreateComponent(component, model); | return super.postCreateComponent(component, model); | ||||
@@ -53,9 +53,12 @@ | |||||
*/ | */ | ||||
package org.apache.ant.antlib.system; | package org.apache.ant.antlib.system; | ||||
import java.util.ArrayList; | import java.util.ArrayList; | ||||
import java.util.HashMap; | |||||
import java.util.List; | import java.util.List; | ||||
import java.util.Map; | import java.util.Map; | ||||
import org.apache.ant.common.service.DataService; | |||||
import org.apache.ant.common.util.AntException; | import org.apache.ant.common.util.AntException; | ||||
import org.apache.ant.common.util.DataValue; | |||||
/** | /** | ||||
* Common Base class for the Ant and AntCall tasks | * Common Base class for the Ant and AntCall tasks | ||||
@@ -89,17 +92,18 @@ public abstract class AntBase extends SubBuild { | |||||
* Get the properties to be used with the sub-build | * Get the properties to be used with the sub-build | ||||
* | * | ||||
* @return the properties the sub-build will start with | * @return the properties the sub-build will start with | ||||
* @exception AntException if the data values cannot be combined with | |||||
* existing values. | |||||
*/ | */ | ||||
protected Map getProperties() { | |||||
if (!inheritAll) { | |||||
return super.getProperties(); | |||||
} | |||||
// need to combine existing properties with new ones | |||||
Map subBuildProperties = getDataService().getAllProperties(); | |||||
subBuildProperties.putAll(super.getProperties()); | |||||
return subBuildProperties; | |||||
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; | |||||
} | } | ||||
@@ -71,7 +71,7 @@ public class AntCall extends AntBase { | |||||
setProperty(MagicProperties.BASEDIR, | setProperty(MagicProperties.BASEDIR, | ||||
getExecService().getBaseDir().getAbsolutePath()); | getExecService().getBaseDir().getAbsolutePath()); | ||||
Object key = getExecService().setupBuild(getProperties(), true); | |||||
Object key = getExecService().setupBuild(getDataValues(), true); | |||||
setSubBuildKey(key); | setSubBuildKey(key); | ||||
getExecService().runBuild(key, getTargets()); | getExecService().runBuild(key, getTargets()); | ||||
setSubBuildKey(null); | setSubBuildKey(null); | ||||
@@ -156,7 +156,7 @@ public class LibPath extends AbstractTask { | |||||
ComponentService componentService = (ComponentService) | ComponentService componentService = (ComponentService) | ||||
context.getCoreService(ComponentService.class); | context.getCoreService(ComponentService.class); | ||||
log("Adding lib path " + url + " for " + libraryId, | log("Adding lib path " + url + " for " + libraryId, | ||||
MessageLevel.MSG_DEBUG); | |||||
MessageLevel.DEBUG); | |||||
componentService.addLibPath(libraryId, url); | componentService.addLibPath(libraryId, url); | ||||
} | } | ||||
@@ -53,9 +53,13 @@ | |||||
*/ | */ | ||||
package org.apache.ant.antlib.system; | package org.apache.ant.antlib.system; | ||||
import java.io.File; | import java.io.File; | ||||
import java.util.HashMap; | |||||
import java.util.Map; | |||||
import org.apache.ant.common.antlib.AntContext; | import org.apache.ant.common.antlib.AntContext; | ||||
import org.apache.ant.common.model.Project; | 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.AntException; | ||||
import org.apache.ant.common.util.DataValue; | |||||
/** | /** | ||||
* A Task to create a project reference. | * A Task to create a project reference. | ||||
@@ -106,6 +110,21 @@ public class Ref extends SubBuild { | |||||
} | } | ||||
/** | |||||
* Get the properties to be used with the references | |||||
* | |||||
* @return the properties the sub-build will start with | |||||
* @exception AntException if the data values cannot be retrieved. | |||||
*/ | |||||
protected Map getDataValues() throws AntException { | |||||
DataService dataService = getDataService(); | |||||
Map values = new HashMap(super.getDataValues()); | |||||
dataService.mergeDataValues(values, dataService.getAllDataValues(), | |||||
DataValue.PRIORITY_USER); | |||||
return values; | |||||
} | |||||
/** | /** | ||||
* Create the project reference | * Create the project reference | ||||
* | * | ||||
@@ -114,7 +133,7 @@ public class Ref extends SubBuild { | |||||
public void execute() throws AntException { | public void execute() throws AntException { | ||||
Project model = getExecService().parseXMLBuildFile(projectFile); | Project model = getExecService().parseXMLBuildFile(projectFile); | ||||
getExecService().createProjectReference(name, model, getProperties()); | |||||
getExecService().createProjectReference(name, model, getDataValues()); | |||||
} | } | ||||
} | } | ||||
@@ -61,6 +61,7 @@ import org.apache.ant.common.antlib.ValidationException; | |||||
import org.apache.ant.common.service.DataService; | import org.apache.ant.common.service.DataService; | ||||
import org.apache.ant.common.service.ExecService; | import org.apache.ant.common.service.ExecService; | ||||
import org.apache.ant.common.util.AntException; | import org.apache.ant.common.util.AntException; | ||||
import org.apache.ant.common.util.DataValue; | |||||
/** | /** | ||||
* Common Base class all tasks that can pass references and property overrides | * Common Base class all tasks that can pass references and property overrides | ||||
@@ -217,8 +218,8 @@ public abstract class SubBuild extends AbstractTask { | |||||
/** The core's ExecutionService for running builds and external programs */ | /** The core's ExecutionService for running builds and external programs */ | ||||
private ExecService execService; | private ExecService execService; | ||||
/** The properties which will be passed to the sub-build */ | |||||
private Map properties = new HashMap(); | |||||
/** The data values which will be passed to the sub-build */ | |||||
private Map dataValues = new HashMap(); | |||||
/** | /** | ||||
@@ -227,7 +228,9 @@ public abstract class SubBuild extends AbstractTask { | |||||
* @param property descriptor for the property to be passed | * @param property descriptor for the property to be passed | ||||
*/ | */ | ||||
public void addProperty(Property property) { | public void addProperty(Property property) { | ||||
properties.put(property.getName(), property.getValue()); | |||||
DataValue value | |||||
= new DataValue(property.getValue(), DataValue.PRIORITY_INHERIT); | |||||
dataValues.put(property.getName(), value); | |||||
} | } | ||||
@@ -235,8 +238,8 @@ public abstract class SubBuild extends AbstractTask { | |||||
* Add a reference to be passed | * Add a reference to be passed | ||||
* | * | ||||
* @param reference the descriptor of the reference to be passed | * @param reference the descriptor of the reference to be passed | ||||
* @exception AntException if the reference does not reference a | |||||
* valid object | |||||
* @exception AntException if the reference does not reference a valid | |||||
* object | |||||
*/ | */ | ||||
public void addReference(Reference reference) throws AntException { | public void addReference(Reference reference) throws AntException { | ||||
String refId = reference.getRefId(); | String refId = reference.getRefId(); | ||||
@@ -251,7 +254,7 @@ public abstract class SubBuild extends AbstractTask { | |||||
toId = refId; | toId = refId; | ||||
} | } | ||||
properties.put(toId, value); | |||||
dataValues.put(toId, new DataValue(value, DataValue.PRIORITY_INHERIT)); | |||||
} | } | ||||
@@ -278,10 +281,11 @@ public abstract class SubBuild extends AbstractTask { | |||||
/** | /** | ||||
* Get the properties to be used with the sub-build | * Get the properties to be used with the sub-build | ||||
* | * | ||||
* @return the properties the sub-build will start with | |||||
* @return the data values the sub-build will start with | |||||
* @exception AntException if the datavalues cannot be retrieved. | |||||
*/ | */ | ||||
protected Map getProperties() { | |||||
return properties; | |||||
protected Map getDataValues() throws AntException { | |||||
return dataValues; | |||||
} | } | ||||
@@ -308,7 +312,9 @@ public abstract class SubBuild extends AbstractTask { | |||||
* @param propertyValue the value of the property | * @param propertyValue the value of the property | ||||
*/ | */ | ||||
protected void setProperty(String propertyName, Object propertyValue) { | protected void setProperty(String propertyName, Object propertyValue) { | ||||
properties.put(propertyName, propertyValue); | |||||
DataValue value | |||||
= new DataValue(propertyValue, DataValue.PRIORITY_INHERIT); | |||||
dataValues.put(propertyName, value); | |||||
} | } | ||||
} | } | ||||
@@ -1,45 +1,106 @@ | |||||
package org.apache.ant.builder; | package org.apache.ant.builder; | ||||
public class Ant1CompatBuilder { | public class Ant1CompatBuilder { | ||||
protected void _init(BuildHelper helper) { | protected void _init(BuildHelper helper) { | ||||
helper.setProperty("src.dir", "src"); | |||||
helper.setProperty("lib.dir", "lib"); | |||||
helper.setProperty("java.dir", "${src.dir}/java"); | |||||
helper.setProperty("bin.dir", "bin"); | |||||
helper.setProperty("dist.dir", "dist"); | |||||
helper.setProperty("javadocs.dir", "${dist.dir}/javadocs"); | |||||
helper.setProperty("distlib.dir", "${dist.dir}/lib"); | |||||
helper.setProperty("debug", "true"); | |||||
helper.setProperty("deprecation", "false"); | |||||
helper.setProperty("optimize", "true"); | |||||
helper.setProperty("junit.fork", "false"); | |||||
helper.setProperty("junit.filtertrace", "off"); | |||||
helper.setProperty("junit.summary", "no"); | |||||
helper.setProperty("ant1base.dir", "../.."); | helper.setProperty("ant1base.dir", "../.."); | ||||
helper.setProperty("ant1src.dir", "${ant1base.dir}/src"); | helper.setProperty("ant1src.dir", "${ant1base.dir}/src"); | ||||
helper.setProperty("ant1java.dir", "${ant1src.dir}/main"); | helper.setProperty("ant1java.dir", "${ant1src.dir}/main"); | ||||
helper.setProperty("ant1etc.dir", "${ant1src.dir}/etc"); | helper.setProperty("ant1etc.dir", "${ant1src.dir}/etc"); | ||||
helper.setProperty("debug", "true"); | |||||
helper.setProperty("ant1.tests.dir", "${ant1src.dir}/etc/testcases"); | |||||
helper.setProperty("src.dir", "src"); | |||||
helper.setProperty("java.dir", "${src.dir}/java"); | |||||
helper.setProperty("lib.dir", "lib"); | |||||
helper.setProperty("tests.dir", "${ant1src.dir}/testcases"); | |||||
helper.setProperty("tests.etc.dir", "${src.dir}/etc/testcases"); | |||||
helper.setProperty("bin.dir", "bin"); | |||||
helper.setProperty("dist.dir", "dist"); | |||||
helper.setProperty("dist.lib.dir", "${dist.dir}/lib"); | |||||
helper.setProperty("dist.core.dir", "${dist.lib.dir}/core"); | |||||
helper.setProperty("dist.antlibs.dir", "${dist.lib.dir}/antlibs"); | |||||
helper.setProperty("dist.syslibs.dir", "${dist.core.dir}/syslibs"); | |||||
helper.setProperty("ant.package", "org/apache/tools/ant"); | helper.setProperty("ant.package", "org/apache/tools/ant"); | ||||
helper.setProperty("optional.package", "${ant.package}/taskdefs/optional"); | helper.setProperty("optional.package", "${ant.package}/taskdefs/optional"); | ||||
helper.setProperty("optional.type.package", "${ant.package}/types/optional"); | helper.setProperty("optional.type.package", "${ant.package}/types/optional"); | ||||
helper.setProperty("util.package", "${ant.package}/util"); | helper.setProperty("util.package", "${ant.package}/util"); | ||||
helper.setProperty("regexp.package", "${util.package}/regexp"); | helper.setProperty("regexp.package", "${util.package}/regexp"); | ||||
helper.setProperty("build.tests", "${bin.dir}/testcases"); | |||||
helper.createPath("classpath"); | helper.createPath("classpath"); | ||||
helper.addFileSetToPath("classpath", | helper.addFileSetToPath("classpath", | ||||
"${lib.dir}/parser", "*.jar"); | |||||
helper.addFileSetToPath("classpath", | |||||
"${lib.dir}/ant1compat", "*.jar"); | |||||
helper.addPathElementToPath("classpath", "${distlib.dir}/init.jar"); | |||||
helper.addPathElementToPath("classpath", "${distlib.dir}/common/common.jar"); | |||||
helper.addPathElementToPath("classpath", "${distlib.dir}/syslibs/system.jar"); | |||||
"${dist.core.dir}/parser", "*.jar"); | |||||
helper.addPathElementToPath("classpath", "${dist.core.dir}/start/init.jar"); | |||||
helper.addPathElementToPath("classpath", "${dist.core.dir}/common/common.jar"); | |||||
helper.addPathElementToPath("classpath", "${dist.syslibs.dir}/system.jar"); | |||||
helper.createPath("tests-classpath"); | |||||
helper.addPathElementToPath("tests-classpath", "${build.classes}"); | |||||
helper.addPathElementToPath("tests-classpath", "${build.tests}"); | |||||
helper.addPathElementToPath("tests-classpath", "${tests.dir}"); | |||||
helper.addPathElementToPath("tests-classpath", "${tests.etc.dir}"); | |||||
helper.addPathToPath("tests-classpath", "classpath"); | |||||
} | } | ||||
protected void check_for_optional_packages(BuildHelper helper) { | protected void check_for_optional_packages(BuildHelper helper) { | ||||
helper.runDepends(this, "check_for_optional_packages", ""); | |||||
System.out.println("check_for_optional_packages: "); | |||||
helper.setProperty("build.tests.resolved", ""); | |||||
} | } | ||||
protected void ant1compat(BuildHelper helper) { | protected void ant1compat(BuildHelper helper) { | ||||
helper.runDepends(this, "ant1compat", "check_for_optional_packages"); | |||||
System.out.println("ant1compat: "); | |||||
helper.mkdir("${bin.dir}/ant1src_copy"); | helper.mkdir("${bin.dir}/ant1src_copy"); | ||||
helper.mkdir("${bin.dir}/ant1compat"); | helper.mkdir("${bin.dir}/ant1compat"); | ||||
helper.copyFilesetRef("ant1src_tocopy", "${bin.dir}/ant1src_copy"); | helper.copyFilesetRef("ant1src_tocopy", "${bin.dir}/ant1src_copy"); | ||||
helper.javac("${bin.dir}/ant1src_copy:${java.dir}/antlibs/ant1compat", "${bin.dir}/ant1compat", "classpath"); | helper.javac("${bin.dir}/ant1src_copy:${java.dir}/antlibs/ant1compat", "${bin.dir}/ant1compat", "classpath"); | ||||
helper.copyFileset("${bin.dir}/ant1src_copy", "${bin.dir}/ant1compat"); | helper.copyFileset("${bin.dir}/ant1src_copy", "${bin.dir}/ant1compat"); | ||||
helper.copyFileset("${ant1etc.dir}", "${bin.dir}/ant1compat/${optional.package}/junit/xsl"); | helper.copyFileset("${ant1etc.dir}", "${bin.dir}/ant1compat/${optional.package}/junit/xsl"); | ||||
helper.mkdir("${distlib.dir}/antlibs/"); | |||||
helper.jar("${bin.dir}/ant1compat", "${distlib.dir}/antlibs/ant1compat.jar", | |||||
helper.mkdir("${dist.antlibs.dir}"); | |||||
helper.jar("${bin.dir}/ant1compat", "${dist.antlibs.dir}/ant1compat.jar", | |||||
"${java.dir}/antlibs/ant1compat", "antlib.xml", null, null); | "${java.dir}/antlibs/ant1compat", "antlib.xml", null, null); | ||||
} | } | ||||
protected void compile_tests(BuildHelper helper) { | |||||
helper.runDepends(this, "compile_tests", "check_for_optional_packages"); | |||||
System.out.println("compile-tests: "); | |||||
helper.mkdir("${build.tests}"); | |||||
helper.javac("${tests.dir}", "${build.tests}", "tests-classpath"); | |||||
helper.copyFilesetRef("ant1testcases_tocopy", "${tests.etc.dir}"); | |||||
} | |||||
protected void dump_info(BuildHelper helper) { | |||||
helper.runDepends(this, "dump_info", "dump_sys_properties,run_which"); | |||||
System.out.println("dump-info: "); | |||||
} | |||||
protected void dump_sys_properties(BuildHelper helper) { | |||||
helper.runDepends(this, "dump_sys_properties", "xml_check"); | |||||
System.out.println("dump-sys-properties: "); | |||||
} | |||||
protected void xml_check(BuildHelper helper) { | |||||
helper.runDepends(this, "xml_check", "check_for_optional_packages"); | |||||
System.out.println("xml-check: "); | |||||
} | |||||
protected void run_which(BuildHelper helper) { | |||||
helper.runDepends(this, "run_which", "check_for_optional_packages"); | |||||
System.out.println("run-which: "); | |||||
} | |||||
protected void probe_offline(BuildHelper helper) { | |||||
helper.runDepends(this, "probe_offline", ""); | |||||
System.out.println("probe-offline: "); | |||||
} | |||||
protected void test(BuildHelper helper) { | |||||
helper.runDepends(this, "test", "run_tests"); | |||||
System.out.println("test: "); | |||||
} | |||||
protected void run_tests(BuildHelper helper) { | |||||
helper.runDepends(this, "run_tests", "dump_info,compile_tests,probe_offline"); | |||||
System.out.println("run-tests: "); | |||||
} | |||||
protected void run_single_test(BuildHelper helper) { | |||||
helper.runDepends(this, "run_single_test", "compile_tests"); | |||||
System.out.println("run-single-test: "); | |||||
} | |||||
protected void clean(BuildHelper helper) { | protected void clean(BuildHelper helper) { | ||||
helper.runDepends(this, "clean", ""); | |||||
System.out.println("clean: "); | |||||
} | } | ||||
} | } |
@@ -60,9 +60,11 @@ import java.io.IOException; | |||||
import java.lang.reflect.Method; | import java.lang.reflect.Method; | ||||
import java.util.ArrayList; | import java.util.ArrayList; | ||||
import java.util.HashMap; | import java.util.HashMap; | ||||
import java.util.HashSet; | |||||
import java.util.Iterator; | import java.util.Iterator; | ||||
import java.util.List; | import java.util.List; | ||||
import java.util.Map; | import java.util.Map; | ||||
import java.util.Set; | |||||
import java.util.StringTokenizer; | import java.util.StringTokenizer; | ||||
import java.util.jar.Attributes; | import java.util.jar.Attributes; | ||||
import java.util.jar.JarOutputStream; | import java.util.jar.JarOutputStream; | ||||
@@ -102,6 +104,8 @@ public class BuildHelper { | |||||
/** Filesets created in the build */ | /** Filesets created in the build */ | ||||
private Map filesets = new HashMap(); | private Map filesets = new HashMap(); | ||||
/** The targets which have been run */ | |||||
private Set runTargets = new HashSet(); | |||||
/** | /** | ||||
* Set a property for the build | * Set a property for the build | ||||
@@ -117,6 +121,21 @@ public class BuildHelper { | |||||
} | } | ||||
} | } | ||||
/** | |||||
* Set the parent helper when creating a new build context | |||||
* | |||||
* @param parentHelper the parent helper | |||||
*/ | |||||
protected void setParent(BuildHelper parentHelper) { | |||||
// grab the parent's properties | |||||
Map parentProperties = parentHelper.properties; | |||||
for (Iterator i = parentProperties.keySet().iterator(); i.hasNext();) { | |||||
String propertyName = (String) i.next(); | |||||
String propertyValue = (String) parentProperties.get(propertyName); | |||||
setProperty(propertyName, propertyValue); | |||||
} | |||||
} | |||||
/** | /** | ||||
* Create a Jar | * Create a Jar | ||||
@@ -136,6 +155,8 @@ public class BuildHelper { | |||||
try { | try { | ||||
File base = new File(resolve(basedir)); | File base = new File(resolve(basedir)); | ||||
File jar = new File(resolve(jarFile)); | File jar = new File(resolve(jarFile)); | ||||
System.out.println(" [jar] Creating jar " + jar); | |||||
Manifest manifest = new Manifest(); | Manifest manifest = new Manifest(); | ||||
Attributes attributes = manifest.getMainAttributes(); | Attributes attributes = manifest.getMainAttributes(); | ||||
attributes.putValue("Manifest-Version", "1.0"); | attributes.putValue("Manifest-Version", "1.0"); | ||||
@@ -206,6 +227,11 @@ public class BuildHelper { | |||||
args[index++] = ((File) i.next()).getPath(); | args[index++] = ((File) i.next()).getPath(); | ||||
} | } | ||||
// System.out.println("Javac Arguments"); | |||||
// for (int i = 0; i < args.length; ++i) { | |||||
// System.out.println(" " + args[i]); | |||||
// } | |||||
try { | try { | ||||
Class c = Class.forName("com.sun.tools.javac.Main"); | Class c = Class.forName("com.sun.tools.javac.Main"); | ||||
Object compiler = c.newInstance(); | Object compiler = c.newInstance(); | ||||
@@ -303,12 +329,14 @@ public class BuildHelper { | |||||
File[] files = buildFileSet(filesetDir, filesetIncludes); | File[] files = buildFileSet(filesetDir, filesetIncludes); | ||||
String currentPath = (String) paths.get(pathName); | String currentPath = (String) paths.get(pathName); | ||||
for (int i = 0; i < files.length; ++i) { | |||||
if (currentPath == null || currentPath.length() == 0) { | |||||
currentPath = files[i].getPath(); | |||||
} else { | |||||
currentPath = currentPath + File.pathSeparator | |||||
+ files[i].getPath(); | |||||
if (files != null) { | |||||
for (int i = 0; i < files.length; ++i) { | |||||
if (currentPath == null || currentPath.length() == 0) { | |||||
currentPath = files[i].getPath(); | |||||
} else { | |||||
currentPath = currentPath + File.pathSeparator | |||||
+ files[i].getPath(); | |||||
} | |||||
} | } | ||||
} | } | ||||
paths.put(pathName, currentPath); | paths.put(pathName, currentPath); | ||||
@@ -549,6 +577,47 @@ public class BuildHelper { | |||||
} | } | ||||
/** | |||||
* Run a target in the build | |||||
* | |||||
* @param builder The builder object created from the original XML build | |||||
* file. | |||||
* @param target The target to run. | |||||
*/ | |||||
private void runTarget(Object builder, String target) { | |||||
try { | |||||
// use reflection to get a method with the given name | |||||
Method targetMethod | |||||
= builder.getClass().getDeclaredMethod(target, | |||||
new Class[]{BuildHelper.class}); | |||||
targetMethod.invoke(builder, new Object[]{this}); | |||||
} catch (Exception e) { | |||||
e.printStackTrace(); | |||||
throw new RuntimeException("Unable to run target \"" | |||||
+ target + "\""); | |||||
} | |||||
} | |||||
/** | |||||
* Run the dependencies of the given target. | |||||
* | |||||
* @param builder The builder object created from the original XML build | |||||
* file. | |||||
* @param targetName the target whose dependencies should be run | |||||
* @param depends the comma separated list of dependencies. | |||||
*/ | |||||
public void runDepends(Object builder, String targetName, String depends) { | |||||
StringTokenizer tokenizer = new StringTokenizer(depends, ", "); | |||||
while (tokenizer.hasMoreTokens()) { | |||||
String target = tokenizer.nextToken(); | |||||
// has this target been run | |||||
if (!runTargets.contains(target)) { | |||||
runTarget(builder, target); | |||||
} | |||||
} | |||||
runTargets.add(targetName); | |||||
} | |||||
/** | /** | ||||
* Resolve the property references in a string | * Resolve the property references in a string | ||||
* | * | ||||
@@ -556,7 +625,7 @@ public class BuildHelper { | |||||
* @return the string with property references replaced by their current | * @return the string with property references replaced by their current | ||||
* value. | * value. | ||||
*/ | */ | ||||
private String resolve(String propertyValue) { | |||||
protected String resolve(String propertyValue) { | |||||
String newValue = propertyValue; | String newValue = propertyValue; | ||||
while (newValue.indexOf("${") != -1) { | while (newValue.indexOf("${") != -1) { | ||||
@@ -90,7 +90,7 @@ public class Builder { | |||||
private static final File INPUT_ROOT | private static final File INPUT_ROOT | ||||
= new File(PACKAGE_ROOT, "input"); | = new File(PACKAGE_ROOT, "input"); | ||||
/** the input root */ | /** the input root */ | ||||
/** the root forthe depend task's support classes */ | /** the root forthe depend task's support classes */ | ||||
private static final File DEPEND_ROOT | private static final File DEPEND_ROOT | ||||
= new File(TASKDEFS_ROOT, "optional/depend"); | = new File(TASKDEFS_ROOT, "optional/depend"); | ||||
@@ -114,7 +114,7 @@ public class Builder { | |||||
*/ | */ | ||||
private void addJavaFiles(List files, File dir, boolean recurse) { | private void addJavaFiles(List files, File dir, boolean recurse) { | ||||
File[] javaFiles = dir.listFiles(); | File[] javaFiles = dir.listFiles(); | ||||
if (javaFiles != null) { | if (javaFiles != null) { | ||||
for (int i = 0; i < javaFiles.length; ++i) { | for (int i = 0; i < javaFiles.length; ++i) { | ||||
if (javaFiles[i].isDirectory() && recurse) { | if (javaFiles[i].isDirectory() && recurse) { | ||||
@@ -125,7 +125,7 @@ public class Builder { | |||||
} | } | ||||
} | } | ||||
} | } | ||||
/** | /** | ||||
* Get the Ant1 files currently required to build a bootstrap build. | * Get the Ant1 files currently required to build a bootstrap build. | ||||
* | * | ||||
@@ -157,7 +157,7 @@ public class Builder { | |||||
files.add(new File(PACKAGE_ROOT, "TaskAdapter.java")); | files.add(new File(PACKAGE_ROOT, "TaskAdapter.java")); | ||||
files.add(new File(PACKAGE_ROOT, "MatchingTask.java")); | files.add(new File(PACKAGE_ROOT, "MatchingTask.java")); | ||||
files.add(new File(PACKAGE_ROOT, "defaultManifest.mf")); | files.add(new File(PACKAGE_ROOT, "defaultManifest.mf")); | ||||
files.add(new File(TASKDEFS_ROOT, "defaults.properties")); | files.add(new File(TASKDEFS_ROOT, "defaults.properties")); | ||||
files.add(new File(TYPES_ROOT, "defaults.properties")); | files.add(new File(TYPES_ROOT, "defaults.properties")); | ||||
@@ -166,7 +166,7 @@ public class Builder { | |||||
files.add(new File(UTIL_ROOT, "regexp/RegexpFactory.java")); | files.add(new File(UTIL_ROOT, "regexp/RegexpFactory.java")); | ||||
files.add(new File(UTIL_ROOT, "regexp/RegexpMatcherFactory.java")); | files.add(new File(UTIL_ROOT, "regexp/RegexpMatcherFactory.java")); | ||||
files.add(new File(FILTERS_ROOT, "util/ChainReaderHelper.java")); | files.add(new File(FILTERS_ROOT, "util/ChainReaderHelper.java")); | ||||
// these should not be included | // these should not be included | ||||
files.remove(new File(TYPES_ROOT, "DataType.java")); | files.remove(new File(TYPES_ROOT, "DataType.java")); | ||||
files.remove(new File(TASKDEFS_ROOT, "Ant.java")); | files.remove(new File(TASKDEFS_ROOT, "Ant.java")); | ||||
@@ -177,7 +177,7 @@ public class Builder { | |||||
files.remove(new File(TASKDEFS_ROOT, "SendEmail.java")); | files.remove(new File(TASKDEFS_ROOT, "SendEmail.java")); | ||||
files.remove(new File(TASKDEFS_ROOT, "Do.java")); | files.remove(new File(TASKDEFS_ROOT, "Do.java")); | ||||
files.remove(new File(INPUT_ROOT, "InputRequest.java")); | files.remove(new File(INPUT_ROOT, "InputRequest.java")); | ||||
// not needed for bootstrap | // not needed for bootstrap | ||||
files.remove(new File(TASKDEFS_ROOT, "Java.java")); | files.remove(new File(TASKDEFS_ROOT, "Java.java")); | ||||
files.remove(new File(TASKDEFS_ROOT, "Tar.java")); | files.remove(new File(TASKDEFS_ROOT, "Tar.java")); | ||||
@@ -186,8 +186,8 @@ public class Builder { | |||||
files.remove(new File(TASKDEFS_ROOT, "BUnzip2.java")); | files.remove(new File(TASKDEFS_ROOT, "BUnzip2.java")); | ||||
files.remove(new File(TASKDEFS_ROOT, "Rmic.java")); | files.remove(new File(TASKDEFS_ROOT, "Rmic.java")); | ||||
files.remove(new File(TASKDEFS_ROOT, "SendEmail.java")); | files.remove(new File(TASKDEFS_ROOT, "SendEmail.java")); | ||||
return (File[]) files.toArray(new File[0]); | return (File[]) files.toArray(new File[0]); | ||||
} | } | ||||
@@ -202,13 +202,7 @@ public class Builder { | |||||
mainBuild.setProperty("dist.dir", "bootstrap"); | mainBuild.setProperty("dist.dir", "bootstrap"); | ||||
MutantBuilder mutantBuilder = new MutantBuilder(); | MutantBuilder mutantBuilder = new MutantBuilder(); | ||||
mutantBuilder._init(mainBuild); | mutantBuilder._init(mainBuild); | ||||
mutantBuilder.buildsetup(mainBuild); | |||||
mutantBuilder.init(mainBuild); | |||||
mutantBuilder.common(mainBuild); | |||||
mutantBuilder.antcore(mainBuild); | |||||
mutantBuilder.start(mainBuild); | |||||
mutantBuilder.frontend(mainBuild); | |||||
mutantBuilder.systemlib(mainBuild); | |||||
mutantBuilder.dist_lite(mainBuild); | |||||
Ant1CompatBuilder ant1Builder = new Ant1CompatBuilder(); | Ant1CompatBuilder ant1Builder = new Ant1CompatBuilder(); | ||||
BuildHelper ant1Build = new BuildHelper(); | BuildHelper ant1Build = new BuildHelper(); | ||||
@@ -4,96 +4,163 @@ public class MutantBuilder { | |||||
helper.setProperty("src.dir", "src"); | helper.setProperty("src.dir", "src"); | ||||
helper.setProperty("lib.dir", "lib"); | helper.setProperty("lib.dir", "lib"); | ||||
helper.setProperty("java.dir", "${src.dir}/java"); | helper.setProperty("java.dir", "${src.dir}/java"); | ||||
helper.setProperty("script.dir", "${src.dir}/script"); | |||||
helper.setProperty("conf.dir", "${src.dir}/conf"); | |||||
helper.setProperty("bin.dir", "bin"); | helper.setProperty("bin.dir", "bin"); | ||||
helper.setProperty("dist.dir", "dist"); | helper.setProperty("dist.dir", "dist"); | ||||
helper.setProperty("javadocs.dir", "${dist.dir}/javadocs"); | |||||
helper.setProperty("distlib.dir", "${dist.dir}/lib"); | |||||
helper.setProperty("dist.bin", "${dist.dir}/bin"); | |||||
helper.setProperty("dist.conf", "${dist.dir}/conf"); | |||||
helper.setProperty("javadocs.dir", "${dist.dir}/docs/manual/api"); | |||||
helper.setProperty("dist.lib.dir", "${dist.dir}/lib"); | |||||
helper.setProperty("dist.core.dir", "${dist.lib.dir}/core"); | |||||
helper.setProperty("dist.frontend.dir", "${dist.lib.dir}/frontend"); | |||||
helper.setProperty("dist.antlibs.dir", "${dist.lib.dir}/antlibs"); | |||||
helper.setProperty("dist.syslibs.dir", "${dist.core.dir}/syslibs"); | |||||
helper.setProperty("debug", "true"); | helper.setProperty("debug", "true"); | ||||
helper.setProperty("chmod.fail", "true"); | |||||
helper.createPath("classpath.parser"); | helper.createPath("classpath.parser"); | ||||
helper.addFileSetToPath("classpath.parser", | helper.addFileSetToPath("classpath.parser", | ||||
"${lib.dir}/parser", "*.jar"); | "${lib.dir}/parser", "*.jar"); | ||||
helper.createPath("classpath.common"); | helper.createPath("classpath.common"); | ||||
helper.addPathElementToPath("classpath.common", "${distlib.dir}/init.jar"); | |||||
helper.addPathElementToPath("classpath.common", "${dist.core.dir}/start/init.jar"); | |||||
helper.createPath("classpath.antcore"); | helper.createPath("classpath.antcore"); | ||||
helper.addPathElementToPath("classpath.antcore", "${distlib.dir}/common/common.jar"); | |||||
helper.addPathElementToPath("classpath.antcore", "${dist.core.dir}/common/common.jar"); | |||||
helper.addPathToPath("classpath.antcore", "classpath.common"); | helper.addPathToPath("classpath.antcore", "classpath.common"); | ||||
helper.addPathToPath("classpath.antcore", "classpath.parser"); | helper.addPathToPath("classpath.antcore", "classpath.parser"); | ||||
helper.createPath("classpath.frontend"); | helper.createPath("classpath.frontend"); | ||||
helper.addPathElementToPath("classpath.frontend", "${distlib.dir}/antcore/antcore.jar"); | |||||
helper.addPathElementToPath("classpath.frontend", "${dist.core.dir}/antcore/antcore.jar"); | |||||
helper.addPathToPath("classpath.frontend", "classpath.antcore"); | helper.addPathToPath("classpath.frontend", "classpath.antcore"); | ||||
helper.createPath("classpath.start"); | helper.createPath("classpath.start"); | ||||
helper.addPathElementToPath("classpath.start", "${distlib.dir}/init.jar"); | |||||
helper.addPathElementToPath("classpath.start", "${dist.core.dir}/start/init.jar"); | |||||
} | } | ||||
protected void buildsetup(BuildHelper helper) { | protected void buildsetup(BuildHelper helper) { | ||||
helper.runDepends(this, "buildsetup", ""); | |||||
System.out.println("buildsetup: "); | |||||
helper.mkdir("${bin.dir}"); | helper.mkdir("${bin.dir}"); | ||||
helper.mkdir("${distlib.dir}"); | |||||
helper.copyFileset("${lib.dir}/parser", "${distlib.dir}/parser"); | |||||
helper.mkdir("${dist.core.dir}"); | |||||
helper.copyFileset("${lib.dir}/parser", "${dist.core.dir}/parser"); | |||||
} | } | ||||
protected void init(BuildHelper helper) { | |||||
protected void initjar(BuildHelper helper) { | |||||
helper.runDepends(this, "initjar", "buildsetup"); | |||||
System.out.println("initjar: "); | |||||
helper.mkdir("${bin.dir}/init"); | helper.mkdir("${bin.dir}/init"); | ||||
helper.mkdir("${dist.core.dir}/start"); | |||||
helper.javac("${java.dir}/init", "${bin.dir}/init", null); | helper.javac("${java.dir}/init", "${bin.dir}/init", null); | ||||
helper.jar("${bin.dir}/init", "${distlib.dir}/init.jar", | |||||
helper.jar("${bin.dir}/init", "${dist.core.dir}/start/init.jar", | |||||
null, null, null, null); | null, null, null, null); | ||||
} | } | ||||
protected void common(BuildHelper helper) { | protected void common(BuildHelper helper) { | ||||
helper.runDepends(this, "common", "initjar"); | |||||
System.out.println("common: "); | |||||
helper.mkdir("${bin.dir}/common"); | helper.mkdir("${bin.dir}/common"); | ||||
helper.mkdir("${distlib.dir}/common"); | |||||
helper.mkdir("${dist.core.dir}/common"); | |||||
helper.javac("${java.dir}/common", "${bin.dir}/common", "classpath.common"); | helper.javac("${java.dir}/common", "${bin.dir}/common", "classpath.common"); | ||||
helper.jar("${bin.dir}/common", "${distlib.dir}/common/common.jar", | |||||
helper.jar("${bin.dir}/common", "${dist.core.dir}/common/common.jar", | |||||
null, null, null, null); | null, null, null, null); | ||||
} | } | ||||
protected void antcore(BuildHelper helper) { | protected void antcore(BuildHelper helper) { | ||||
helper.runDepends(this, "antcore", "common"); | |||||
System.out.println("antcore: "); | |||||
helper.mkdir("${bin.dir}/antcore"); | helper.mkdir("${bin.dir}/antcore"); | ||||
helper.mkdir("${distlib.dir}/antcore"); | |||||
helper.mkdir("${dist.core.dir}/antcore"); | |||||
helper.javac("${java.dir}/antcore", "${bin.dir}/antcore", "classpath.antcore"); | helper.javac("${java.dir}/antcore", "${bin.dir}/antcore", "classpath.antcore"); | ||||
helper.jar("${bin.dir}/antcore", "${distlib.dir}/antcore/antcore.jar", | |||||
helper.jar("${bin.dir}/antcore", "${dist.core.dir}/antcore/antcore.jar", | |||||
null, null, null, null); | null, null, null, null); | ||||
} | } | ||||
protected void frontend(BuildHelper helper) { | protected void frontend(BuildHelper helper) { | ||||
helper.runDepends(this, "frontend", "antcore, startjar"); | |||||
System.out.println("frontend: "); | |||||
helper.mkdir("${bin.dir}/frontend"); | helper.mkdir("${bin.dir}/frontend"); | ||||
helper.mkdir("${distlib.dir}/frontend"); | |||||
helper.mkdir("${dist.frontend.dir}"); | |||||
helper.javac("${java.dir}/frontend", "${bin.dir}/frontend", "classpath.frontend"); | helper.javac("${java.dir}/frontend", "${bin.dir}/frontend", "classpath.frontend"); | ||||
helper.jar("${bin.dir}/frontend", "${distlib.dir}/frontend/frontend.jar", | |||||
null, null, null, null); | |||||
helper.jar("${bin.dir}/frontend", "${distlib.dir}/frontend/cli.jar", | |||||
null, null, "frontend.jar", "org.apache.ant.cli.Commandline"); | |||||
helper.jar("${bin.dir}/frontend", "${dist.frontend.dir}/cli.jar", | |||||
null, null, null, "org.apache.ant.cli.Commandline"); | |||||
} | } | ||||
protected void start(BuildHelper helper) { | |||||
protected void startjar(BuildHelper helper) { | |||||
helper.runDepends(this, "startjar", "initjar"); | |||||
System.out.println("startjar: "); | |||||
helper.mkdir("${bin.dir}/start"); | helper.mkdir("${bin.dir}/start"); | ||||
helper.mkdir("${dist.core.dir}/start"); | |||||
helper.javac("${java.dir}/start", "${bin.dir}/start", "classpath.start"); | helper.javac("${java.dir}/start", "${bin.dir}/start", "classpath.start"); | ||||
helper.jar("${bin.dir}/start", "${distlib.dir}/start.jar", | |||||
helper.jar("${bin.dir}/start", "${dist.core.dir}/start/start.jar", | |||||
null, null, "init.jar", "org.apache.ant.start.Main"); | null, null, "init.jar", "org.apache.ant.start.Main"); | ||||
helper.jar("${bin.dir}/start", "${distlib.dir}/ant.jar", | |||||
helper.jar("${bin.dir}/start", "${dist.core.dir}/start/ant.jar", | |||||
null, null, "start.jar", "org.apache.tools.ant.Main"); | null, null, "start.jar", "org.apache.tools.ant.Main"); | ||||
} | } | ||||
protected void ant1compat(BuildHelper helper) { | |||||
} | |||||
protected void remote(BuildHelper helper) { | |||||
helper.mkdir("${bin.dir}/remote"); | |||||
helper.javac("${java.dir}/remote", "${bin.dir}/remote", "classpath.start"); | |||||
helper.jar("${bin.dir}/remote", "${distlib.dir}/remote.jar", | |||||
null, null, null, "org.apache.ant.remote.RemoteMain"); | |||||
} | |||||
protected void clean(BuildHelper helper) { | |||||
} | |||||
protected void antlibs(BuildHelper helper) { | protected void antlibs(BuildHelper helper) { | ||||
helper.runDepends(this, "antlibs", "common"); | |||||
System.out.println("antlibs: "); | |||||
{ | |||||
BuildHelper subHelper = new BuildHelper(); | |||||
subHelper.setProperty("libname", helper.resolve("system")); | |||||
subHelper.setProperty("antlibdir", helper.resolve("${dist.syslibs.dir}")); | |||||
subHelper.setParent(helper); | |||||
_init(subHelper); | |||||
buildlib(subHelper); | |||||
} | |||||
{ | |||||
BuildHelper subHelper = new BuildHelper(); | |||||
subHelper.setProperty("libname", helper.resolve("monitor")); | |||||
subHelper.setProperty("antlibdir", helper.resolve("${dist.syslibs.dir}")); | |||||
subHelper.setParent(helper); | |||||
_init(subHelper); | |||||
buildlib(subHelper); | |||||
} | |||||
} | } | ||||
protected void systemlib(BuildHelper helper) { | |||||
helper.mkdir("${bin.dir}/antlibs/system"); | |||||
helper.mkdir("${distlib.dir}/syslibs"); | |||||
protected void buildlib(BuildHelper helper) { | |||||
helper.runDepends(this, "buildlib", ""); | |||||
System.out.println("buildlib: "); | |||||
helper.setProperty("antlib.build.dir", "${bin.dir}/antlibs/${libname}"); | |||||
helper.setProperty("antlib.src.dir", "${java.dir}/antlibs/${libname}"); | |||||
helper.mkdir("${antlib.build.dir}"); | |||||
helper.mkdir("${antlibdir}"); | |||||
helper.createPath("classpath.antlibs"); | helper.createPath("classpath.antlibs"); | ||||
helper.addPathElementToPath("classpath.antlibs", "${distlib.dir}/common/common.jar"); | |||||
helper.addPathElementToPath("classpath.antlibs", "${dist.core.dir}/common/common.jar"); | |||||
helper.addPathToPath("classpath.antlibs", "classpath.common"); | helper.addPathToPath("classpath.antlibs", "classpath.common"); | ||||
helper.javac("${java.dir}/antlibs/system", "${bin.dir}/antlibs/system", "classpath.antlibs"); | |||||
helper.jar("${bin.dir}/antlibs/system", "${distlib.dir}/syslibs/system.jar", | |||||
"${java.dir}/antlibs/system", "antlib.xml", null, null); | |||||
helper.javac("${antlib.src.dir}", "${antlib.build.dir}", "classpath.antlibs"); | |||||
helper.jar("${antlib.build.dir}", "${antlibdir}/${libname}.jar", | |||||
"${antlib.src.dir}", "antlib.xml", null, null); | |||||
} | |||||
protected void setup_bin(BuildHelper helper) { | |||||
helper.runDepends(this, "setup_bin", ""); | |||||
System.out.println("setup-bin: "); | |||||
helper.mkdir("${dist.bin}"); | |||||
helper.copyFileset("${script.dir}/", "${dist.bin}"); | |||||
} | } | ||||
protected void main(BuildHelper helper) { | |||||
protected void setup_conf(BuildHelper helper) { | |||||
helper.runDepends(this, "setup_conf", ""); | |||||
System.out.println("setup-conf: "); | |||||
helper.mkdir("${dist.conf}"); | |||||
helper.copyFileset("${conf.dir}/", "${dist.conf}"); | |||||
} | |||||
protected void clean(BuildHelper helper) { | |||||
helper.runDepends(this, "clean", ""); | |||||
System.out.println("clean: "); | |||||
} | } | ||||
protected void checkstyle(BuildHelper helper) { | protected void checkstyle(BuildHelper helper) { | ||||
helper.runDepends(this, "checkstyle", ""); | |||||
System.out.println("checkstyle: "); | |||||
helper.mkdir("${bin.dir}/check"); | helper.mkdir("${bin.dir}/check"); | ||||
} | } | ||||
protected void javadocs(BuildHelper helper) { | protected void javadocs(BuildHelper helper) { | ||||
helper.runDepends(this, "javadocs", ""); | |||||
System.out.println("javadocs: "); | |||||
helper.mkdir("${javadocs.dir}"); | helper.mkdir("${javadocs.dir}"); | ||||
} | } | ||||
protected void test(BuildHelper helper) { | |||||
helper.runDepends(this, "test", ""); | |||||
System.out.println("test: "); | |||||
} | |||||
protected void jars(BuildHelper helper) { | |||||
helper.runDepends(this, "jars", "initjar, startjar, antcore, frontend, antlibs"); | |||||
System.out.println("jars: "); | |||||
} | |||||
protected void dist_lite(BuildHelper helper) { | |||||
helper.runDepends(this, "dist_lite", "jars, setup_bin, setup_conf"); | |||||
System.out.println("dist-lite: "); | |||||
} | |||||
protected void dist(BuildHelper helper) { | |||||
helper.runDepends(this, "dist", "dist_lite, javadocs"); | |||||
System.out.println("dist: "); | |||||
} | |||||
} | } |
@@ -94,7 +94,7 @@ public abstract class AbstractTask extends AbstractComponent implements Task { | |||||
*/ | */ | ||||
public void handleSystemOut(String line) throws AntException { | public void handleSystemOut(String line) throws AntException { | ||||
// default behaviout is to log at INFO level | // default behaviout is to log at INFO level | ||||
log(line, MessageLevel.MSG_INFO); | |||||
log(line, MessageLevel.INFO); | |||||
} | } | ||||
/** | /** | ||||
@@ -108,7 +108,7 @@ public abstract class AbstractTask extends AbstractComponent implements Task { | |||||
*/ | */ | ||||
public void handleSystemErr(String line) throws AntException { | public void handleSystemErr(String line) throws AntException { | ||||
// default behaviout is to log at WARN level | // default behaviout is to log at WARN level | ||||
log(line, MessageLevel.MSG_WARN); | |||||
log(line, MessageLevel.WARNING); | |||||
} | } | ||||
} | } | ||||
@@ -62,16 +62,10 @@ package org.apache.ant.common.constants; | |||||
public class Namespace { | public class Namespace { | ||||
/** The Ant namespace used to identify Ant metadata */ | /** The Ant namespace used to identify Ant metadata */ | ||||
public static final String ANT_META_URI | public static final String ANT_META_URI | ||||
= "http://jakarta.apache.org/ant/meta"; | |||||
/** The namespace id that is predeclared for the Ant metadata namespace */ | |||||
public static final String ANT_META_PREFIX = "ant"; | |||||
= "http://jakarta.apache.org/ant"; | |||||
/** The XML Schema namespace */ | /** The XML Schema namespace */ | ||||
public static final String XSI_URI | public static final String XSI_URI | ||||
= "http://www.w3.org/2001/XMLSchema-instance"; | = "http://www.w3.org/2001/XMLSchema-instance"; | ||||
/** The namespace id that is predeclared for the Ant metadata namespace */ | |||||
public static final String XSI_PREFIX = "xsi"; | |||||
} | } | ||||
@@ -61,14 +61,14 @@ package org.apache.ant.common.event; | |||||
*/ | */ | ||||
public class MessageLevel { | public class MessageLevel { | ||||
/** Error message level */ | /** Error message level */ | ||||
public static final int MSG_ERR = 0; | |||||
public static final int ERROR = 0; | |||||
/** Warnign message level */ | /** Warnign message level */ | ||||
public static final int MSG_WARN = 1; | |||||
public static final int WARNING = 1; | |||||
/** Informational message level */ | /** Informational message level */ | ||||
public static final int MSG_INFO = 2; | |||||
public static final int INFO = 2; | |||||
/** Verbose message level */ | /** Verbose message level */ | ||||
public static final int MSG_VERBOSE = 3; | |||||
public static final int VERBOSE = 3; | |||||
/** Debug Message level */ | /** Debug Message level */ | ||||
public static final int MSG_DEBUG = 4; | |||||
public static final int DEBUG = 4; | |||||
} | } | ||||
@@ -82,7 +82,7 @@ public class DefaultLogger extends BuildListenerAdapter implements BuildLogger { | |||||
/** The stream to where errors should be written */ | /** The stream to where errors should be written */ | ||||
private PrintStream err; | private PrintStream err; | ||||
/** The level of messages which should be let through */ | /** The level of messages which should be let through */ | ||||
private int messageOutputLevel = MessageLevel.MSG_ERR; | |||||
private int messageOutputLevel = MessageLevel.ERROR; | |||||
/** Controls whether adornments are added */ | /** Controls whether adornments are added */ | ||||
private boolean emacsMode = false; | private boolean emacsMode = false; | ||||
@@ -171,7 +171,7 @@ public class DefaultLogger extends BuildListenerAdapter implements BuildLogger { | |||||
} | } | ||||
out.println(e.getMessage()); | out.println(e.getMessage()); | ||||
if (messageOutputLevel >= MessageLevel.MSG_VERBOSE) { | |||||
if (messageOutputLevel >= MessageLevel.VERBOSE) { | |||||
t.printStackTrace(out); | t.printStackTrace(out); | ||||
} | } | ||||
@@ -218,7 +218,7 @@ public class DefaultLogger extends BuildListenerAdapter implements BuildLogger { | |||||
* @param event Description of Parameter | * @param event Description of Parameter | ||||
*/ | */ | ||||
public void targetStarted(BuildEvent event) { | public void targetStarted(BuildEvent event) { | ||||
if (MessageLevel.MSG_INFO <= messageOutputLevel) { | |||||
if (MessageLevel.INFO <= messageOutputLevel) { | |||||
Target target = (Target) event.getSource(); | Target target = (Target) event.getSource(); | ||||
out.println(lSep + target.getName() + ":"); | out.println(lSep + target.getName() + ":"); | ||||
} | } | ||||
@@ -255,7 +255,7 @@ public class DefaultLogger extends BuildListenerAdapter implements BuildLogger { | |||||
*/ | */ | ||||
public void messageLogged(BuildEvent event) { | public void messageLogged(BuildEvent event) { | ||||
PrintStream logTo | PrintStream logTo | ||||
= event.getPriority() == MessageLevel.MSG_ERR ? err : out; | |||||
= event.getPriority() == MessageLevel.ERROR ? err : out; | |||||
// Filter out messages based on priority | // Filter out messages based on priority | ||||
if (event.getPriority() <= messageOutputLevel) { | if (event.getPriority() <= messageOutputLevel) { | ||||
@@ -55,6 +55,7 @@ package org.apache.ant.common.service; | |||||
import java.util.Map; | import java.util.Map; | ||||
import org.apache.ant.common.util.AntException; | import org.apache.ant.common.util.AntException; | ||||
import org.apache.ant.common.util.DataValue; | |||||
/** | /** | ||||
* Service interface for Data value manipulation operations provided by the | * Service interface for Data value manipulation operations provided by the | ||||
@@ -64,12 +65,13 @@ import org.apache.ant.common.util.AntException; | |||||
* @created 31 January 2002 | * @created 31 January 2002 | ||||
*/ | */ | ||||
public interface DataService { | public interface DataService { | ||||
/** | /** | ||||
* Get a data value | * Get a data value | ||||
* | * | ||||
* @param valueName the name of the data value | * @param valueName 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 | |||||
* @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. | * @exception AntException if the value cannot be retrieved. | ||||
*/ | */ | ||||
Object getDataValue(String valueName) throws AntException; | Object getDataValue(String valueName) throws AntException; | ||||
@@ -80,29 +82,21 @@ public interface DataService { | |||||
* @param name the name of the data value - may contain reference | * @param name the name of the data value - may contain reference | ||||
* delimiters | * delimiters | ||||
* @return true if the value exists | * @return true if the value exists | ||||
* @exception AntException if the containing frame for the value | |||||
* does not exist | |||||
* @exception AntException if the containing frame for the value does not | |||||
* exist | |||||
*/ | */ | ||||
boolean isDataValueSet(String name) throws AntException; | boolean isDataValueSet(String name) throws AntException; | ||||
/** | /** | ||||
* Set a data value. If an existing data value exists, associated with | |||||
* the given name, the value will not be changed | |||||
* Set a data value. If an existing data value exists, associated with the | |||||
* given name, the value will not be changed | |||||
* | * | ||||
* @param valueName the name of the data value | * @param valueName the name of the data value | ||||
* @param value the value to be associated with the name | * @param value the value to be associated with the name | ||||
* @param mutable if true, existing values can be changed | |||||
* @exception AntException if the value cannot be set | * @exception AntException if the value cannot be set | ||||
*/ | */ | ||||
void setDataValue(String valueName, Object value) throws AntException; | |||||
/** | |||||
* Set a data value which can be overwritten | |||||
* | |||||
* @param valueName the name of the data value | |||||
* @param value the value to be associated with the name | |||||
* @exception AntException if the value cannot be set | |||||
*/ | |||||
void setMutableDataValue(String valueName, Object value) | |||||
void setDataValue(String valueName, DataValue value, boolean mutable) | |||||
throws AntException; | throws AntException; | ||||
/** | /** | ||||
@@ -133,9 +127,29 @@ public interface DataService { | |||||
* is an expensive operation since it must clone all of the property | * is an expensive operation since it must clone all of the property | ||||
* stores in all frames | * stores in all frames | ||||
* | * | ||||
* @return a Map containing the frames properties indexed by their full | |||||
* @return a Map containing the frames data values indexed by their full | |||||
* name. | * name. | ||||
* @exception AntExceptionif the values cannot be retrieved. | |||||
*/ | */ | ||||
Map getAllProperties(); | |||||
Map getAllDataValues() throws AntException; | |||||
/** | |||||
* 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. | |||||
*/ | |||||
void mergeDataValues(Map values, Map newValues); | |||||
/** | |||||
* 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. | |||||
*/ | |||||
void mergeDataValues(Map values, Map newValues, int threshold); | |||||
} | } | ||||
@@ -95,26 +95,26 @@ public interface ExecService { | |||||
* Setup a sub-build. | * Setup a sub-build. | ||||
* | * | ||||
* @param model the project model to be used for the build | * @param model the project model to be used for the build | ||||
* @param properties the initiali properties to be used in the build | |||||
* @param dataValue the initial properties to be used in the build | |||||
* @param addListeners true if the current frame's listeners should be | * @param addListeners true if the current frame's listeners should be | ||||
* added to the created Frame | * added to the created Frame | ||||
* @return a key to the build allowing it to be executed and managed | * @return a key to the build allowing it to be executed and managed | ||||
* @exception AntException if the subbuild cannot be setup | * @exception AntException if the subbuild cannot be setup | ||||
*/ | */ | ||||
Object setupBuild(Project model, Map properties, boolean addListeners) | |||||
Object setupBuild(Project model, Map dataValue, boolean addListeners) | |||||
throws AntException; | throws AntException; | ||||
/** | /** | ||||
* Setup a sub-build using the current frame's project model | * Setup a sub-build using the current frame's project model | ||||
* | * | ||||
* @param properties the initiali properties to be used in the build | |||||
* @param dataValue the initial properties to be used in the build | |||||
* @param addListeners true if the current frame's listeners should be | * @param addListeners true if the current frame's listeners should be | ||||
* added to the created Frame | * added to the created Frame | ||||
* @return a key to the build allowing it to be executed and managed | * @return a key to the build allowing it to be executed and managed | ||||
* @exception AntException if the subbuild cannot be setup | * @exception AntException if the subbuild cannot be setup | ||||
*/ | */ | ||||
Object setupBuild(Map properties, boolean addListeners) | |||||
Object setupBuild(Map dataValue, boolean addListeners) | |||||
throws AntException; | throws AntException; | ||||
@@ -0,0 +1,127 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||||
* reserved. | |||||
* | |||||
* Redistribution and use in source and binary forms, with or without | |||||
* modification, are permitted provided that the following conditions | |||||
* are met: | |||||
* | |||||
* 1. Redistributions of source code must retain the above copyright | |||||
* notice, this list of conditions and the following disclaimer. | |||||
* | |||||
* 2. Redistributions in binary form must reproduce the above copyright | |||||
* notice, this list of conditions and the following disclaimer in | |||||
* the documentation and/or other materials provided with the | |||||
* distribution. | |||||
* | |||||
* 3. The end-user documentation included with the redistribution, if | |||||
* any, must include the following acknowlegement: | |||||
* "This product includes software developed by the | |||||
* Apache Software Foundation (http://www.apache.org/)." | |||||
* Alternately, this acknowlegement may appear in the software itself, | |||||
* if and wherever such third-party acknowlegements normally appear. | |||||
* | |||||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
* Foundation" must not be used to endorse or promote products derived | |||||
* from this software without prior written permission. For written | |||||
* permission, please contact apache@apache.org. | |||||
* | |||||
* 5. Products derived from this software may not be called "Apache" | |||||
* nor may "Apache" appear in their names without prior written | |||||
* permission of the Apache Group. | |||||
* | |||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
* SUCH DAMAGE. | |||||
* ==================================================================== | |||||
* | |||||
* This software consists of voluntary contributions made by many | |||||
* individuals on behalf of the Apache Software Foundation. For more | |||||
* information on the Apache Software Foundation, please see | |||||
* <http://www.apache.org/>. | |||||
*/ | |||||
package org.apache.ant.common.util; | |||||
import java.util.HashMap; | |||||
import java.util.Iterator; | |||||
import java.util.Map; | |||||
/** | |||||
* A DataValue is an arbitrary value with an associated priority. | |||||
* | |||||
* @author Conor MacNeill | |||||
* @created 26 June 2002 | |||||
*/ | |||||
public class DataValue { | |||||
/** Base priority level */ | |||||
public static final int PRIORITY_BASE = 0; | |||||
/** Prioirty of values inherited from a super build. */ | |||||
public static final int PRIORITY_INHERIT = 10; | |||||
/** Priority of values specified by the user. */ | |||||
public static final int PRIORITY_USER = 20; | |||||
/** The DataValue's priority */ | |||||
private int priority; | |||||
/** The actual data. */ | |||||
private Object value; | |||||
/** | |||||
* Create a DataValue with the given data and priority. | |||||
* | |||||
* @param value the actual value | |||||
* @param priority the priority associated with this value. | |||||
*/ | |||||
public DataValue(Object value, int priority) { | |||||
this.priority = priority; | |||||
this.value = value; | |||||
} | |||||
/** | |||||
* Convert plain named values into a collection of DataValues with the | |||||
* given priority | |||||
* | |||||
* @param values A collection of values named by String keys | |||||
* @param priority The required data value to be applied to the values. | |||||
* @return A collection of datavalues corresponding to the input collection | |||||
* and having the specified priority. | |||||
*/ | |||||
public static Map makeDataValues(Map values, int priority) { | |||||
Map dataValues = new HashMap(); | |||||
for (Iterator i = values.keySet().iterator(); i.hasNext();) { | |||||
Object key = i.next(); | |||||
Object value = values.get(key); | |||||
dataValues.put(key, new DataValue(value, priority)); | |||||
} | |||||
return dataValues; | |||||
} | |||||
/** | |||||
* Gets the priority of the DataValue object | |||||
* | |||||
* @return the priority value | |||||
*/ | |||||
public int getPriority() { | |||||
return priority; | |||||
} | |||||
/** | |||||
* Gets the value of the DataValue object | |||||
* | |||||
* @return the value value | |||||
*/ | |||||
public Object getValue() { | |||||
return value; | |||||
} | |||||
} | |||||
@@ -55,8 +55,8 @@ package org.apache.ant.cli; | |||||
import java.io.File; | import java.io.File; | ||||
import java.io.FileOutputStream; | import java.io.FileOutputStream; | ||||
import java.io.IOException; | import java.io.IOException; | ||||
import java.io.PrintStream; | |||||
import java.io.OutputStream; | import java.io.OutputStream; | ||||
import java.io.PrintStream; | |||||
import java.net.MalformedURLException; | import java.net.MalformedURLException; | ||||
import java.net.URL; | import java.net.URL; | ||||
import java.util.ArrayList; | import java.util.ArrayList; | ||||
@@ -66,19 +66,21 @@ import java.util.List; | |||||
import java.util.Map; | import java.util.Map; | ||||
import org.apache.ant.antcore.config.AntConfig; | import org.apache.ant.antcore.config.AntConfig; | ||||
import org.apache.ant.antcore.execution.Frame; | import org.apache.ant.antcore.execution.Frame; | ||||
import org.apache.ant.antcore.frontend.FrontendException; | |||||
import org.apache.ant.antcore.frontend.FrontendUtils; | |||||
import org.apache.ant.antcore.modelparser.XMLProjectParser; | import org.apache.ant.antcore.modelparser.XMLProjectParser; | ||||
import org.apache.ant.antcore.xml.XMLParseException; | import org.apache.ant.antcore.xml.XMLParseException; | ||||
import org.apache.ant.common.event.BuildEvent; | import org.apache.ant.common.event.BuildEvent; | ||||
import org.apache.ant.common.event.BuildListener; | import org.apache.ant.common.event.BuildListener; | ||||
import org.apache.ant.common.event.MessageLevel; | import org.apache.ant.common.event.MessageLevel; | ||||
import org.apache.ant.common.logger.BuildLogger; | |||||
import org.apache.ant.common.logger.DefaultLogger; | |||||
import org.apache.ant.common.model.Project; | import org.apache.ant.common.model.Project; | ||||
import org.apache.ant.common.util.DataValue; | |||||
import org.apache.ant.common.util.DemuxOutputStream; | import org.apache.ant.common.util.DemuxOutputStream; | ||||
import org.apache.ant.common.logger.DefaultLogger; | |||||
import org.apache.ant.common.logger.BuildLogger; | |||||
import org.apache.ant.init.AntEnvironment; | import org.apache.ant.init.AntEnvironment; | ||||
import org.apache.ant.init.Frontend; | |||||
import org.apache.ant.init.InitUtils; | import org.apache.ant.init.InitUtils; | ||||
import org.apache.ant.frontend.FrontendUtils; | |||||
import org.apache.ant.frontend.FrontendException; | |||||
/** | /** | ||||
* This is the command line front end. It drives the core. | * This is the command line front end. It drives the core. | ||||
@@ -86,7 +88,7 @@ import org.apache.ant.frontend.FrontendException; | |||||
* @author Conor MacNeill | * @author Conor MacNeill | ||||
* @created 9 January 2002 | * @created 9 January 2002 | ||||
*/ | */ | ||||
public class Commandline { | |||||
public class Commandline implements Frontend { | |||||
/** The initialisation configuration for Ant */ | /** The initialisation configuration for Ant */ | ||||
private AntEnvironment antEnv; | private AntEnvironment antEnv; | ||||
@@ -103,16 +105,13 @@ public class Commandline { | |||||
private List targets = new ArrayList(4); | private List targets = new ArrayList(4); | ||||
/** The command line properties */ | /** The command line properties */ | ||||
private Map definedProperties = new HashMap(); | |||||
private Map definedValues = new HashMap(); | |||||
/** The Config files to use in this run */ | /** The Config files to use in this run */ | ||||
private List configFiles = new ArrayList(); | private List configFiles = new ArrayList(); | ||||
/** | |||||
* This is the build file to run. By default it is a file: type URL but | |||||
* other URL protocols can be used. | |||||
*/ | |||||
private URL buildFileURL; | |||||
/** This is the build to run. */ | |||||
private String buildSource; | |||||
/** | /** | ||||
* The Ant logger class. There may be only one logger. It will have the | * The Ant logger class. There may be only one logger. It will have the | ||||
@@ -122,29 +121,17 @@ public class Commandline { | |||||
private String loggerClassname = null; | private String loggerClassname = null; | ||||
/** Our current message output status. Follows MessageLevel values */ | /** Our current message output status. Follows MessageLevel values */ | ||||
private int messageOutputLevel = MessageLevel.MSG_INFO; | |||||
private int messageOutputLevel = MessageLevel.INFO; | |||||
/** The logger that will be used for the build */ | /** The logger that will be used for the build */ | ||||
private BuildLogger logger = null; | private BuildLogger logger = null; | ||||
/** | |||||
* Start the command line front end for mutant. | |||||
* | |||||
* @param args the commandline arguments | |||||
* @param config the initialisation configuration | |||||
*/ | |||||
public static void start(String[] args, AntEnvironment config) { | |||||
// create a command line and use it to run ant | |||||
Commandline commandline = new Commandline(); | |||||
commandline.process(args, config); | |||||
} | |||||
/** | /** | ||||
* Adds a feature to the BuildListeners attribute of the Commandline | * Adds a feature to the BuildListeners attribute of the Commandline | ||||
* object | * object | ||||
* | * | ||||
* @param eventSource the build event source to which listeners | |||||
* will be added. | |||||
* @param eventSource the build event source to which listeners will be | |||||
* added. | |||||
* @exception FrontendException if the necessary listener instances could | * @exception FrontendException if the necessary listener instances could | ||||
* not be created | * not be created | ||||
*/ | */ | ||||
@@ -205,14 +192,15 @@ public class Commandline { | |||||
* @param args the commandline arguments | * @param args the commandline arguments | ||||
* @param antEnv Ant's initialization configuration | * @param antEnv Ant's initialization configuration | ||||
*/ | */ | ||||
private void process(String[] args, AntEnvironment antEnv) { | |||||
public void start(final String[] args, final AntEnvironment antEnv) { | |||||
this.antEnv = antEnv; | this.antEnv = antEnv; | ||||
Frame mainFrame = null; | Frame mainFrame = null; | ||||
Project project = null; | Project project = null; | ||||
try { | try { | ||||
parseArguments(args); | parseArguments(args); | ||||
createLogger(); | createLogger(); | ||||
determineBuildFile(); | |||||
URL buildSourceURL = determineBuildFile(); | |||||
AntConfig config = new AntConfig(); | AntConfig config = new AntConfig(); | ||||
AntConfig userConfig = | AntConfig userConfig = | ||||
@@ -230,27 +218,32 @@ public class Commandline { | |||||
for (Iterator i = configFiles.iterator(); i.hasNext();) { | for (Iterator i = configFiles.iterator(); i.hasNext();) { | ||||
File configFile = (File) i.next(); | File configFile = (File) i.next(); | ||||
AntConfig runConfig | AntConfig runConfig | ||||
= FrontendUtils.getAntConfigFile(configFile); | |||||
= FrontendUtils.getAntConfigFile(configFile); | |||||
config.merge(runConfig); | config.merge(runConfig); | ||||
} | } | ||||
if (!buildFileURL.getProtocol().equals("file") | |||||
&& !config.isRemoteProjectAllowed()) { | |||||
if (buildSourceURL.getProtocol().equals("file")) { | |||||
System.out.println("Buildfile: " + buildSource); | |||||
} else if (!config.isRemoteProjectAllowed()) { | |||||
throw new FrontendException("Remote Projects are not allowed: " | throw new FrontendException("Remote Projects are not allowed: " | ||||
+ buildFileURL); | |||||
+ buildSourceURL); | |||||
} else { | |||||
System.out.println("Build: " + buildSourceURL); | |||||
} | } | ||||
project = parseProject(); | |||||
project = parseProject(buildSourceURL); | |||||
// create the execution manager to execute the build | // create the execution manager to execute the build | ||||
mainFrame = new Frame(antEnv, config); | mainFrame = new Frame(antEnv, config); | ||||
OutputStream demuxOut | OutputStream demuxOut | ||||
= new DemuxOutputStream(mainFrame, false); | |||||
= new DemuxOutputStream(mainFrame, false); | |||||
OutputStream demuxErr | OutputStream demuxErr | ||||
= new DemuxOutputStream(mainFrame, true); | |||||
= new DemuxOutputStream(mainFrame, true); | |||||
System.setOut(new PrintStream(demuxOut)); | System.setOut(new PrintStream(demuxOut)); | ||||
System.setErr(new PrintStream(demuxErr)); | System.setErr(new PrintStream(demuxErr)); | ||||
addBuildListeners(mainFrame); | addBuildListeners(mainFrame); | ||||
mainFrame.setProject(project); | |||||
mainFrame.initialize(definedValues); | |||||
} catch (Throwable e) { | } catch (Throwable e) { | ||||
if (logger != null) { | if (logger != null) { | ||||
BuildEvent finishedEvent | BuildEvent finishedEvent | ||||
@@ -263,9 +256,6 @@ public class Commandline { | |||||
} | } | ||||
try { | try { | ||||
mainFrame.setProject(project); | |||||
mainFrame.initialize(definedProperties); | |||||
mainFrame.startBuild(targets); | mainFrame.startBuild(targets); | ||||
System.exit(0); | System.exit(0); | ||||
} catch (Throwable t) { | } catch (Throwable t) { | ||||
@@ -274,35 +264,26 @@ public class Commandline { | |||||
} | } | ||||
/** | /** | ||||
* Use the XML parser to parse the build file into a project model | |||||
* Use the XML parser to parse the build into a project model | |||||
* | * | ||||
* @param buildSourceURL the location of the build XML source. | |||||
* @return a project model representation of the project file | * @return a project model representation of the project file | ||||
* @exception XMLParseException if the project cannot be parsed | * @exception XMLParseException if the project cannot be parsed | ||||
*/ | */ | ||||
private Project parseProject() | |||||
private Project parseProject(URL buildSourceURL) | |||||
throws XMLParseException { | throws XMLParseException { | ||||
XMLProjectParser parser = new XMLProjectParser(); | XMLProjectParser parser = new XMLProjectParser(); | ||||
Project project = parser.parseBuildFile(buildFileURL); | |||||
Project project = parser.parseBuildFile(buildSourceURL); | |||||
return project; | return project; | ||||
} | } | ||||
/** | /** | ||||
* Handle build file argument | |||||
* Handle build argument | |||||
* | * | ||||
* @param url the build file's URL | |||||
* @exception FrontendException if the build file location is not valid | |||||
* @param buildSource the build to process | |||||
*/ | */ | ||||
private void argBuildFile(String url) throws FrontendException { | |||||
try { | |||||
if (url.indexOf(":") == -1) { | |||||
// We convert any hash characters to their URL escape. | |||||
buildFileURL = InitUtils.getFileURL(new File(url)); | |||||
} else { | |||||
buildFileURL = new URL(url); | |||||
} | |||||
} catch (MalformedURLException e) { | |||||
throw new FrontendException("Build file is not valid", e); | |||||
} | |||||
private void argBuild(String buildSource) { | |||||
this.buildSource = buildSource; | |||||
} | } | ||||
/** | /** | ||||
@@ -339,26 +320,50 @@ public class Commandline { | |||||
/** | /** | ||||
* Determine the build file to use | |||||
* Determine the build to use | |||||
* | * | ||||
* @exception FrontendException if the build file cannot be found | |||||
* @return the URL of the build source. | |||||
* @exception FrontendException if the build cannot be found | |||||
*/ | */ | ||||
private void determineBuildFile() throws FrontendException { | |||||
if (buildFileURL == null) { | |||||
File defaultBuildFile | |||||
= new File(FrontendUtils.DEFAULT_BUILD_FILENAME); | |||||
if (!defaultBuildFile.exists()) { | |||||
File ant1BuildFile | |||||
= new File(FrontendUtils.DEFAULT_ANT1_FILENAME); | |||||
if (ant1BuildFile.exists()) { | |||||
defaultBuildFile = ant1BuildFile; | |||||
private URL determineBuildFile() throws FrontendException { | |||||
URL buildSourceURL = null; | |||||
try { | |||||
if (buildSource == null) { | |||||
buildSource = FrontendUtils.DEFAULT_BUILD_FILENAME; | |||||
File defaultBuildFile = new File(buildSource); | |||||
if (!defaultBuildFile.exists()) { | |||||
String ant1File = FrontendUtils.DEFAULT_ANT1_FILENAME; | |||||
File ant1BuildFile = new File(ant1File); | |||||
if (ant1BuildFile.exists()) { | |||||
buildSource = ant1File; | |||||
defaultBuildFile = ant1BuildFile; | |||||
} else { | |||||
throw new FrontendException("No build file " | |||||
+ FrontendUtils.DEFAULT_BUILD_FILENAME + " or " | |||||
+ FrontendUtils.DEFAULT_ANT1_FILENAME + " found."); | |||||
} | |||||
} | |||||
buildSourceURL = InitUtils.getFileURL(defaultBuildFile); | |||||
} else { | |||||
// we have been given a file as a string - try to figure out if | |||||
// it is a URL or just a file | |||||
try { | |||||
buildSourceURL = new URL(buildSource); | |||||
} catch (MalformedURLException e) { | |||||
// must be a file | |||||
File buildFile = new File(buildSource); | |||||
if (!buildFile.exists()) { | |||||
throw new FrontendException("Cannot find build: " | |||||
+ buildSource); | |||||
} | |||||
buildSourceURL = InitUtils.getFileURL(buildFile); | |||||
} | } | ||||
} | } | ||||
try { | |||||
buildFileURL = InitUtils.getFileURL(defaultBuildFile); | |||||
} catch (MalformedURLException e) { | |||||
throw new FrontendException("Build file is not valid", e); | |||||
} | |||||
return buildSourceURL; | |||||
} catch (MalformedURLException e) { | |||||
throw new FrontendException("Build file " + buildSource | |||||
+ " is not valid", e); | |||||
} | } | ||||
} | } | ||||
@@ -378,17 +383,17 @@ public class Commandline { | |||||
if (arg.equals("-buildfile") || arg.equals("-file") | if (arg.equals("-buildfile") || arg.equals("-file") | ||||
|| arg.equals("-f")) { | || arg.equals("-f")) { | ||||
argBuildFile(getOption(args, i++, arg)); | |||||
argBuild(getOption(args, i++, arg)); | |||||
} else if (arg.equals("-logfile") || arg.equals("-l")) { | } else if (arg.equals("-logfile") || arg.equals("-l")) { | ||||
argLogFile(getOption(args, i++, arg)); | argLogFile(getOption(args, i++, arg)); | ||||
} else if (arg.equals("-quiet") || arg.equals("-q")) { | } else if (arg.equals("-quiet") || arg.equals("-q")) { | ||||
messageOutputLevel = MessageLevel.MSG_WARN; | |||||
messageOutputLevel = MessageLevel.WARNING; | |||||
} else if (arg.equals("-verbose") || arg.equals("-v")) { | } else if (arg.equals("-verbose") || arg.equals("-v")) { | ||||
// printVersion(); | // printVersion(); | ||||
messageOutputLevel = MessageLevel.MSG_VERBOSE; | |||||
messageOutputLevel = MessageLevel.VERBOSE; | |||||
} else if (arg.equals("-debug")) { | } else if (arg.equals("-debug")) { | ||||
// printVersion(); | // printVersion(); | ||||
messageOutputLevel = MessageLevel.MSG_DEBUG; | |||||
messageOutputLevel = MessageLevel.DEBUG; | |||||
} else if (arg.equals("-config") || arg.equals("-c")) { | } else if (arg.equals("-config") || arg.equals("-c")) { | ||||
configFiles.add(new File(getOption(args, i++, arg))); | configFiles.add(new File(getOption(args, i++, arg))); | ||||
} else if (arg.equals("-listener")) { | } else if (arg.equals("-listener")) { | ||||
@@ -405,7 +410,8 @@ public class Commandline { | |||||
} else { | } else { | ||||
value = getOption(args, i++, arg); | value = getOption(args, i++, arg); | ||||
} | } | ||||
definedProperties.put(name, value); | |||||
definedValues.put(name, | |||||
new DataValue(value, DataValue.PRIORITY_USER)); | |||||
} else if (arg.startsWith("-")) { | } else if (arg.startsWith("-")) { | ||||
// we don't have any more args to recognize! | // we don't have any more args to recognize! | ||||
System.out.println("Unknown option: " + arg); | System.out.println("Unknown option: " + arg); | ||||
@@ -59,14 +59,47 @@ import java.net.URL; | |||||
import java.net.URLClassLoader; | import java.net.URLClassLoader; | ||||
/** | /** | ||||
* AntEnvironment describes the environment in which Ant is operating. | |||||
* It provides the locations of a number of key Ant components. | |||||
* AntEnvironment describes the environment in which Ant is operating. It | |||||
* provides the locations of a number of key Ant components. | |||||
* | * | ||||
* @author Conor MacNeill | * @author Conor MacNeill | ||||
* @created 9 January 2002 | * @created 9 January 2002 | ||||
*/ | */ | ||||
public class AntEnvironment { | public class AntEnvironment { | ||||
/** | |||||
* How to navigate from a URL retrieved from a core class to | |||||
* the Ant Home area | |||||
*/ | |||||
public static final String CORECLASS_TO_ANTHOME = "../../.."; | |||||
/** The configuration directory */ | |||||
public static final String SYSTEM_CONFDIR = "conf"; | |||||
/** The User's configuration directory */ | |||||
public static final String USER_CONFDIR = ".ant/conf"; | |||||
/** The library diurectory */ | |||||
public static final String LIB_DIR = "lib/"; | |||||
/** Common libraries directory */ | |||||
public static final String COMMON_DIR = "core/common/"; | |||||
/** Parser library directory */ | |||||
public static final String PARSER_DIR = "core/parser/"; | |||||
/** Core libraries directory */ | |||||
public static final String ANTCORE_DIR = "core/antcore/"; | |||||
/** System Ant libraries directory */ | |||||
public static final String SYSLIBS_DIR = "core/syslibs/"; | |||||
/** Standard Ant Libraries directory */ | |||||
public static final String ANTLIBS_DIR = "antlibs/"; | |||||
/** The Ant Home property */ | |||||
public static final String ANTHOME_PROPERTY = "ant.home"; | |||||
/** The default name of the jar containing the XML parser */ | /** The default name of the jar containing the XML parser */ | ||||
public static final String DEFAULT_PARSER_JAR = "crimson.jar"; | public static final String DEFAULT_PARSER_JAR = "crimson.jar"; | ||||
@@ -74,14 +107,14 @@ public class AntEnvironment { | |||||
private ClassLoader systemLoader; | private ClassLoader systemLoader; | ||||
/** | /** | ||||
* The common class loader loads components which are common to tasks | |||||
* and the core | |||||
* The common class loader loads components which are common to tasks and | |||||
* the core | |||||
*/ | */ | ||||
private ClassLoader commonLoader; | private ClassLoader commonLoader; | ||||
/** | /** | ||||
* The core loader is the loader which loads classes which are | |||||
* exclusively used by the Ant core | |||||
* The core loader is the loader which loads classes which are exclusively | |||||
* used by the Ant core | |||||
*/ | */ | ||||
private ClassLoader coreLoader; | private ClassLoader coreLoader; | ||||
@@ -93,8 +126,8 @@ public class AntEnvironment { | |||||
/** | /** | ||||
* The URLs to the Ant XML parser. These are available to allow tasks | * The URLs to the Ant XML parser. These are available to allow tasks | ||||
* which require XML support to use the standard parser rather than | |||||
* having to supply their own | |||||
* which require XML support to use the standard parser rather than having | |||||
* to supply their own | |||||
*/ | */ | ||||
private URL[] parserURLs; | private URL[] parserURLs; | ||||
@@ -123,22 +156,39 @@ public class AntEnvironment { | |||||
/** | /** | ||||
* Create and automatically configure the Ant Environment | * Create and automatically configure the Ant Environment | ||||
* | * | ||||
* @param libraryClass - a class loaded from the Ant library area. | |||||
* @param coreClass - a core Ant class | |||||
* @exception InitException if the configuration cannot be initialized | * @exception InitException if the configuration cannot be initialized | ||||
*/ | */ | ||||
public AntEnvironment(Class libraryClass) throws InitException { | |||||
public AntEnvironment(Class coreClass) throws InitException { | |||||
try { | try { | ||||
URL antLibURL = getAntLibURL(libraryClass); | |||||
setLibraryURL(antLibURL); | |||||
// is Ant Home set? | |||||
String antHomeProperty = System.getProperty(ANTHOME_PROPERTY); | |||||
if (antHomeProperty == null) { | |||||
URL classURL = getAntLibURL(coreClass); | |||||
antHome = new URL(classURL, CORECLASS_TO_ANTHOME); | |||||
} else { | |||||
try { | |||||
antHome = new URL(antHomeProperty); | |||||
} catch (MalformedURLException e) { | |||||
// try as a file | |||||
File antHomeDir = new File(antHomeProperty); | |||||
if (!antHomeDir.exists()) { | |||||
throw new InitException("ant.home value \"" | |||||
+ antHomeProperty + "\" is not valid."); | |||||
} | |||||
antHome = InitUtils.getFileURL(antHomeDir); | |||||
} | |||||
} | |||||
setLibraryURL(new URL(antHome, LIB_DIR)); | |||||
URL antHome = new URL(antLibURL, ".."); | |||||
setAntHome(antHome); | |||||
if (antHome.getProtocol().equals("file")) { | if (antHome.getProtocol().equals("file")) { | ||||
File systemConfigArea = new File(antHome.getFile(), "conf"); | |||||
File systemConfigArea | |||||
= new File(antHome.getFile(), SYSTEM_CONFDIR); | |||||
setSystemConfigArea(systemConfigArea); | setSystemConfigArea(systemConfigArea); | ||||
} | } | ||||
File userConfigArea | File userConfigArea | ||||
= new File(System.getProperty("user.home"), ".ant/conf"); | |||||
= new File(System.getProperty("user.home"), USER_CONFDIR); | |||||
setUserConfigArea(userConfigArea); | setUserConfigArea(userConfigArea); | ||||
// set up the class loaders that will be used when running Ant | // set up the class loaders that will be used when running Ant | ||||
@@ -147,21 +197,21 @@ public class AntEnvironment { | |||||
URL toolsJarURL = ClassLocator.getToolsJarURL(); | URL toolsJarURL = ClassLocator.getToolsJarURL(); | ||||
setToolsJarURL(toolsJarURL); | setToolsJarURL(toolsJarURL); | ||||
URL commonJarLib = new URL(libraryURL, "common/"); | |||||
URL commonJarLib = new URL(libraryURL, COMMON_DIR); | |||||
ClassLoader commonLoader | ClassLoader commonLoader | ||||
= new URLClassLoader(LoaderUtils.getLocationURLs(commonJarLib, | = new URLClassLoader(LoaderUtils.getLocationURLs(commonJarLib, | ||||
"common.jar"), systemLoader); | "common.jar"), systemLoader); | ||||
setCommonLoader(commonLoader); | setCommonLoader(commonLoader); | ||||
// core needs XML parser for parsing various XML components. | // core needs XML parser for parsing various XML components. | ||||
URL parserBase = new URL(libraryURL, "parser/"); | |||||
URL parserBase = new URL(libraryURL, PARSER_DIR); | |||||
URL[] parserURLs | URL[] parserURLs | ||||
= LoaderUtils.getLocationURLs(parserBase, DEFAULT_PARSER_JAR); | = LoaderUtils.getLocationURLs(parserBase, DEFAULT_PARSER_JAR); | ||||
setParserURLs(parserURLs); | setParserURLs(parserURLs); | ||||
URL antcoreBase = new URL(libraryURL, ANTCORE_DIR); | |||||
URL[] coreURLs | URL[] coreURLs | ||||
= LoaderUtils.getLocationURLs(new URL(libraryURL, "antcore/"), | |||||
"antcore.jar"); | |||||
= LoaderUtils.getLocationURLs(antcoreBase, "antcore.jar"); | |||||
URL[] combinedURLs = new URL[parserURLs.length + coreURLs.length]; | URL[] combinedURLs = new URL[parserURLs.length + coreURLs.length]; | ||||
System.arraycopy(coreURLs, 0, combinedURLs, 0, coreURLs.length); | System.arraycopy(coreURLs, 0, combinedURLs, 0, coreURLs.length); | ||||
System.arraycopy(parserURLs, 0, combinedURLs, coreURLs.length, | System.arraycopy(parserURLs, 0, combinedURLs, coreURLs.length, | ||||
@@ -336,6 +386,26 @@ public class AntEnvironment { | |||||
return libraryURL; | return libraryURL; | ||||
} | } | ||||
/** | |||||
* Get the location of the antlibs directory | |||||
* | |||||
* @return a URL giving the location of the antlibs directory | |||||
* @exception MalformedURLException if the URL cannot be formed. | |||||
*/ | |||||
public URL getSyslibsURL() throws MalformedURLException { | |||||
return new URL(libraryURL, SYSLIBS_DIR); | |||||
} | |||||
/** | |||||
* Get the location of the syslibs directory | |||||
* | |||||
* @return a URL giving the location of the syslibs directory | |||||
* @exception MalformedURLException if the URL cannot be formed. | |||||
*/ | |||||
public URL getAntlibsURL() throws MalformedURLException { | |||||
return new URL(libraryURL, ANTLIBS_DIR); | |||||
} | |||||
/** | /** | ||||
* Get a URL to the Ant Library directory. | * Get a URL to the Ant Library directory. | ||||
* | * | ||||
@@ -353,7 +423,7 @@ public class AntEnvironment { | |||||
initURLString = initURLString.substring(0, index + 1); | initURLString = initURLString.substring(0, index + 1); | ||||
} | } | ||||
return new URL(initURLString); | |||||
return new URL(initURLString); | |||||
} | } | ||||
} | } | ||||
@@ -0,0 +1,72 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||||
* reserved. | |||||
* | |||||
* Redistribution and use in source and binary forms, with or without | |||||
* modification, are permitted provided that the following conditions | |||||
* are met: | |||||
* | |||||
* 1. Redistributions of source code must retain the above copyright | |||||
* notice, this list of conditions and the following disclaimer. | |||||
* | |||||
* 2. Redistributions in binary form must reproduce the above copyright | |||||
* notice, this list of conditions and the following disclaimer in | |||||
* the documentation and/or other materials provided with the | |||||
* distribution. | |||||
* | |||||
* 3. The end-user documentation included with the redistribution, if | |||||
* any, must include the following acknowlegement: | |||||
* "This product includes software developed by the | |||||
* Apache Software Foundation (http://www.apache.org/)." | |||||
* Alternately, this acknowlegement may appear in the software itself, | |||||
* if and wherever such third-party acknowlegements normally appear. | |||||
* | |||||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
* Foundation" must not be used to endorse or promote products derived | |||||
* from this software without prior written permission. For written | |||||
* permission, please contact apache@apache.org. | |||||
* | |||||
* 5. Products derived from this software may not be called "Apache" | |||||
* nor may "Apache" appear in their names without prior written | |||||
* permission of the Apache Group. | |||||
* | |||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
* SUCH DAMAGE. | |||||
* ==================================================================== | |||||
* | |||||
* This software consists of voluntary contributions made by many | |||||
* individuals on behalf of the Apache Software Foundation. For more | |||||
* information on the Apache Software Foundation, please see | |||||
* <http://www.apache.org/>. | |||||
*/ | |||||
package org.apache.ant.init; | |||||
/** | |||||
* Interface which all front ends implement and is used to launch the front | |||||
* end. | |||||
* | |||||
* @author Conor MacNeill | |||||
* @created 26 June 2002 | |||||
*/ | |||||
public interface Frontend { | |||||
/** | |||||
* Start a frontend. | |||||
* | |||||
* @param args the command line arguments is any | |||||
* @param antEnv the AntEnvironment describing the operating environment. | |||||
*/ | |||||
void start(String[] args, AntEnvironment antEnv); | |||||
} | |||||
@@ -54,7 +54,6 @@ | |||||
package org.apache.ant.start; | package org.apache.ant.start; | ||||
import java.io.IOException; | import java.io.IOException; | ||||
import java.lang.reflect.Method; | |||||
import java.net.URL; | import java.net.URL; | ||||
import java.net.URLClassLoader; | import java.net.URLClassLoader; | ||||
import java.util.jar.Attributes; | import java.util.jar.Attributes; | ||||
@@ -62,6 +61,7 @@ import java.util.jar.JarInputStream; | |||||
import java.util.jar.Manifest; | import java.util.jar.Manifest; | ||||
import org.apache.ant.init.AntEnvironment; | import org.apache.ant.init.AntEnvironment; | ||||
import org.apache.ant.init.InitException; | import org.apache.ant.init.InitException; | ||||
import org.apache.ant.init.Frontend; | |||||
import java.io.File; | import java.io.File; | ||||
/** | /** | ||||
@@ -72,10 +72,6 @@ import java.io.File; | |||||
* @created 9 January 2002 | * @created 9 January 2002 | ||||
*/ | */ | ||||
public class Main { | public class Main { | ||||
/** The actual class that implements the command line front end. */ | |||||
public static final String DEFAULT_COMMANDLINE_CLASS | |||||
= "org.apache.ant.cli.Commandline"; | |||||
/** The default front end name */ | /** The default front end name */ | ||||
public static final String DEFAULT_FRONTEND = "cli"; | public static final String DEFAULT_FRONTEND = "cli"; | ||||
@@ -98,6 +94,7 @@ public class Main { | |||||
} | } | ||||
} | } | ||||
String[] mainArgs = args; | |||||
if (frontendIndex != -1) { | if (frontendIndex != -1) { | ||||
try { | try { | ||||
frontend = args[frontendIndex + 1]; | frontend = args[frontendIndex + 1]; | ||||
@@ -106,42 +103,36 @@ public class Main { | |||||
+ "-frontend argument"); | + "-frontend argument"); | ||||
} | } | ||||
String[] newArgs = new String[args.length - 2]; | |||||
mainArgs = new String[args.length - 2]; | |||||
System.arraycopy(args, 0, newArgs, 0, frontendIndex); | |||||
System.arraycopy(args, 0, mainArgs, 0, frontendIndex); | |||||
if (args.length > (frontendIndex + 2)) { | if (args.length > (frontendIndex + 2)) { | ||||
System.arraycopy(args, frontendIndex + 2, newArgs, | |||||
System.arraycopy(args, frontendIndex + 2, mainArgs, | |||||
frontendIndex, args.length - frontendIndex - 2); | frontendIndex, args.length - frontendIndex - 2); | ||||
} | } | ||||
args = newArgs; | |||||
} | } | ||||
String defaultClass = frontend.equals(DEFAULT_FRONTEND) | |||||
? DEFAULT_COMMANDLINE_CLASS : null; | |||||
main.start(frontend, defaultClass, args); | |||||
main.start(frontend, mainArgs); | |||||
} | } | ||||
/** | /** | ||||
* Internal start method used to initialise front end | * Internal start method used to initialise front end | ||||
* | * | ||||
* @param frontend the frontend jar to launch | |||||
* @param frontendName the frontend jar to launch | |||||
* @param args commandline arguments | * @param args commandline arguments | ||||
* @param defaultClass the default class to use if it cannot be determined | |||||
* from the jar itself | |||||
* @exception InitException if the front end cannot be started | * @exception InitException if the front end cannot be started | ||||
*/ | */ | ||||
public void start(String frontend, String defaultClass, String[] args) | |||||
public void start(String frontendName, String[] args) | |||||
throws InitException { | throws InitException { | ||||
try { | try { | ||||
AntEnvironment config = new AntEnvironment(getClass()); | |||||
AntEnvironment antEnv = new AntEnvironment(getClass()); | |||||
URL frontendJar = new URL(config.getLibraryURL(), | |||||
"frontend/" + frontend + ".jar"); | |||||
URL frontendJar = new URL(antEnv.getLibraryURL(), | |||||
"frontend/" + frontendName + ".jar"); | |||||
URL[] frontendJars = new URL[]{frontendJar}; | URL[] frontendJars = new URL[]{frontendJar}; | ||||
ClassLoader frontEndLoader | ClassLoader frontEndLoader | ||||
= new URLClassLoader(frontendJars, config.getCoreLoader()); | |||||
= new URLClassLoader(frontendJars, antEnv.getCoreLoader()); | |||||
//System.out.println("Front End Loader config"); | //System.out.println("Front End Loader config"); | ||||
//LoaderUtils.dumpLoader(System.out, frontEndLoader); | //LoaderUtils.dumpLoader(System.out, frontEndLoader); | ||||
@@ -150,31 +141,22 @@ public class Main { | |||||
File jarFile = new File(frontendJar.getFile()); | File jarFile = new File(frontendJar.getFile()); | ||||
if (!jarFile.exists()) { | if (!jarFile.exists()) { | ||||
throw new InitException("Could not find jar for frontend \"" | throw new InitException("Could not find jar for frontend \"" | ||||
+ frontend + "\" - expected at " + frontendJar); | |||||
+ frontendName + "\" - expected at " + frontendJar); | |||||
} | } | ||||
} | } | ||||
String mainClass = getMainClass(frontendJar); | String mainClass = getMainClass(frontendJar); | ||||
if (mainClass == null) { | |||||
mainClass = defaultClass; | |||||
} | |||||
if (mainClass == null) { | if (mainClass == null) { | ||||
throw new InitException("Unable to determine main class " | throw new InitException("Unable to determine main class " | ||||
+ " for \"" + frontend + "\" frontend"); | |||||
+ " for \"" + frontendName + "\" frontend"); | |||||
} | } | ||||
// Now start the front end by reflection. | // Now start the front end by reflection. | ||||
Class frontendClass = Class.forName(mainClass, true, | Class frontendClass = Class.forName(mainClass, true, | ||||
frontEndLoader); | frontEndLoader); | ||||
final Class[] param = {Class.forName("[Ljava.lang.String;"), | |||||
AntEnvironment.class}; | |||||
final Method startMethod | |||||
= frontendClass.getMethod("start", param); | |||||
final Object[] argument = {args, config}; | |||||
startMethod.invoke(null, argument); | |||||
Frontend frontend = (Frontend) frontendClass.newInstance(); | |||||
frontend.start(args, antEnv); | |||||
} catch (Exception e) { | } catch (Exception e) { | ||||
throw new InitException(e); | throw new InitException(e); | ||||
} | } | ||||
@@ -0,0 +1,172 @@ | |||||
#! /bin/sh | |||||
# Copyright (c) 2002 The Apache Software Foundation. All rights | |||||
# reserved. | |||||
# load system-wide ant configuration | |||||
if [ -f "/etc/mutant.conf" ] ; then | |||||
. /etc/mutant.conf | |||||
fi | |||||
# provide default values for people who don't use RPMs | |||||
if [ -z "$rpm_mode" ] ; then | |||||
rpm_mode=false; | |||||
fi | |||||
if [ -z "$usejikes" ] ; then | |||||
usejikes=false; | |||||
fi | |||||
# load user ant configuration | |||||
if [ -f "$HOME/.antrc" ] ; then | |||||
. $HOME/.antrc | |||||
fi | |||||
# OS specific support. $var _must_ be set to either true or false. | |||||
cygwin=false; | |||||
darwin=false; | |||||
case "`uname`" in | |||||
CYGWIN*) cygwin=true ;; | |||||
Darwin*) darwin=true | |||||
if [ -z "$JAVA_HOME" ] ; then | |||||
JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Home | |||||
fi | |||||
;; | |||||
esac | |||||
if [ -z "$MUTANT_HOME" ] ; then | |||||
# try to find MUTANT | |||||
if [ -d /opt/mutant ] ; then | |||||
MUTANT_HOME=/opt/mutant | |||||
fi | |||||
if [ -d ${HOME}/opt/mutant ] ; then | |||||
MUTANT_HOME=${HOME}/opt/mutant | |||||
fi | |||||
## resolve links - $0 may be a link to ant's home | |||||
PRG=$0 | |||||
progname=`basename $0` | |||||
saveddir=`pwd` | |||||
# need this for relative symlinks | |||||
cd `dirname $PRG` | |||||
while [ -h "$PRG" ] ; do | |||||
ls=`ls -ld "$PRG"` | |||||
link=`expr "$ls" : '.*-> \(.*\)$'` | |||||
if expr "$link" : '.*/.*' > /dev/null; then | |||||
PRG="$link" | |||||
else | |||||
PRG="`dirname $PRG`/$link" | |||||
fi | |||||
done | |||||
MUTANT_HOME=`dirname "$PRG"`/.. | |||||
# make it fully qualified | |||||
MUTANT_HOME=`cd "$MUTANT_HOME" && pwd` | |||||
cd $saveddir | |||||
fi | |||||
# For Cygwin, ensure paths are in UNIX format before anything is touched | |||||
if $cygwin ; then | |||||
[ -n "$MUTANT_HOME" ] && | |||||
MUTANT_HOME=`cygpath --unix "$MUTANT_HOME"` | |||||
[ -n "$JAVA_HOME" ] && | |||||
JAVA_HOME=`cygpath --unix "$JAVA_HOME"` | |||||
[ -n "$CLASSPATH" ] && | |||||
CLASSPATH=`cygpath --path --unix "$CLASSPATH"` | |||||
fi | |||||
if [ -z "$JAVACMD" ] ; then | |||||
if [ -n "$JAVA_HOME" ] ; then | |||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then | |||||
# IBM's JDK on AIX uses strange locations for the executables | |||||
JAVACMD="$JAVA_HOME/jre/sh/java" | |||||
else | |||||
JAVACMD="$JAVA_HOME/bin/java" | |||||
fi | |||||
else | |||||
JAVACMD=java | |||||
fi | |||||
fi | |||||
if [ ! -x "$JAVACMD" ] ; then | |||||
echo "Error: JAVA_HOME is not defined correctly." | |||||
echo " We cannot execute $JAVACMD" | |||||
exit 1 | |||||
fi | |||||
# in rpm_mode get ant/optional/xml parser&api from JAVALIBDIR | |||||
if $rpm_mode; then | |||||
JAVALIBDIR=/usr/share/java | |||||
# TODO - RPM structure for Mutant needs to be determined | |||||
else | |||||
# add in the dependency .jar files in non-RPM mode (the default) | |||||
STARTJARPATH="${MUTANT_HOME}"/lib/core/start/start.jar | |||||
fi | |||||
if [ -n "$JAVA_HOME" ] ; then | |||||
if [ -f "$JAVA_HOME/lib/tools.jar" ] ; then | |||||
TOOLSJARPATH="$JAVA_HOME/lib/tools.jar" | |||||
fi | |||||
# OSX hack to make Ant work with jikes | |||||
if $darwin ; then | |||||
OSXHACK="/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Classes" | |||||
if [ -d ${OSXHACK} ] ; then | |||||
for i in ${OSXHACK}/*.jar | |||||
do | |||||
JIKESPATH=$JIKESPATH:$i | |||||
done | |||||
fi | |||||
fi | |||||
else | |||||
echo "Warning: JAVA_HOME environment variable is not set." | |||||
echo " If build fails because sun.* classes could not be found" | |||||
echo " you will need to set the JAVA_HOME environment variable" | |||||
echo " to the installation directory of java." | |||||
fi | |||||
# supply JIKESPATH to Ant as jikes.class.path | |||||
if [ -n "$JIKESPATH" ] ; then | |||||
if $cygwin ; then | |||||
JIKESPATH=`cygpath --path --windows "$JIKESPATH"` | |||||
fi | |||||
ANT_OPTS="$ANT_OPTS -Djikes.class.path=$JIKESPATH" | |||||
fi | |||||
# Allow Jikes support (off by default) | |||||
if $usejikes; then | |||||
ANT_OPTS="$ANT_OPTS -Dbuild.compiler=jikes" | |||||
fi | |||||
LOCALCLASSPATH=$STARTJARPATH | |||||
if [ -n "$CLASSPATH" ] ; then | |||||
LOCALCLASSPATH="$LOCALCLASSPATH:$CLASSPATH" | |||||
fi | |||||
#Setup policy file | |||||
if [ -z $ANT_POLICY ] ; then | |||||
if [ -f $MUTANT_HOME/conf/ant.policy ] ; then | |||||
ANT_POLICY=file:$MUTANT_HOME/conf/ant.policy | |||||
fi | |||||
fi | |||||
if [ -n $ANT_POLICY ] ; then | |||||
ANT_OPTS="$ANT_OPTS -Djava.security.manager -Djava.security.policy=$ANT_POLICY" | |||||
fi | |||||
# For Cygwin, switch paths to Windows format before running java | |||||
if $cygwin; then | |||||
MUTANT_HOME=`cygpath --path --windows "$MUTANT_HOME"` | |||||
JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` | |||||
STARTJARPATH=`cygpath --path --windows "$STARTJARPATH"` | |||||
TOOLSJARPATH=`cygpath --path --windows "$TOOLSJARPATH"` | |||||
LOCALCLASSPATH=`cygpath --path --windows "$LOCALCLASSPATH"` | |||||
ANT_OPTS="$ANT_OPTS -Dcygwin.user.home="`cygpath --path --windows "$HOME"` | |||||
fi | |||||
"$JAVACMD" -classpath "$LOCALCLASSPATH" $ANT_OPTS -Dant.home=$MUTANT_HOME org.apache.ant.start.Main $ANT_ARGS "$@" |