Browse Source

Change Exception hierarchy

Much better Ant1 compatability
New monitoring aspect


git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@272784 13f79535-47bb-0310-9956-ffa450edef68
master
Conor MacNeill 23 years ago
parent
commit
f9d1c1691c
87 changed files with 3431 additions and 1398 deletions
  1. +38
    -22
      proposal/mutant/build.xml
  2. +342
    -46
      proposal/mutant/build/ant1compat.xml
  3. +12
    -11
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/antlib/AntLibException.java
  4. +3
    -4
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/antlib/AntLibHandler.java
  5. +140
    -120
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/antlib/AntLibManager.java
  6. +7
    -7
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/antlib/AntLibrary.java
  7. +5
    -6
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/antlib/AntLibrarySpec.java
  8. +3
    -3
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/antlib/ComponentLibrary.java
  9. +68
    -14
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/config/AntConfig.java
  10. +20
    -10
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/config/AntConfigHandler.java
  11. +26
    -26
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/AttributeSetter.java
  12. +4
    -4
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/BuildEventSupport.java
  13. +120
    -127
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/ComponentManager.java
  14. +5
    -5
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/CoreDataService.java
  15. +0
    -1
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/CoreEventService.java
  16. +88
    -28
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/CoreExecService.java
  17. +3
    -3
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/CoreFileService.java
  18. +0
    -1
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/CoreInputService.java
  19. +0
    -1
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/DeferredSetter.java
  20. +2
    -3
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/ExecutionContext.java
  21. +0
    -201
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/ExecutionManager.java
  22. +315
    -132
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/Frame.java
  23. +13
    -13
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/Reflector.java
  24. +3
    -3
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/Setter.java
  25. +11
    -2
      proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/TaskAdapter.java
  26. +129
    -0
      proposal/mutant/src/java/antlibs/ant1compat/org/apache/tools/ant/Ant1CompatException.java
  27. +6
    -6
      proposal/mutant/src/java/antlibs/ant1compat/org/apache/tools/ant/Ant1Converter.java
  28. +14
    -14
      proposal/mutant/src/java/antlibs/ant1compat/org/apache/tools/ant/Ant1Factory.java
  29. +2
    -2
      proposal/mutant/src/java/antlibs/ant1compat/org/apache/tools/ant/Ant1InputHandler.java
  30. +362
    -106
      proposal/mutant/src/java/antlibs/ant1compat/org/apache/tools/ant/Project.java
  31. +4
    -4
      proposal/mutant/src/java/antlibs/ant1compat/org/apache/tools/ant/ProjectComponent.java
  32. +7
    -9
      proposal/mutant/src/java/antlibs/ant1compat/org/apache/tools/ant/ProjectHelper.java
  33. +12
    -12
      proposal/mutant/src/java/antlibs/ant1compat/org/apache/tools/ant/Task.java
  34. +8
    -8
      proposal/mutant/src/java/antlibs/ant1compat/org/apache/tools/ant/taskdefs/Ant.java
  35. +7
    -7
      proposal/mutant/src/java/antlibs/ant1compat/org/apache/tools/ant/taskdefs/CallTarget.java
  36. +4
    -0
      proposal/mutant/src/java/antlibs/monitor/antlib.xml
  37. +176
    -0
      proposal/mutant/src/java/antlibs/monitor/org/apache/ant/antlib/monitor/MonitorAspect.java
  38. +94
    -0
      proposal/mutant/src/java/antlibs/monitor/org/apache/ant/antlib/monitor/MonitorRecord.java
  39. +9
    -10
      proposal/mutant/src/java/antlibs/script/org/apache/ant/antlib/script/ScriptBase.java
  40. +3
    -3
      proposal/mutant/src/java/antlibs/script/org/apache/ant/antlib/script/ScriptDef.java
  41. +129
    -0
      proposal/mutant/src/java/antlibs/script/org/apache/ant/antlib/script/ScriptException.java
  42. +10
    -11
      proposal/mutant/src/java/antlibs/script/org/apache/ant/antlib/script/ScriptFactory.java
  43. +41
    -8
      proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/Ant.java
  44. +33
    -32
      proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/AntAspect.java
  45. +8
    -7
      proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/AntBase.java
  46. +7
    -5
      proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/AntCall.java
  47. +5
    -5
      proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/FileConverter.java
  48. +9
    -8
      proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/Import.java
  49. +23
    -21
      proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/LibPath.java
  50. +21
    -19
      proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/LoadLib.java
  51. +9
    -9
      proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/Parallel.java
  52. +9
    -9
      proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/PrimitiveConverter.java
  53. +5
    -5
      proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/Ref.java
  54. +3
    -3
      proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/Sequential.java
  55. +21
    -20
      proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/SubBuild.java
  56. +129
    -0
      proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/SystemException.java
  57. +5
    -5
      proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/URLConverter.java
  58. +34
    -24
      proposal/mutant/src/java/common/org/apache/ant/common/antlib/AbstractAspect.java
  59. +7
    -7
      proposal/mutant/src/java/common/org/apache/ant/common/antlib/AbstractComponent.java
  60. +5
    -5
      proposal/mutant/src/java/common/org/apache/ant/common/antlib/AbstractTask.java
  61. +3
    -3
      proposal/mutant/src/java/common/org/apache/ant/common/antlib/AntContext.java
  62. +9
    -9
      proposal/mutant/src/java/common/org/apache/ant/common/antlib/AntLibFactory.java
  63. +23
    -23
      proposal/mutant/src/java/common/org/apache/ant/common/antlib/Aspect.java
  64. +129
    -0
      proposal/mutant/src/java/common/org/apache/ant/common/antlib/AspectException.java
  65. +4
    -6
      proposal/mutant/src/java/common/org/apache/ant/common/antlib/Converter.java
  66. +129
    -0
      proposal/mutant/src/java/common/org/apache/ant/common/antlib/ConverterException.java
  67. +5
    -5
      proposal/mutant/src/java/common/org/apache/ant/common/antlib/ExecutionComponent.java
  68. +9
    -9
      proposal/mutant/src/java/common/org/apache/ant/common/antlib/StandardLibFactory.java
  69. +7
    -7
      proposal/mutant/src/java/common/org/apache/ant/common/antlib/Task.java
  70. +3
    -3
      proposal/mutant/src/java/common/org/apache/ant/common/antlib/TaskContainer.java
  71. +130
    -0
      proposal/mutant/src/java/common/org/apache/ant/common/antlib/ValidationException.java
  72. +1
    -1
      proposal/mutant/src/java/common/org/apache/ant/common/logger/BuildLogger.java
  73. +1
    -1
      proposal/mutant/src/java/common/org/apache/ant/common/logger/DefaultLogger.java
  74. +63
    -0
      proposal/mutant/src/java/common/org/apache/ant/common/service/BuildKey.java
  75. +24
    -26
      proposal/mutant/src/java/common/org/apache/ant/common/service/ComponentService.java
  76. +13
    -13
      proposal/mutant/src/java/common/org/apache/ant/common/service/DataService.java
  77. +5
    -5
      proposal/mutant/src/java/common/org/apache/ant/common/service/EventService.java
  78. +72
    -25
      proposal/mutant/src/java/common/org/apache/ant/common/service/ExecService.java
  79. +3
    -3
      proposal/mutant/src/java/common/org/apache/ant/common/service/FileService.java
  80. +3
    -3
      proposal/mutant/src/java/common/org/apache/ant/common/service/InputService.java
  81. +12
    -0
      proposal/mutant/src/java/common/org/apache/ant/common/service/MagicProperties.java
  82. +8
    -8
      proposal/mutant/src/java/common/org/apache/ant/common/util/FileUtils.java
  83. +9
    -16
      proposal/mutant/src/java/common/org/apache/ant/common/util/GeneralException.java
  84. +3
    -3
      proposal/mutant/src/java/common/org/apache/ant/common/util/PropertyUtils.java
  85. +48
    -43
      proposal/mutant/src/java/frontend/org/apache/ant/cli/Commandline.java
  86. +129
    -0
      proposal/mutant/src/java/frontend/org/apache/ant/frontend/FrontendException.java
  87. +8
    -9
      proposal/mutant/src/java/frontend/org/apache/ant/frontend/FrontendUtils.java

+ 38
- 22
proposal/mutant/build.xml View File

@@ -8,13 +8,13 @@
<property name="dist.dir" value="dist"/> <property name="dist.dir" value="dist"/>
<property name="javadocs.dir" value="${dist.dir}/javadocs"/> <property name="javadocs.dir" value="${dist.dir}/javadocs"/>
<property name="distlib.dir" value="${dist.dir}/lib"/> <property name="distlib.dir" value="${dist.dir}/lib"/>
<property name="debug" value="true"/> <property name="debug" 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="${distlib.dir}/init.jar"/>
</path> </path>
@@ -29,13 +29,13 @@
<path refid="classpath.antcore"/> <path refid="classpath.antcore"/>
<pathelement location="${distlib.dir}/antcore/antcore.jar"/> <pathelement location="${distlib.dir}/antcore/antcore.jar"/>
</path> </path>
<path id="classpath.start"> <path id="classpath.start">
<pathelement location="${distlib.dir}/init.jar"/> <pathelement location="${distlib.dir}/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}"/> <mkdir dir="${distlib.dir}"/>
@@ -123,7 +123,7 @@
<target name="ant1compat" depends="common"> <target name="ant1compat" depends="common">
<ant antfile="build/ant1compat.xml" /> <ant antfile="build/ant1compat.xml" />
</target> </target>
<target name="remote" depends="init"> <target name="remote" depends="init">
<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">
@@ -138,38 +138,46 @@
</manifest> </manifest>
</jar> </jar>
</target> </target>
<target name="clean"> <target name="clean">
<delete dir="${bin.dir}"/> <delete dir="${bin.dir}"/>
<delete dir="${dist.dir}"/> <delete dir="${dist.dir}"/>
</target> </target>


<target name="antlibs" depends="common, systemlib">
<ant antfile="build/script.xml"/>
<target name="antlibs" depends="common">
<ant antfile="build/script.xml"/>
<antcall target="buildlib">
<param name="libid" value="system"/>
<param name="libarea" value="syslibs"/>
</antcall>
<antcall target="buildlib">
<param name="libid" value="monitor"/>
<param name="libarea" value="syslibs"/>
</antcall>
</target> </target>
<target name="systemlib" depends="common">
<mkdir dir="${bin.dir}/antlibs/system"/>
<mkdir dir="${distlib.dir}/syslibs"/>
<target name="buildlib">
<mkdir dir="${bin.dir}/${libarea}/${libid}"/>
<mkdir dir="${distlib.dir}/${libarea}"/>
<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="${distlib.dir}/common/common.jar"/>
</path> </path>
<depend destdir="${bin.dir}/antlibs/system" srcdir="${java.dir}/antlibs/system" closure="yes">
<depend destdir="${bin.dir}/${libarea}/${libid}" srcdir="${java.dir}/antlibs/${libid}" closure="yes">
<classpath refid="classpath.antlibs"/> <classpath refid="classpath.antlibs"/>
</depend> </depend>
<javac destdir="${bin.dir}/antlibs/system" srcdir="${java.dir}/antlibs/system" debug="${debug}">
<javac destdir="${bin.dir}/${libarea}/${libid}" srcdir="${java.dir}/antlibs/${libid}" debug="${debug}">
<classpath refid="classpath.antlibs"/> <classpath refid="classpath.antlibs"/>
</javac> </javac>
<jar basedir="${bin.dir}/antlibs/system" jarfile="${distlib.dir}/syslibs/system.jar">
<metainf dir="${java.dir}/antlibs/system"
<jar basedir="${bin.dir}/${libarea}/${libid}" jarfile="${distlib.dir}/${libarea}/${libid}.jar">
<metainf dir="${java.dir}/antlibs/${libid}"
includes="antlib.xml"/> includes="antlib.xml"/>
</jar> </jar>
</target> </target>


<target name="main" depends="frontend, antlibs, ant1compat, remote, checkstyle"/>
<target name="checkstyle" if="xxxcheckstyle.available">
<target name="main" depends="frontend, antlibs, ant1compat, remote, checkstyle"/>
<target name="checkstyle" if="xxcheckstyle.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"/>
@@ -184,7 +192,7 @@
<exclude name="**/builder/Ant1CompatBuilder.java"/> <exclude name="**/builder/Ant1CompatBuilder.java"/>
</fileset> </fileset>
</checkstyle> </checkstyle>
<checkstyle allowProtected="true"
<checkstyle allowProtected="true"
headerFile="../../src/etc/RequiredHeader.txt" headerFile="../../src/etc/RequiredHeader.txt"
headerIgnoreLine="4"> headerIgnoreLine="4">
<fileset dir="${java.dir}"> <fileset dir="${java.dir}">
@@ -194,14 +202,14 @@
</fileset> </fileset>
</checkstyle> </checkstyle>
</target> </target>
<target name="javadocs"> <target name="javadocs">
<mkdir dir="${javadocs.dir}"/> <mkdir dir="${javadocs.dir}"/>
<javadoc packagenames="org.apache.*" <javadoc packagenames="org.apache.*"
useexternalfile="yes" useexternalfile="yes"
sourcepath="${java.dir}/antcore:${java.dir}/init:${java.dir}/common:${java.dir}/frontend:${java.dir}/start" sourcepath="${java.dir}/antcore:${java.dir}/init:${java.dir}/common:${java.dir}/frontend:${java.dir}/start"
destdir="${javadocs.dir}" destdir="${javadocs.dir}"
author="true"
author="true"
private ="true" private ="true"
version="true" version="true"
windowtitle="Mutant API" windowtitle="Mutant API"
@@ -216,4 +224,12 @@
<tag name="created" description="Date Created:" scope="types"/> <tag name="created" description="Date Created:" scope="types"/>
</javadoc> </javadoc>
</target> </target>


<target name="test">
<ant antfile="build/ant1compat.xml" target="test"/>
</target>



</project> </project>

+ 342
- 46
proposal/mutant/build/ant1compat.xml View File

@@ -1,36 +1,72 @@
<project default="ant1compat" name="Ant1Compat" basedir=".."> <project default="ant1compat" name="Ant1Compat" basedir="..">


<property name="debug" value="true" />
<property name="chmod.fail" value="true" />
<property name="deprecation" value="false" />
<property name="optimize" value="true" />
<property name="junit.fork" value="false" />
<property name="junit.filtertrace" value="off"/>
<property name="junit.summary" value="no"/>

<property name="ant1base.dir" value="../.."/>
<property name="ant1src.dir" value="${ant1base.dir}/src"/>
<property name="ant1java.dir" value="${ant1src.dir}/main"/>
<property name="ant1etc.dir" value="${ant1src.dir}/etc"/>
<property name="ant1.tests.dir" value="${ant1src.dir}/etc/testcases"/>

<property name="src.dir" value="src"/> <property name="src.dir" value="src"/>
<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="lib.dir" value="lib"/>
<property name="tests.dir" value="${ant1src.dir}/testcases"/>
<property name="tests.etc.dir" value="${src.dir}/etc/testcases"/>


<property name="bin.dir" value="bin"/> <property name="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="distlib.dir" value="${dist.dir}/lib"/>


<property name="ant1base.dir" value="../.."/>
<property name="ant1src.dir" value="${ant1base.dir}/src"/>
<property name="ant1java.dir" value="${ant1src.dir}/main"/>
<property name="ant1etc.dir" value="${ant1src.dir}/etc"/>

<property name="debug" value="true"/>

<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"/>
<property name="optional.type.package" value="${ant.package}/types/optional"/> <property name="optional.type.package" value="${ant.package}/types/optional"/>
<property name="util.package" value="${ant.package}/util"/> <property name="util.package" value="${ant.package}/util"/>
<property name="regexp.package" value="${util.package}/regexp"/> <property name="regexp.package" value="${util.package}/regexp"/>


<!--
===================================================================
Set the properties for the build area
===================================================================
-->
<property name="build.tests" value="${bin.dir}/testcases"/>


<path id="classpath">
<pathelement location="${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"/>
</path>

<path id="tests-classpath">
<pathelement location="${build.classes}" />
<pathelement location="${build.tests}" />
<!--
include the test source and test data dirs
so that we can pick resources via getResource(AsStream)
-->
<pathelement location="${tests.dir}"/>
<pathelement location="${tests.etc.dir}"/>
<path refid="classpath" />
</path>

<patternset id="deprecated"> <patternset id="deprecated">
<exclude name="org/apache/tools/ant/taskdefs/Copydir.java"/> <exclude name="org/apache/tools/ant/taskdefs/Copydir.java"/>
<exclude name="org/apache/tools/ant/taskdefs/Copyfile.java"/> <exclude name="org/apache/tools/ant/taskdefs/Copyfile.java"/>
</patternset> </patternset>
<patternset id="toohard"> <patternset id="toohard">
<exclude name="org/apache/tools/ant/taskdefs/Do.java"/>
</patternset> </patternset>
<patternset id="converted"> <patternset id="converted">
<exclude name="org/apache/tools/ant/taskdefs/Ant.java"/> <exclude name="org/apache/tools/ant/taskdefs/Ant.java"/>
<exclude name="org/apache/tools/ant/taskdefs/CallTarget.java"/> <exclude name="org/apache/tools/ant/taskdefs/CallTarget.java"/>
@@ -51,7 +87,17 @@
<exclude name="org/apache/tools/ant/RuntimeConfigurable.java"/> <exclude name="org/apache/tools/ant/RuntimeConfigurable.java"/>
<exclude name="org/apache/tools/ant/UnknownElement.java"/> <exclude name="org/apache/tools/ant/UnknownElement.java"/>
</patternset> </patternset>

<patternset id="unsupportedTests">
<exclude name="org/apache/tools/ant/taskdefs/ParallelTest.java"/>
<exclude name="org/apache/tools/ant/taskdefs/AntTest.java"/>
<exclude name="org/apache/tools/ant/taskdefs/InitializeClassTest.java"/>
<exclude name="org/apache/tools/ant/taskdefs/InputTest.java"/>
<exclude name="org/apache/tools/ant/taskdefs/JavaTest.java"/>
<exclude name="org/apache/tools/ant/taskdefs/JavacTest.java"/>
<exclude name="org/apache/tools/ant/taskdefs/TStampTest.java"/>
</patternset>

<fileset id="ant1src_tocopy" dir="${ant1java.dir}"> <fileset id="ant1src_tocopy" dir="${ant1java.dir}">
<include name="**/*.properties"/> <include name="**/*.properties"/>
<include name="**/*.mf"/> <include name="**/*.mf"/>
@@ -71,13 +117,8 @@
<patternset refid="notrequired"/> <patternset refid="notrequired"/>
</fileset> </fileset>


<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"/>
</path>
<fileset id="ant1testcases_tocopy" dir="${ant1.tests.dir}">
</fileset>


<!-- <!--
=================================================================== ===================================================================
@@ -89,9 +130,9 @@
<patternset id="needs.jdk1.2+"> <patternset id="needs.jdk1.2+">
<exclude name="${util.package}/optional/NoExitSecurityManager.java" <exclude name="${util.package}/optional/NoExitSecurityManager.java"
unless="jdk1.2+" /> unless="jdk1.2+" />
<exclude name="${optional.package}/Javah.java"
<exclude name="${optional.package}/Javah.java"
unless="jdk1.2+" /> unless="jdk1.2+" />
<exclude name="${optional.package}/metamata/*.java"
<exclude name="${optional.package}/metamata/*.java"
unless="jdk1.2+" /> unless="jdk1.2+" />
<exclude name="${optional.package}/ejb/EjbJar.java" <exclude name="${optional.package}/ejb/EjbJar.java"
unless="jdk1.2+" /> unless="jdk1.2+" />
@@ -102,13 +143,15 @@
<!-- uses the context classloader --> <!-- uses the context classloader -->
<exclude name="${optional.package}/junit/JUnitClassLoaderTest.java" <exclude name="${optional.package}/junit/JUnitClassLoaderTest.java"
unless="jdk1.2+" /> unless="jdk1.2+" />
<!-- use various 1.2 methods -->
<!-- use various 1.2 methods -->
<exclude name="${optional.package}/sitraka/**/*.java" <exclude name="${optional.package}/sitraka/**/*.java"
unless="jdk1.2+" /> unless="jdk1.2+" />
</patternset> </patternset>
<patternset id="needs.jdk1.3+"> <patternset id="needs.jdk1.3+">
<exclude name="${ant.package}/taskdefs/TestProcess.java" <exclude name="${ant.package}/taskdefs/TestProcess.java"
unless="jdk1.3+" /> unless="jdk1.3+" />
<exclude name="${optional.package}/extension/**/*.java"
unless="jdk1.3+" />
</patternset> </patternset>
<patternset id="needs.jdk1.4+"> <patternset id="needs.jdk1.4+">
<exclude name="${regexp.package}/Jdk14Regexp*.java" <exclude name="${regexp.package}/Jdk14Regexp*.java"
@@ -138,9 +181,11 @@
<patternset id="needs.trax"> <patternset id="needs.trax">
<exclude name="${optional.package}/TraXLiaison*.java" <exclude name="${optional.package}/TraXLiaison*.java"
unless="trax.present" /> unless="trax.present" />
<exclude name="${optional.package}/sitraka/**"
<exclude name="${optional.package}/sitraka/**"
unless="trax.present"/>
<exclude name="${optional.package}/metamata/MMetrics*"
unless="trax.present"/> unless="trax.present"/>
<exclude name="${optional.package}/metamata/MMetrics*"
<exclude name="${optional.package}/XsltTest.java"
unless="trax.present"/> unless="trax.present"/>
</patternset> </patternset>
<patternset id="needs.xalan1"> <patternset id="needs.xalan1">
@@ -154,7 +199,7 @@
unless="xalan2.present" /> unless="xalan2.present" />
</patternset> </patternset>
<patternset id="needs.xslp"> <patternset id="needs.xslp">
<exclude name="${optional.package}/XslpLiaison*.java"
<exclude name="${optional.package}/XslpLiaison*.java"
unless="xslp.present" /> unless="xslp.present" />
</patternset> </patternset>
<patternset id="needs.junit"> <patternset id="needs.junit">
@@ -165,15 +210,15 @@
unless="jakarta.regexp.present" /> unless="jakarta.regexp.present" />
</patternset> </patternset>
<patternset id="needs.jakarta.oro"> <patternset id="needs.jakarta.oro">
<exclude name="${regexp.package}/JakartaOro*.java"
<exclude name="${regexp.package}/JakartaOro*.java"
unless="jakarta.oro.present" /> unless="jakarta.oro.present" />
<exclude name="${optional.package}/perforce/*.java"
<exclude name="${optional.package}/perforce/*.java"
unless="jakarta.oro.present" /> unless="jakarta.oro.present" />
<exclude name="${optional.package}/metamata/MAudit*.java"
<exclude name="${optional.package}/metamata/MAudit*.java"
unless="jakarta.oro.present"/> unless="jakarta.oro.present"/>
</patternset> </patternset>
<patternset id="needs.jakarta.bcel"> <patternset id="needs.jakarta.bcel">
<exclude name="${ant.package}/filters/util/JavaClassHelper.java"
<exclude name="${ant.package}/filters/util/JavaClassHelper.java"
unless="bcel.present" /> unless="bcel.present" />
<exclude name="${util.package}/depend/bcel/*.java" <exclude name="${util.package}/depend/bcel/*.java"
unless="bcel.present" /> unless="bcel.present" />
@@ -184,12 +229,16 @@
<exclude name="${ant.package}/listener/Log4jListener.java" <exclude name="${ant.package}/listener/Log4jListener.java"
unless="log4j.present" /> unless="log4j.present" />
</patternset> </patternset>
<patternset id="needs.commons.logging">
<exclude name="${ant.package}/listener/CommonsLoggingListener.java"
unless="commons.logging.present" />
</patternset>
<patternset id="needs.bsf"> <patternset id="needs.bsf">
<exclude name="${optional.package}/Script.java"
<exclude name="${optional.package}/Script.java"
unless="bsf.present" /> unless="bsf.present" />
</patternset> </patternset>
<patternset id="needs.stylebook"> <patternset id="needs.stylebook">
<exclude name="${optional.package}/StyleBook.java"
<exclude name="${optional.package}/StyleBook.java"
unless="stylebook.present" /> unless="stylebook.present" />
</patternset> </patternset>
<patternset id="needs.javamail"> <patternset id="needs.javamail">
@@ -205,7 +254,7 @@
unless="netrexx.present" /> unless="netrexx.present" />
</patternset> </patternset>
<patternset id="needs.weblogic.ejbc"> <patternset id="needs.weblogic.ejbc">
<exclude name="${optional.package}/ejb/Ejbc*.java"
<exclude name="${optional.package}/ejb/Ejbc*.java"
unless="ejb.ejbc.present" /> unless="ejb.ejbc.present" />
</patternset> </patternset>
<patternset id="needs.weblogic.ddcreator"> <patternset id="needs.weblogic.ddcreator">
@@ -215,7 +264,7 @@
<patternset id="needs.weblogic.server"> <patternset id="needs.weblogic.server">
<exclude name="${optional.package}/ejb/WLRun.java" <exclude name="${optional.package}/ejb/WLRun.java"
unless="ejb.wls.present" /> unless="ejb.wls.present" />
<exclude name="${optional.package}/ejb/WLStop.java"
<exclude name="${optional.package}/ejb/WLStop.java"
unless="ejb.wls.present" /> unless="ejb.wls.present" />
</patternset> </patternset>
<patternset id="needs.netcomponents"> <patternset id="needs.netcomponents">
@@ -231,7 +280,7 @@
unless="starteam.present" /> unless="starteam.present" />
</patternset> </patternset>
<patternset id="needs.vaj"> <patternset id="needs.vaj">
<exclude name="${optional.package}/ide/VAJ*.java"
<exclude name="${optional.package}/ide/VAJ*.java"
unless="vaj.present" /> unless="vaj.present" />
</patternset> </patternset>
<patternset id="needs.antlr"> <patternset id="needs.antlr">
@@ -253,6 +302,8 @@
<patternset id="needs.swing"> <patternset id="needs.swing">
<exclude name="${optional.package}/splash/*.java" unless="swing.present" /> <exclude name="${optional.package}/splash/*.java" unless="swing.present" />
</patternset> </patternset>
<patternset id="teststhatfail">
</patternset>


<!-- <!--
=================================================================== ===================================================================
@@ -268,7 +319,7 @@
classpathref="classpath" /> classpathref="classpath" />
<condition property="netrexx.present"> <condition property="netrexx.present">
<and> <and>
<isset property="jdk1.2+"/>
<isset property="jdk1.2+"/>
<available classname="netrexx.lang.Rexx" <available classname="netrexx.lang.Rexx"
classpathref="classpath"/> classpathref="classpath"/>
</and> </and>
@@ -323,7 +374,7 @@
classpathref="classpath"/> classpathref="classpath"/>
<condition property="icontract.present"> <condition property="icontract.present">
<and> <and>
<isset property="jdk1.2+"/>
<isset property="jdk1.2+"/>
<available classname="com.reliablesystems.iContract.IContracted" <available classname="com.reliablesystems.iContract.IContracted"
classpathref="classpath"/> classpathref="classpath"/>
</and> </and>
@@ -334,6 +385,9 @@
<available property="log4j.present" <available property="log4j.present"
classname="org.apache.log4j.Category" classname="org.apache.log4j.Category"
classpathref="classpath"/> classpathref="classpath"/>
<available property="commons.logging.present"
classname="org.apache.commons.logging.LogFactory"
classpathref="classpath"/>
<!-- this is just a way to check for a TraX implementation --> <!-- this is just a way to check for a TraX implementation -->
<available property="trax.impl.present" <available property="trax.impl.present"
resource="META-INF/services/javax.xml.transform.TransformerFactory" resource="META-INF/services/javax.xml.transform.TransformerFactory"
@@ -354,7 +408,7 @@
classpathref="classpath" /> classpathref="classpath" />
<condition property="bcel.present"> <condition property="bcel.present">
<and> <and>
<isset property="jdk1.2+"/>
<isset property="jdk1.2+"/>
<available classname="org.apache.bcel.Constants" <available classname="org.apache.bcel.Constants"
classpathref="classpath"/> classpathref="classpath"/>
</and> </and>
@@ -379,7 +433,14 @@
<isset property="jakarta.oro.present" /> <isset property="jakarta.oro.present" />
</or> </or>
</condition> </condition>

<condition property="tests.and.ant.share.classloader">
<or>
<equals arg1="${junit.fork}" arg2="true" />
<equals arg1="${build.sysclasspath}" arg2="only" />
</or>
</condition>

<condition property="sun.tools.present"> <condition property="sun.tools.present">
<and> <and>
<available classname="sun.tools.native2ascii.Main" /> <available classname="sun.tools.native2ascii.Main" />
@@ -389,17 +450,29 @@


<available property="base64.present" classname="sun.misc.BASE64Encoder" /> <available property="base64.present" classname="sun.misc.BASE64Encoder" />


<property name="build.tests.resolved" location="${build.tests}" />
<condition property="tests.are.on.system.classpath">
<or>
<!-- relative paths in CLASSPATH -->
<contains string="${java.class.path}"
substring="${build.tests}" />
<!-- absolute paths in CLASSPATH -->
<contains string="${java.class.path}"
substring="${build.tests.resolved}" />
</or>
</condition>

<condition property="jasper.present"> <condition property="jasper.present">
<and> <and>
<available classname="org.apache.jasper.compiler.Compiler" /> <available classname="org.apache.jasper.compiler.Compiler" />
<available classname="org.apache.jasper.JasperException" /> <available classname="org.apache.jasper.JasperException" />
</and> </and>
</condition> </condition>
<available property="swing.present" <available property="swing.present"
classname="javax.swing.ImageIcon" classname="javax.swing.ImageIcon"
classpathref="classpath"/> classpathref="classpath"/>
<condition property="wsdl.found"> <condition property="wsdl.found">
<or> <or>
<available file="wsdl" filepath="${env.PATH}" /> <available file="wsdl" filepath="${env.PATH}" />
@@ -421,7 +494,7 @@
<isset property="csc.found"/> <isset property="csc.found"/>
<isset property="wsdl.found"/> <isset property="wsdl.found"/>
</and> </and>
</condition>
</condition>
<echo level="verbose"> csc.found=${csc.found}</echo> <echo level="verbose"> csc.found=${csc.found}</echo>
</target> </target>


@@ -431,21 +504,23 @@
<copy todir="${bin.dir}/ant1src_copy"> <copy todir="${bin.dir}/ant1src_copy">
<fileset refid="ant1src_tocopy"/> <fileset refid="ant1src_tocopy"/>
</copy> </copy>
<depend destdir="${bin.dir}/ant1compat" srcdir="${bin.dir}/ant1src_copy:${java.dir}/antlibs/ant1compat"
<depend destdir="${bin.dir}/ant1compat" srcdir="${bin.dir}/ant1src_copy:${java.dir}/antlibs/ant1compat"
closure="yes"> closure="yes">
<classpath refid="classpath"/> <classpath refid="classpath"/>
</depend> </depend>
<javac destdir="${bin.dir}/ant1compat"
<javac destdir="${bin.dir}/ant1compat"
srcdir="${bin.dir}/ant1src_copy:${java.dir}/antlibs/ant1compat" srcdir="${bin.dir}/ant1src_copy:${java.dir}/antlibs/ant1compat"
debug="${debug}"> debug="${debug}">
<classpath refid="classpath" /> <classpath refid="classpath" />


<patternset refid="needs.jdk1.2+" /> <patternset refid="needs.jdk1.2+" />
<patternset refid="needs.jdk1.3+" />
<patternset refid="needs.jdk1.4+" /> <patternset refid="needs.jdk1.4+" />


<patternset refid="needs.jakarta.regexp" /> <patternset refid="needs.jakarta.regexp" />
<patternset refid="needs.jakarta.oro" /> <patternset refid="needs.jakarta.oro" />
<patternset refid="needs.jakarta.log4j" /> <patternset refid="needs.jakarta.log4j" />
<patternset refid="needs.commons.logging" />
<patternset refid="needs.sun.uue" /> <patternset refid="needs.sun.uue" />
<patternset refid="needs.javamail" /> <patternset refid="needs.javamail" />
<patternset refid="needs.icontract" /> <patternset refid="needs.icontract" />
@@ -485,14 +560,235 @@


<mkdir dir="${distlib.dir}/antlibs/"/> <mkdir dir="${distlib.dir}/antlibs/"/>
<jar basedir="${bin.dir}/ant1compat" jarfile="${distlib.dir}/antlibs/ant1compat.jar"> <jar basedir="${bin.dir}/ant1compat" jarfile="${distlib.dir}/antlibs/ant1compat.jar">
<metainf dir="${java.dir}/antlibs/ant1compat"
<metainf dir="${java.dir}/antlibs/ant1compat"
includes="antlib.xml"/> includes="antlib.xml"/>
</jar> </jar>
</target> </target>

<!--
===================================================================
Compile testcases
===================================================================
-->
<target name="compile-tests" depends="check_for_optional_packages" if="junit.present">
<mkdir dir="${build.tests}"/>

<javac srcdir="${tests.dir}"
destdir="${build.tests}"
debug="${debug}"
deprecation="${deprecation}" >
<classpath refid="tests-classpath" />

<patternset refid="needs.antlr" />

<patternset refid="needs.jdk1.2+" />
<patternset refid="needs.jdk1.3+" />
<patternset refid="needs.jdk1.4+" />

<patternset refid="needs.jakarta.regexp" />
<patternset refid="needs.jakarta.oro" />

<patternset refid="needs.trax" />
<patternset refid="needs.xslp" />
<patternset refid="needs.xalan1" />
<patternset refid="needs.jakarta.bcel" />
<patternset refid="unsupportedTests" />
</javac>
<copy todir="${tests.etc.dir}">
<fileset refid="ant1testcases_tocopy"/>
</copy>
</target>

<target name="dump-info" depends="dump-sys-properties,run-which" />

<target name="dump-sys-properties" unless="which.present"
depends="xml-check">
<echo message="java.vm.info=${java.vm.info}" />
<echo message="java.vm.name=${java.vm.name}" />
<echo message="java.vm.vendor=${java.vm.vendor}" />
<echo message="java.vm.version=${java.vm.version}" />
<echo message="os.arch=${os.arch}" />
<echo message="os.name=${os.name}" />
<echo message="os.version=${os.version}" />
<echo message="file.encoding=${file.encoding}" />
<echo message="user.language=${user.language}" />
</target>

<!-- helper class from Xalan2 to check for jar versioning of xml/xsl processors -->
<target name="xml-check" depends="check_for_optional_packages"
if="xalan.envcheck" unless="which.present">
<java classname="org.apache.xalan.xslt.EnvironmentCheck"/>
</target>

<target name="run-which" depends="check_for_optional_packages"
if="which.present">
<java classname="org.apache.env.Which" taskname="which"/>
</target>

<!-- test to see if we are online or not. can take a while when we are off line, so
setting the property is a good shortcut-->
<target name="probe-offline">
<condition property="offline">
<or>
<isset property="offline"/>
<not>
<http url="http://www.apache.org/"/>
</not>
</or>
</condition>
<echo level="verbose" > offline=${offline}</echo>
</target>

<!--
===================================================================
Run testcase
===================================================================
-->
<target name="test" depends="run-tests" description="--> run JUnit tests"/>

<target name="run-tests" depends="dump-info,compile-tests,probe-offline" if="junit.present">

<junit printsummary="${junit.summary}" haltonfailure="yes"
filtertrace="${junit.filtertrace}"
fork="${junit.fork}">
<classpath refid="tests-classpath"/>

<sysproperty key="ant.home" value="${ant.home}" />
<sysproperty key="build.tests" value="${build.tests}"/>
<sysproperty key="tests-classpath.value"
value="${tests-classpath.value}" />

<formatter type="brief" usefile="false" />

<batchtest>
<fileset dir="${tests.dir}">
<include name="**/*Test*" />

<!-- abstract classes, not testcases -->
<exclude name="${ant.package}/taskdefs/TaskdefsTest.java" />
<exclude name="${ant.package}/BuildFileTest.java" />
<exclude name="${regexp.package}/RegexpMatcherTest.java" />
<exclude name="${regexp.package}/RegexpTest.java" />
<exclude name="${optional.package}/AbstractXSLTLiaisonTest.java" />
<exclude name="${ant.package}/types/AbstractFileSetTest.java" />

<!-- helper classes, not testcases -->
<exclude name="org/example/**" />
<exclude name="${ant.package}/taskdefs/TaskdefTest*Task.java" />

<!-- interactive test -->
<exclude name="${ant.package}/taskdefs/TestProcess.java" />

<!-- only run these tests if their required libraries are
installed -->
<patternset refid="needs.jdk1.2+" />
<patternset refid="needs.jdk1.4+" />
<patternset refid="needs.jakarta.regexp" />
<patternset refid="needs.jakarta.oro" />
<patternset refid="needs.vaj" />
<patternset refid="needs.antlr" />
<patternset refid="needs.xalan1" />
<patternset refid="needs.xslp" />
<patternset refid="needs.jakarta.bcel" />
<patternset refid="needs.trax" />
<patternset refid="unsupportedTests" />
<!-- fails under 1.1 -->
<exclude name="${optional.package}/perforce/P4ChangeTest.java"
unless="jdk1.2+"/>

<!-- tests excluded if the test is run in offline mode -->
<patternset refid="onlinetests"/>

<!-- failing tests excluded unless run.failing.tests is set -->
<patternset refid="teststhatfail" />

<!-- runtime dependencies that are different from compile
time dependencies -->
<exclude name="${optional.package}/ReplaceRegExpTest.java"
unless="some.regexp.support" />
<exclude name="${optional.package}/sitraka/*.java"
unless="some.regexp.support" />

<!-- fail if testcases can be loaded from the system classloader -->
<exclude name="${optional.package}/junit/JUnitClassLoaderTest.java"
if="tests.are.on.system.classpath"/>
<exclude name="${optional.package}/sitraka/XMLReportTest.java"
if="tests.are.on.system.classpath"/>

<!-- these tests need to be localised before being ran???? -->
<exclude name="${optional.package}/PvcsTest.java" />

<!-- ehm, this is not really a TraX test but rather a xalan2 test..-->
<exclude name="${optional.package}/TraXLiaisonTest.java"
unless="xalan2.present"/>

<!-- needs BSF to work -->
<exclude name="${optional.package}/XalanLiaisonTest.java"
unless="bsf.present" />

<!--
XXX need to figure out what's causing this InvocationTargetException
-->
<exclude name="${optional.package}/junit/JUnitTestRunnerTest.java"
unless="jdk1.2+" />
<!-- DateTime handling seems to be broken in JDK 1.1 -->
<exclude name="${util.package}/DateUtilsTest.java"
unless="jdk1.2+" />

<!-- misc oneoff tests -->
<exclude name="${optional.package}/JspcTest.java"
unless="jasper.present" />
<exclude name="${optional.package}/WsdlToDotnetTest.java"
unless="dotnetapps.found" />

<!-- These tests only passes if testcases and Ant classes have
been loaded by the same classloader - will throw
IllegalAccessExceptions otherwise. -->
<exclude name="${ant.package}/taskdefs/SQLExecTest.java"
unless="tests.and.ant.share.classloader" />
<exclude name="${optional.package}/sos/SOSTest.java"
unless="tests.and.ant.share.classloader" />
<exclude name="${optional.package}/TraXLiaisonTest.java"
unless="tests.and.ant.share.classloader" />
<exclude name="${optional.package}/metamata/MAuditParserTest.java"
unless="tests.and.ant.share.classloader" />

<!-- can only run if cvs is installed on your machine
enable by setting the property have.cvs
-->
<exclude name="${ant.package}/taskdefs/AbstractCvsTaskTest.java"
unless="have.cvs" />

</fileset>
</batchtest>

</junit>
</target>

<target name="run-single-test" if="testcase" depends="compile-tests"
description="--> runs the single unit test defined in the testcase property">


<junit printsummary="${junit.summary}"
haltonfailure="yes"
fork="${junit.fork}"
filtertrace="${junit.filtertrace}">
<!-- <jvmarg value="-classic"/> -->
<sysproperty key="ant.home" value="${ant.home}" />
<sysproperty key="build.tests" value="${build.tests}"/>
<sysproperty key="tests-classpath.value"
value="${tests-classpath.value}" />
<classpath refid="classes.zip" />
<classpath refid="tests-classpath"/>
<formatter type="plain" usefile="false" />
<test name="${testcase}" />
</junit>
</target>

<target name="clean"> <target name="clean">
<delete dir="${bin.dir}/ant1src_copy"/> <delete dir="${bin.dir}/ant1src_copy"/>
<delete dir="${bin.dir}/ant1compat"/> <delete dir="${bin.dir}/ant1compat"/>
<delete dir="${tests.etc.dir}"/>
</target> </target>


</project> </project>

proposal/mutant/src/java/common/org/apache/ant/common/util/ConfigException.java → proposal/mutant/src/java/antcore/org/apache/ant/antcore/antlib/AntLibException.java View File

@@ -51,22 +51,23 @@
* 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.common.util;
package org.apache.ant.antcore.antlib;

import org.apache.ant.common.util.AntException;
import org.apache.ant.common.util.Location;


/** /**
* A ConfigException indicates a problem with Ant's configuration or the
* commandline used to start Ant.
* An AntLibException indicates a problem in an ant library
* *
* @author Conor MacNeill * @author Conor MacNeill
* @created 9 January 2002
*/ */
public class ConfigException extends AntException {
public class AntLibException extends AntException {
/** /**
* Constructs an exception with the given descriptive message. * Constructs an exception with the given descriptive message.
* *
* @param msg Description of or information about the exception. * @param msg Description of or information about the exception.
*/ */
public ConfigException(String msg) {
public AntLibException(String msg) {
super(msg); super(msg);
} }


@@ -78,7 +79,7 @@ public class ConfigException extends AntException {
* @param msg Description of or information about the exception. * @param msg Description of or information about the exception.
* @param location Location in the project file where the error occured. * @param location Location in the project file where the error occured.
*/ */
public ConfigException(String msg, Location location) {
public AntLibException(String msg, Location location) {
super(msg, location); super(msg, location);
} }


@@ -90,7 +91,7 @@ public class ConfigException extends AntException {
* @param msg Description of or information about the exception. * @param msg Description of or information about the exception.
* @param cause Throwable that might have cause this one. * @param cause Throwable that might have cause this one.
*/ */
public ConfigException(String msg, Throwable cause) {
public AntLibException(String msg, Throwable cause) {
super(msg, cause); super(msg, cause);
} }


@@ -103,7 +104,7 @@ public class ConfigException extends AntException {
* @param cause Exception that might have cause this one. * @param cause Exception that might have cause this one.
* @param location Location in the project file where the error occured. * @param location Location in the project file where the error occured.
*/ */
public ConfigException(String msg, Throwable cause, Location location) {
public AntLibException(String msg, Throwable cause, Location location) {
super(msg, cause, location); super(msg, cause, location);
} }


@@ -113,7 +114,7 @@ public class ConfigException extends AntException {
* *
* @param cause Exception that might have caused this one. * @param cause Exception that might have caused this one.
*/ */
public ConfigException(Throwable cause) {
public AntLibException(Throwable cause) {
super(cause); super(cause);
} }


@@ -125,7 +126,7 @@ public class ConfigException extends AntException {
* @param cause Exception that might have cause this one. * @param cause Exception that might have cause this one.
* @param location Location in the project file where the error occured. * @param location Location in the project file where the error occured.
*/ */
public ConfigException(Throwable cause, Location location) {
public AntLibException(Throwable cause, Location location) {
super(cause, location); super(cause, location);
} }



+ 3
- 4
proposal/mutant/src/java/antcore/org/apache/ant/antcore/antlib/AntLibHandler.java View File

@@ -52,7 +52,6 @@
* <http://www.apache.org/>. * <http://www.apache.org/>.
*/ */
package org.apache.ant.antcore.antlib; package org.apache.ant.antcore.antlib;
import org.apache.ant.common.util.ConfigException;
import org.apache.ant.antcore.xml.ElementHandler; import org.apache.ant.antcore.xml.ElementHandler;
import org.xml.sax.Attributes; import org.xml.sax.Attributes;
import org.xml.sax.SAXParseException; import org.xml.sax.SAXParseException;
@@ -80,7 +79,7 @@ public class AntLibHandler extends ElementHandler {
/** The extends attribute name */ /** The extends attribute name */
public static final String ISOLATED_ATTR = "isolated"; public static final String ISOLATED_ATTR = "isolated";


/** The list of allowed Attributes */ /** The list of allowed Attributes */
public static final String[] ALLOWED_ATTRIBUTES public static final String[] ALLOWED_ATTRIBUTES
= {LIBID_ATTR, HOME_ATTR, REQXML_ATTR, REQTOOLS_ATTR, = {LIBID_ATTR, HOME_ATTR, REQXML_ATTR, REQTOOLS_ATTR,
@@ -166,8 +165,8 @@ public class AntLibHandler extends ElementHandler {
} else { } else {
super.startElement(uri, localName, qualifiedName, attributes); super.startElement(uri, localName, qualifiedName, attributes);
} }
} catch (ConfigException e) {
throw new SAXParseException(e.getMessage(), getLocator());
} catch (AntLibException e) {
throw new SAXParseException(e.getMessage(), getLocator(), e);
} }
} }




+ 140
- 120
proposal/mutant/src/java/antcore/org/apache/ant/antcore/antlib/AntLibManager.java View File

@@ -52,7 +52,6 @@
* <http://www.apache.org/>. * <http://www.apache.org/>.
*/ */
package org.apache.ant.antcore.antlib; package org.apache.ant.antcore.antlib;
import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
@@ -65,18 +64,22 @@ import org.apache.ant.antcore.xml.ParseContext;
import org.apache.ant.antcore.xml.XMLParseException; import org.apache.ant.antcore.xml.XMLParseException;
import org.apache.ant.common.util.CircularDependencyChecker; import org.apache.ant.common.util.CircularDependencyChecker;
import org.apache.ant.common.util.CircularDependencyException; import org.apache.ant.common.util.CircularDependencyException;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.init.InitConfig; import org.apache.ant.init.InitConfig;
import org.apache.ant.init.InitUtils;
import org.apache.ant.init.LoaderUtils; import org.apache.ant.init.LoaderUtils;


/** /**
* This class manages the configuration of Ant Libraries
* This class manages Ant Libraries. This class forms a global
* repository of loaded libraries so that only one copy of a library is
* used across all frames.
* *
* @author Conor MacNeill * @author Conor MacNeill
* @created 29 January 2002 * @created 29 January 2002
*/ */
public class AntLibManager { public class AntLibManager {
/**
* These are AntLibraries which have been loaded into the system
*/
private Map antLibraries = new HashMap();


/** The list of extensions which are examined for ant libraries */ /** The list of extensions which are examined for ant libraries */
public static final String[] ANTLIB_EXTENSIONS public static final String[] ANTLIB_EXTENSIONS
@@ -85,14 +88,25 @@ public class AntLibManager {
/** Flag which indicates whether non-file URLS are used */ /** Flag which indicates whether non-file URLS are used */
private boolean remoteAllowed; private boolean remoteAllowed;


/** The Ant initialization config - location of vital components */
private InitConfig initConfig;

/**
* This map stores a list of additional paths for each library indexed by
* the libraryId
*/
private Map libPathsMap = new HashMap();

/** /**
* Constructor for the AntLibManager object * Constructor for the AntLibManager object
* *
* @param initConfig the init config of the system.
* @param remoteAllowed true if remote libraries can be used and * @param remoteAllowed true if remote libraries can be used and
* configured * configured
*/ */
public AntLibManager(boolean remoteAllowed) {
public AntLibManager(InitConfig initConfig, boolean remoteAllowed) {
this.remoteAllowed = remoteAllowed; this.remoteAllowed = remoteAllowed;
this.initConfig = initConfig;
} }


/** /**
@@ -101,47 +115,53 @@ public class AntLibManager {
* @param librarySpecs A map to which additional library specifications * @param librarySpecs A map to which additional library specifications
* are added. * are added.
* @param libURL the URL from which Ant libraries are to be loaded * @param libURL the URL from which Ant libraries are to be loaded
* @exception MalformedURLException if the URL for the individual
* library components cannot be formed
* @exception ExecutionException if the library specs cannot be parsed
* @exception AntLibException if the library specs cannot be parsed
*/ */
public void addAntLibraries(Map librarySpecs, URL libURL) public void addAntLibraries(Map librarySpecs, URL libURL)
throws MalformedURLException, ExecutionException {
URL[] libURLs = LoaderUtils.getLocationURLs(libURL, libURL.toString(),
ANTLIB_EXTENSIONS);
throws AntLibException {
try {
URL[] libURLs = LoaderUtils.getLocationURLs(libURL,
libURL.toString(), ANTLIB_EXTENSIONS);


if (libURLs == null) {
return;
}
if (libURLs == null) {
return;
}


// parse each task library to get its library definition
for (int i = 0; i < libURLs.length; ++i) {
URL antLibraryURL = new URL("jar:" + libURLs[i]
+ "!/META-INF/antlib.xml");
try {
AntLibrarySpec antLibrarySpec = parseLibraryDef(antLibraryURL);
if (antLibrarySpec != null) {
String libraryId = antLibrarySpec.getLibraryId();
if (librarySpecs.containsKey(libraryId)) {
AntLibrarySpec currentSpec
= (AntLibrarySpec) librarySpecs.get(libraryId);
throw new ExecutionException("Found more than one "
+ "copy of library with id = " + libraryId
+ " (" + libURLs[i] + ") + existing library at ("
+ currentSpec.getLibraryURL() + ")");
// parse each task library to get its library definition
for (int i = 0; i < libURLs.length; ++i) {
URL antLibraryURL = new URL("jar:" + libURLs[i]
+ "!/META-INF/antlib.xml");
try {
AntLibrarySpec antLibrarySpec
= parseLibraryDef(antLibraryURL);
if (antLibrarySpec != null) {
String libraryId = antLibrarySpec.getLibraryId();
if (librarySpecs.containsKey(libraryId)) {
AntLibrarySpec currentSpec
= (AntLibrarySpec) librarySpecs.get(libraryId);
throw new AntLibException("Found more than one "
+ "copy of library with id = " + libraryId
+ " (" + libURLs[i] + ") + existing library "
+ "at (" + currentSpec.getLibraryURL() + ")");
}
antLibrarySpec.setLibraryURL(libURLs[i]);
librarySpecs.put(libraryId, antLibrarySpec);
}
} catch (XMLParseException e) {
Throwable t = e.getCause();
// ignore file not found exceptions - means the
// jar does not provide META-INF/antlib.xml
if (t instanceof AntLibException) {
throw (AntLibException) t;
} else if (!(t instanceof FileNotFoundException)) {
throw new AntLibException("Unable to parse Ant "
+ "library " + libURLs[i], e);
} }
antLibrarySpec.setLibraryURL(libURLs[i]);
librarySpecs.put(libraryId, antLibrarySpec);
}
} catch (XMLParseException e) {
Throwable t = e.getCause();
// ignore file not found exceptions - means the
// jar does not provide META-INF/antlib.xml
if (!(t instanceof FileNotFoundException)) {
throw new ExecutionException("Unable to parse Ant library "
+ libURLs[i], e);
} }
} }
} catch (MalformedURLException e) {
throw new AntLibException("Unable to load libraries from "
+ libURL, e);
} }
} }


@@ -151,32 +171,27 @@ public class AntLibManager {
* creating the class loaders for the library * creating the class loaders for the library
* *
* @param librarySpecs the loaded specifications of the Ant libraries * @param librarySpecs the loaded specifications of the Ant libraries
* @param initConfig the Ant initialization configuration
* @param libraries the collection of libraries already configured
* @param libPathsMap a map of lists of library paths for each library
* @return A map of the newly configured libraries * @return A map of the newly configured libraries
* @exception ExecutionException if a library cannot be configured from
* @exception AntLibException if a library cannot be configured from
* the given specification * the given specification
*/ */
public Map configLibraries(InitConfig initConfig, Map librarySpecs,
Map libraries, Map libPathsMap)
throws ExecutionException {
private Map configLibraries(Map librarySpecs)
throws AntLibException {


// check if any already defined // check if any already defined
for (Iterator i = librarySpecs.keySet().iterator(); i.hasNext();) { for (Iterator i = librarySpecs.keySet().iterator(); i.hasNext();) {
String libraryId = (String) i.next(); String libraryId = (String) i.next();
if (libraries.containsKey(libraryId)) {
AntLibrary currentVersion
= (AntLibrary) libraries.get(libraryId);
if (antLibraries.containsKey(libraryId)) {
AntLibrary currentVersion = getLibrary(libraryId);
// same location? // same location?
AntLibrarySpec spec
= (AntLibrarySpec) librarySpecs.get(libraryId);
AntLibrarySpec spec
= (AntLibrarySpec) librarySpecs.get(libraryId);
URL specURL = spec.getLibraryURL(); URL specURL = spec.getLibraryURL();
if (!specURL.equals(currentVersion.getDefinitionURL())) { if (!specURL.equals(currentVersion.getDefinitionURL())) {
throw new ExecutionException("Ant Library \"" + libraryId
throw new AntLibException("Ant Library \"" + libraryId
+ "\" is already loaded from " + "\" is already loaded from "
+ currentVersion.getDefinitionURL()
+ " new version found at "
+ currentVersion.getDefinitionURL()
+ " new version found at "
+ specURL); + specURL);
} }
} }
@@ -187,12 +202,12 @@ public class AntLibManager {
= new CircularDependencyChecker("configuring Ant libraries"); = new CircularDependencyChecker("configuring Ant libraries");
for (Iterator i = librarySpecs.keySet().iterator(); i.hasNext();) { for (Iterator i = librarySpecs.keySet().iterator(); i.hasNext();) {
String libraryId = (String) i.next(); String libraryId = (String) i.next();
if (!libraries.containsKey(libraryId)) {
configLibrary(initConfig, librarySpecs, libraryId,
configuring, libraries, newLibraries, libPathsMap);
if (!antLibraries.containsKey(libraryId)) {
configLibrary(librarySpecs, libraryId,
configuring, newLibraries);
} }
} }
return newLibraries; return newLibraries;
} }


@@ -200,87 +215,74 @@ public class AntLibManager {
* Load either a set of libraries or a single library. * Load either a set of libraries or a single library.
* *
* @param libLocationURL URL where libraries can be found * @param libLocationURL URL where libraries can be found
* @param librarySpecs A collection of library specs which will be
* populated with the libraries found
* @exception ExecutionException if the libraries cannot be loaded
* @exception MalformedURLException if the library's location cannot be
* formed
* @exception AntLibException if the libraries cannot be loaded
*
* @return a map containing the newly loaded libraries indexed by their
* library ids.
*/ */
public void loadLibs(Map librarySpecs, URL libLocationURL)
throws ExecutionException, MalformedURLException {
public Map loadLibs(URL libLocationURL)
throws AntLibException {
if (!libLocationURL.getProtocol().equals("file") if (!libLocationURL.getProtocol().equals("file")
&& !remoteAllowed) { && !remoteAllowed) {
throw new ExecutionException("The config library "
throw new AntLibException("The config library "
+ "location \"" + libLocationURL + "location \"" + libLocationURL
+ "\" cannot be used because config does " + "\" cannot be used because config does "
+ "not allow remote libraries"); + "not allow remote libraries");
} }

Map librarySpecs = new HashMap();
addAntLibraries(librarySpecs, libLocationURL); addAntLibraries(librarySpecs, libLocationURL);
}
/**
* Load either a set of libraries or a single library.
*
* @param libLocationString URL or file where libraries can be found
* @param librarySpecs A collection of library specs which will be
* populated with the libraries found
* @exception ExecutionException if the libraries cannot be loaded
* @exception MalformedURLException if the library's location cannot be
* formed
*/
public void loadLibs(Map librarySpecs, String libLocationString)
throws ExecutionException, MalformedURLException {

File libLocation = new File(libLocationString);
if (!libLocation.exists()) {
try {
loadLibs(librarySpecs, new URL(libLocationString));
} catch (MalformedURLException e) {
// XXX
}
} else {
addAntLibraries(librarySpecs, InitUtils.getFileURL(libLocation));
}
Map newLibraries = configLibraries(librarySpecs);

antLibraries.putAll(newLibraries);
return newLibraries;
} }


/** /**
* Add a library path to the given library * Add a library path to the given library
* *
* @param antLibrary the library to which the path is to be added
* @param path the path to be added
* @exception ExecutionException if remote paths are not allowed by
* @param libraryId the id of the library to which the path is to be added
* @param libPath the path to be added
* @exception AntLibException if remote paths are not allowed by
* configuration * configuration
*/ */
public void addLibPath(AntLibrary antLibrary, URL path)
throws ExecutionException {
if (!path.getProtocol().equals("file")
public void addLibPath(String libraryId, URL libPath)
throws AntLibException {
System.out.println("Adding path " + libPath + " for " + libraryId);
if (!libPath.getProtocol().equals("file")
&& !remoteAllowed) { && !remoteAllowed) {
throw new ExecutionException("Remote libpaths are not"
+ " allowed: " + path);
throw new AntLibException("Remote libpaths are not"
+ " allowed: " + libPath);
}

List libPaths = (List) libPathsMap.get(libraryId);
if (libPaths == null) {
libPaths = new ArrayList();
libPathsMap.put(libraryId, libPaths);
}
libPaths.add(libPath);

AntLibrary antLibrary = getLibrary(libraryId);
if (antLibrary != null) {
antLibrary.addLibraryURL(libPath);
} }
antLibrary.addLibraryURL(path);
} }


/** /**
* Configure a library from a specification and the Ant init config. * Configure a library from a specification and the Ant init config.
* *
* @param initConfig Ant's init config passed in from the front end.
* @param librarySpecs the library specs from which this library is to * @param librarySpecs the library specs from which this library is to
* be configured. * be configured.
* @param libraryId the global identifier for the library * @param libraryId the global identifier for the library
* @param configuring A circualr dependency chcker for library * @param configuring A circualr dependency chcker for library
* dependencies. * dependencies.
* @param libraries the collection of libraries which have already been
* configured
* @param newLibraries the new libraries being configured.
* @param libPathsMap a map of lists of library patsh fro each library
* @exception ExecutionException if the library cannot be configured.
* @param newLibraries the new libraries being configured.
* @exception AntLibException if the library cannot be configured.
*/ */
private void configLibrary(InitConfig initConfig, Map librarySpecs,
String libraryId,
private void configLibrary(Map librarySpecs, String libraryId,
CircularDependencyChecker configuring, CircularDependencyChecker configuring,
Map libraries, Map newLibraries, Map libPathsMap)
throws ExecutionException {
Map newLibraries)
throws AntLibException {


try { try {
configuring.visitNode(libraryId); configuring.visitNode(libraryId);
@@ -289,15 +291,15 @@ public class AntLibManager {
= (AntLibrarySpec) librarySpecs.get(libraryId); = (AntLibrarySpec) librarySpecs.get(libraryId);
String extendsId = librarySpec.getExtendsLibraryId(); String extendsId = librarySpec.getExtendsLibraryId();
if (extendsId != null) { if (extendsId != null) {
if (!libraries.containsKey(extendsId) &&
if (!antLibraries.containsKey(extendsId) &&
!newLibraries.containsKey(extendsId)) { !newLibraries.containsKey(extendsId)) {
if (!librarySpecs.containsKey(extendsId)) { if (!librarySpecs.containsKey(extendsId)) {
throw new ExecutionException("Could not find library, "
throw new AntLibException("Could not find library, "
+ extendsId + ", upon which library " + extendsId + ", upon which library "
+ libraryId + " depends"); + libraryId + " depends");
} }
configLibrary(initConfig, librarySpecs, extendsId,
configuring, libraries, newLibraries, libPathsMap);
configLibrary(librarySpecs, extendsId,
configuring, newLibraries);
} }
} }


@@ -328,12 +330,11 @@ public class AntLibManager {
antLibrary.addLibraryURL((URL) i.next()); antLibrary.addLibraryURL((URL) i.next());
} }
if (extendsId != null) { if (extendsId != null) {
AntLibrary extendsLibrary
= (AntLibrary) libraries.get(extendsId);
AntLibrary extendsLibrary = getLibrary(extendsId);
if (extendsLibrary == null) { if (extendsLibrary == null) {
extendsLibrary = (AntLibrary) newLibraries.get(extendsId); extendsLibrary = (AntLibrary) newLibraries.get(extendsId);
} }
antLibrary.setExtendsLibrary(extendsLibrary); antLibrary.setExtendsLibrary(extendsLibrary);
} }
antLibrary.setParentLoader(initConfig.getCommonLoader()); antLibrary.setParentLoader(initConfig.getCommonLoader());
@@ -344,14 +345,13 @@ public class AntLibManager {
if (libPaths != null) { if (libPaths != null) {
for (Iterator j = libPaths.iterator(); j.hasNext();) { for (Iterator j = libPaths.iterator(); j.hasNext();) {
URL pathURL = (URL) j.next(); URL pathURL = (URL) j.next();
addLibPath(antLibrary, pathURL);
antLibrary.addLibraryURL(pathURL);
} }
} }
} }

configuring.leaveNode(libraryId); configuring.leaveNode(libraryId);
} catch (CircularDependencyException e) { } catch (CircularDependencyException e) {
throw new ExecutionException(e);
throw new AntLibException(e);
} }
} }


@@ -374,5 +374,25 @@ public class AntLibManager {
return libHandler.getAntLibrarySpec(); return libHandler.getAntLibrarySpec();
} }



/**
* Get a loaded library by its id.
*
* @param libraryId the library's global id
*
* @return the requested library or null if it has not been loaded
*/
public AntLibrary getLibrary(String libraryId) {
return (AntLibrary) antLibraries.get(libraryId);
}

/**
* Get all the library ids of the currently loaded libraries.
*
* @return an iterator over the library identifier strings.
*/
public Iterator getLibraryIds() {
return antLibraries.keySet().iterator();
}
} }



+ 7
- 7
proposal/mutant/src/java/antcore/org/apache/ant/antcore/antlib/AntLibrary.java View File

@@ -60,7 +60,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import org.apache.ant.common.antlib.AntContext; import org.apache.ant.common.antlib.AntContext;
import org.apache.ant.common.antlib.AntLibFactory; import org.apache.ant.common.antlib.AntLibFactory;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;


/** /**
* This class represents the Ant library. * This class represents the Ant library.
@@ -221,10 +221,10 @@ public class AntLibrary implements ComponentLibrary {
* required * required
* @return an instance of the factory, or null if this library does not * @return an instance of the factory, or null if this library does not
* support a factory * support a factory
* @exception ExecutionException if the factory cannot be created
* @exception AntException if the factory cannot be created
*/ */
public AntLibFactory getFactory(AntContext context) public AntLibFactory getFactory(AntContext context)
throws ExecutionException {
throws AntException {
try { try {
AntLibFactory libFactory = null; AntLibFactory libFactory = null;
if (factoryClassName != null) { if (factoryClassName != null) {
@@ -236,20 +236,20 @@ public class AntLibrary implements ComponentLibrary {
} }
return libFactory; return libFactory;
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
throw new ExecutionException("Unable to create factory "
throw new AntLibException("Unable to create factory "
+ factoryClassName + " for the \"" + libraryId + factoryClassName + " for the \"" + libraryId
+ "\" Ant library", e); + "\" Ant library", e);
} catch (NoClassDefFoundError e) { } catch (NoClassDefFoundError e) {
throw new ExecutionException("Could not load a dependent class ("
throw new AntLibException("Could not load a dependent class ("
+ e.getMessage() + ") to create the factory " + e.getMessage() + ") to create the factory "
+ factoryClassName + " for the \"" + libraryId + factoryClassName + " for the \"" + libraryId
+ "\" Ant library", e); + "\" Ant library", e);
} catch (InstantiationException e) { } catch (InstantiationException e) {
throw new ExecutionException("Unable to instantiate factory "
throw new AntLibException("Unable to instantiate factory "
+ factoryClassName + " for the \"" + libraryId + factoryClassName + " for the \"" + libraryId
+ "\" Ant library", e); + "\" Ant library", e);
} catch (IllegalAccessException e) { } catch (IllegalAccessException e) {
throw new ExecutionException("Unable to access factory "
throw new AntLibException("Unable to access factory "
+ factoryClassName + " for the \"" + libraryId + factoryClassName + " for the \"" + libraryId
+ "\" Ant library", e); + "\" Ant library", e);
} }


+ 5
- 6
proposal/mutant/src/java/antcore/org/apache/ant/antcore/antlib/AntLibrarySpec.java View File

@@ -57,7 +57,6 @@ import java.util.ArrayList;
import java.util.HashMap; 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.util.ConfigException;


/** /**
* This class represents the specification of an Ant library. It is merely * This class represents the specification of an Ant library. It is merely
@@ -291,7 +290,7 @@ public class AntLibrarySpec {
public void addAspect(String className) { public void addAspect(String className) {
aspectClassNames.add(className); aspectClassNames.add(className);
} }
/** /**
* Indicates if this library requires Ant's XML parser * Indicates if this library requires Ant's XML parser
* *
@@ -308,13 +307,13 @@ public class AntLibrarySpec {
* @param classname the name of the class implementing the element * @param classname the name of the class implementing the element
* @param definitionTypeName the name of the definition type. This is * @param definitionTypeName the name of the definition type. This is
* converted to its symbolic value * converted to its symbolic value
* @exception ConfigException if the definition has already been defined
* @exception AntLibException if the definition has already been defined
*/ */
public void addDefinition(String definitionTypeName, String name, public void addDefinition(String definitionTypeName, String name,
String classname) String classname)
throws ConfigException {
throws AntLibException {
if (definitions.containsKey(name)) { if (definitions.containsKey(name)) {
throw new ConfigException("More than one definition "
throw new AntLibException("More than one definition "
+ "in library for " + name); + "in library for " + name);
} }
int definitionType = 0; int definitionType = 0;
@@ -324,7 +323,7 @@ public class AntLibrarySpec {
} else if (definitionTypeName.equals("taskdef")) { } else if (definitionTypeName.equals("taskdef")) {
definitionType = AntLibrary.TASKDEF; definitionType = AntLibrary.TASKDEF;
} else { } else {
throw new ConfigException("Unknown type of definition "
throw new AntLibException("Unknown type of definition "
+ definitionTypeName); + definitionTypeName);
} }
definitions.put(name, definitions.put(name,


+ 3
- 3
proposal/mutant/src/java/antcore/org/apache/ant/antcore/antlib/ComponentLibrary.java View File

@@ -54,7 +54,7 @@
package org.apache.ant.antcore.antlib; package org.apache.ant.antcore.antlib;
import org.apache.ant.common.antlib.AntContext; import org.apache.ant.common.antlib.AntContext;
import org.apache.ant.common.antlib.AntLibFactory; import org.apache.ant.common.antlib.AntLibFactory;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;


/** /**
* A Component Library supplies components to the Ant core. * A Component Library supplies components to the Ant core.
@@ -83,9 +83,9 @@ public interface ComponentLibrary {
* required * required
* @return an instance of the factory, or null if this library does not * @return an instance of the factory, or null if this library does not
* support a factory * support a factory
* @exception ExecutionException if the factory cannot be created
* @exception AntException if the factory cannot be created
*/ */
AntLibFactory getFactory(AntContext context) throws ExecutionException;
AntLibFactory getFactory(AntContext context) throws AntException;


/** /**
* Gets the libraryId of the AntLibrary * Gets the libraryId of the AntLibrary


+ 68
- 14
proposal/mutant/src/java/antcore/org/apache/ant/antcore/config/AntConfig.java View File

@@ -52,9 +52,7 @@
* <http://www.apache.org/>. * <http://www.apache.org/>.
*/ */
package org.apache.ant.antcore.config; package org.apache.ant.antcore.config;
import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
import java.util.List;
import org.apache.ant.common.model.BuildElement; import org.apache.ant.common.model.BuildElement;


/** /**
@@ -75,10 +73,15 @@ public class AntConfig {
private boolean unsetProperties = true; private boolean unsetProperties = true;


/** /**
* Configuration tasks.
* Global Configuration tasks. These are run only once.
*/ */
private List tasks = new ArrayList();
private BuildElement globalTasks;

/**
* Frame tasks - these are run in each new frame.
*/
private BuildElement frameTasks;

/** /**
* Indicate if unset properties are OK. * Indicate if unset properties are OK.
* *
@@ -107,21 +110,47 @@ public class AntConfig {
} }


/** /**
* Get the configuration tasks
* Get the global configuration tasks
* *
* @return an iterator over the set of config tasks. * @return an iterator over the set of config tasks.
*/ */
public Iterator getTasks() {
return tasks.iterator();
public Iterator getGlobalTasks() {
if (globalTasks == null) {
return null;
}
return globalTasks.getNestedElements();
} }


/** /**
* Add a config task.
* Get the per-frame configuration tasks
* *
* @param task a task to be executed as part of the configuration process.
* @return an iterator over the set of config tasks.
*/ */
public void addTask(BuildElement task) {
tasks.add(task);
public Iterator getFrameTasks() {
if (frameTasks == null) {
return null;
}
return frameTasks.getNestedElements();
}

/**
* Add a global config task.
*
* @param globalTasks a collection of tasks to be executed as part of
* the configuration process.
*/
public void addGlobalTasks(BuildElement globalTasks) {
this.globalTasks = globalTasks;
}

/**
* Add a per-frame config task.
*
* @param frameTasks a collection of tasks to be executed as part of the
* setup of each new frame.
*/
public void addFrameTasks(BuildElement frameTasks) {
this.frameTasks = frameTasks;
} }


/** /**
@@ -151,7 +180,7 @@ public class AntConfig {
public void allowUnsetProperties(boolean allowUnsetProperties) { public void allowUnsetProperties(boolean allowUnsetProperties) {
this.unsetProperties = allowUnsetProperties; this.unsetProperties = allowUnsetProperties;
} }
/** /**
* Merge in another configuration. The configuration being merged in * Merge in another configuration. The configuration being merged in
* takes precedence * takes precedence
@@ -162,7 +191,32 @@ public class AntConfig {
remoteLibs = otherConfig.remoteLibs; remoteLibs = otherConfig.remoteLibs;
remoteProjects = otherConfig.remoteProjects; remoteProjects = otherConfig.remoteProjects;
unsetProperties = otherConfig.unsetProperties; unsetProperties = otherConfig.unsetProperties;
tasks.addAll(otherConfig.tasks);
globalTasks = combineTasks(globalTasks, otherConfig.globalTasks);
frameTasks = combineTasks(frameTasks, otherConfig.frameTasks);
}

/**
* Combine two task collections
*
* @param lhs the lefthand collection
* @param rhs the right hand collection
*
* @return the combined collection of tasks
*/
private BuildElement combineTasks(BuildElement lhs, BuildElement rhs) {
if (rhs == null) {
return lhs;
}

if (lhs == null) {
return rhs;
}

for (Iterator i = rhs.getNestedElements(); i.hasNext();) {
lhs.addNestedElement((BuildElement) i.next());
}

return lhs;
} }
} }



+ 20
- 10
proposal/mutant/src/java/antcore/org/apache/ant/antcore/config/AntConfigHandler.java View File

@@ -54,6 +54,7 @@
package org.apache.ant.antcore.config; package org.apache.ant.antcore.config;
import org.apache.ant.antcore.xml.ElementHandler; import org.apache.ant.antcore.xml.ElementHandler;
import org.apache.ant.antcore.modelparser.BuildElementHandler; import org.apache.ant.antcore.modelparser.BuildElementHandler;
import org.apache.ant.common.model.BuildElement;
import org.xml.sax.Attributes; import org.xml.sax.Attributes;
import org.xml.sax.SAXParseException; import org.xml.sax.SAXParseException;


@@ -66,13 +67,19 @@ import org.xml.sax.SAXParseException;
public class AntConfigHandler extends ElementHandler { public class AntConfigHandler extends ElementHandler {
/** The allowRemoteProject attribute name */ /** The allowRemoteProject attribute name */
public static final String REMOTE_PROJECT_ATTR = "allow-remote-project"; public static final String REMOTE_PROJECT_ATTR = "allow-remote-project";
/** The allowRemoteLibrary attribute name */ /** The allowRemoteLibrary attribute name */
public static final String REMOTE_LIBRARY_ATTR = "allow-remote-library"; public static final String REMOTE_LIBRARY_ATTR = "allow-remote-library";


/** The allowReportProject attribute name */ /** The allowReportProject attribute name */
public static final String UNSET_PROPS_ATTR = "allow-unset-properties"; public static final String UNSET_PROPS_ATTR = "allow-unset-properties";


/** The global tasks element */
public static final String GLOBAL_TASKS_ELEMENT = "global-tasks";

/** The per-frame tasks element */
public static final String PERFRAME_TASKS_ELEMENT = "frame-tasks";

/** The list of allowed Attributes */ /** The list of allowed Attributes */
public static final String[] ALLOWED_ATTRIBUTES public static final String[] ALLOWED_ATTRIBUTES
= {REMOTE_PROJECT_ATTR, REMOTE_LIBRARY_ATTR, UNSET_PROPS_ATTR}; = {REMOTE_PROJECT_ATTR, REMOTE_LIBRARY_ATTR, UNSET_PROPS_ATTR};
@@ -108,8 +115,8 @@ public class AntConfigHandler extends ElementHandler {
allowUnsetProperties = getBooleanAttribute(UNSET_PROPS_ATTR); allowUnsetProperties = getBooleanAttribute(UNSET_PROPS_ATTR);
} }
config.allowUnsetProperties(allowUnsetProperties); config.allowUnsetProperties(allowUnsetProperties);
}
}
/** /**
* Start a new element in the ant config. * Start a new element in the ant config.
* *
@@ -123,17 +130,20 @@ public class AntConfigHandler extends ElementHandler {
Attributes attributes) Attributes attributes)
throws SAXParseException { throws SAXParseException {


// everything else is a task
// configs support two task collections as elements
BuildElementHandler buildElementHandler = new BuildElementHandler(); BuildElementHandler buildElementHandler = new BuildElementHandler();
buildElementHandler.start(getParseContext(), getXMLReader(), buildElementHandler.start(getParseContext(), getXMLReader(),
this, getLocator(), attributes, getElementSource(), this, getLocator(), attributes, getElementSource(),
qualifiedName); qualifiedName);
config.addTask(buildElementHandler.getBuildElement());
// try {
// } catch (ConfigException e) {
// throw new SAXParseException("Unable to process config",
// getLocator(), e);
// }
BuildElement element = buildElementHandler.getBuildElement();
if (element.getType().equals(GLOBAL_TASKS_ELEMENT)) {
config.addGlobalTasks(element);
} else if (element.getType().equals(PERFRAME_TASKS_ELEMENT)) {
config.addFrameTasks(element);
} else {
throw new SAXParseException("<antconfig> does not support the <"
+ element.getType() + "> element", getLocator());
}
} }


/** /**


+ 26
- 26
proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/AttributeSetter.java View File

@@ -56,7 +56,7 @@ import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import org.apache.ant.common.antlib.Converter; import org.apache.ant.common.antlib.Converter;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;


/** /**
* AttributeSetters are created at introspection time for each * AttributeSetters are created at introspection time for each
@@ -69,25 +69,25 @@ import org.apache.ant.common.util.ExecutionException;
public class AttributeSetter { public class AttributeSetter {
/** The method that will perform the setting */ /** The method that will perform the setting */
private Method method; private Method method;
/**
* A converter to convert the string value to a value to be given to
* the setter method
*/
/**
* A converter to convert the string value to a value to be given to
* the setter method
*/
private Converter converter; private Converter converter;
/** /**
* A constructor used to create the string value to an object to be used * A constructor used to create the string value to an object to be used
* by the setter
* by the setter
*/ */
private Constructor valueConstructor; private Constructor valueConstructor;
/** The depth of the setter in the class hierarchy */ /** The depth of the setter in the class hierarchy */
private int depth; private int depth;


/** /**
* Create a setter which just uses string values
*
* Create a setter which just uses string values
*
* @param method the method to be invoked. * @param method the method to be invoked.
* @param depth the depth of this method declaraion in the class hierarchy. * @param depth the depth of this method declaraion in the class hierarchy.
*/ */
@@ -97,8 +97,8 @@ public class AttributeSetter {
} }


/** /**
* Create a setter which just uses string values
*
* Create a setter which just uses string values
*
* @param method the method to be invoked. * @param method the method to be invoked.
* @param depth the depth of this method declaraion in the class hierarchy. * @param depth the depth of this method declaraion in the class hierarchy.
* @param converter a converter to convert string values into instances of * @param converter a converter to convert string values into instances of
@@ -110,19 +110,19 @@ public class AttributeSetter {
} }


/** /**
* Create a setter which just uses string values
*
* Create a setter which just uses string values
*
* @param method the method to be invoked. * @param method the method to be invoked.
* @param depth the depth of this method declaraion in the class hierarchy. * @param depth the depth of this method declaraion in the class hierarchy.
* @param valueConstructor an object constructor used to convert string
* @param valueConstructor an object constructor used to convert string
* values into instances of the type expected by the method. * values into instances of the type expected by the method.
*/ */
public AttributeSetter(Method method, int depth,
public AttributeSetter(Method method, int depth,
Constructor valueConstructor) { Constructor valueConstructor) {
this(method, depth); this(method, depth);
this.valueConstructor = valueConstructor; this.valueConstructor = valueConstructor;
} }
/** /**
* Set the attribute value on an object * Set the attribute value on an object
* *
@@ -131,17 +131,17 @@ public class AttributeSetter {
* @exception InvocationTargetException if the method cannot be * @exception InvocationTargetException if the method cannot be
* invoked * invoked
* @exception IllegalAccessException if the method cannot be invoked * @exception IllegalAccessException if the method cannot be invoked
* @exception ExecutionException if the conversion of the value
* @exception AntException if the conversion of the value
* fails * fails
*/ */
void set(Object obj, String stringValue) void set(Object obj, String stringValue)
throws InvocationTargetException, IllegalAccessException, throws InvocationTargetException, IllegalAccessException,
ExecutionException {
AntException {
Object value = null; Object value = null;
if (converter != null) { if (converter != null) {
Class type = getType(); Class type = getType();
value = converter.convert(stringValue, type);
value = converter.convert(stringValue, type);
} else if (valueConstructor != null) { } else if (valueConstructor != null) {
try { try {
value = valueConstructor.newInstance(new String[]{stringValue}); value = valueConstructor.newInstance(new String[]{stringValue});
@@ -151,19 +151,19 @@ public class AttributeSetter {
} else { } else {
value = stringValue; value = stringValue;
} }
method.invoke(obj, new Object[]{value}); method.invoke(obj, new Object[]{value});
} }
/** /**
* Get the declaration depth of this setter.
* Get the declaration depth of this setter.
* *
* @return the attribute setter's declaration depth. * @return the attribute setter's declaration depth.
*/ */
public int getDepth() { public int getDepth() {
return depth; return depth;
} }
/** /**
* Get the type expected by this setter's method * Get the type expected by this setter's method
* *


+ 4
- 4
proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/BuildEventSupport.java View File

@@ -63,7 +63,7 @@ import org.apache.ant.common.event.BuildListener;
import org.apache.ant.common.model.ModelElement; import org.apache.ant.common.model.ModelElement;
import org.apache.ant.common.util.DemuxOutputReceiver; import org.apache.ant.common.util.DemuxOutputReceiver;
import org.apache.ant.common.event.MessageLevel; import org.apache.ant.common.event.MessageLevel;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;


/** /**
* BuildEventSupport is used by classes which which to send build events to * BuildEventSupport is used by classes which which to send build events to
@@ -239,11 +239,11 @@ public class BuildEventSupport implements DemuxOutputReceiver {
task.handleSystemOut(line); task.handleSystemOut(line);
} }
return; return;
} catch (ExecutionException e) {
// ignore just log normally
} catch (AntException e) {
// ignore just log as a non-task message
} }
} }
fireMessageLogged(this, line,
fireMessageLogged(this, line,
isError ? MessageLevel.MSG_ERR : MessageLevel.MSG_INFO); isError ? MessageLevel.MSG_ERR : MessageLevel.MSG_INFO);
} }
} }


+ 120
- 127
proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/ComponentManager.java View File

@@ -52,7 +52,6 @@
* <http://www.apache.org/>. * <http://www.apache.org/>.
*/ */
package org.apache.ant.antcore.execution; package org.apache.ant.antcore.execution;
import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
@@ -78,7 +77,7 @@ import org.apache.ant.common.antlib.TaskContainer;
import org.apache.ant.common.event.MessageLevel; import org.apache.ant.common.event.MessageLevel;
import org.apache.ant.common.model.BuildElement; import org.apache.ant.common.model.BuildElement;
import org.apache.ant.common.service.ComponentService; import org.apache.ant.common.service.ComponentService;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;
import org.apache.ant.common.util.Location; import org.apache.ant.common.util.Location;
import org.apache.ant.init.LoaderUtils; import org.apache.ant.init.LoaderUtils;


@@ -91,11 +90,6 @@ import org.apache.ant.init.LoaderUtils;
*/ */
public class ComponentManager implements ComponentService { public class ComponentManager implements ComponentService {


/**
* These are AntLibraries which have been loaded into this component
* manager
*/
private static Map antLibraries = new HashMap();
/** /**
* Type converters for this frame. Converters are used when configuring * Type converters for this frame. Converters are used when configuring
* Tasks to handle special type conversions. * Tasks to handle special type conversions.
@@ -129,12 +123,6 @@ public class ComponentManager implements ComponentService {
/** The definitions which have been imported into this frame. */ /** The definitions which have been imported into this frame. */
private Map imports = new HashMap(); private Map imports = new HashMap();


/**
* This map stores a list of additional paths for each library indexed by
* the libraryId
*/
private Map libPathsMap = new HashMap();

/** Reflector objects used to configure Tasks from the Task models. */ /** Reflector objects used to configure Tasks from the Task models. */
private Map setters = new HashMap(); private Map setters = new HashMap();


@@ -143,16 +131,17 @@ public class ComponentManager implements ComponentService {
* Constructor * Constructor
* *
* @param frame the frame containing this context * @param frame the frame containing this context
*
* @exception ExecutionException if the loaded libraries could not be
* @param libManager the library manager with the library definitions
* which are shared across all component manager instances.
* @exception ExecutionException if the loaded libraries could not be
* imported. * imported.
*/ */
protected ComponentManager(Frame frame) throws ExecutionException {
protected ComponentManager(Frame frame, AntLibManager libManager)
throws ExecutionException {
this.frame = frame; this.frame = frame;
AntConfig config = frame.getConfig(); AntConfig config = frame.getConfig();
libManager = new AntLibManager(config.isRemoteLibAllowed());
this.libManager = libManager;
dynamicLibraries = new HashMap(); dynamicLibraries = new HashMap();
libPathsMap = new HashMap();
} }


/** /**
@@ -162,32 +151,32 @@ public class ComponentManager implements ComponentService {
* @param libLocation the file or URL of the library location * @param libLocation the file or URL of the library location
* @param importAll if true all tasks are imported as the library is * @param importAll if true all tasks are imported as the library is
* loaded * loaded
* @param autoImport true if libraries in the Ant namespace should be
* automatically imported.
* @exception ExecutionException if the library cannot be loaded
* @exception AntException if the library cannot be loaded
*/ */
public void loadLib(String libLocation, boolean importAll,
boolean autoImport)
throws ExecutionException {
try {
Map librarySpecs = new HashMap();
libManager.loadLibs(librarySpecs, libLocation);
Map newLibraries = libManager.configLibraries(frame.getInitConfig(),
librarySpecs, antLibraries, libPathsMap);

antLibraries.putAll(newLibraries);
Iterator i = antLibraries.keySet().iterator();
while (i.hasNext()) {
String libraryId = (String) i.next();
boolean doAuto = autoImport
&& libraryId.startsWith(Constants.ANT_LIB_PREFIX);
if (importAll || doAuto) {
importLibrary(libraryId);
}
public void loadLib(URL libLocation, boolean importAll)
throws AntException {
Map newLibraries = libManager.loadLibs(libLocation);
Iterator i = newLibraries.keySet().iterator();
while (i.hasNext()) {
String libraryId = (String) i.next();
if (importAll) {
importLibrary(libraryId);
}
}
}

/**
* Examine all the libraries defined in the Library manager and import
* those which are in the ant library namespace.
*
* @exception AntException if the standard components cannot be imported.
*/
protected void importStandardComponents() throws AntException {
for (Iterator i = libManager.getLibraryIds(); i.hasNext();) {
String libraryId = (String) i.next();
if (libraryId.startsWith(Constants.ANT_LIB_PREFIX)) {
importLibrary(libraryId);
} }
} catch (MalformedURLException e) {
throw new ExecutionException("Unable to load libraries from "
+ libLocation, e);
} }
} }


@@ -229,32 +218,21 @@ public class ComponentManager implements ComponentService {
* @param libraryId the unique id of the library for which an additional * @param libraryId the unique id of the library for which an additional
* path is being defined * path is being defined
* @param libPath the library path (usually a jar) * @param libPath the library path (usually a jar)
* @exception ExecutionException if the path cannot be specified
* @exception AntException if the path cannot be specified
*/ */
public void addLibPath(String libraryId, URL libPath) public void addLibPath(String libraryId, URL libPath)
throws ExecutionException {
List libPaths = (List) libPathsMap.get(libraryId);
if (libPaths == null) {
libPaths = new ArrayList();
libPathsMap.put(libraryId, libPaths);
}
libPaths.add(libPath);

// If this library already exists give it the new path now
AntLibrary library = (AntLibrary) antLibraries.get(libraryId);
if (library != null) {
libManager.addLibPath(library, libPath);
}
throws AntException {
libManager.addLibPath(libraryId, libPath);
} }


/** /**
* Import a complete library into the current execution frame * Import a complete library into the current execution frame
* *
* @param libraryId The id of the library to be imported * @param libraryId The id of the library to be imported
* @exception ExecutionException if the library cannot be imported
* @exception AntException if the library cannot be imported
*/ */
public void importLibrary(String libraryId) throws ExecutionException {
AntLibrary library = (AntLibrary) antLibraries.get(libraryId);
public void importLibrary(String libraryId) throws AntException {
AntLibrary library = libManager.getLibrary(libraryId);
if (library == null) { if (library == null) {
throw new ExecutionException("Unable to import library " + libraryId throw new ExecutionException("Unable to import library " + libraryId
+ " as it has not been loaded"); + " as it has not been loaded");
@@ -277,11 +255,11 @@ public class ComponentManager implements ComponentService {
* @param alias the name under which this component will be used in the * @param alias the name under which this component will be used in the
* build scripts. If this is null, the components default name is * build scripts. If this is null, the components default name is
* used. * used.
* @exception ExecutionException if the component cannot be imported
* @exception AntException if the component cannot be imported
*/ */
public void importComponent(String libraryId, String defName, public void importComponent(String libraryId, String defName,
String alias) throws ExecutionException {
AntLibrary library = (AntLibrary) antLibraries.get(libraryId);
String alias) throws AntException {
AntLibrary library = libManager.getLibrary(libraryId);
if (library == null) { if (library == null) {
throw new ExecutionException("Unable to import component from " throw new ExecutionException("Unable to import component from "
+ "library \"" + libraryId + "\" as it has not been loaded"); + "library \"" + libraryId + "\" as it has not been loaded");
@@ -331,10 +309,10 @@ public class ComponentManager implements ComponentService {
* @param componentName the name of the component * @param componentName the name of the component
* @return the created component. The return type of this method depends * @return the created component. The return type of this method depends
* on the component type. * on the component type.
* @exception ExecutionException if the component cannot be created
* @exception AntException if the component cannot be created
*/ */
public Object createComponent(String componentName) public Object createComponent(String componentName)
throws ExecutionException {
throws AntException {
return createComponent(componentName, (BuildElement) null); return createComponent(componentName, (BuildElement) null);
} }


@@ -347,12 +325,11 @@ public class ComponentManager implements ComponentService {
* @param localName the name component within the library. * @param localName the name component within the library.
* @return the created component. The return type of this method depends * @return the created component. The return type of this method depends
* on the component type. * on the component type.
* @exception ExecutionException if the component cannot be created
* @exception AntException if the component cannot be created
*/ */
public Object createComponent(String libraryId, String localName) public Object createComponent(String libraryId, String localName)
throws ExecutionException {
AntLibrary library
= (AntLibrary) antLibraries.get(libraryId);
throws AntException {
AntLibrary library = libManager.getLibrary(libraryId);
if (library == null) { if (library == null) {
throw new ExecutionException("No library with libraryId \"" throw new ExecutionException("No library with libraryId \""
+ libraryId + "\" is available"); + libraryId + "\" is available");
@@ -377,6 +354,21 @@ public class ComponentManager implements ComponentService {
return converters; return converters;
} }


/**
* Initialize a library.
*
* @param libraryId the library's identifier.
*
* @exception AntException if the library cannot be initalized.
*/
protected void initializeLibrary(String libraryId)
throws AntException {
AntLibrary library = libManager.getLibrary(libraryId);
if (library != null) {
getLibFactory(library);
}
}

/** /**
* Get the collection of Ant Libraries defined for this frame Gets the * Get the collection of Ant Libraries defined for this frame Gets the
* factory object for the given library * factory object for the given library
@@ -384,10 +376,10 @@ public class ComponentManager implements ComponentService {
* @param componentLibrary the compnent library for which a factory objetc * @param componentLibrary the compnent library for which a factory objetc
* is required * is required
* @return the library's factory object * @return the library's factory object
* @exception ExecutionException if the factory cannot be created
* @exception AntException if the factory cannot be created
*/ */
protected AntLibFactory getLibFactory(ComponentLibrary componentLibrary) protected AntLibFactory getLibFactory(ComponentLibrary componentLibrary)
throws ExecutionException {
throws AntException {
String libraryId = componentLibrary.getLibraryId(); String libraryId = componentLibrary.getLibraryId();
if (libFactories.containsKey(libraryId)) { if (libFactories.containsKey(libraryId)) {
return (AntLibFactory) libFactories.get(libraryId); return (AntLibFactory) libFactories.get(libraryId);
@@ -419,11 +411,11 @@ public class ComponentManager implements ComponentService {
* @param model the build model representing the component and its * @param model the build model representing the component and its
* configuration * configuration
* @return the configured component * @return the configured component
* @exception ExecutionException if there is a problem creating or
* @exception AntException if there is a problem creating or
* configuring the component * configuring the component
*/ */
protected Object createComponent(BuildElement model) protected Object createComponent(BuildElement model)
throws ExecutionException {
throws AntException {
String componentName = model.getType(); String componentName = model.getType();
return createComponent(componentName, model); return createComponent(componentName, model);
} }
@@ -437,20 +429,20 @@ public class ComponentManager implements ComponentService {
* @param model the build model of the component. If this is null, the * @param model the build model of the component. If this is null, the
* component is created but not configured. * component is created but not configured.
* @return the configured component * @return the configured component
* @exception ExecutionException if there is a problem creating or
* @exception AntException if there is a problem creating or
* configuring the component * configuring the component
*/ */
private Object createComponent(String componentName, BuildElement model) private Object createComponent(String componentName, BuildElement model)
throws ExecutionException {
throws AntException {


Object component = null; Object component = null;
if (model != null) {
if (model != null) {
for (Iterator i = aspects.iterator(); i.hasNext();) { for (Iterator i = aspects.iterator(); i.hasNext();) {
Aspect aspect = (Aspect) i.next(); Aspect aspect = (Aspect) i.next();
component = aspect.preCreateComponent(component, model); component = aspect.preCreateComponent(component, model);
} }
} }
if (component == null) { if (component == null) {
ImportInfo importInfo = getImport(componentName); ImportInfo importInfo = getImport(componentName);
if (importInfo == null) { if (importInfo == null) {
@@ -458,21 +450,21 @@ public class ComponentManager implements ComponentService {
+ componentName + "> component"); + componentName + "> component");
} }
String className = importInfo.getClassName(); String className = importInfo.getClassName();
ComponentLibrary componentLibrary ComponentLibrary componentLibrary
= importInfo.getComponentLibrary(); = importInfo.getComponentLibrary();
component = createComponentFromDef(componentName, componentLibrary, component = createComponentFromDef(componentName, componentLibrary,
importInfo.getDefinition(), model); importInfo.getDefinition(), model);
} }
if (model != null) { if (model != null) {
for (Iterator i = aspects.iterator(); i.hasNext();) { for (Iterator i = aspects.iterator(); i.hasNext();) {
Aspect aspect = (Aspect) i.next(); Aspect aspect = (Aspect) i.next();
component = aspect.postCreateComponent(component, model); component = aspect.postCreateComponent(component, model);
} }
} }
return component; return component;
} }


@@ -485,13 +477,13 @@ public class ComponentManager implements ComponentService {
* @param libDefinition the component's definition * @param libDefinition the component's definition
* @param model the BuildElement model of the component's configuration. * @param model the BuildElement model of the component's configuration.
* @return the required component potentially wrapped in a wrapper object. * @return the required component potentially wrapped in a wrapper object.
* @exception ExecutionException if the component cannot be created
* @exception AntException if the component cannot be created
*/ */
private Object createComponentFromDef(String componentName, private Object createComponentFromDef(String componentName,
ComponentLibrary componentLibrary, ComponentLibrary componentLibrary,
AntLibDefinition libDefinition, AntLibDefinition libDefinition,
BuildElement model) BuildElement model)
throws ExecutionException {
throws AntException {


Location location = Location.UNKNOWN_LOCATION; Location location = Location.UNKNOWN_LOCATION;
if (model != null) { if (model != null) {
@@ -633,12 +625,12 @@ public class ComponentManager implements ComponentService {
* @param libFactory the factory object of the typeClass's Ant library * @param libFactory the factory object of the typeClass's Ant library
* @param localName the name of the type within its Ant library * @param localName the name of the type within its Ant library
* @return an instance of the given class appropriately configured * @return an instance of the given class appropriately configured
* @exception ExecutionException if there is a problem creating the type
* @exception AntException if there is a problem creating the type
* instance * instance
*/ */
private Object createTypeInstance(Class typeClass, AntLibFactory libFactory, private Object createTypeInstance(Class typeClass, AntLibFactory libFactory,
BuildElement model, String localName) BuildElement model, String localName)
throws ExecutionException {
throws AntException {
try { try {
Object typeInstance Object typeInstance
= libFactory.createComponent(typeClass, localName); = libFactory.createComponent(typeClass, localName);
@@ -646,7 +638,7 @@ public class ComponentManager implements ComponentService {
if (typeInstance instanceof ExecutionComponent) { if (typeInstance instanceof ExecutionComponent) {
ExecutionComponent component ExecutionComponent component
= (ExecutionComponent) typeInstance; = (ExecutionComponent) typeInstance;
ExecutionContext context
ExecutionContext context
= new ExecutionContext(frame, component, model); = new ExecutionContext(frame, component, model);
component.init(context, localName); component.init(context, localName);
configureElement(libFactory, typeInstance, model); configureElement(libFactory, typeInstance, model);
@@ -680,16 +672,16 @@ public class ComponentManager implements ComponentService {
* @param model the model of the nested element * @param model the model of the nested element
* @param factory Ant Library factory associated with the element to which * @param factory Ant Library factory associated with the element to which
* the attribute is to be added. * the attribute is to be added.
* @exception ExecutionException if the nested element cannot be created
* @exception AntException if the nested element cannot be created
*/ */
private void addNestedElement(AntLibFactory factory, Setter setter, private void addNestedElement(AntLibFactory factory, Setter setter,
Object element, BuildElement model) Object element, BuildElement model)
throws ExecutionException {
throws AntException {
String nestedElementName = model.getType(); String nestedElementName = model.getType();
Class nestedType = setter.getType(nestedElementName); Class nestedType = setter.getType(nestedElementName);


// is there a polymorph indicator - look in Ant aspects // is there a polymorph indicator - look in Ant aspects
String typeName
String typeName
= model.getAspectAttributeValue(Constants.ANT_ASPECT, "type"); = model.getAspectAttributeValue(Constants.ANT_ASPECT, "type");


Object typeInstance = null; Object typeInstance = null;
@@ -734,11 +726,11 @@ public class ComponentManager implements ComponentService {
* @param model the build model for the nestd element * @param model the build model for the nestd element
* @param factory Ant Library factory associated with the element creating * @param factory Ant Library factory associated with the element creating
* the nested element * the nested element
* @exception ExecutionException if the nested element cannot be created.
* @exception AntException if the nested element cannot be created.
*/ */
private void createNestedElement(AntLibFactory factory, Setter setter, private void createNestedElement(AntLibFactory factory, Setter setter,
Object element, BuildElement model) Object element, BuildElement model)
throws ExecutionException {
throws AntException {
String nestedElementName = model.getType(); String nestedElementName = model.getType();
try { try {
Object nestedElement Object nestedElement
@@ -747,7 +739,7 @@ public class ComponentManager implements ComponentService {
if (nestedElement instanceof ExecutionComponent) { if (nestedElement instanceof ExecutionComponent) {
ExecutionComponent component ExecutionComponent component
= (ExecutionComponent) nestedElement; = (ExecutionComponent) nestedElement;
ExecutionContext context
ExecutionContext context
= new ExecutionContext(frame, component, model); = new ExecutionContext(frame, component, model);
component.init(context, nestedElementName); component.init(context, nestedElementName);
configureElement(factory, nestedElement, model); configureElement(factory, nestedElement, model);
@@ -770,12 +762,12 @@ public class ComponentManager implements ComponentService {
* @param attributeValues a map containing named attribute values. * @param attributeValues a map containing named attribute values.
* @param ignoreUnsupported if this is true, attribute names for which no * @param ignoreUnsupported if this is true, attribute names for which no
* setter method exists are ignored. * setter method exists are ignored.
* @exception ExecutionException if the object does not support an
* @exception AntException if the object does not support an
* attribute in the map. * attribute in the map.
*/ */
public void configureAttributes(Object object, Map attributeValues, public void configureAttributes(Object object, Map attributeValues,
boolean ignoreUnsupported) boolean ignoreUnsupported)
throws ExecutionException {
throws AntException {
Setter setter = getSetter(object.getClass()); Setter setter = getSetter(object.getClass());
for (Iterator i = attributeValues.keySet().iterator(); i.hasNext();) { for (Iterator i = attributeValues.keySet().iterator(); i.hasNext();) {
String attributeName = (String) i.next(); String attributeName = (String) i.next();
@@ -800,36 +792,13 @@ public class ComponentManager implements ComponentService {
* @param model the BuildElement describing the object in the build file * @param model the BuildElement describing the object in the build file
* @param factory Ant Library factory associated with the element being * @param factory Ant Library factory associated with the element being
* configured * configured
* @exception ExecutionException if the element cannot be configured
* @exception AntException if the element cannot be configured
*/ */
private void configureElement(AntLibFactory factory, Object element, private void configureElement(AntLibFactory factory, Object element,
BuildElement model) BuildElement model)
throws ExecutionException {
throws AntException {
Setter setter = getSetter(element.getClass()); Setter setter = getSetter(element.getClass());
// start by setting the attributes of this element
for (Iterator i = model.getAttributeNames(); i.hasNext();) {
String attributeName = (String) i.next();
String attributeValue = model.getAttributeValue(attributeName);
if (!setter.supportsAttribute(attributeName)) {
throw new ExecutionException(model.getType()
+ " does not support the \"" + attributeName
+ "\" attribute", model.getLocation());
}
setter.setAttribute(element, attributeName,
frame.replacePropertyRefs(attributeValue));
}

String modelText = model.getText().trim();
if (modelText.length() != 0) {
if (!setter.supportsText()) {
throw new ExecutionException(model.getType()
+ " does not support content", model.getLocation());
}
setter.addText(element,
frame.replacePropertyRefs(modelText));
}

// now do the nested elements
// do the nested elements
for (Iterator i = model.getNestedElements(); i.hasNext();) { for (Iterator i = model.getNestedElements(); i.hasNext();) {
BuildElement nestedElementModel = (BuildElement) i.next(); BuildElement nestedElementModel = (BuildElement) i.next();
String nestedElementName = nestedElementModel.getType(); String nestedElementName = nestedElementModel.getType();
@@ -851,13 +820,37 @@ public class ComponentManager implements ComponentService {
createNestedElement(factory, setter, element, createNestedElement(factory, setter, element,
nestedElementModel); nestedElementModel);
} else { } else {
throw new ExecutionException(model.getType()
throw new ExecutionException("<" + model.getType() + ">"
+ " does not support the \"" + nestedElementName + " does not support the \"" + nestedElementName
+ "\" nested element", + "\" nested element",
nestedElementModel.getLocation()); nestedElementModel.getLocation());
} }
} }
} }

// Set the attributes of this element
for (Iterator i = model.getAttributeNames(); i.hasNext();) {
String attributeName = (String) i.next();
String attributeValue = model.getAttributeValue(attributeName);
if (!setter.supportsAttribute(attributeName)) {
throw new ExecutionException("<" + model.getType() + ">"
+ " does not support the \"" + attributeName
+ "\" attribute", model.getLocation());
}
setter.setAttribute(element, attributeName,
frame.replacePropertyRefs(attributeValue));
}

String modelText = model.getText();
if (modelText.length() != 0) {
if (!setter.supportsText()) {
throw new ExecutionException("<" + model.getType() + ">"
+ " does not support content", model.getLocation());
}
setter.addText(element,
frame.replacePropertyRefs(modelText));
}

} }


/** /**
@@ -889,9 +882,9 @@ public class ComponentManager implements ComponentService {
* *
* @param library the library from which the aspects are to be loaded. * @param library the library from which the aspects are to be loaded.
* *
* @exception ExecutionException if an aspect cannot be loaded.
* @exception AntException if an aspect cannot be loaded.
*/ */
private void addAspects(AntLibrary library) throws ExecutionException {
private void addAspects(AntLibrary library) throws AntException {
if (!library.hasAspects() if (!library.hasAspects()
|| loadedAspects.contains(library.getLibraryId())) { || loadedAspects.contains(library.getLibraryId())) {
return; return;
@@ -912,7 +905,7 @@ public class ComponentManager implements ComponentService {
+ " does not implement the Aspect interface"); + " does not implement the Aspect interface");
} }
Aspect aspect = (Aspect) libFactory.createInstance(aspectClass); Aspect aspect = (Aspect) libFactory.createInstance(aspectClass);
ExecutionContext context
ExecutionContext context
= new ExecutionContext(frame, null, null); = new ExecutionContext(frame, null, null);
aspect.init(context); aspect.init(context);
aspects.add(aspect); aspects.add(aspect);
@@ -946,11 +939,11 @@ public class ComponentManager implements ComponentService {
* frame. * frame.
* *
* @param library the library from which the converters are required * @param library the library from which the converters are required
* @exception ExecutionException if a converter defined in the library
* @exception AntException if a converter defined in the library
* cannot be instantiated * cannot be instantiated
*/ */
private void addConverters(AntLibrary library) private void addConverters(AntLibrary library)
throws ExecutionException {
throws AntException {
if (!library.hasConverters() if (!library.hasConverters()
|| loadedConverters.contains(library.getLibraryId())) { || loadedConverters.contains(library.getLibraryId())) {
return; return;
@@ -972,7 +965,7 @@ public class ComponentManager implements ComponentService {
} }
Converter converter Converter converter
= (Converter) libFactory.createInstance(converterClass); = (Converter) libFactory.createInstance(converterClass);
ExecutionContext context
ExecutionContext context
= new ExecutionContext(frame, null, null); = new ExecutionContext(frame, null, null);
converter.init(context); converter.init(context);
Class[] converterTypes = converter.getTypes(); Class[] converterTypes = converter.getTypes();
@@ -1004,7 +997,7 @@ public class ComponentManager implements ComponentService {
} }


/** /**
* Get the aspects which have been registered from ant libraries.
* Get the aspects which have been registered from ant libraries.
* *
* @return the list of Aspect instances currently defined. * @return the list of Aspect instances currently defined.
*/ */


+ 5
- 5
proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/CoreDataService.java View File

@@ -57,8 +57,8 @@ 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.service.DataService; import org.apache.ant.common.service.DataService;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.PropertyUtils; import org.apache.ant.common.util.PropertyUtils;
import org.apache.ant.common.util.AntException;


/** /**
* This is the core's implementation of the DataService service interface. * This is the core's implementation of the DataService service interface.
@@ -156,10 +156,10 @@ public class CoreDataService implements DataService {
* *
* @param value the string to be scanned for property references. * @param value the string to be scanned for property references.
* @return the string with all property references replaced * @return the string with all property references replaced
* @exception ExecutionException if any of the properties do not exist
* @exception AntException if any of the properties do not exist
*/ */
public String replacePropertyRefs(String value) public String replacePropertyRefs(String value)
throws ExecutionException {
throws AntException {
if (value == null) { if (value == null) {
return null; return null;
} }
@@ -199,10 +199,10 @@ public class CoreDataService implements DataService {
* @param value the string to be scanned for property references. * @param value the string to be scanned for property references.
* @param replacementValues the collection of replacement values * @param replacementValues the collection of replacement values
* @return the string with all property references replaced * @return the string with all property references replaced
* @exception ExecutionException if any of the properties do not exist
* @exception AntException if any of the properties do not exist
*/ */
public String replacePropertyRefs(String value, Map replacementValues) public String replacePropertyRefs(String value, Map replacementValues)
throws ExecutionException {
throws AntException {
if (value == null) { if (value == null) {
return null; return null;
} }


+ 0
- 1
proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/CoreEventService.java View File

@@ -54,7 +54,6 @@
package org.apache.ant.antcore.execution; package org.apache.ant.antcore.execution;
import org.apache.ant.common.event.BuildListener; import org.apache.ant.common.event.BuildListener;
import org.apache.ant.common.service.EventService; import org.apache.ant.common.service.EventService;
import org.apache.ant.common.util.ExecutionException;


/** /**
* Core implementation of the event service * Core implementation of the event service


+ 88
- 28
proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/CoreExecService.java View File

@@ -64,9 +64,11 @@ 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.model.BuildElement; import org.apache.ant.common.model.BuildElement;
import org.apache.ant.common.service.ExecService; import org.apache.ant.common.service.ExecService;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.service.BuildKey;
import org.apache.ant.init.InitUtils; import org.apache.ant.init.InitUtils;
import org.apache.ant.common.model.AspectValueCollection; import org.apache.ant.common.model.AspectValueCollection;
import org.apache.ant.common.event.BuildListener;
import org.apache.ant.common.util.AntException;


/** /**
* This is the core's implementation of the Execution Service. * This is the core's implementation of the Execution Service.
@@ -98,9 +100,9 @@ public class CoreExecService implements ExecService {
* core. This is checked * core. This is checked
* *
* @param task the task to be executed * @param task the task to be executed
* @exception ExecutionException if there is an execution problem
* @exception AntException if there is an execution problem
*/ */
public void executeTask(Task task) throws ExecutionException {
public void executeTask(Task task) throws AntException {
ExecutionContext execContext = getTaskExecutionContext(task); ExecutionContext execContext = getTaskExecutionContext(task);


BuildElement model = execContext.getModel(); BuildElement model = execContext.getModel();
@@ -110,7 +112,7 @@ public class CoreExecService implements ExecService {
} }
frame.executeTask(task, aspectValues); frame.executeTask(task, aspectValues);
} }
/** /**
* Retrieve the execution context from a task and verify that the context * Retrieve the execution context from a task and verify that the context
* is valid. * is valid.
@@ -120,7 +122,7 @@ public class CoreExecService implements ExecService {
* *
* @exception ExecutionException if the task's context is not valid. * @exception ExecutionException if the task's context is not valid.
*/ */
private ExecutionContext getTaskExecutionContext(Task task)
private ExecutionContext getTaskExecutionContext(Task task)
throws ExecutionException { throws ExecutionException {
AntContext context = task.getAntContext(); AntContext context = task.getAntContext();


@@ -130,25 +132,25 @@ public class CoreExecService implements ExecService {
} }
return (ExecutionContext) context; return (ExecutionContext) context;
} }
/** /**
* Execute a task with a set of aspect values. Normally aspect values come
* Execute a task with a set of aspect values. Normally aspect values come
* from a build model but not all tasks will be created from a build model. * from a build model but not all tasks will be created from a build model.
* Some may be created dynamically and configured programatically. This
* Some may be created dynamically and configured programatically. This
* method allows aspect values to provided for execution of such tasks since * method allows aspect values to provided for execution of such tasks since
* by their nature, aspect values are not part of the task configuration. * by their nature, aspect values are not part of the task configuration.
* *
* @param task the task to be executed * @param task the task to be executed
* @param aspectValues the aspect attribute values. * @param aspectValues the aspect attribute values.
* @exception ExecutionException if there is an execution problem
* @exception AntException if there is an execution problem
*/ */
public void executeTask(Task task, AspectValueCollection aspectValues)
throws ExecutionException {
public void executeTask(Task task, AspectValueCollection aspectValues)
throws AntException {
ExecutionContext execContext = getTaskExecutionContext(task); ExecutionContext execContext = getTaskExecutionContext(task);


frame.executeTask(task, aspectValues); frame.executeTask(task, aspectValues);
} }




/** /**
@@ -160,6 +162,17 @@ public class CoreExecService implements ExecService {
return frame.getBaseDir(); return frame.getBaseDir();
} }


/**
* Set the basedir for the current execution
*
* @param baseDir the new base directory for this execution of Ant
*
* @exception AntException if the baseDir cannot be set to the given value.
*/
public void setBaseDir(File baseDir) throws AntException {
frame.setBaseDir(baseDir);
}



/** /**
* get the name of the project associated with this execution. * get the name of the project associated with this execution.
@@ -203,15 +216,54 @@ public class CoreExecService implements ExecService {
} }




/**
* Force initialisation of a particular ant library in the context of the
* given subbuild.
*
* @param key the build key.
* @param libraryId the id of the library to be initialized.
* @exception AntException if the build cannot be run
*/
public void initializeBuildLibrary(BuildKey key, String libraryId)
throws AntException {
Frame subFrame = getSubbuildFrame(key);
subFrame.initializeLibrary(libraryId);
}

/**
* Add a listener to a subbuild
*
* @param key the key identifying the build previously setup
* @param listener the listener to add to the build.
*
* @exception ExecutionException if the build cannot be found.
*/
public void addBuildListener(BuildKey key, BuildListener listener)
throws ExecutionException {
getSubbuildFrame(key).addBuildListener(listener);
}


/** /**
* Run a build which have been previously setup * Run a build which have been previously setup
* *
* @param targets A list of targets to be run * @param targets A list of targets to be run
* @param key Description of the Parameter * @param key Description of the Parameter
* @exception ExecutionException if the build cannot be run
* @exception AntException if the build cannot be run
*/ */
public void runBuild(Object key, List targets) throws ExecutionException {
public void runBuild(BuildKey key, List targets) throws AntException {
getSubbuildFrame(key).runBuild(targets); getSubbuildFrame(key).runBuild(targets);
}


/**
* Release a subbuild that is no longer in use.
*
* @param key the BuildKey identifiying the subbuild.
*
* @exception ExecutionException if the build was not registered.
*/
public void releaseBuild(BuildKey key) throws ExecutionException {
subBuilds.remove(key); subBuilds.remove(key);
} }


@@ -245,12 +297,12 @@ public class CoreExecService implements ExecService {
* referenced. * referenced.
* @param model the project model. * @param model the project model.
* @param initialData the project's initial data load. * @param initialData the project's initial data load.
* @exception ExecutionException if the project cannot be referenced.
* @exception AntException if the project cannot be referenced.
*/ */
public void createProjectReference(String referenceName, Project model,
public void createProjectReference(String referenceName, Project model,
Map initialData) Map initialData)
throws ExecutionException {
frame.createProjectReference(referenceName, model, initialData);
throws AntException {
frame.createProjectReference(referenceName, model, initialData);
} }




@@ -259,16 +311,22 @@ public class CoreExecService implements ExecService {
* *
* @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 properties the initiali properties to be used in the build
* @param addListeners true if the current frame's listeners should be
* added to the created Frame
* @return Description of the Return Value * @return Description of the Return Value
* @exception ExecutionException if the subbuild cannot be run
* @exception AntException if the subbuild cannot be run
*/ */
public Object setupBuild(Project model, Map properties)
throws ExecutionException {
public BuildKey setupBuild(Project model, Map properties,
boolean addListeners)
throws AntException {
Frame newFrame = frame.createFrame(model); Frame newFrame = frame.createFrame(model);
if (addListeners) {
frame.addListeners(newFrame);
}
newFrame.initialize(properties);


newFrame.setInitialProperties(properties);

Object key = new Object();
// create an anonymous inner class key.
BuildKey key = new BuildKey() {};


subBuilds.put(key, newFrame); subBuilds.put(key, newFrame);
return key; return key;
@@ -279,12 +337,14 @@ 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 properties the initiali properties to be used in the build
* @param addListeners true if the current frame's listeners should be
* added to the created Frame
* @return Description of the Return Value * @return Description of the Return Value
* @exception ExecutionException if the subbuild cannot be run
* @exception AntException if the subbuild cannot be run
*/ */
public Object setupBuild(Map properties)
throws ExecutionException {
return setupBuild(frame.getProject(), properties);
public BuildKey setupBuild(Map properties, boolean addListeners)
throws AntException {
return setupBuild(frame.getProject(), properties, addListeners);
} }
} }



+ 3
- 3
proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/CoreFileService.java View File

@@ -54,8 +54,8 @@
package org.apache.ant.antcore.execution; package org.apache.ant.antcore.execution;
import java.io.File; import java.io.File;
import org.apache.ant.common.service.FileService; import org.apache.ant.common.service.FileService;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.FileUtils; import org.apache.ant.common.util.FileUtils;
import org.apache.ant.common.util.AntException;


/** /**
* The core's implementation of the File Service. The File Service is used * The core's implementation of the File Service. The File Service is used
@@ -86,9 +86,9 @@ public class CoreFileService implements FileService {
* *
* @param fileName the file name to be resolved. * @param fileName the file name to be resolved.
* @return the file resolved to the project's base dir * @return the file resolved to the project's base dir
* @exception ExecutionException if the file cannot be resolved.
* @exception AntException if the file cannot be resolved.
*/ */
public File resolveFile(String fileName) throws ExecutionException {
public File resolveFile(String fileName) throws AntException {
File base = frame.getBaseDir(); File base = frame.getBaseDir();
return fileUtils.resolveFile(fileUtils.normalize(base.getPath()), return fileUtils.resolveFile(fileUtils.normalize(base.getPath()),
fileName); fileName);


+ 0
- 1
proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/CoreInputService.java View File

@@ -53,7 +53,6 @@
*/ */
package org.apache.ant.antcore.execution; package org.apache.ant.antcore.execution;
import org.apache.ant.common.service.InputService; import org.apache.ant.common.service.InputService;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.input.InputRequest; import org.apache.ant.common.input.InputRequest;


/** /**


+ 0
- 1
proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/DeferredSetter.java View File

@@ -53,7 +53,6 @@
*/ */
package org.apache.ant.antcore.execution; package org.apache.ant.antcore.execution;
import org.apache.ant.common.antlib.DeferredTask; import org.apache.ant.common.antlib.DeferredTask;
import org.apache.ant.common.util.ExecutionException;


/** /**
* An implementation of the Setter interface for configuring instances of * An implementation of the Setter interface for configuring instances of


+ 2
- 3
proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/ExecutionContext.java View File

@@ -54,7 +54,6 @@
package org.apache.ant.antcore.execution; package org.apache.ant.antcore.execution;
import org.apache.ant.common.antlib.AntContext; import org.apache.ant.common.antlib.AntContext;
import org.apache.ant.common.antlib.ExecutionComponent; import org.apache.ant.common.antlib.ExecutionComponent;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.Location; import org.apache.ant.common.util.Location;
import org.apache.ant.common.model.BuildElement; import org.apache.ant.common.model.BuildElement;


@@ -90,7 +89,7 @@ public class ExecutionContext implements AntContext {
* *
* @param frame the frame containing this context * @param frame the frame containing this context
* @param component the component associated with this context - may be null * @param component the component associated with this context - may be null
* @param model the build model associated with this component if any.
* @param model the build model associated with this component if any.
*/ */
protected ExecutionContext(Frame frame, ExecutionComponent component, protected ExecutionContext(Frame frame, ExecutionComponent component,
BuildElement model) { BuildElement model) {
@@ -170,7 +169,7 @@ public class ExecutionContext implements AntContext {
protected ExecutionComponent getExecutionComponent() { protected ExecutionComponent getExecutionComponent() {
return component; return component;
} }
/** /**
* Get the build model associated with this context. * Get the build model associated with this context.
* *


+ 0
- 201
proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/ExecutionManager.java View File

@@ -1,201 +0,0 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.ant.antcore.execution;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.ant.antcore.config.AntConfig;
import org.apache.ant.common.event.BuildListener;
import org.apache.ant.common.model.Project;
import org.apache.ant.common.util.AntException;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.DemuxOutputReceiver;
import org.apache.ant.init.InitConfig;

/**
* The ExecutionManager is used to manage the execution of a build. The
* Execution manager is responsible for loading the Ant task libraries,
* creating Frames for each project that is part of the build and then
* executing the tasks within those Execution Frames.
*
* @author Conor MacNeill
* @created 12 January 2002
*/
public class ExecutionManager implements DemuxOutputReceiver {
/** BuildEvent support used to fire events and manage listeners */
private BuildEventSupport eventSupport = new BuildEventSupport();

/** The Execution Frame for the top level project being executed */
private Frame mainFrame;

/**
* The configuration to be used in this execution of Ant. It is formed
* from the system, user and any runtime configs.
*/
private AntConfig config;

/**
* Ant's initialization configuration with information on the location
* of Ant and its libraries.
*/
private InitConfig initConfig;

/**
* Create an ExecutionManager. When an ExecutionManager is created, it
* loads the ant libraries which are installed in the Ant lib/task
* directory.
*
* @param initConfig Ant's configuration - classloaders etc
* @param config The user config to use - may be null
* @exception ExecutionException if there is a problem with one of Ant's
* tasks
*/
public ExecutionManager(InitConfig initConfig, AntConfig config)
throws ExecutionException {
this.config = config;
this.initConfig = initConfig;
init();
}

/**
* Initialise the execution manager
*
* @exception ExecutionException if the standard ant libraries cannot be
* loaded
*/
public void init() throws ExecutionException {
}

/**
* Run a build, executing each of the targets on the given project
*
* @param project the project model to be used for the build
* @param targets a list of target names to be executed.
* @param commandProperties the properties defined by the front end to
* control the build
* @exception AntException if there is a problem in the build
*/
public void runBuild(Project project, List targets, Map commandProperties)
throws AntException {
Throwable buildFailureCause = null;
try {
// start by validating the project we have been given.
project.validate();

mainFrame = new Frame(initConfig, config);
for (Iterator j = eventSupport.getListeners(); j.hasNext();) {
BuildListener listener = (BuildListener) j.next();
mainFrame.addBuildListener(listener);
}

mainFrame.setProject(project);
mainFrame.setInitialProperties(commandProperties);

eventSupport.fireBuildStarted(project);
mainFrame.runBuild(targets);
} catch (RuntimeException e) {
buildFailureCause = e;
throw e;
} catch (ExecutionException e) {
ExecutionException ee = e instanceof ExecutionException
? e : new ExecutionException(e);
buildFailureCause = e;
throw ee;
} finally {
eventSupport.fireBuildFinished(project, buildFailureCause);
}
}

/**
* Add a build listener to the build
*
* @param listener the listener to be added to the build
*/
public void addBuildListener(BuildListener listener) {
eventSupport.addBuildListener(listener);
if (mainFrame != null) {
mainFrame.addBuildListener(listener);
}
}

/**
* Remove a build listener from the execution
*
* @param listener the listener to be removed
*/
public void removeBuildListener(BuildListener listener) {
eventSupport.removeBuildListener(listener);
if (mainFrame != null) {
mainFrame.removeBuildListener(listener);
}
}

/**
* Handle the content from a single thread. This method will be called
* by the thread producing the content. The content is broken up into
* separate lines
*
* @param line the content produce by the current thread.
* @param isErr true if this content is from the thread's error stream.
*/
public void threadOutput(String line, boolean isErr) {
if (mainFrame == null) {
eventSupport.threadOutput(line, isErr);
} else {
mainFrame.threadOutput(line, isErr);
}
}
}


+ 315
- 132
proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/Frame.java View File

@@ -63,11 +63,13 @@ import java.util.List;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Set; import java.util.Set;
import org.apache.ant.antcore.config.AntConfig; import org.apache.ant.antcore.config.AntConfig;
import org.apache.ant.antcore.antlib.AntLibManager;
import org.apache.ant.common.antlib.Task; import org.apache.ant.common.antlib.Task;
import org.apache.ant.common.antlib.Aspect; import org.apache.ant.common.antlib.Aspect;
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.model.BuildElement; import org.apache.ant.common.model.BuildElement;
import org.apache.ant.common.model.ModelException;
import org.apache.ant.common.model.Project; import org.apache.ant.common.model.Project;
import org.apache.ant.common.model.Target; import org.apache.ant.common.model.Target;
import org.apache.ant.common.model.AspectValueCollection; import org.apache.ant.common.model.AspectValueCollection;
@@ -79,8 +81,9 @@ 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.ExecutionException;
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.AntException;
import org.apache.ant.init.InitConfig; import org.apache.ant.init.InitConfig;
import org.apache.ant.init.LoaderUtils; import org.apache.ant.init.LoaderUtils;


@@ -102,20 +105,20 @@ public class Frame implements DemuxOutputReceiver {
/** The referenced frames corresponding to the referenced projects */ /** The referenced frames corresponding to the referenced projects */
private Map referencedFrames = new HashMap(); private Map referencedFrames = new HashMap();


/**
/**
* This is a Map of Maps. This map is keyed on an executing task. * This is a Map of Maps. This map is keyed on an executing task.
* Each entry is itself a Map of Aspects to their context for the * Each entry is itself a Map of Aspects to their context for the
* particular task. * particular task.
*/ */
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
/**
* 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. * property values indexed by their relative name.
*/ */
private Map overrides = new HashMap(); private Map overrides = new HashMap();
/** /**
* The context of this execution. This contains all data object's created * The context of this execution. This contains all data object's created
* by tasks that have been executed * by tasks that have been executed
@@ -146,10 +149,10 @@ public class Frame implements DemuxOutputReceiver {
/** /**
* The Data Service instance used by the frame for data management * The Data Service instance used by the frame for data management
*/ */
private DataService dataService;
private CoreDataService dataService;


/** The execution file service instance */ /** The execution file service instance */
private FileService fileService;
private CoreFileService fileService;


/** /**
* the Component Manager used to manage the importing of library * the Component Manager used to manage the importing of library
@@ -160,19 +163,41 @@ public class Frame implements DemuxOutputReceiver {
/** The core's execution Service */ /** The core's execution Service */
private CoreExecService execService; private CoreExecService execService;


/** The parent frame of this frame - may be null. */
private Frame parent = null;

/** The currently executing target in this frame */
private String currentTarget = null;

/** The global library manager */
private AntLibManager libManager;

/**
* Create the main or root Execution Frame.
*
* @param config the user config to use for this execution of Ant
* @param initConfig Ant's initialisation config
*/
public Frame(InitConfig initConfig, AntConfig config) {
this.config = config;
this.initConfig = initConfig;
this.parent = null;
this.libManager
= new AntLibManager(initConfig, config.isRemoteLibAllowed());
}


/** /**
* Create an Execution Frame for the given project
* Create an Execution Frame.
* *
* @param config the user config to use for this execution of Ant * @param config the user config to use for this execution of Ant
* @param initConfig Ant's initialisation config * @param initConfig Ant's initialisation config
* @exception ExecutionException if a component of the library cannot be
* imported
* @param parent the frame creating this frame.
*/ */
protected Frame(InitConfig initConfig,
AntConfig config) throws ExecutionException {
private Frame(InitConfig initConfig, AntConfig config, Frame parent) {
this.config = config; this.config = config;
this.initConfig = initConfig; this.initConfig = initConfig;
this.parent = parent;
this.libManager = parent.libManager;
} }




@@ -182,10 +207,10 @@ public class Frame implements DemuxOutputReceiver {
* *
* @param value the string to be scanned for property references. * @param value the string to be scanned for property references.
* @return the string with all property references replaced * @return the string with all property references replaced
* @exception ExecutionException if any of the properties do not exist
* @exception AntException if any of the properties do not exist
*/ */
protected String replacePropertyRefs(String value)
throws ExecutionException {
protected String replacePropertyRefs(String value)
throws AntException {
return dataService.replacePropertyRefs(value); return dataService.replacePropertyRefs(value);
} }


@@ -194,12 +219,12 @@ public class Frame implements DemuxOutputReceiver {
* Sets the Project of the Frame * Sets the Project of the Frame
* *
* @param project The new Project value * @param project The new Project value
* @exception ExecutionException if any required sub-frames cannot be
* created and configured
* @exception ModelException if the project is not valid.
*/ */
protected void setProject(Project project) throws ExecutionException {
public void setProject(Project project) throws ModelException {
this.project = project; this.project = project;
referencedFrames.clear(); referencedFrames.clear();
project.validate();
} }




@@ -235,7 +260,7 @@ public class Frame implements DemuxOutputReceiver {


if (frame == this) { if (frame == this) {
if (dataValues.containsKey(name) && !mutable) { if (dataValues.containsKey(name) && !mutable) {
log("Ignoring oveeride for data value " + name,
log("Ignoring override for data value " + name,
MessageLevel.MSG_VERBOSE); MessageLevel.MSG_VERBOSE);
} else { } else {
dataValues.put(name, value); dataValues.put(name, value);
@@ -252,22 +277,22 @@ public class Frame implements DemuxOutputReceiver {
* @param name the name of the value * @param name the name of the value
* @param value the actual value * @param value the actual value
* @param mutable if true, existing values can be changed * @param mutable if true, existing values can be changed
* @exception ExecutionException if attempting to override a property in
* the current frame.
* @exception ExecutionException if attempting to override a property in
* the current frame.
*/ */
private void setOverrideProperty(String name, Object value,
boolean mutable)
private void setOverrideProperty(String name, Object value,
boolean mutable)
throws ExecutionException { throws ExecutionException {
int refIndex = name.indexOf(Project.REF_DELIMITER); int refIndex = name.indexOf(Project.REF_DELIMITER);
if (refIndex == -1) { if (refIndex == -1) {
throw new ExecutionException("Property overrides can only be set"
+ " for properties in referenced projects - not "
throw new ExecutionException("Property overrides can only be set"
+ " for properties in referenced projects - not "
+ name); + name);
} }
String firstFrameName = name.substring(0, refIndex); String firstFrameName = name.substring(0, refIndex);
String relativeName
String relativeName
= name.substring(refIndex + Project.REF_DELIMITER.length()); = name.substring(refIndex + Project.REF_DELIMITER.length());


Map frameOverrides = (Map) overrides.get(firstFrameName); Map frameOverrides = (Map) overrides.get(firstFrameName);
@@ -278,30 +303,30 @@ public class Frame implements DemuxOutputReceiver {


if (mutable || !frameOverrides.containsKey(relativeName)) { if (mutable || !frameOverrides.containsKey(relativeName)) {
frameOverrides.put(relativeName, value); frameOverrides.put(relativeName, value);
}
}
} }
/** /**
* Get a value which exists in the frame property overrides awaiting
* Get a value which exists in the frame property overrides awaiting
* the frame to be introduced. * the frame to be introduced.
* *
* @param name the name of the value * @param name the name of the value
* @return the value of the property or null if the property does not
* @return the value of the property or null if the property does not
* exist. * exist.
* @exception ExecutionException if attempting to get an override in
* the current frame.
* @exception ExecutionException if attempting to get an override in
* the current frame.
*/ */
private Object getOverrideProperty(String name) throws ExecutionException { private Object getOverrideProperty(String name) throws ExecutionException {
int refIndex = name.indexOf(Project.REF_DELIMITER); int refIndex = name.indexOf(Project.REF_DELIMITER);
if (refIndex == -1) { if (refIndex == -1) {
throw new ExecutionException("Property overrides can only be"
+ " returned for properties in referenced projects - not "
throw new ExecutionException("Property overrides can only be"
+ " returned for properties in referenced projects - not "
+ name); + name);
} }
String firstFrameName = name.substring(0, refIndex); String firstFrameName = name.substring(0, refIndex);
String relativeName
String relativeName
= name.substring(refIndex + Project.REF_DELIMITER.length()); = name.substring(refIndex + Project.REF_DELIMITER.length());


Map frameOverrides = (Map) overrides.get(firstFrameName); Map frameOverrides = (Map) overrides.get(firstFrameName);
@@ -311,28 +336,28 @@ public class Frame implements DemuxOutputReceiver {


return frameOverrides.get(relativeName); return frameOverrides.get(relativeName);
} }
/** /**
* Get a value which exists in the frame property overrides awaiting
* Get a value which exists in the frame property overrides awaiting
* the frame to be introduced. * the frame to be introduced.
* *
* @param name the name of the value * @param name the name of the value
* @return the value of the property or null if the property does not
* @return the value of the property or null if the property does not
* exist. * exist.
* @exception ExecutionException if attempting to check an override in
* the current frame.
* @exception ExecutionException if attempting to check an override in
* the current frame.
*/ */
private boolean isOverrideSet(String name) throws ExecutionException { private boolean isOverrideSet(String name) throws ExecutionException {
int refIndex = name.indexOf(Project.REF_DELIMITER); int refIndex = name.indexOf(Project.REF_DELIMITER);
if (refIndex == -1) { if (refIndex == -1) {
throw new ExecutionException("Property overrides can only be"
+ " returned for properties in referenced projects - not "
throw new ExecutionException("Property overrides can only be"
+ " returned for properties in referenced projects - not "
+ name); + name);
} }
String firstFrameName = name.substring(0, refIndex); String firstFrameName = name.substring(0, refIndex);
String relativeName
String relativeName
= name.substring(refIndex + Project.REF_DELIMITER.length()); = name.substring(refIndex + Project.REF_DELIMITER.length());


Map frameOverrides = (Map) overrides.get(firstFrameName); Map frameOverrides = (Map) overrides.get(firstFrameName);
@@ -342,32 +367,35 @@ public class Frame implements DemuxOutputReceiver {


return frameOverrides.containsKey(relativeName); return frameOverrides.containsKey(relativeName);
} }


/** /**
* Set the initial properties to be used when the frame starts execution
* Initialize the frame setting any initial properties.
* *
* @param properties a Map of named properties which may in fact be any * @param properties a Map of named properties which may in fact be any
* object * object
* @exception ExecutionException if the properties cannot be set
* @exception AntException if the properties cannot be set
*/ */
protected void setInitialProperties(Map properties)
throws ExecutionException {
public void initialize(Map properties)
throws AntException {
configureServices();
if (properties != null) { if (properties != null) {
addProperties(properties); addProperties(properties);
} }


// add in system properties // add in system properties
addProperties(System.getProperties()); addProperties(System.getProperties());
setMagicProperties();
} }




/** /**
* Set the values of various magic properties * Set the values of various magic properties
* *
* @exception ExecutionException if the properties cannot be set
* @exception AntException if the properties cannot be set
*/ */
protected void setMagicProperties() throws ExecutionException {
protected void setMagicProperties() throws AntException {
// ant.home
URL antHomeURL = initConfig.getAntHome(); URL antHomeURL = initConfig.getAntHome();
String antHomeString = null; String antHomeString = null;


@@ -378,7 +406,25 @@ public class Frame implements DemuxOutputReceiver {
} else { } else {
antHomeString = antHomeURL.toString(); antHomeString = antHomeURL.toString();
} }
setDataValue(MagicProperties.ANT_HOME, antHomeString, true);
setDataValue(MagicProperties.ANT_HOME, antHomeString, false);

// ant.file
URL projectSource = project.getSourceURL();
if (projectSource != null
&& projectSource.getProtocol().equals("file")) {
setDataValue(MagicProperties.ANT_FILE, projectSource.getFile(),
true);
}

// basedir
determineBaseDir();

// ant.project.name
String projectName = project.getName();
if (projectName != null) {
setDataValue(MagicProperties.ANT_PROJECT_NAME, projectName, true);
}

} }




@@ -650,26 +696,24 @@ public class Frame implements DemuxOutputReceiver {
* referenced. * referenced.
* @param project the project model. * @param project the project model.
* @param initialData the project's initial data load. * @param initialData the project's initial data load.
* @exception ExecutionException if the project cannot be referenced.
* @exception AntException if the project cannot be referenced.
*/ */
protected void createProjectReference(String name, Project project, protected void createProjectReference(String name, Project project,
Map initialData)
throws ExecutionException {
Map initialData)
throws AntException {
Frame referencedFrame = createFrame(project); Frame referencedFrame = createFrame(project);
addListeners(referencedFrame);

referencedFrame.initialize(initialData);


if (initialData != null) {
referencedFrame.setInitialProperties(initialData);
}
// does the frame have any overrides? // does the frame have any overrides?
Map initialProperties = (Map) overrides.get(name); Map initialProperties = (Map) overrides.get(name);
if (initialProperties != null) {
referencedFrame.setInitialProperties(initialProperties);
overrides.remove(name);
}
referencedFrame.initialize(initialProperties);
overrides.remove(name);

referencedFrames.put(name, referencedFrame); referencedFrames.put(name, referencedFrame);
referencedFrame.initialize();
referencedFrame.importStandardComponents();
referencedFrame.runGlobalTasks();
} }


/** /**
@@ -677,21 +721,30 @@ public class Frame implements DemuxOutputReceiver {
* *
* @param project the project model the frame will deal with * @param project the project model the frame will deal with
* @return an Frame ready to build the project * @return an Frame ready to build the project
* @exception ExecutionException if the frame cannot be created.
* @exception ModelException if the given project is not valid.
*/ */
protected Frame createFrame(Project project) protected Frame createFrame(Project project)
throws ExecutionException {
throws ModelException {
Frame newFrame Frame newFrame
= new Frame(initConfig, config);
= new Frame(initConfig, config, this);


newFrame.setProject(project); newFrame.setProject(project);

return newFrame;
}

/**
* Add all build listeners from this frame to the given sub frame.
*
* @param subFrame the subFrame to which all the listeners of this frame
* will be added.
*/
protected void addListeners(Frame subFrame) {
for (Iterator j = eventSupport.getListeners(); j.hasNext();) { for (Iterator j = eventSupport.getListeners(); j.hasNext();) {
BuildListener listener = (BuildListener) j.next(); BuildListener listener = (BuildListener) j.next();


newFrame.addBuildListener(listener);
subFrame.addBuildListener(listener);
} }
return newFrame;
} }




@@ -711,7 +764,7 @@ public class Frame implements DemuxOutputReceiver {
* *
* @param listener the listener to be added to the frame * @param listener the listener to be added to the frame
*/ */
protected void addBuildListener(BuildListener listener) {
public void addBuildListener(BuildListener listener) {
for (Iterator i = getReferencedFrames(); i.hasNext();) { for (Iterator i = getReferencedFrames(); i.hasNext();) {
Frame referencedFrame = (Frame) i.next(); Frame referencedFrame = (Frame) i.next();


@@ -735,15 +788,26 @@ public class Frame implements DemuxOutputReceiver {
eventSupport.removeBuildListener(listener); eventSupport.removeBuildListener(listener);
} }


/**
* Import any standard components from the libraries which have been loaded.
* A standard component is a component provided by a library in the ant
* namespace.
*
* @exception AntException if the standard components cannot be imported.
*/
private void importStandardComponents() throws AntException {
componentManager.importStandardComponents();
}


/** /**
* Run the given list of targets * Run the given list of targets
* *
* @param targets a list of target names which are to be evaluated * @param targets a list of target names which are to be evaluated
* @exception ExecutionException if there is a problem in the build
* @exception AntException if there is a problem in the build
*/ */
protected void runBuild(List targets) throws ExecutionException {
initialize();
protected void runBuild(List targets) throws AntException {
importStandardComponents();
runGlobalTasks();
if (targets.isEmpty()) { if (targets.isEmpty()) {
// we just execute the default target if any // we just execute the default target if any
String defaultTarget = project.getDefaultTarget(); String defaultTarget = project.getDefaultTarget();
@@ -787,10 +851,12 @@ public class Frame implements DemuxOutputReceiver {
* @param flattenedList the List of targets that must be executed before * @param flattenedList the List of targets that must be executed before
* the given target * the given target
* @param fullTargetName the fully qualified name of the target * @param fullTargetName the fully qualified name of the target
* @param targetRefLocation the location requesting this dependency.
* @exception ExecutionException if the given target does not exist in the * @exception ExecutionException if the given target does not exist in the
* project hierarchy * project hierarchy
*/ */
private void flattenDependency(List flattenedList, String fullTargetName)
private void flattenDependency(List flattenedList, String fullTargetName,
Location targetRefLocation)
throws ExecutionException { throws ExecutionException {
if (flattenedList.contains(fullTargetName)) { if (flattenedList.contains(fullTargetName)) {
return; return;
@@ -800,17 +866,18 @@ public class Frame implements DemuxOutputReceiver {
String localTargetName = getNameInFrame(fullTargetName); String localTargetName = getNameInFrame(fullTargetName);
Target target = frame.getProject().getTarget(localTargetName); Target target = frame.getProject().getTarget(localTargetName);
if (target == null) { if (target == null) {
throw new ExecutionException("Target " + fullTargetName
+ " does not exist");
throw new ExecutionException("Target \"" + fullTargetName
+ "\" does not exist", targetRefLocation);
} }
for (Iterator i = target.getDependencies(); i.hasNext();) { for (Iterator i = target.getDependencies(); i.hasNext();) {
String localDependencyName = (String) i.next(); String localDependencyName = (String) i.next();
String fullDependencyName = localDependencyName; String fullDependencyName = localDependencyName;
if (fullProjectName != null) { if (fullProjectName != null) {
fullDependencyName = fullProjectName + Project.REF_DELIMITER
fullDependencyName = fullProjectName + Project.REF_DELIMITER
+ localDependencyName; + localDependencyName;
} }
flattenDependency(flattenedList, fullDependencyName);
flattenDependency(flattenedList, fullDependencyName,
target.getLocation());
if (!flattenedList.contains(fullDependencyName)) { if (!flattenedList.contains(fullDependencyName)) {
flattenedList.add(fullDependencyName); flattenedList.add(fullDependencyName);
} }
@@ -829,7 +896,7 @@ public class Frame implements DemuxOutputReceiver {
protected List getTargetDependencies(String fullTargetName) protected List getTargetDependencies(String fullTargetName)
throws ExecutionException { throws ExecutionException {
List flattenedList = new ArrayList(); List flattenedList = new ArrayList();
flattenDependency(flattenedList, fullTargetName);
flattenDependency(flattenedList, fullTargetName, null);
flattenedList.add(fullTargetName); flattenedList.add(fullTargetName);
return flattenedList; return flattenedList;
} }
@@ -839,10 +906,10 @@ public class Frame implements DemuxOutputReceiver {
* Execute the tasks of a target in this frame with the given name * Execute the tasks of a target in this frame with the given name
* *
* @param targetName the name of the target whose tasks will be evaluated * @param targetName the name of the target whose tasks will be evaluated
* @exception ExecutionException if there is a problem executing the tasks
* @exception AntException if there is a problem executing the tasks
* of the target * of the target
*/ */
protected void executeTarget(String targetName) throws ExecutionException {
protected void executeTarget(String targetName) throws AntException {


// to execute a target we must determine its dependencies and // to execute a target we must determine its dependencies and
// execute them in order. // execute them in order.
@@ -864,10 +931,10 @@ public class Frame implements DemuxOutputReceiver {
* *
* @param task the task to be executed. * @param task the task to be executed.
* @param aspectValues the collection of aspect attribute values. * @param aspectValues the collection of aspect attribute values.
* @exception ExecutionException if the task has a problem.
* @exception AntException if the task has a problem.
*/ */
protected void executeTask(Task task, AspectValueCollection aspectValues)
throws ExecutionException {
protected void executeTask(Task task, AspectValueCollection aspectValues)
throws AntException {


List aspects = componentManager.getAspects(); List aspects = componentManager.getAspects();
Map aspectContexts = new HashMap(); Map aspectContexts = new HashMap();
@@ -881,7 +948,7 @@ public class Frame implements DemuxOutputReceiver {
if (aspectContexts.size() != 0) { if (aspectContexts.size() != 0) {
aspectContextsMap.put(task, aspectContexts); aspectContextsMap.put(task, aspectContexts);
} }
eventSupport.fireTaskStarted(task); eventSupport.fireTaskStarted(task);


Throwable failureCause = null; Throwable failureCause = null;
@@ -903,14 +970,14 @@ public class Frame implements DemuxOutputReceiver {
for (Iterator i = activeAspects.iterator(); i.hasNext();) { for (Iterator i = activeAspects.iterator(); i.hasNext();) {
Aspect aspect = (Aspect) i.next(); Aspect aspect = (Aspect) i.next();
Object aspectContext = aspectContexts.get(aspect); Object aspectContext = aspectContexts.get(aspect);
failureCause
failureCause
= aspect.postExecuteTask(aspectContext, failureCause); = aspect.postExecuteTask(aspectContext, failureCause);
} }
eventSupport.fireTaskFinished(task, failureCause); eventSupport.fireTaskFinished(task, failureCause);
if (aspectContexts.size() != 0) { if (aspectContexts.size() != 0) {
aspectContextsMap.remove(task); aspectContextsMap.remove(task);
} }
if (failureCause != null) { if (failureCause != null) {
if (failureCause instanceof ExecutionException) { if (failureCause instanceof ExecutionException) {
throw (ExecutionException) failureCause; throw (ExecutionException) failureCause;
@@ -918,18 +985,22 @@ public class Frame implements DemuxOutputReceiver {
throw new ExecutionException(failureCause); throw new ExecutionException(failureCause);
} }
} }


/** /**
* Run the tasks returned by the given iterator * Run the tasks returned by the given iterator
* *
* @param taskIterator the iterator giving the tasks to execute * @param taskIterator the iterator giving the tasks to execute
* @exception ExecutionException if there is execution problem while
* @exception AntException if there is execution problem while
* executing tasks * executing tasks
*/ */
protected void executeTasks(Iterator taskIterator) protected void executeTasks(Iterator taskIterator)
throws ExecutionException {
throws AntException {

if (taskIterator == null) {
return;
}

while (taskIterator.hasNext()) { while (taskIterator.hasNext()) {
BuildElement model = (BuildElement) taskIterator.next(); BuildElement model = (BuildElement) taskIterator.next();


@@ -938,7 +1009,7 @@ public class Frame implements DemuxOutputReceiver {
Object component = componentManager.createComponent(model); Object component = componentManager.createComponent(model);
if (component instanceof Task) { if (component instanceof Task) {
execService.executeTask((Task) component); execService.executeTask((Task) component);
}
}
} catch (ExecutionException e) { } catch (ExecutionException e) {
e.setLocation(model.getLocation(), false); e.setLocation(model.getLocation(), false);
throw e; throw e;
@@ -952,6 +1023,63 @@ public class Frame implements DemuxOutputReceiver {


} }


/**
* Get the parent frame of this frame.
*
* @return the parent frame - may be null if this frame has no parent.
*/
private Frame getParent() {
return parent;
}

/**
* Get the currently executing target of this frame
*
* @return the name of the current target.
*/
private String getCurrentTarget() {
return currentTarget;
}

/**
* Check for recursion - executing the same target in the same buildfile
* with the same base directory
*
* @param targetName the target to check
*
* @exception ExecutionException if the target is already being evaluated
* in a parent frame.
*/
private void checkRecursion(String targetName) throws ExecutionException {
Frame checkFrame = getParent();
while (checkFrame != null) {
File checkDir = checkFrame.getBaseDir();
String checkTarget = checkFrame.getCurrentTarget();
URL checkURL = checkFrame.getProject().getSourceURL();
if (targetName.equals(checkTarget)
&& checkDir.equals(getBaseDir())
&& checkURL != null
&& checkURL.equals(getProject().getSourceURL())) {
throw new ExecutionException("Recursive execution of "
+ "target \"" + targetName + "\" in "
+ "project \"" + checkURL + "\"");
}
checkFrame = checkFrame.getParent();
}
}

/**
* Initialize a library in this frame.
*
* @param libraryId the library's global identifier.
*
* @exception AntException if the library cannot be initialized.
*/
protected void initializeLibrary(String libraryId)
throws AntException {
componentManager.initializeLibrary(libraryId);
}



/** /**
* Execute the given target's tasks. The target must be local to this * Execute the given target's tasks. The target must be local to this
@@ -959,10 +1087,13 @@ public class Frame implements DemuxOutputReceiver {
* *
* @param targetName the name of the target within this frame that is to * @param targetName the name of the target within this frame that is to
* be executed. * be executed.
* @exception ExecutionException if there is a problem executing tasks
* @exception AntException if there is a problem executing tasks
*/ */
protected void executeTargetTasks(String targetName) protected void executeTargetTasks(String targetName)
throws ExecutionException {
throws AntException {
checkRecursion(targetName);
currentTarget = targetName;

Throwable failureCause = null; Throwable failureCause = null;
Target target = project.getTarget(targetName); Target target = project.getTarget(targetName);
String ifCondition = target.getIfCondition(); String ifCondition = target.getIfCondition();
@@ -1000,51 +1131,104 @@ public class Frame implements DemuxOutputReceiver {
throw ee; throw ee;
} finally { } finally {
eventSupport.fireTargetFinished(target, failureCause); eventSupport.fireTargetFinished(target, failureCause);
currentTarget = null;
} }
}


}


/** /**
* Initialize the frame by executing the project level tasks if any
* Start the build. This is only called on the
* main frame of the build. All subordinate frames use runBuild to
* process sub builds.
* *
* @exception ExecutionException if the top level tasks of the frame
* failed
* This method performs all global config tasks and then starts the
* build
*
* @param targets the targets to be evaluated in this build
*
* @exception AntException if there is a problem running the build.
*/ */
protected void initialize() throws ExecutionException {
configureServices();
setMagicProperties();
determineBaseDir();
public void startBuild(List targets) throws AntException {
eventSupport.fireBuildStarted(project);


try {
Throwable buildFailureCause = null;
try {
// load system ant lib // load system ant lib
URL systemLibs
URL systemLibs
= new URL(initConfig.getLibraryURL(), "syslibs/"); = new URL(initConfig.getLibraryURL(), "syslibs/");
componentManager.loadLib(systemLibs.toString(), true, true);
// execute any config tasks
executeTasks(config.getTasks());
componentManager.loadLib(systemLibs, true);

executeTasks(config.getGlobalTasks());

// now load other system libraries // now load other system libraries
URL antLibs = new URL(initConfig.getLibraryURL(), "antlibs/"); URL antLibs = new URL(initConfig.getLibraryURL(), "antlibs/");
componentManager.loadLib(antLibs.toString(), false, true);
executeTasks(project.getTasks());
componentManager.loadLib(antLibs, false);

} catch (MalformedURLException e) { } catch (MalformedURLException e) {
throw new ExecutionException("Unable to initialize antlibs", e); throw new ExecutionException("Unable to initialize antlibs", e);
} }

try {
runBuild(targets);
} catch (RuntimeException e) {
buildFailureCause = e;
throw e;
} catch (AntException e) {
buildFailureCause = e;
throw e;
} finally {
eventSupport.fireBuildFinished(project, buildFailureCause);
}
}

/**
* Execute any config and project level tasks
*
* @exception AntException if the top level tasks of the frame
* failed
*/
private void runGlobalTasks() throws AntException {
executeTasks(config.getFrameTasks());
executeTasks(project.getTasks());
}

/**
* Set the base director for this frame's execution.
*
* @param baseDir the new base directory
*
* @exception AntException if the base directory cannot be set.
*/
protected void setBaseDir(File baseDir) throws AntException {
FileUtils fileUtils = FileUtils.newFileUtils();

baseDir = fileUtils.normalize(baseDir.getAbsolutePath());
if (!baseDir.exists()) {
throw new ExecutionException("Basedir " + baseDir.getAbsolutePath()
+ " does not exist");
}
if (!baseDir.isDirectory()) {
throw new ExecutionException("Basedir " + baseDir.getAbsolutePath()
+ " is not a directory");
}
this.baseDir = baseDir;
setDataValue(MagicProperties.BASEDIR, baseDir.getPath(), false);
log("Project base dir set to: " + this.baseDir,
MessageLevel.MSG_VERBOSE);
} }




/** /**
* Determine the base directory for each frame in the frame hierarchy
* Determine the base directory.
* *
* @exception ExecutionException if the base directories cannot be
* @exception AntException if the base directories cannot be
* determined * determined
*/ */
private void determineBaseDir() throws ExecutionException {
private void determineBaseDir() throws AntException {
if (isDataValueSet(MagicProperties.BASEDIR)) { if (isDataValueSet(MagicProperties.BASEDIR)) {
baseDir
= new File(getDataValue(MagicProperties.BASEDIR).toString());
String baseDirString
= getDataValue(MagicProperties.BASEDIR).toString();
setBaseDir(new File(baseDirString));
} else { } else {
URL projectURL = project.getSourceURL(); URL projectURL = project.getSourceURL();


@@ -1054,17 +1238,16 @@ public class Frame implements DemuxOutputReceiver {
String base = project.getBase(); String base = project.getBase();


if (base == null) { if (base == null) {
baseDir = projectFileParent;
setBaseDir(projectFileParent);
} else { } else {
FileUtils fileUtils = FileUtils.newFileUtils(); FileUtils fileUtils = FileUtils.newFileUtils();


baseDir = fileUtils.resolveFile(projectFileParent, base);
setBaseDir(fileUtils.resolveFile(projectFileParent, base));
} }
} else { } else {
baseDir = new File(".");
setBaseDir(new File("."));
} }
} }
setDataValue(MagicProperties.BASEDIR, baseDir.getAbsolutePath(), true);
} }




@@ -1072,13 +1255,13 @@ public class Frame implements DemuxOutputReceiver {
* Configure the services that the frame makes available to its library * Configure the services that the frame makes available to its library
* components * components
* *
* @exception ExecutionException if the services required by the core
* @exception ExecutionException if the services required by the core
* could not be configured. * could not be configured.
*/ */
private void configureServices() throws ExecutionException { private void configureServices() throws ExecutionException {
// create services and make them available in our services map // create services and make them available in our services map
fileService = new CoreFileService(this); fileService = new CoreFileService(this);
componentManager = new ComponentManager(this);
componentManager = new ComponentManager(this, libManager);
dataService = new CoreDataService(this, dataService = new CoreDataService(this,
config.isUnsetPropertiesAllowed()); config.isUnsetPropertiesAllowed());
execService = new CoreExecService(this); execService = new CoreExecService(this);


+ 13
- 13
proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/Reflector.java View File

@@ -59,7 +59,7 @@ 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.antlib.Converter; import org.apache.ant.common.antlib.Converter;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;


/** /**
* A reflector is used to set attributes and add nested elements to an * A reflector is used to set attributes and add nested elements to an
@@ -145,12 +145,12 @@ public class Reflector implements Setter {
* @param obj the object on which the value is being set * @param obj the object on which the value is being set
* @param attributeName the name of the attribute * @param attributeName the name of the attribute
* @param value the string represenation of the attribute's value * @param value the string represenation of the attribute's value
* @exception ExecutionException if the object does not support the
* @exception AntException if the object does not support the
* attribute or the object has a problem setting the value * attribute or the object has a problem setting the value
*/ */
public void setAttribute(Object obj, String attributeName, public void setAttribute(Object obj, String attributeName,
String value) String value)
throws ExecutionException {
throws AntException {
String name = attributeName.toLowerCase(); String name = attributeName.toLowerCase();
AttributeSetter as AttributeSetter as
= (AttributeSetter) attributeSetters.get(name); = (AttributeSetter) attributeSetters.get(name);
@@ -338,14 +338,14 @@ public class Reflector implements Setter {
* Add an attribute setter for the given property. The setter will only * Add an attribute setter for the given property. The setter will only
* be added if it does not override a higher priorty setter * be added if it does not override a higher priorty setter
* *
* @param attributeName the name of the attribute that the setter operates
* @param attributeName the name of the attribute that the setter operates
* upon. * upon.
* @param setter the AttribnuteSetter instance to use. * @param setter the AttribnuteSetter instance to use.
*/ */
private void addAttributeSetter(String attributeName,
private void addAttributeSetter(String attributeName,
AttributeSetter setter) { AttributeSetter setter) {
String name = attributeName.toLowerCase(); String name = attributeName.toLowerCase();
AttributeSetter currentSetter
AttributeSetter currentSetter
= (AttributeSetter) attributeSetters.get(name); = (AttributeSetter) attributeSetters.get(name);
if (currentSetter != null) { if (currentSetter != null) {
// there is a setter, is it lower down in the class hierarchy // there is a setter, is it lower down in the class hierarchy
@@ -359,11 +359,11 @@ public class Reflector implements Setter {
return; return;
} }
} }
}
}
attributeSetters.put(name, setter); attributeSetters.put(name, setter);
} }
/** /**
* Determine if the class associated with this reflector supports a * Determine if the class associated with this reflector supports a
* particular nested element * particular nested element
@@ -380,13 +380,13 @@ public class Reflector implements Setter {
* Add a method to the reflector for setting an attribute value * Add a method to the reflector for setting an attribute value
* *
* @param m the method, obtained by introspection. * @param m the method, obtained by introspection.
* @param depth the depth of this method's declaration in the class
* @param depth the depth of this method's declaration in the class
* hierarchy * hierarchy
* @param propertyName the property name the method will set. * @param propertyName the property name the method will set.
* @param converters A map of converter classes used to convert strings * @param converters A map of converter classes used to convert strings
* to different types. * to different types.
*/ */
public void addAttributeMethod(Method m, int depth,
public void addAttributeMethod(Method m, int depth,
String propertyName, Map converters) { String propertyName, Map converters) {
Class type = m.getParameterTypes()[0]; Class type = m.getParameterTypes()[0];


@@ -471,7 +471,7 @@ public class Reflector implements Setter {
* Add an attribute setter with an associated converter * Add an attribute setter with an associated converter
* *
* @param m the attribute setter method * @param m the attribute setter method
* @param depth the depth of this method's declaration in the class
* @param depth the depth of this method's declaration in the class
* hierarchy * hierarchy
* @param propertyName the name of the attribute this method supports * @param propertyName the name of the attribute this method supports
* @param converter the converter to be used to construct the value * @param converter the converter to be used to construct the value
@@ -479,7 +479,7 @@ public class Reflector implements Setter {
*/ */
private void addConvertingSetter(Method m, int depth, private void addConvertingSetter(Method m, int depth,
String propertyName, Converter converter) { String propertyName, Converter converter) {
addAttributeSetter(propertyName,
addAttributeSetter(propertyName,
new AttributeSetter(m, depth, converter)); new AttributeSetter(m, depth, converter));
} }
} }


+ 3
- 3
proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/Setter.java View File

@@ -52,7 +52,7 @@
* <http://www.apache.org/>. * <http://www.apache.org/>.
*/ */
package org.apache.ant.antcore.execution; package org.apache.ant.antcore.execution;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;


/** /**
* The Setter interface is used by the Ant core to set values and nested * The Setter interface is used by the Ant core to set values and nested
@@ -68,12 +68,12 @@ public interface Setter {
* @param obj the object on which the value is being set * @param obj the object on which the value is being set
* @param attributeName the name of the attribute * @param attributeName the name of the attribute
* @param value the string represenation of the attribute's value * @param value the string represenation of the attribute's value
* @exception ExecutionException if the object does not support the
* @exception AntException if the object does not support the
* attribute or the object has a problem setting the value * attribute or the object has a problem setting the value
*/ */
void setAttribute(Object obj, String attributeName, void setAttribute(Object obj, String attributeName,
String value) String value)
throws ExecutionException;
throws AntException;


/** /**
* Get the type of the given nested element * Get the type of the given nested element


+ 11
- 2
proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/TaskAdapter.java View File

@@ -53,9 +53,9 @@
*/ */
package org.apache.ant.antcore.execution; package org.apache.ant.antcore.execution;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
import org.apache.ant.common.antlib.AbstractTask; import org.apache.ant.common.antlib.AbstractTask;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.event.MessageLevel;


/** /**
* Use introspection to "adapt" an arbitrary Bean (not extending Task, but * Use introspection to "adapt" an arbitrary Bean (not extending Task, but
@@ -105,7 +105,16 @@ public class TaskAdapter extends AbstractTask {
public void execute() throws ExecutionException { public void execute() throws ExecutionException {
try { try {
executeMethod.invoke(worker, null); executeMethod.invoke(worker, null);
} catch (InvocationTargetException e) {
log("Error in " + worker.getClass(), MessageLevel.MSG_ERR);
Throwable t = e.getTargetException();
if (t instanceof ExecutionException) {
throw (ExecutionException) t;
} else {
throw new ExecutionException(t);
}
} catch (Throwable t) { } catch (Throwable t) {
log("Error in " + worker.getClass(), MessageLevel.MSG_ERR);
throw new ExecutionException(t); throw new ExecutionException(t);
} }
} }


+ 129
- 0
proposal/mutant/src/java/antlibs/ant1compat/org/apache/tools/ant/Ant1CompatException.java View File

@@ -0,0 +1,129 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.tools.ant;

import org.apache.ant.common.util.Location;
import org.apache.ant.common.util.AntException;

/**
* An exception in the Ant1 compatability layer.
*
* @author Conor MacNeill
*/
public class Ant1CompatException extends AntException {
/**
* Constructs an exception with the given descriptive message.
*
* @param msg Description of or information about the exception.
*/
public Ant1CompatException(String msg) {
super(msg);
}

/**
* Constructs an exception with the given descriptive message and a
* location in a file.
*
* @param msg Description of or information about the exception.
* @param location Location in the project file where the error occured.
*/
public Ant1CompatException(String msg, Location location) {
super(msg, location);
}

/**
* Constructs an exception with the given message and exception as a
* root cause.
*
* @param msg Description of or information about the exception.
* @param cause Throwable that might have cause this one.
*/
public Ant1CompatException(String msg, Throwable cause) {
super(msg, cause);
}

/**
* Constructs an exception with the given message and exception as a
* root cause and a location in a file.
*
* @param msg Description of or information about the exception.
* @param cause Exception that might have cause this one.
* @param location Location in the project file where the error occured.
*/
public Ant1CompatException(String msg, Throwable cause,
Location location) {
super(msg, cause, location);
}

/**
* Constructs an exception with the given exception as a root cause.
*
* @param cause Exception that might have caused this one.
*/
public Ant1CompatException(Throwable cause) {
super(cause);
}

/**
* Constructs an exception with the given exception as a root cause and
* a location in a file.
*
* @param cause Exception that might have cause this one.
* @param location Location in the project file where the error occured.
*/
public Ant1CompatException(Throwable cause, Location location) {
super(cause, location);
}
}


+ 6
- 6
proposal/mutant/src/java/antlibs/ant1compat/org/apache/tools/ant/Ant1Converter.java View File

@@ -54,7 +54,7 @@
package org.apache.tools.ant; package org.apache.tools.ant;


import org.apache.ant.common.antlib.AbstractConverter; import org.apache.ant.common.antlib.AbstractConverter;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.antlib.ConverterException;
import org.apache.tools.ant.types.EnumeratedAttribute; import org.apache.tools.ant.types.EnumeratedAttribute;
import org.apache.tools.ant.types.Path; import org.apache.tools.ant.types.Path;


@@ -96,9 +96,9 @@ public class Ant1Converter extends AbstractConverter {
* @param value The value to be converted * @param value The value to be converted
* @param type the desired type of the converted object * @param type the desired type of the converted object
* @return the value of the converted object * @return the value of the converted object
* @exception ExecutionException if the conversion cannot be made
* @exception ConverterException if the conversion cannot be made
*/ */
public Object convert(String value, Class type) throws ExecutionException {
public Object convert(String value, Class type) throws ConverterException {
if (type.equals(Path.class)) { if (type.equals(Path.class)) {
return new Path(project, value); return new Path(project, value);
} else if (EnumeratedAttribute.class.isAssignableFrom(type)) { } else if (EnumeratedAttribute.class.isAssignableFrom(type)) {
@@ -108,13 +108,13 @@ public class Ant1Converter extends AbstractConverter {
ea.setValue(value); ea.setValue(value);
return ea; return ea;
} catch (InstantiationException e) { } catch (InstantiationException e) {
throw new ExecutionException(e);
throw new ConverterException(e);
} catch (IllegalAccessException e) { } catch (IllegalAccessException e) {
throw new ExecutionException(e);
throw new ConverterException(e);
} }


} else { } else {
throw new ExecutionException("This converter does not handle "
throw new ConverterException("This converter does not handle "
+ type.getName()); + type.getName());
} }
} }


+ 14
- 14
proposal/mutant/src/java/antlibs/ant1compat/org/apache/tools/ant/Ant1Factory.java View File

@@ -55,7 +55,7 @@ package org.apache.tools.ant;
import org.apache.ant.common.antlib.AntContext; import org.apache.ant.common.antlib.AntContext;
import org.apache.ant.common.antlib.StandardLibFactory; import org.apache.ant.common.antlib.StandardLibFactory;
import org.apache.ant.common.service.EventService; import org.apache.ant.common.service.EventService;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;
import org.apache.ant.init.LoaderUtils; import org.apache.ant.init.LoaderUtils;


/** /**
@@ -78,9 +78,9 @@ public class Ant1Factory extends StandardLibFactory {
* *
* @param context the context for this factory to use to access core * @param context the context for this factory to use to access core
* services. * services.
* @exception ExecutionException if the factory cannot be initialised.
* @exception AntException if the factory cannot be initialised.
*/ */
public void init(AntContext context) throws ExecutionException {
public void init(AntContext context) throws AntException {
if (project != null) { if (project != null) {
return; return;
} }
@@ -109,11 +109,11 @@ public class Ant1Factory extends StandardLibFactory {
* @return an instance of the required class * @return an instance of the required class
* @exception InstantiationException if the class cannot be instantiated * @exception InstantiationException if the class cannot be instantiated
* @exception IllegalAccessException if the instance cannot be accessed * @exception IllegalAccessException if the instance cannot be accessed
* @exception ExecutionException if there is a problem creating the task
* @exception Ant1CompatException if there is a problem creating the task
*/ */
public Object createComponent(Class componentClass, String localName) public Object createComponent(Class componentClass, String localName)
throws InstantiationException, IllegalAccessException, throws InstantiationException, IllegalAccessException,
ExecutionException {
Ant1CompatException {
try { try {
java.lang.reflect.Constructor constructor = null; java.lang.reflect.Constructor constructor = null;
// DataType can have a "no arg" constructor or take a single // DataType can have a "no arg" constructor or take a single
@@ -123,7 +123,7 @@ public class Ant1Factory extends StandardLibFactory {
constructor = componentClass.getConstructor(new Class[0]); constructor = componentClass.getConstructor(new Class[0]);
component = constructor.newInstance(new Object[0]); component = constructor.newInstance(new Object[0]);
} catch (NoSuchMethodException nse) { } catch (NoSuchMethodException nse) {
constructor
constructor
= componentClass.getConstructor(new Class[]{Project.class}); = componentClass.getConstructor(new Class[]{Project.class});
component = constructor.newInstance(new Object[]{project}); component = constructor.newInstance(new Object[]{project});
} }
@@ -136,9 +136,9 @@ public class Ant1Factory extends StandardLibFactory {
Throwable t = ite.getTargetException(); Throwable t = ite.getTargetException();
String msg = "Could not create component of type: " String msg = "Could not create component of type: "
+ componentClass.getName() + " due to " + t; + componentClass.getName() + " due to " + t;
throw new ExecutionException(msg, t);
throw new Ant1CompatException(msg, t);
} catch (NoSuchMethodException e) { } catch (NoSuchMethodException e) {
throw new ExecutionException("Unable to find an appropriate "
throw new Ant1CompatException("Unable to find an appropriate "
+ "constructor for component " + componentClass.getName(), e); + "constructor for component " + componentClass.getName(), e);
} }
} }
@@ -151,12 +151,12 @@ public class Ant1Factory extends StandardLibFactory {
* @return a instance of the required class * @return a instance of the required class
* @exception InstantiationException if the class cannot be instantiated * @exception InstantiationException if the class cannot be instantiated
* @exception IllegalAccessException if the instance cannot be accessed * @exception IllegalAccessException if the instance cannot be accessed
* @exception ExecutionException if there is a problem creating the
* @exception Ant1CompatException if there is a problem creating the
* converter * converter
*/ */
public Object createInstance(Class requiredClass) public Object createInstance(Class requiredClass)
throws InstantiationException, IllegalAccessException, throws InstantiationException, IllegalAccessException,
ExecutionException {
Ant1CompatException {


java.lang.reflect.Constructor c = null; java.lang.reflect.Constructor c = null;


@@ -175,9 +175,9 @@ public class Ant1Factory extends StandardLibFactory {
Throwable t = ite.getTargetException(); Throwable t = ite.getTargetException();
String msg = "Could not create instance of type: " String msg = "Could not create instance of type: "
+ requiredClass.getName() + " due to " + t; + requiredClass.getName() + " due to " + t;
throw new ExecutionException(msg, t);
throw new Ant1CompatException(msg, t);
} catch (NoSuchMethodException e) { } catch (NoSuchMethodException e) {
throw new ExecutionException("Unable to find an appropriate "
throw new Ant1CompatException("Unable to find an appropriate "
+ "constructor for class " + requiredClass.getName(), e); + "constructor for class " + requiredClass.getName(), e);
} }
} }
@@ -187,11 +187,11 @@ public class Ant1Factory extends StandardLibFactory {
* create method. * create method.
* *
* @param createdElement the element that the component created * @param createdElement the element that the component created
* @exception ExecutionException if there is a problem registering the
* @exception AntException if there is a problem registering the
* element * element
*/ */
public void registerCreatedElement(Object createdElement) public void registerCreatedElement(Object createdElement)
throws ExecutionException {
throws AntException {
if (createdElement instanceof ProjectComponent) { if (createdElement instanceof ProjectComponent) {
ProjectComponent component = (ProjectComponent) createdElement; ProjectComponent component = (ProjectComponent) createdElement;
component.setProject(project); component.setProject(project);


+ 2
- 2
proposal/mutant/src/java/antlibs/ant1compat/org/apache/tools/ant/Ant1InputHandler.java View File

@@ -54,7 +54,7 @@
package org.apache.tools.ant; package org.apache.tools.ant;


import org.apache.ant.common.service.InputService; import org.apache.ant.common.service.InputService;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;
import org.apache.tools.ant.input.InputHandler; import org.apache.tools.ant.input.InputHandler;
import org.apache.tools.ant.input.InputRequest; import org.apache.tools.ant.input.InputRequest;


@@ -87,7 +87,7 @@ public class Ant1InputHandler implements InputHandler {
public void handleInput(InputRequest request) throws BuildException { public void handleInput(InputRequest request) throws BuildException {
try { try {
inputService.handleInput(request); inputService.handleInput(request);
} catch (ExecutionException e) {
} catch (AntException e) {
throw new BuildException(e); throw new BuildException(e);
} }
} }


+ 362
- 106
proposal/mutant/src/java/antlibs/ant1compat/org/apache/tools/ant/Project.java View File

@@ -55,22 +55,26 @@ package org.apache.tools.ant;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.ArrayList;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.Iterator; import java.util.Iterator;
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;
import org.apache.ant.common.antlib.AntContext; import org.apache.ant.common.antlib.AntContext;
import org.apache.ant.common.antlib.AntLibFactory; import org.apache.ant.common.antlib.AntLibFactory;
import org.apache.ant.common.event.MessageLevel; import org.apache.ant.common.event.MessageLevel;
import org.apache.ant.common.service.BuildKey;
import org.apache.ant.common.service.ComponentService; import org.apache.ant.common.service.ComponentService;
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.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.ExecutionException;
import org.apache.ant.common.util.AntException;
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;
@@ -84,6 +88,11 @@ import org.apache.tools.ant.util.FileUtils;
* @created 30 January 2002 * @created 30 January 2002
*/ */
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.
*/
private static final String PROXY_KEY = "_ant.proxy";


/** String which indicates Java version 1.0 */ /** String which indicates Java version 1.0 */
public static final String JAVA_1_0 = "1.0"; public static final String JAVA_1_0 = "1.0";
@@ -155,6 +164,12 @@ 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 */
@@ -167,6 +182,33 @@ public class Project implements org.apache.ant.common.event.BuildListener {
/** the target's we have seen */ /** the target's we have seen */
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.
*/
private boolean proxying;

/**
* The properties which will be passed to the project instance for which we
* are proxing.
*/
private Map proxyProperties = new HashMap();

/**
* The build key used to control the proxied build.
*/
private BuildKey proxyBuildKey;

/**
* The subordinate project if proxying
*/
private Project subordinate;

/**
* The requested base dir
*/
private File baseDir = null;

static { static {


// Determine the Java version by looking at available classes // Determine the Java version by looking at available classes
@@ -197,18 +239,44 @@ public class Project implements org.apache.ant.common.event.BuildListener {
* @param factory the factory object creating this project * @param factory the factory object creating this project
*/ */
public Project(AntLibFactory factory) { public Project(AntLibFactory factory) {
proxying = false;
this.factory = factory; this.factory = factory;
fileUtils = FileUtils.newFileUtils(); fileUtils = FileUtils.newFileUtils();
} }


/** /**
* The old constructor fopr Project instances - not used now.
* The old constructor for Project instances - legacy support.
* *
* @deprecated * @deprecated
*/ */
public Project() { public Project() {
throw new BuildException("Projects can not be constructed to "
+ "invoke Ant");
if (sharedContext == null) {
throw new BuildException("Project object can no longer be "
+ "constructed outside Ant execution");
}
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);
}
} }


/** /**
@@ -270,8 +338,65 @@ public class Project implements org.apache.ant.common.event.BuildListener {
* @deprecated * @deprecated
*/ */
public void init() throws BuildException { public void init() throws BuildException {
throw new BuildException("Projects can not be initialized in this "
+ "manner any longer.");
String defs = "/org/apache/tools/ant/taskdefs/defaults.properties";

try {
Properties props = new Properties();
InputStream in = this.getClass().getResourceAsStream(defs);
if (in == null) {
throw new BuildException("Can't load default task list");
}
props.load(in);
in.close();

Enumeration enum = props.propertyNames();
while (enum.hasMoreElements()) {
String key = (String) enum.nextElement();
String value = props.getProperty(key);
try {
Class taskClass = Class.forName(value);
taskClassDefinitions.put(key, taskClass);
} catch (NoClassDefFoundError ncdfe) {
log("Could not load a dependent class ("
+ ncdfe.getMessage() + ") for task " + key, MSG_DEBUG);
} catch (ClassNotFoundException cnfe) {
log("Could not load class (" + value
+ ") for task " + key, MSG_DEBUG);
}
}
} catch (IOException ioe) {
throw new BuildException("Can't load default task list");
}

String dataDefs = "/org/apache/tools/ant/types/defaults.properties";

try {
Properties props = new Properties();
InputStream in = this.getClass().getResourceAsStream(dataDefs);
if (in == null) {
throw new BuildException("Can't load default datatype list");
}
props.load(in);
in.close();

Enumeration enum = props.propertyNames();
while (enum.hasMoreElements()) {
String key = (String) enum.nextElement();
String value = props.getProperty(key);
try {
Class dataClass = Class.forName(value);
dataClassDefinitions.put(key, dataClass);
} catch (NoClassDefFoundError ncdfe) {
log("Could not load a dependent class ("
+ ncdfe.getMessage() + ") for type " + key, MSG_DEBUG);
} catch (ClassNotFoundException cnfe) {
log("Could not load class (" + value
+ ") for type " + key, MSG_DEBUG);
}
}
} catch (IOException ioe) {
throw new BuildException("Can't load default datatype list");
}
} }




@@ -284,8 +409,56 @@ public class Project implements org.apache.ant.common.event.BuildListener {
* @deprecated * @deprecated
*/ */
public void executeTargets(Vector targetNames) throws BuildException { public void executeTargets(Vector targetNames) throws BuildException {
throw new BuildException("Targets within the project cannot be "
+ "executed with this method.");
if (!proxying) {
throw new BuildException("This interface is no longer available.");
}

try {
List targets = new ArrayList();
for (Iterator i = targetNames.iterator(); i.hasNext();) {
targets.add(i.next());
}

ExecService execService
= (ExecService) sharedContext.getCoreService(ExecService.class);
execService.runBuild(proxyBuildKey, targets);
} catch (AntException e) {
throw new BuildException(e.getMessage(), e);
}
}

/**
* 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>.
*
* @exception BuildException if the build failed
*/
public void executeTarget(String targetName) throws BuildException {

// sanity check ourselves, if we've been asked to build nothing
// then we should complain

if (targetName == null) {
String msg = "No target specified";
throw new BuildException(msg);
}

if (!proxying) {
throw new BuildException("This interface is no longer available.");
}

try {
List targets = new ArrayList();
targets.add(targetName);

ExecService execService
= (ExecService) sharedContext.getCoreService(ExecService.class);
execService.runBuild(proxyBuildKey, targets);
} catch (AntException e) {
throw new BuildException(e.getMessage(), e);
}
} }


/** /**
@@ -306,8 +479,8 @@ public class Project implements org.apache.ant.common.event.BuildListener {
public void setProperty(String name, String value) { public void setProperty(String name, String value) {
try { try {
dataService.setMutableDataValue(name, value); dataService.setMutableDataValue(name, value);
} catch (ExecutionException e) {
throw new BuildException(e);
} catch (AntException e) {
throw new BuildException(e.getMessage(), e);
} }
} }


@@ -318,10 +491,16 @@ public class Project implements org.apache.ant.common.event.BuildListener {
* @param value the property value * @param value the property value
*/ */
public void setNewProperty(String name, String value) { public void setNewProperty(String name, String value) {
if (dataService == null) {
if (!proxyProperties.containsKey(name)) {
proxyProperties.put(name, value);
}
return;
}
try { try {
dataService.setDataValue(name, value); dataService.setDataValue(name, value);
} catch (ExecutionException e) {
throw new BuildException(e);
} catch (AntException e) {
throw new BuildException(e.getMessage(), e);
} }
} }


@@ -333,10 +512,15 @@ public class Project implements org.apache.ant.common.event.BuildListener {
* @param value the property value * @param value the property value
*/ */
public void setUserProperty(String name, String value) { public void setUserProperty(String name, String value) {
if (dataService == null) {
proxyProperties.put(name, value);
return;
}

try { try {
dataService.setMutableDataValue(name, value); dataService.setMutableDataValue(name, value);
} catch (ExecutionException e) {
throw new BuildException(e);
} catch (AntException e) {
throw new BuildException(e.getMessage(), e);
} }
} }


@@ -345,10 +529,10 @@ public class Project implements org.apache.ant.common.event.BuildListener {
* special handling for instances of tasks and data types. * special handling for instances of tasks and data types.
* <p> * <p>
* This is useful for logging purposes. * This is useful for logging purposes.
*
*
* @param element The element to describe. * @param element The element to describe.
* Must not be <code>null</code>. * 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
@@ -467,8 +651,8 @@ public class Project implements org.apache.ant.common.event.BuildListener {
try { try {
Object value = dataService.getDataValue(name); Object value = dataService.getDataValue(name);
return value == null ? null : value.toString(); return value == null ? null : value.toString();
} catch (ExecutionException e) {
throw new BuildException(e);
} catch (AntException e) {
throw new BuildException(e.getMessage(), e);
} }
} }


@@ -482,8 +666,8 @@ public class Project implements org.apache.ant.common.event.BuildListener {
public String getUserProperty(String name) { public String getUserProperty(String name) {
try { try {
return dataService.getDataValue(name).toString(); return dataService.getDataValue(name).toString();
} catch (ExecutionException e) {
throw new BuildException(e);
} catch (AntException e) {
throw new BuildException(e.getMessage(), e);
} }
} }


@@ -497,8 +681,8 @@ public class Project implements org.apache.ant.common.event.BuildListener {
public Object getReference(String refId) { public Object getReference(String refId) {
try { try {
return dataService.getDataValue(refId); return dataService.getDataValue(refId);
} catch (ExecutionException e) {
throw new BuildException(e);
} catch (AntException e) {
throw new BuildException(e.getMessage(), e);
} }
} }


@@ -585,6 +769,7 @@ public class Project implements org.apache.ant.common.event.BuildListener {
* @since 1.102, Ant 1.5 * @since 1.102, Ant 1.5
*/ */
public void registerThreadTask(Thread thread, Task task) { public void registerThreadTask(Thread thread, Task task) {
// XXX
// if (task != null) { // if (task != null) {
// threadTasks.put(thread, task); // threadTasks.put(thread, task);
// } else { // } else {
@@ -601,7 +786,7 @@ public class Project implements org.apache.ant.common.event.BuildListener {
*/ */
public Task getThreadTask(Thread thread) { public Task getThreadTask(Thread thread) {
return null; return null;
// return (Task)threadTasks.get(thread);
// return (Task)threadTasks.get(thread); XXX
} }


/** /**
@@ -655,6 +840,10 @@ public class Project implements org.apache.ant.common.event.BuildListener {
* @param event task started event * @param event task started event
*/ */
public void taskStarted(org.apache.ant.common.event.BuildEvent event) { public void taskStarted(org.apache.ant.common.event.BuildEvent event) {
Object source = event.getSource();
if (source instanceof Task) {
fireTaskStarted((Task) source);
}
} }


/** /**
@@ -663,6 +852,10 @@ public class Project implements org.apache.ant.common.event.BuildListener {
* @param event task finished event * @param event task finished event
*/ */
public void taskFinished(org.apache.ant.common.event.BuildEvent event) { public void taskFinished(org.apache.ant.common.event.BuildEvent event) {
Object source = event.getSource();
if (source instanceof Task) {
fireTaskFinished((Task) source, event.getCause());
}
} }


/** /**
@@ -671,6 +864,14 @@ public class Project implements org.apache.ant.common.event.BuildListener {
* @param event message logged event * @param event message logged event
*/ */
public void messageLogged(org.apache.ant.common.event.BuildEvent event) { public void messageLogged(org.apache.ant.common.event.BuildEvent event) {
Object source = event.getSource();
if (source instanceof Task) {
fireMessageLogged((Task) source, event.getMessage(),
event.getPriority());
} else {
fireMessageLogged(this, event.getMessage(),
event.getPriority());
}
} }


/** /**
@@ -679,7 +880,11 @@ public class Project implements org.apache.ant.common.event.BuildListener {
* @param listener the listener to be added to the project * @param listener the listener to be added to the project
*/ */
public void addBuildListener(BuildListener listener) { public void addBuildListener(BuildListener listener) {
listeners.addElement(listener);
if (subordinate != null) {
subordinate.addBuildListener(listener);
} else {
listeners.addElement(listener);
}
} }


/** /**
@@ -701,8 +906,8 @@ public class Project implements org.apache.ant.common.event.BuildListener {
public void addReference(String name, Object value) { public void addReference(String name, Object value) {
try { try {
dataService.setDataValue(name, value); dataService.setDataValue(name, value);
} catch (ExecutionException e) {
throw new BuildException(e);
} catch (AntException e) {
throw new BuildException(e.getMessage(), e);
} }
} }


@@ -758,8 +963,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
@@ -829,8 +1034,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
@@ -849,83 +1054,104 @@ public class Project implements org.apache.ant.common.event.BuildListener {
filtering ? globalFilters : null, overwrite, preserveLastModified); filtering ? globalFilters : null, overwrite, preserveLastModified);
} }




/**
* Initialise this project
*
* @param context the context the project uses to access core services
* @exception AntException if the project cannot be initialised.
*/
public void init(AntContext context) throws AntException {
initContext(context);
Object proxy = dataService.getDataValue(PROXY_KEY);
if (proxy != null) {
Project proxyProject = (Project) proxy;
proxyProject.setSubordinate(this);
}
init();
}

/**
* 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
*
* @exception AntException if there is a problem configuring this project to
* use the subordinate's context.
*/
private void setSubordinate(Project subordinate) throws AntException {
initContext(subordinate.getContext());
// add our listeners to the subordinate
for (Iterator i = listeners.iterator(); i.hasNext();) {
BuildListener listener = (BuildListener) i.next();
subordinate.addBuildListener(listener);
}
if (baseDir != null) {
execService.setBaseDir(baseDir);
}
this.subordinate = subordinate;
}

/**
* 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
*/
public void setBasedir(String baseDir) throws BuildException {
setBaseDir(new File(baseDir));
}

/** /**
* Initialise this porject
* 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
*/
public void setBaseDir(File baseDir) throws BuildException {
try {
if (execService != null) {
execService.setBaseDir(baseDir);
}
this.baseDir = baseDir;
proxyProperties.put("basedir", baseDir.getPath());
} catch (AntException e) {
throw new BuildException(e.getMessage(), e);
}
}

/**
* Initialise the context related parts of this project
* *
* @param context the context the project uses to access core services * @param context the context the project uses to access core services
* @exception ExecutionException if the project cannot be initialised.
* @exception AntException if the project cannot be initialised.
*/ */
public void init(AntContext context) throws ExecutionException {
public void initContext(AntContext context) throws AntException {
this.context = context; this.context = context;
if (sharedContext == null) {
sharedContext = context;
}

fileService = (FileService) context.getCoreService(FileService.class); fileService = (FileService) context.getCoreService(FileService.class);
dataService = (DataService) context.getCoreService(DataService.class); dataService = (DataService) context.getCoreService(DataService.class);
execService = (ExecService) context.getCoreService(ExecService.class); execService = (ExecService) context.getCoreService(ExecService.class);
componentService = (ComponentService)
componentService = (ComponentService)
context.getCoreService(ComponentService.class); context.getCoreService(ComponentService.class);


InputService inputService InputService inputService
= (InputService) context.getCoreService(InputService.class); = (InputService) context.getCoreService(InputService.class);
setInputHandler(new Ant1InputHandler(inputService)); setInputHandler(new Ant1InputHandler(inputService));

String defs = "/org/apache/tools/ant/taskdefs/defaults.properties";

try {
Properties props = new Properties();
InputStream in = this.getClass().getResourceAsStream(defs);
if (in == null) {
throw new BuildException("Can't load default task list");
}
props.load(in);
in.close();

Enumeration enum = props.propertyNames();
while (enum.hasMoreElements()) {
String key = (String) enum.nextElement();
String value = props.getProperty(key);
try {
Class taskClass = Class.forName(value);
taskClassDefinitions.put(key, taskClass);
} catch (NoClassDefFoundError ncdfe) {
log("Could not load a dependent class ("
+ ncdfe.getMessage() + ") for task " + key, MSG_DEBUG);
} catch (ClassNotFoundException cnfe) {
log("Could not load class (" + value
+ ") for task " + key, MSG_DEBUG);
}
}
} catch (IOException ioe) {
throw new BuildException("Can't load default task list");
}

String dataDefs = "/org/apache/tools/ant/types/defaults.properties";

try {
Properties props = new Properties();
InputStream in = this.getClass().getResourceAsStream(dataDefs);
if (in == null) {
throw new BuildException("Can't load default datatype list");
}
props.load(in);
in.close();

Enumeration enum = props.propertyNames();
while (enum.hasMoreElements()) {
String key = (String) enum.nextElement();
String value = props.getProperty(key);
try {
Class dataClass = Class.forName(value);
dataClassDefinitions.put(key, dataClass);
} catch (NoClassDefFoundError ncdfe) {
log("Could not load a dependent class ("
+ ncdfe.getMessage() + ") for type " + key, MSG_DEBUG);
} catch (ClassNotFoundException cnfe) {
log("Could not load class (" + value
+ ") for type " + key, MSG_DEBUG);
}
}
} catch (IOException ioe) {
throw new BuildException("Can't load default datatype list");
}
} }


/** /**
@@ -946,7 +1172,11 @@ public class Project implements org.apache.ant.common.event.BuildListener {
* @param msgLevel level to log at * @param msgLevel level to log at
*/ */
public void log(String msg, int msgLevel) { public void log(String msg, int msgLevel) {
context.log(msg, msgLevel);
if (context != null) {
context.log(msg, msgLevel);
} else {
sharedContext.log(msg, msgLevel);
}
} }


/** /**
@@ -976,7 +1206,33 @@ public class Project implements org.apache.ant.common.event.BuildListener {
* @param msgLevel level to log at * @param msgLevel level to log at
*/ */
public void log(Task task, String msg, int msgLevel) { public void log(Task task, String msg, int msgLevel) {
context.log(msg, msgLevel);
if (context != null) {
context.log(msg, msgLevel);
} else {
sharedContext.log(msg, msgLevel);
}
}


/**
* 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>.
*
* @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.
*
* @deprecated
*/
public File resolveFile(String fileName, File rootDir) {
return fileUtils.resolveFile(rootDir, fileName);
} }


/** /**
@@ -988,8 +1244,8 @@ public class Project implements org.apache.ant.common.event.BuildListener {
public File resolveFile(String fileName) { public File resolveFile(String fileName) {
try { try {
return fileService.resolveFile(fileName); return fileService.resolveFile(fileName);
} catch (ExecutionException e) {
throw new BuildException(e);
} catch (AntException e) {
throw new BuildException(e.getMessage(), e);
} }
} }


@@ -1002,8 +1258,8 @@ public class Project implements org.apache.ant.common.event.BuildListener {
public String replaceProperties(String value) { public String replaceProperties(String value) {
try { try {
return dataService.replacePropertyRefs(value); return dataService.replacePropertyRefs(value);
} catch (ExecutionException e) {
throw new BuildException(e);
} catch (AntException e) {
throw new BuildException(e.getMessage(), e);
} }
} }


@@ -1020,8 +1276,8 @@ public class Project implements org.apache.ant.common.event.BuildListener {
componentService.taskdef(factory, taskClass.getClassLoader(), componentService.taskdef(factory, taskClass.getClassLoader(),
taskName, taskClass.getName()); taskName, taskClass.getName());
taskClassDefinitions.put(taskName, taskClass); taskClassDefinitions.put(taskName, taskClass);
} catch (ExecutionException e) {
throw new BuildException(e);
} catch (AntException e) {
throw new BuildException(e.getMessage(), e);
} }
} }


@@ -1036,8 +1292,8 @@ public class Project implements org.apache.ant.common.event.BuildListener {
componentService.typedef(factory, typeClass.getClassLoader(), componentService.typedef(factory, typeClass.getClassLoader(),
typeName, typeClass.getName()); typeName, typeClass.getName());
dataClassDefinitions.put(typeName, typeClass); dataClassDefinitions.put(typeName, typeClass);
} catch (ExecutionException e) {
throw new BuildException(e);
} catch (AntException e) {
throw new BuildException(e.getMessage(), e);
} }
} }


@@ -1070,7 +1326,7 @@ public class Project implements org.apache.ant.common.event.BuildListener {
task.setTaskName(taskType); task.setTaskName(taskType);
return task; return task;
} catch (Throwable e) { } catch (Throwable e) {
throw new BuildException(e);
throw new BuildException(e.getMessage(), e);
} }
} }


@@ -1094,7 +1350,7 @@ public class Project implements org.apache.ant.common.event.BuildListener {
try { try {
return componentService.createComponent(typeName); return componentService.createComponent(typeName);
} catch (Throwable e) { } catch (Throwable e) {
throw new BuildException(e);
throw new BuildException(e.getMessage(), e);
} }
} }




+ 4
- 4
proposal/mutant/src/java/antlibs/ant1compat/org/apache/tools/ant/ProjectComponent.java View File

@@ -54,7 +54,7 @@
package org.apache.tools.ant; package org.apache.tools.ant;


import org.apache.ant.common.antlib.AntContext; import org.apache.ant.common.antlib.AntContext;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;


/** /**
* ProjectComponent facade * ProjectComponent facade
@@ -113,10 +113,10 @@ public abstract class ProjectComponent {
* *
* @param context the core context for this component * @param context the core context for this component
* @param componentType the component type of this component * @param componentType the component type of this component
* @exception ExecutionException if the component cannot be initialized
* @exception AntException if the component cannot be initialized
*/ */
public void init(AntContext context, String componentType)
throws ExecutionException {
public void init(AntContext context, String componentType)
throws AntException {
this.context = context; this.context = context;
this.componentType = componentType; this.componentType = componentType;




+ 7
- 9
proposal/mutant/src/java/antlibs/ant1compat/org/apache/tools/ant/ProjectHelper.java View File

@@ -58,7 +58,6 @@ import java.io.File;
import org.apache.ant.common.antlib.AntContext; import org.apache.ant.common.antlib.AntContext;
import org.apache.ant.common.service.DataService; 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.ExecutionException;
import org.apache.ant.common.util.PropertyUtils; import org.apache.ant.common.util.PropertyUtils;


/** /**
@@ -106,7 +105,7 @@ public class ProjectHelper {
DataService dataService DataService dataService
= (DataService) context.getCoreService(DataService.class); = (DataService) context.getCoreService(DataService.class);
return dataService.replacePropertyRefs(value); return dataService.replacePropertyRefs(value);
} catch (ExecutionException e) {
} catch (AntException e) {
throw new BuildException(e); throw new BuildException(e);
} }
} }
@@ -128,25 +127,24 @@ public class ProjectHelper {
DataService dataService DataService dataService
= (DataService) context.getCoreService(DataService.class); = (DataService) context.getCoreService(DataService.class);
return dataService.replacePropertyRefs(value, keys); return dataService.replacePropertyRefs(value, keys);
} catch (ExecutionException e) {
} catch (AntException e) {
throw new BuildException(e); throw new BuildException(e);
} }
} }


/** /**
* Old method to build a project. * Old method to build a project.
*
*
* @param project The project to configure. Must not be <code>null</code>. * @param project The project to configure. Must not be <code>null</code>.
* @param buildFile An XML file giving the project's configuration. * @param buildFile An XML file giving the project's configuration.
* Must not be <code>null</code>. * Must not be <code>null</code>.
*
*
* @exception BuildException always * @exception BuildException always
* @deprecated * @deprecated
*/ */
public static void configureProject(Project project, File buildFile)
throws BuildException {
throw new BuildException("Project are not built by ProjectHelper "
+ "any longer.");
public static void configureProject(Project project, File buildFile)
throws BuildException {
project.configure(buildFile);
} }
} }



+ 12
- 12
proposal/mutant/src/java/antlibs/ant1compat/org/apache/tools/ant/Task.java View File

@@ -55,7 +55,7 @@ package org.apache.tools.ant;


import org.apache.ant.common.antlib.AntContext; import org.apache.ant.common.antlib.AntContext;
import org.apache.ant.common.service.ExecService; import org.apache.ant.common.service.ExecService;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;


/** /**
* Ant1 Task facade * Ant1 Task facade
@@ -77,10 +77,10 @@ public abstract class Task extends ProjectComponent
protected Location location; protected Location location;


/** /**
* Called by the project to let the task do its work. This method may be
* called more than once, if the task is invoked more than once.
* For example,
* if target1 and target2 both depend on target3, then running
* Called by the project to let the task do its work. This method may be
* called more than once, if the task is invoked more than once.
* For example,
* if target1 and target2 both depend on target3, then running
* "ant target1 target2" will run all tasks in target3 twice. * "ant target1 target2" will run all tasks in target3 twice.
* *
* @exception BuildException if something goes wrong with the build * @exception BuildException if something goes wrong with the build
@@ -159,10 +159,10 @@ public abstract class Task extends ProjectComponent
* Add a nested task to this Ant1 task. * Add a nested task to this Ant1 task.
* *
* @param task The task to be added * @param task The task to be added
* @exception ExecutionException if the task cannot be added.
* @exception AntException if the task cannot be added.
*/ */
public void addNestedTask(org.apache.ant.common.antlib.Task task) public void addNestedTask(org.apache.ant.common.antlib.Task task)
throws ExecutionException {
throws AntException {


if (!(this instanceof TaskContainer)) { if (!(this instanceof TaskContainer)) {
throw new BuildException("Can't add tasks to this task"); throw new BuildException("Can't add tasks to this task");
@@ -185,15 +185,15 @@ public abstract class Task extends ProjectComponent
* *
* @param context the core context for this component * @param context the core context for this component
* @param componentType the component type of this component * @param componentType the component type of this component
* @exception ExecutionException if the component cannot be initialized
* @exception AntException if the component cannot be initialized
*/ */
public void init(AntContext context, String componentType) public void init(AntContext context, String componentType)
throws ExecutionException {
throws AntException {
super.init(context, componentType); super.init(context, componentType);


taskType = componentType; taskType = componentType;
taskName = componentType; taskName = componentType;
org.apache.ant.common.util.Location contextLocation org.apache.ant.common.util.Location contextLocation
= context.getLocation(); = context.getLocation();


@@ -225,7 +225,7 @@ public abstract class Task extends ProjectComponent
ExecService execService ExecService execService
= (ExecService) context.getCoreService(ExecService.class); = (ExecService) context.getCoreService(ExecService.class);
execService.executeTask(this); execService.executeTask(this);
} catch (ExecutionException e) {
} catch (AntException e) {
throw new BuildException(e); throw new BuildException(e);
} }
} }
@@ -281,7 +281,7 @@ public abstract class Task extends ProjectComponent
void setTaskType(String type) { void setTaskType(String type) {
this.taskType = type; this.taskType = type;
} }
/** /**
* Sets the file location where this task was defined. * Sets the file location where this task was defined.
* *


+ 8
- 8
proposal/mutant/src/java/antlibs/ant1compat/org/apache/tools/ant/taskdefs/Ant.java View File

@@ -60,7 +60,7 @@ import org.apache.ant.antlib.system.AntBase;
import org.apache.ant.common.antlib.AntContext; import org.apache.ant.common.antlib.AntContext;
import org.apache.ant.common.antlib.AntLibFactory; import org.apache.ant.common.antlib.AntLibFactory;
import org.apache.ant.common.service.ComponentService; import org.apache.ant.common.service.ComponentService;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;
import org.apache.tools.ant.BuildException; import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task; import org.apache.tools.ant.Task;


@@ -147,7 +147,7 @@ public class Ant extends Task {
AntLibFactory factory = getProject().getFactory(); AntLibFactory factory = getProject().getFactory();
realAnt = (org.apache.ant.antlib.system.Ant) realAnt = (org.apache.ant.antlib.system.Ant)
componentService.createComponent("ant.system", "ant"); componentService.createComponent("ant.system", "ant");
} catch (ExecutionException e) {
} catch (AntException e) {
throw new BuildException(e); throw new BuildException(e);
} }
} }
@@ -156,7 +156,7 @@ public class Ant extends Task {
/** /**
* Do the execution. * Do the execution.
* *
* @exception BuildException if the execution of the sub-build has a
* @exception BuildException if the execution of the sub-build has a
* problem * problem
*/ */
public void execute() throws BuildException { public void execute() throws BuildException {
@@ -169,7 +169,7 @@ public class Ant extends Task {
} }
try { try {
realAnt.execute(); realAnt.execute();
} catch (ExecutionException e) {
} catch (AntException e) {
throw new BuildException(e); throw new BuildException(e);
} }
} }
@@ -194,7 +194,7 @@ public class Ant extends Task {
public void addReference(AntBase.Reference r) { public void addReference(AntBase.Reference r) {
try { try {
realAnt.addReference(r); realAnt.addReference(r);
} catch (ExecutionException e) {
} catch (AntException e) {
throw new BuildException(e); throw new BuildException(e);
} }
} }
@@ -203,11 +203,11 @@ public class Ant extends Task {
* Gets the componentService * Gets the componentService
* *
* @return the componentService instance provided by the core * @return the componentService instance provided by the core
* @exception ExecutionException if the service is not available.
* @exception AntException if the service is not available.
*/ */
private ComponentService getComponentService() throws ExecutionException {
private ComponentService getComponentService() throws AntException {
AntContext context = getAntContext(); AntContext context = getAntContext();
return (ComponentService)
return (ComponentService)
context.getCoreService(ComponentService.class); context.getCoreService(ComponentService.class);
} }




+ 7
- 7
proposal/mutant/src/java/antlibs/ant1compat/org/apache/tools/ant/taskdefs/CallTarget.java View File

@@ -60,7 +60,7 @@ import org.apache.ant.antlib.system.AntCall;
import org.apache.ant.common.antlib.AntContext; import org.apache.ant.common.antlib.AntContext;
import org.apache.ant.common.antlib.AntLibFactory; import org.apache.ant.common.antlib.AntLibFactory;
import org.apache.ant.common.service.ComponentService; import org.apache.ant.common.service.ComponentService;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;
import org.apache.tools.ant.BuildException; import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task; import org.apache.tools.ant.Task;


@@ -104,7 +104,7 @@ public class CallTarget extends Task {
AntLibFactory factory = getProject().getFactory(); AntLibFactory factory = getProject().getFactory();
antCall = (AntCall) componentService.createComponent("ant.system", antCall = (AntCall) componentService.createComponent("ant.system",
"antcall"); "antcall");
} catch (ExecutionException e) {
} catch (AntException e) {
throw new BuildException(e); throw new BuildException(e);
} }
} }
@@ -120,7 +120,7 @@ public class CallTarget extends Task {
} }
try { try {
antCall.execute(); antCall.execute();
} catch (ExecutionException e) {
} catch (AntException e) {
throw new BuildException(e); throw new BuildException(e);
} }
} }
@@ -145,7 +145,7 @@ public class CallTarget extends Task {
public void addReference(AntBase.Reference r) { public void addReference(AntBase.Reference r) {
try { try {
antCall.addReference(r); antCall.addReference(r);
} catch (ExecutionException e) {
} catch (AntException e) {
throw new BuildException(e); throw new BuildException(e);
} }
} }
@@ -154,11 +154,11 @@ public class CallTarget extends Task {
* Gets the componentService * Gets the componentService
* *
* @return the componentService instance provided by the core * @return the componentService instance provided by the core
* @exception ExecutionException if the service is not available.
* @exception AntException if the service is not available.
*/ */
private ComponentService getComponentService() throws ExecutionException {
private ComponentService getComponentService() throws AntException {
AntContext context = getAntContext(); AntContext context = getAntContext();
return
return
(ComponentService) context.getCoreService(ComponentService.class); (ComponentService) context.getCoreService(ComponentService.class);
} }
} }


+ 4
- 0
proposal/mutant/src/java/antlibs/monitor/antlib.xml View File

@@ -0,0 +1,4 @@
<antlib libid="antopt.monitor"
home="http://jakarta.apache.org/ant">
<aspect classname="org.apache.ant.antlib.monitor.MonitorAspect"/>
</antlib>

+ 176
- 0
proposal/mutant/src/java/antlibs/monitor/org/apache/ant/antlib/monitor/MonitorAspect.java View File

@@ -0,0 +1,176 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.ant.antlib.monitor;

import org.apache.ant.common.antlib.AbstractAspect;
import org.apache.ant.common.antlib.Task;
import org.apache.ant.common.model.BuildElement;
import org.apache.ant.common.model.AspectValueCollection;
import org.apache.ant.common.util.AntException;
import org.apache.ant.common.event.MessageLevel;
import java.util.Date;
import java.io.PrintStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
* A monitoring aspect to help understand memory and performance
* characteristics.
*
* @author Conor MacNeill
*/
public class MonitorAspect extends AbstractAspect {
private static PrintStream monitorLog;
private static long lastMessageTime;
public MonitorAspect() {
if (monitorLog == null) {
try {
monitorLog
= new PrintStream(new FileOutputStream("monitor.log"));
monitorLog.println("Logging started at " + new Date());
lastMessageTime = System.currentTimeMillis();
} catch (IOException e) {
log("Unable to open monitor log", MessageLevel.MSG_WARN);
}
}
}

private void monitor(String message) {
Runtime rt = Runtime.getRuntime();
synchronized (monitorLog) {
long now = System.currentTimeMillis();
long diff = now - lastMessageTime;
lastMessageTime = now;
long freeMem = rt.freeMemory();
long usedMem = rt.totalMemory() - freeMem;
monitorLog.println("+" + diff + " (" + usedMem + "/"
+ freeMem + "): " + message);
}
}

/**
* This join point is activated before a component is to be created.
* The aspect can return an object to be used rather than the core creating
* the object.
*
* @param component the component that has been created. This will be null
* unless another aspect has created the component
* @param model the Build model that applies to the component
*
* @return a component to use.
* @exception AntException if the aspect cannot process the component.
*/
public Object preCreateComponent(Object component, BuildElement model)
throws AntException {
monitor("Creating component " + "from <" + model.getType() + ">");
return component;
}

/**
* This join point is activated after a component has been created and
* configured. If the aspect wishes, an object can be returned in place
* of the one created by Ant.
*
* @param component the component that has been created.
* @param model the Build model used to create the component.
*
* @return a replacement for the component if desired. If null is returned
* the current component is used.
* @exception AntException if the aspect cannot process the component.
*/
public Object postCreateComponent(Object component, BuildElement model)
throws AntException {
monitor("Created component "
+ component.getClass().getName()
+ " from <" + model.getType() + ">");
return component;
}

/**
* This join point is activated just prior to task execution.
*
* @param task the task being executed.
* @param aspectValues a collection of aspect attribute values for use
* during the task execution - may be null if no aspect values are
* provided.
* @return an object which indicates that this aspect wishes to
* be notified after execution has been completed, in which case the obkect
* is returned to provide the aspect its context. If this returns null
* the aspect's postExecuteTask method will not be invoked.
* @exception AntException if the aspect cannot process the task.
*/
public Object preExecuteTask(Task task, AspectValueCollection aspectValues)
throws AntException {
String taskName = task.getClass().getName();
MonitorRecord record = new MonitorRecord(taskName);
return record;
}

/**
* This join point is activated after a task has executed. The aspect
* may override the task's failure cause by returning a new failure.
*
* @param context the context the aspect provided in preExecuteTask.
* @param failureCause the current failure reason for the task.
*
* @return a new failure reason or null if the task is not to fail.
*/
public Throwable postExecuteTask(Object context, Throwable failureCause) {
MonitorRecord record = (MonitorRecord)context;
record.print(monitorLog);
System.gc();
return failureCause;
}

}

+ 94
- 0
proposal/mutant/src/java/antlibs/monitor/org/apache/ant/antlib/monitor/MonitorRecord.java View File

@@ -0,0 +1,94 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.ant.antlib.monitor;

import org.apache.ant.common.antlib.AbstractAspect;
import org.apache.ant.common.antlib.Task;
import org.apache.ant.common.model.BuildElement;
import org.apache.ant.common.model.AspectValueCollection;
import org.apache.ant.common.util.AntException;
import org.apache.ant.common.event.MessageLevel;
import java.util.Date;
import java.io.PrintStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
* A record of some performance values at a particular time
*
* @author Conor MacNeill
*/
public class MonitorRecord {
private String recordName;
private long startMillis;
private long startMemory;

private long getMemoryUsage() {
Runtime rt = Runtime.getRuntime();
return rt.totalMemory() - rt.freeMemory();
}

public MonitorRecord(String recordName) {
this.recordName = recordName;
startMillis = System.currentTimeMillis();
startMemory = getMemoryUsage();
}

public void print(PrintStream stream) {
long timeDiff = System.currentTimeMillis() - startMillis;
long memDiff = getMemoryUsage() - startMemory;
stream.println(recordName + " took " + timeDiff
+ " milliseconds and memory used changed by " + memDiff);
}
}

+ 9
- 10
proposal/mutant/src/java/antlibs/script/org/apache/ant/antlib/script/ScriptBase.java View File

@@ -62,7 +62,6 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import org.apache.ant.common.antlib.AbstractTask; import org.apache.ant.common.antlib.AbstractTask;
import org.apache.ant.common.antlib.DeferredTask; import org.apache.ant.common.antlib.DeferredTask;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.antlib.AntContext; import org.apache.ant.common.antlib.AntContext;


/** /**
@@ -113,9 +112,9 @@ public class ScriptBase extends AbstractTask implements DeferredTask {
/** /**
* Execute the script * Execute the script
* *
* @exception ExecutionException if tghe script execution fails
* @exception ScriptException if tghe script execution fails
*/ */
public void execute() throws ExecutionException {
public void execute() throws ScriptException {
String language = factory.getScriptLanguage(scriptName); String language = factory.getScriptLanguage(scriptName);
String script = factory.getScript(scriptName); String script = factory.getScript(scriptName);


@@ -123,10 +122,10 @@ public class ScriptBase extends AbstractTask implements DeferredTask {
BSFManager manager = new BSFManager(); BSFManager manager = new BSFManager();
manager.declareBean("self", this, getClass()); manager.declareBean("self", this, getClass());
manager.declareBean("context", getAntContext(), AntContext.class); manager.declareBean("context", getAntContext(), AntContext.class);
// execute the script // execute the script
BSFEngine engine = manager.loadScriptingEngine(language); BSFEngine engine = manager.loadScriptingEngine(language);
engine.exec(scriptName, 0, 0, script); engine.exec(scriptName, 0, 0, script);
for (Iterator i = attributes.keySet().iterator(); i.hasNext();) { for (Iterator i = attributes.keySet().iterator(); i.hasNext();) {
String attributeName = (String) i.next(); String attributeName = (String) i.next();
@@ -135,7 +134,7 @@ public class ScriptBase extends AbstractTask implements DeferredTask {
setter.setCharAt(0, Character.toUpperCase(setter.charAt(0))); setter.setCharAt(0, Character.toUpperCase(setter.charAt(0)));
engine.call(null, "set" + setter, new Object[]{value}); engine.call(null, "set" + setter, new Object[]{value});
} }
Iterator i = nestedElementNames.iterator(); Iterator i = nestedElementNames.iterator();
Iterator j = nestedElements.iterator(); Iterator j = nestedElements.iterator();
while (i.hasNext()) { while (i.hasNext()) {
@@ -145,19 +144,19 @@ public class ScriptBase extends AbstractTask implements DeferredTask {
adder.setCharAt(0, Character.toUpperCase(adder.charAt(0))); adder.setCharAt(0, Character.toUpperCase(adder.charAt(0)));
engine.call(null, "add" + adder, new Object[]{nestedElement}); engine.call(null, "add" + adder, new Object[]{nestedElement});
} }
engine.call(null, "execute", new Object[]{}); engine.call(null, "execute", new Object[]{});
} catch (BSFException e) { } catch (BSFException e) {
Throwable t = e; Throwable t = e;
Throwable te = e.getTargetException(); Throwable te = e.getTargetException();
if (te != null) { if (te != null) {
if (te instanceof ExecutionException) {
throw (ExecutionException) te;
if (te instanceof ScriptException) {
throw (ScriptException) te;
} else { } else {
t = te; t = te;
} }
} }
throw new ExecutionException(t);
throw new ScriptException(t);
} }
} }




+ 3
- 3
proposal/mutant/src/java/antlibs/script/org/apache/ant/antlib/script/ScriptDef.java View File

@@ -54,7 +54,7 @@
package org.apache.ant.antlib.script; package org.apache.ant.antlib.script;


import org.apache.ant.common.antlib.AbstractTask; import org.apache.ant.common.antlib.AbstractTask;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;


/** /**
* Define a task using a script * Define a task using a script
@@ -98,9 +98,9 @@ public class ScriptDef extends AbstractTask {
* Define the script. The script itself is stored in the factory where * Define the script. The script itself is stored in the factory where
* it is retried by the ScriptBase instance * it is retried by the ScriptBase instance
* *
* @exception ExecutionException if the script cannot be defined
* @exception AntException if the script cannot be defined
*/ */
public void execute() throws ExecutionException {
public void execute() throws AntException {
// tell the factory about this script, under this name. // tell the factory about this script, under this name.
factory.defineScript(name, language, script); factory.defineScript(name, language, script);
} }


+ 129
- 0
proposal/mutant/src/java/antlibs/script/org/apache/ant/antlib/script/ScriptException.java View File

@@ -0,0 +1,129 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.ant.antlib.script;

import org.apache.ant.common.util.Location;
import org.apache.ant.common.util.AntException;

/**
* A Script related exception
*
* @author Conor MacNeill
*/
public class ScriptException extends AntException {
/**
* Constructs an exception with the given descriptive message.
*
* @param msg Description of or information about the exception.
*/
public ScriptException(String msg) {
super(msg);
}

/**
* Constructs an exception with the given descriptive message and a
* location in a file.
*
* @param msg Description of or information about the exception.
* @param location Location in the project file where the error occured.
*/
public ScriptException(String msg, Location location) {
super(msg, location);
}

/**
* Constructs an exception with the given message and exception as a
* root cause.
*
* @param msg Description of or information about the exception.
* @param cause Throwable that might have cause this one.
*/
public ScriptException(String msg, Throwable cause) {
super(msg, cause);
}

/**
* Constructs an exception with the given message and exception as a
* root cause and a location in a file.
*
* @param msg Description of or information about the exception.
* @param cause Exception that might have cause this one.
* @param location Location in the project file where the error occured.
*/
public ScriptException(String msg, Throwable cause,
Location location) {
super(msg, cause, location);
}

/**
* Constructs an exception with the given exception as a root cause.
*
* @param cause Exception that might have caused this one.
*/
public ScriptException(Throwable cause) {
super(cause);
}

/**
* Constructs an exception with the given exception as a root cause and
* a location in a file.
*
* @param cause Exception that might have cause this one.
* @param location Location in the project file where the error occured.
*/
public ScriptException(Throwable cause, Location location) {
super(cause, location);
}
}


+ 10
- 11
proposal/mutant/src/java/antlibs/script/org/apache/ant/antlib/script/ScriptFactory.java View File

@@ -58,7 +58,7 @@ import java.util.Map;
import org.apache.ant.common.antlib.AntContext; import org.apache.ant.common.antlib.AntContext;
import org.apache.ant.common.antlib.StandardLibFactory; import org.apache.ant.common.antlib.StandardLibFactory;
import org.apache.ant.common.service.ComponentService; import org.apache.ant.common.service.ComponentService;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;


/** /**
* The ScriptFactory class is a factory for the Scripting tasks. It stores * The ScriptFactory class is a factory for the Scripting tasks. It stores
@@ -120,19 +120,19 @@ public class ScriptFactory extends StandardLibFactory {
* Initialise the factory * Initialise the factory
* *
* @param context the factory's context * @param context the factory's context
* @exception ExecutionException if the factory cannot be initialized
* @exception AntException if the factory cannot be initialized
*/ */
public void init(AntContext context) throws ExecutionException {
public void init(AntContext context) throws AntException {
super.init(context); super.init(context);
componentService = (ComponentService)
componentService = (ComponentService)
context.getCoreService(ComponentService.class); context.getCoreService(ComponentService.class);
try { try {
Class.forName("com.ibm.bsf.BSFManager"); Class.forName("com.ibm.bsf.BSFManager");
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
throw new ExecutionException("The script Ant library requires "
throw new ScriptException("The script Ant library requires "
+ "bsf.jar to be available"); + "bsf.jar to be available");
} catch (NoClassDefFoundError e) { } catch (NoClassDefFoundError e) {
throw new ExecutionException("The script Ant library requires "
throw new ScriptException("The script Ant library requires "
+ "bsf.jar to be available. The class " + e.getMessage() + "bsf.jar to be available. The class " + e.getMessage()
+ "appears to be missing"); + "appears to be missing");
} }
@@ -147,11 +147,10 @@ public class ScriptFactory extends StandardLibFactory {
* @return an instance of the required class * @return an instance of the required class
* @exception InstantiationException if the class cannot be instantiated * @exception InstantiationException if the class cannot be instantiated
* @exception IllegalAccessException if the instance cannot be accessed * @exception IllegalAccessException if the instance cannot be accessed
* @exception ExecutionException if there is a problem creating the task
* @exception AntException if there is a problem creating the task
*/ */
public Object createComponent(Class componentClass, String localName) public Object createComponent(Class componentClass, String localName)
throws InstantiationException, IllegalAccessException,
ExecutionException {
throws InstantiationException, IllegalAccessException, AntException {
Object component = super.createComponent(componentClass, localName); Object component = super.createComponent(componentClass, localName);


if (component instanceof ScriptDef) { if (component instanceof ScriptDef) {
@@ -193,10 +192,10 @@ public class ScriptFactory extends StandardLibFactory {
* @param name the name the script is to be defined under * @param name the name the script is to be defined under
* @param language the language of the scripr * @param language the language of the scripr
* @param script the script text * @param script the script text
* @exception ExecutionException if the script cannot be defined
* @exception AntException if the script cannot be defined
*/ */
protected void defineScript(String name, String language, String script) protected void defineScript(String name, String language, String script)
throws ExecutionException {
throws AntException {
ScriptInfo scriptDefinition = new ScriptInfo(language, script); ScriptInfo scriptDefinition = new ScriptInfo(language, script);
scripts.put(name, scriptDefinition); scripts.put(name, scriptDefinition);
componentService.taskdef(this, ScriptBase.class.getClassLoader(), componentService.taskdef(this, ScriptBase.class.getClassLoader(),


+ 41
- 8
proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/Ant.java View File

@@ -53,11 +53,18 @@
*/ */
package org.apache.ant.antlib.system; package org.apache.ant.antlib.system;
import java.io.File; import java.io.File;
import java.io.PrintStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.ant.common.model.Project; import org.apache.ant.common.model.Project;
import org.apache.ant.common.service.BuildKey;
import org.apache.ant.common.service.ExecService; import org.apache.ant.common.service.ExecService;
import org.apache.ant.common.service.FileService;
import org.apache.ant.common.service.MagicProperties; import org.apache.ant.common.service.MagicProperties;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;
import org.apache.ant.common.util.FileUtils; import org.apache.ant.common.util.FileUtils;
import org.apache.ant.common.logger.DefaultLogger;
import org.apache.ant.common.event.MessageLevel;


/** /**
* The Ant task - used to execute a different build file * The Ant task - used to execute a different build file
@@ -71,7 +78,7 @@ public class Ant extends AntBase {
/** the base directory to use for the run */ /** the base directory to use for the run */
private File baseDir; private File baseDir;
/** File to capture any output */ /** File to capture any output */
private File outputFile;
private String output;




/** /**
@@ -97,19 +104,19 @@ public class Ant extends AntBase {
/** /**
* The output file for capturing the build output * The output file for capturing the build output
* *
* @param outputFile the output file for capturing the build output
* @param output the output file for capturing the build output
*/ */
public void setOutput(File outputFile) {
this.outputFile = outputFile;
public void setOutput(String output) {
this.output = output;
} }




/** /**
* Run the sub-build * Run the sub-build
* *
* @exception ExecutionException if the build can't be run
* @exception AntException if the build can't be run
*/ */
public void execute() throws ExecutionException {
public void execute() throws AntException {
if (baseDir == null) { if (baseDir == null) {
baseDir = getExecService().getBaseDir(); baseDir = getExecService().getBaseDir();
} }
@@ -130,10 +137,36 @@ 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());
BuildKey key = execService.setupBuild(model, getProperties(), true);


setSubBuildKey(key); setSubBuildKey(key);

if (output != null) {
FileService fileService
= (FileService) getCoreService(FileService.class);

File outfile = null;
if (baseDir != null) {
outfile = FileUtils.newFileUtils().resolveFile(baseDir, output);
} else {
outfile = fileService.resolveFile(output);
}
try {
PrintStream out
= new PrintStream(new FileOutputStream(outfile));
DefaultLogger logger = new DefaultLogger();
logger.setMessageOutputLevel(MessageLevel.MSG_INFO);
logger.setOutputPrintStream(out);
logger.setErrorPrintStream(out);
execService.addBuildListener(key, logger);
} catch (IOException ex) {
log("Ant: Can't set output to " + output,
MessageLevel.MSG_INFO);
}
}

execService.runBuild(key, getTargets()); execService.runBuild(key, getTargets());
execService.releaseBuild(key);
} }
} }



+ 33
- 32
proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/AntAspect.java View File

@@ -57,9 +57,10 @@ import java.util.Map;
import org.apache.ant.common.antlib.AbstractAspect; import org.apache.ant.common.antlib.AbstractAspect;
import org.apache.ant.common.antlib.AntContext; import org.apache.ant.common.antlib.AntContext;
import org.apache.ant.common.antlib.Task; import org.apache.ant.common.antlib.Task;
import org.apache.ant.common.antlib.AspectException;
import org.apache.ant.common.service.DataService; import org.apache.ant.common.service.DataService;
import org.apache.ant.common.service.ComponentService; import org.apache.ant.common.service.ComponentService;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;
import org.apache.ant.common.model.BuildElement; import org.apache.ant.common.model.BuildElement;
import org.apache.ant.common.model.AspectValueCollection; import org.apache.ant.common.model.AspectValueCollection;


@@ -71,7 +72,7 @@ import org.apache.ant.common.model.AspectValueCollection;
public class AntAspect extends AbstractAspect { public class AntAspect extends AbstractAspect {
/** The Ant aspect used to identify Ant metadata */ /** The Ant aspect used to identify Ant metadata */
public static final String ANT_ASPECT = "ant"; public static final String ANT_ASPECT = "ant";
/** The core's data service implementation */ /** The core's data service implementation */
private DataService dataService = null; private DataService dataService = null;


@@ -79,73 +80,73 @@ public class AntAspect extends AbstractAspect {
private ComponentService componentService = null; private ComponentService componentService = null;


/** /**
* Initialise the aspect with a context.
* Initialise the aspect with a context.
* *
* @param context the aspect's context * @param context the aspect's context
* @exception ExecutionException if the aspect cannot be initialised
* @exception AntException if the aspect cannot be initialised
*/ */
public void init(AntContext context) throws ExecutionException {
public void init(AntContext context) throws AntException {
super.init(context); super.init(context);
dataService = (DataService) context.getCoreService(DataService.class); dataService = (DataService) context.getCoreService(DataService.class);
componentService
componentService
= (ComponentService) context.getCoreService(ComponentService.class); = (ComponentService) context.getCoreService(ComponentService.class);
} }


/** /**
* This join point is activated before a component has been created. * This join point is activated before a component has been created.
* The aspect can return an object to be used rather than the core creating
* the object.
* The aspect can return an object to be used rather than the core creating
* the object.
* *
* @param component the component that has been created. This will be null * @param component the component that has been created. This will be null
* unless another aspect has created the component * unless another aspect has created the component
* @param model the Build model that applies to the component * @param model the Build model that applies to the component
* *
* @return a component to use. * @return a component to use.
* @exception ExecutionException if the aspect cannot process the component.
*/
* @exception AntException if the aspect cannot process the component.
*/
public Object preCreateComponent(Object component, BuildElement model) public Object preCreateComponent(Object component, BuildElement model)
throws ExecutionException {
throws AntException {
String refId = model.getAspectAttributeValue(ANT_ASPECT, "refid"); String refId = model.getAspectAttributeValue(ANT_ASPECT, "refid");
if (refId != null) { if (refId != null) {
if (model.getAttributeNames().hasNext() || if (model.getAttributeNames().hasNext() ||
model.getNestedElements().hasNext() || model.getNestedElements().hasNext() ||
model.getText().length() != 0) { model.getText().length() != 0) {
throw new ExecutionException("Element <" + model.getType()
throw new AspectException("Element <" + model.getType()
+ "> is defined by reference and hence may not specify " + "> is defined by reference and hence may not specify "
+ "any attributes, nested elements or content", + "any attributes, nested elements or content",
model.getLocation()); model.getLocation());
} }
Object referredComponent = dataService.getDataValue(refId); Object referredComponent = dataService.getDataValue(refId);
if (referredComponent == null) { if (referredComponent == null) {
throw new ExecutionException("The given ant:refid value '"
throw new AspectException("The given ant:refid value '"
+ refId + "' is not defined", model.getLocation()); + refId + "' is not defined", model.getLocation());
} }
return referredComponent; return referredComponent;
}
}
return component; return component;
} }
/** /**
* This join point is activated after a component has been created and * This join point is activated after a component has been created and
* configured. If the aspect wishes, an object can be returned in place * configured. If the aspect wishes, an object can be returned in place
* of the one created by Ant.
* of the one created by Ant.
* *
* @param component the component that has been created. * @param component the component that has been created.
* @param model the Build model used to create the component. * @param model the Build model used to create the component.
* *
* @return a replacement for the component if desired. If null is returned * @return a replacement for the component if desired. If null is returned
* the current component is used. * the current component is used.
* @exception ExecutionException if the component cannot be processed.
*/
public Object postCreateComponent(Object component, BuildElement model)
throws ExecutionException {
* @exception AntException if the component cannot be processed.
*/
public Object postCreateComponent(Object component, BuildElement model)
throws AntException {
String typeId = model.getAspectAttributeValue(ANT_ASPECT, "id"); String typeId = model.getAspectAttributeValue(ANT_ASPECT, "id");
if (typeId != null) { if (typeId != null) {
dataService.setMutableDataValue(typeId, component); dataService.setMutableDataValue(typeId, component);
} }
return super.postCreateComponent(component, model); return super.postCreateComponent(component, model);
} }


@@ -153,31 +154,31 @@ public class AntAspect extends AbstractAspect {
* This join point is activated just prior to task execution. * This join point is activated just prior to task execution.
* *
* @param task the task being executed. * @param task the task being executed.
* @param aspectValues a collection of aspect attribute values for use
* @param aspectValues a collection of aspect attribute values for use
* during the task execution. * during the task execution.
* *
* @return an objectwhich indicates that this aspect wishes to
* @return an objectwhich indicates that this aspect wishes to
* be notified after execution has been completed, in which case the obkect * be notified after execution has been completed, in which case the obkect
* is returned to provide the aspect its context. If this returns null * is returned to provide the aspect its context. If this returns null
* the aspect's postExecuteTask method will not be invoked. * the aspect's postExecuteTask method will not be invoked.
* @exception ExecutionException if the aspect cannot process the task.
* @exception AntException if the aspect cannot process the task.
*/ */
public Object preExecuteTask(Task task, AspectValueCollection aspectValues)
throws ExecutionException {
public Object preExecuteTask(Task task, AspectValueCollection aspectValues)
throws AntException {
AntAspectContext aspectContext = new AntAspectContext(); AntAspectContext aspectContext = new AntAspectContext();
Map antAspectValues = aspectValues.getAttributes(ANT_ASPECT); Map antAspectValues = aspectValues.getAttributes(ANT_ASPECT);
if (antAspectValues == null) { if (antAspectValues == null) {
return null; return null;
} }
componentService.configureAttributes(aspectContext, antAspectValues,
componentService.configureAttributes(aspectContext, antAspectValues,
true); true);
if (aspectContext.isRequired()) { if (aspectContext.isRequired()) {
return aspectContext; return aspectContext;
} }
return null;
return null;
} }
/** /**
* This join point is activated after a task has executed. The aspect * This join point is activated after a task has executed. The aspect
* may override the task's failure cause by returning a new failure. * may override the task's failure cause by returning a new failure.


+ 8
- 7
proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/AntBase.java View File

@@ -55,7 +55,8 @@ package org.apache.ant.antlib.system;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;
import org.apache.ant.common.service.BuildKey;


/** /**
* Common Base class for the Ant and AntCall tasks * Common Base class for the Ant and AntCall tasks
@@ -80,7 +81,7 @@ public abstract class AntBase extends SubBuild {
/** /**
* The key to the subbuild with which the Ant task can manage the subbuild * The key to the subbuild with which the Ant task can manage the subbuild
*/ */
private Object subbuildKey;
private BuildKey subbuildKey;


/** The name of the target to be evaluated in the sub-build */ /** The name of the target to be evaluated in the sub-build */
private String targetName; private String targetName;
@@ -125,9 +126,9 @@ public abstract class AntBase extends SubBuild {
* System.err, directly or indirectly. * System.err, directly or indirectly.
* *
* @param line The line of error info produce by the task * @param line The line of error info produce by the task
* @exception ExecutionException if the output cannot be handled.
* @exception AntException if the output cannot be handled.
*/ */
public void handleSystemErr(String line) throws ExecutionException {
public void handleSystemErr(String line) throws AntException {
if (subbuildKey == null) { if (subbuildKey == null) {
super.handleSystemErr(line); super.handleSystemErr(line);
} else { } else {
@@ -143,9 +144,9 @@ public abstract class AntBase extends SubBuild {
* or indirectly. * or indirectly.
* *
* @param line The line of content produce by the task * @param line The line of content produce by the task
* @exception ExecutionException if the output cannot be handled.
* @exception AntException if the output cannot be handled.
*/ */
public void handleSystemOut(String line) throws ExecutionException {
public void handleSystemOut(String line) throws AntException {
if (subbuildKey == null) { if (subbuildKey == null) {
super.handleSystemOut(line); super.handleSystemOut(line);
} else { } else {
@@ -180,7 +181,7 @@ public abstract class AntBase extends SubBuild {
* *
* @param key the key returned by the Ant core for managing the subbuild * @param key the key returned by the Ant core for managing the subbuild
*/ */
protected void setSubBuildKey(Object key) {
protected void setSubBuildKey(BuildKey key) {
this.subbuildKey = key; this.subbuildKey = key;
} }




+ 7
- 5
proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/AntCall.java View File

@@ -52,8 +52,9 @@
* <http://www.apache.org/>. * <http://www.apache.org/>.
*/ */
package org.apache.ant.antlib.system; package org.apache.ant.antlib.system;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;
import org.apache.ant.common.service.MagicProperties; import org.apache.ant.common.service.MagicProperties;
import org.apache.ant.common.service.BuildKey;


/** /**
* The Ant task - used to execute a different build file * The Ant task - used to execute a different build file
@@ -65,15 +66,16 @@ public class AntCall extends AntBase {
/** /**
* Execute the sub-build * Execute the sub-build
* *
* @exception ExecutionException if the build fails
* @exception AntException if the build fails
*/ */
public void execute() throws ExecutionException {
setProperty(MagicProperties.BASEDIR,
public void execute() throws AntException {
setProperty(MagicProperties.BASEDIR,
getExecService().getBaseDir().getAbsolutePath()); getExecService().getBaseDir().getAbsolutePath());


Object key = getExecService().setupBuild(getProperties());
BuildKey key = getExecService().setupBuild(getProperties(), true);
setSubBuildKey(key); setSubBuildKey(key);
getExecService().runBuild(key, getTargets()); getExecService().runBuild(key, getTargets());
getExecService().releaseBuild(key);
} }


/** /**


+ 5
- 5
proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/FileConverter.java View File

@@ -55,7 +55,7 @@ package org.apache.ant.antlib.system;


import java.io.File; import java.io.File;
import org.apache.ant.common.antlib.AbstractConverter; import org.apache.ant.common.antlib.AbstractConverter;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.antlib.ConverterException;
import org.apache.ant.common.util.AntException; import org.apache.ant.common.util.AntException;
import org.apache.ant.common.service.FileService; import org.apache.ant.common.service.FileService;


@@ -85,15 +85,15 @@ public class FileConverter extends AbstractConverter {
* @param value The value to be converted * @param value The value to be converted
* @param type the desired type of the converted object * @param type the desired type of the converted object
* @return the value of the converted object * @return the value of the converted object
* @exception ExecutionException if the conversion cannot be made
* @exception ConverterException if the conversion cannot be made
*/ */
public Object convert(String value, Class type) throws ExecutionException {
public Object convert(String value, Class type) throws ConverterException {
try { try {
FileService fileService
FileService fileService
= (FileService) getContext().getCoreService(FileService.class); = (FileService) getContext().getCoreService(FileService.class);
return fileService.resolveFile(value); return fileService.resolveFile(value);
} catch (AntException e) { } catch (AntException e) {
throw new ExecutionException("Unable to resolve file: "
throw new ConverterException("Unable to resolve file: "
+ value, e); + value, e);
} }
} }


+ 9
- 8
proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/Import.java View File

@@ -55,8 +55,9 @@ package org.apache.ant.antlib.system;


import org.apache.ant.common.antlib.AbstractTask; import org.apache.ant.common.antlib.AbstractTask;
import org.apache.ant.common.antlib.AntContext; import org.apache.ant.common.antlib.AntContext;
import org.apache.ant.common.antlib.ValidationException;
import org.apache.ant.common.service.ComponentService; import org.apache.ant.common.service.ComponentService;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;


/** /**
* Task to import a component or components from a library * Task to import a component or components from a library
@@ -116,22 +117,22 @@ public class Import extends AbstractTask {
/** /**
* Validate this task is properly configured * Validate this task is properly configured
* *
* @exception ExecutionException if the task is not configured correctly
* @exception ValidationException if the task is not configured correctly
*/ */
public void validateComponent() throws ExecutionException {
public void validateComponent() throws ValidationException {
if (ref != null) { if (ref != null) {
if (libraryId != null || name != null) { if (libraryId != null || name != null) {
throw new ExecutionException("The \"ref\" attribute can only "
throw new ValidationException("The \"ref\" attribute can only "
+ "be used when \"libraryId\" and \"name\" attributes are " + "be used when \"libraryId\" and \"name\" attributes are "
+ "not present"); + "not present");
} }
} else { } else {
if (libraryId == null) { if (libraryId == null) {
throw new ExecutionException("You must specify a library "
throw new ValidationException("You must specify a library "
+ "identifier with the \"libraryid\" attribute"); + "identifier with the \"libraryid\" attribute");
} }
if (alias != null && name == null) { if (alias != null && name == null) {
throw new ExecutionException("You may only specify an alias"
throw new ValidationException("You may only specify an alias"
+ " when you specify the \"name\" or \"ref\" attributes"); + " when you specify the \"name\" or \"ref\" attributes");
} }
} }
@@ -140,9 +141,9 @@ public class Import extends AbstractTask {
/** /**
* Do the work and import the component or components * Do the work and import the component or components
* *
* @exception ExecutionException if the components cannot be imported
* @exception AntException if the components cannot be imported
*/ */
public void execute() throws ExecutionException {
public void execute() throws AntException {
AntContext context = getAntContext(); AntContext context = getAntContext();
ComponentService componentService = (ComponentService) ComponentService componentService = (ComponentService)
context.getCoreService(ComponentService.class); context.getCoreService(ComponentService.class);


+ 23
- 21
proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/LibPath.java View File

@@ -58,8 +58,9 @@ import java.net.URL;


import org.apache.ant.common.antlib.AbstractTask; import org.apache.ant.common.antlib.AbstractTask;
import org.apache.ant.common.antlib.AntContext; import org.apache.ant.common.antlib.AntContext;
import org.apache.ant.common.antlib.ValidationException;
import org.apache.ant.common.service.ComponentService; import org.apache.ant.common.service.ComponentService;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;
import org.apache.ant.common.event.MessageLevel; import org.apache.ant.common.event.MessageLevel;
import org.apache.ant.init.InitUtils; import org.apache.ant.init.InitUtils;


@@ -91,9 +92,9 @@ public class LibPath extends AbstractTask {
* Sets the URL of the library to be loaded * Sets the URL of the library to be loaded
* *
* @param url the URL from which the library is to be loaded * @param url the URL from which the library is to be loaded
* @exception ExecutionException if the URL cannot be set
* @exception ValidationException if the URL cannot be set
*/ */
public void setURL(URL url) throws ExecutionException {
public void setURL(URL url) throws ValidationException {
checkNullURL(); checkNullURL();
this.url = url; this.url = url;
} }
@@ -102,14 +103,14 @@ public class LibPath extends AbstractTask {
* Set the file from which the library should be loaded. * Set the file from which the library should be loaded.
* *
* @param file the file from which the library should be loaded * @param file the file from which the library should be loaded
* @exception ExecutionException if the file attribute cannot be set
* @exception ValidationException if the file attribute cannot be set
*/ */
public void setFile(File file) throws ExecutionException {
public void setFile(File file) throws ValidationException {
checkNullURL(); checkNullURL();
try { try {
this.url = InitUtils.getFileURL(file); this.url = InitUtils.getFileURL(file);
} catch (MalformedURLException e) { } catch (MalformedURLException e) {
throw new ExecutionException(e);
throw new ValidationException(e);
} }
} }


@@ -117,29 +118,29 @@ public class LibPath extends AbstractTask {
* Set the dir in which to search for AntLibraries. * Set the dir in which to search for AntLibraries.
* *
* @param dir the dir from which all Ant Libraries found will be loaded. * @param dir the dir from which all Ant Libraries found will be loaded.
* @exception ExecutionException if the dir attribute cannot be set
* @exception ValidationException if the dir attribute cannot be set
*/ */
public void setDir(File dir) throws ExecutionException {
public void setDir(File dir) throws ValidationException {
checkNullURL(); checkNullURL();
try { try {
this.url = InitUtils.getFileURL(dir); this.url = InitUtils.getFileURL(dir);
} catch (MalformedURLException e) { } catch (MalformedURLException e) {
throw new ExecutionException(e);
throw new ValidationException(e);
} }
} }


/** /**
* Validate this task is configured correctly * Validate this task is configured correctly
* *
* @exception ExecutionException if the task is not configured correctly
* @exception ValidationException if the task is not configured correctly
*/ */
public void validateComponent() throws ExecutionException {
public void validateComponent() throws ValidationException {
if (libraryId == null) { if (libraryId == null) {
throw new ExecutionException("You must specify the id of the"
throw new ValidationException("You must specify the id of the"
+ "library for which you are providing additional classpaths"); + "library for which you are providing additional classpaths");
} }
if (url == null) { if (url == null) {
throw new ExecutionException("You must provide an additional "
throw new ValidationException("You must provide an additional "
+ "classpath using one of the file, dir or url attributes"); + "classpath using one of the file, dir or url attributes");
} }
} }
@@ -147,15 +148,15 @@ public class LibPath extends AbstractTask {
/** /**
* Add the libpath to the set of paths associated with the library * Add the libpath to the set of paths associated with the library
* *
* @exception ExecutionException if the library path cannot be addded to
* @exception AntException if the library path cannot be addded to
* the library * the library
*/ */
public void execute() throws ExecutionException {
public void execute() throws AntException {
AntContext context = getAntContext(); AntContext context = getAntContext();
ComponentService componentService = (ComponentService) ComponentService componentService = (ComponentService)
context.getCoreService(ComponentService.class); context.getCoreService(ComponentService.class);
log("Adding lib path " + url + " for " + libraryId,
MessageLevel.MSG_DEBUG);
log("Adding lib path " + url + " for " + libraryId,
MessageLevel.MSG_DEBUG);
componentService.addLibPath(libraryId, url); componentService.addLibPath(libraryId, url);
} }


@@ -163,12 +164,13 @@ public class LibPath extends AbstractTask {
* Check if any of the location specifying attributes have already been * Check if any of the location specifying attributes have already been
* set. * set.
* *
* @exception ExecutionException if the search URL has already been set
* @exception ValidationException if the search URL has already been set
*/ */
private void checkNullURL() throws ExecutionException {
private void checkNullURL() throws ValidationException {
if (url != null) { if (url != null) {
throw new ExecutionException("Location of library has already been "
+ "set. Please use only one of file, dir or url attributes");
throw new ValidationException("Location of library has already "
+ "been set. Please use only one of file, dir or url "
+ "attributes");
} }
} }
} }


+ 21
- 19
proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/LoadLib.java View File

@@ -58,7 +58,8 @@ import java.net.URL;
import org.apache.ant.common.antlib.AbstractTask; import org.apache.ant.common.antlib.AbstractTask;
import org.apache.ant.common.antlib.AntContext; import org.apache.ant.common.antlib.AntContext;
import org.apache.ant.common.service.ComponentService; import org.apache.ant.common.service.ComponentService;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.antlib.ValidationException;
import org.apache.ant.common.util.AntException;
import org.apache.ant.init.InitUtils; import org.apache.ant.init.InitUtils;


/** /**
@@ -81,9 +82,9 @@ public class LoadLib extends AbstractTask {
* Sets the URL of the library to be loaded * Sets the URL of the library to be loaded
* *
* @param url the URL from which the library is to be loaded * @param url the URL from which the library is to be loaded
* @exception ExecutionException if the URL cannot be set
* @exception ValidationException if the URL cannot be set
*/ */
public void setURL(URL url) throws ExecutionException {
public void setURL(URL url) throws ValidationException {
checkNullURL(); checkNullURL();
this.url = url; this.url = url;
} }
@@ -92,14 +93,14 @@ public class LoadLib extends AbstractTask {
* Set the file from which the library should be loaded. * Set the file from which the library should be loaded.
* *
* @param file the file from which the library should be loaded * @param file the file from which the library should be loaded
* @exception ExecutionException if the file attribute cannot be set
* @exception ValidationException if the file attribute cannot be set
*/ */
public void setFile(File file) throws ExecutionException {
public void setFile(File file) throws ValidationException {
checkNullURL(); checkNullURL();
try { try {
this.url = InitUtils.getFileURL(file); this.url = InitUtils.getFileURL(file);
} catch (MalformedURLException e) { } catch (MalformedURLException e) {
throw new ExecutionException(e);
throw new ValidationException(e);
} }
} }


@@ -107,14 +108,14 @@ public class LoadLib extends AbstractTask {
* Set the dir in which to search for AntLibraries. * Set the dir in which to search for AntLibraries.
* *
* @param dir the dir from which all Ant Libraries found will be loaded. * @param dir the dir from which all Ant Libraries found will be loaded.
* @exception ExecutionException if the dir attribute cannot be set
* @exception ValidationException if the dir attribute cannot be set
*/ */
public void setDir(File dir) throws ExecutionException {
public void setDir(File dir) throws ValidationException {
checkNullURL(); checkNullURL();
try { try {
this.url = InitUtils.getFileURL(dir); this.url = InitUtils.getFileURL(dir);
} catch (MalformedURLException e) { } catch (MalformedURLException e) {
throw new ExecutionException(e);
throw new ValidationException(e);
} }
} }


@@ -131,11 +132,11 @@ public class LoadLib extends AbstractTask {
/** /**
* Validate this task is configured correctly * Validate this task is configured correctly
* *
* @exception ExecutionException if the task is not configured correctly
* @exception ValidationException if the task is not configured correctly
*/ */
public void validateComponent() throws ExecutionException {
public void validateComponent() throws ValidationException {
if (url == null) { if (url == null) {
throw new ExecutionException("A location from which to load "
throw new ValidationException("A location from which to load "
+ "libraries must be provided"); + "libraries must be provided");
} }
} }
@@ -144,26 +145,27 @@ public class LoadLib extends AbstractTask {
/** /**
* Load the library or libraries and optiinally import their components * Load the library or libraries and optiinally import their components
* *
* @exception ExecutionException if the library or libraries cannot be
* @exception AntException if the library or libraries cannot be
* loaded. * loaded.
*/ */
public void execute() throws ExecutionException {
public void execute() throws AntException {
AntContext context = getAntContext(); AntContext context = getAntContext();
ComponentService componentService = (ComponentService) ComponentService componentService = (ComponentService)
context.getCoreService(ComponentService.class); context.getCoreService(ComponentService.class);
componentService.loadLib(url.toString(), importAll, false);
componentService.loadLib(url, importAll);
} }


/** /**
* Check if any of the location specifying attributes have already been * Check if any of the location specifying attributes have already been
* set. * set.
* *
* @exception ExecutionException if the search URL has already been set
* @exception ValidationException if the search URL has already been set
*/ */
private void checkNullURL() throws ExecutionException {
private void checkNullURL() throws ValidationException {
if (url != null) { if (url != null) {
throw new ExecutionException("Location of library has already been "
+ "set. Please use only one of file, dir or url attributes");
throw new ValidationException("Location of library has already "
+ "been set. Please use only one of file, dir or url "
+ "attributes");
} }
} }
} }


+ 9
- 9
proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/Parallel.java View File

@@ -61,7 +61,7 @@ import org.apache.ant.common.antlib.AntContext;
import org.apache.ant.common.antlib.Task; import org.apache.ant.common.antlib.Task;
import org.apache.ant.common.antlib.TaskContainer; import org.apache.ant.common.antlib.TaskContainer;
import org.apache.ant.common.service.ExecService; import org.apache.ant.common.service.ExecService;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;
import org.apache.ant.common.util.Location; import org.apache.ant.common.util.Location;


/** /**
@@ -143,10 +143,10 @@ public class Parallel extends AbstractTask
* Block execution until the specified time or for a specified amount of * Block execution until the specified time or for a specified amount of
* milliseconds and if defined, execute the wait status. * milliseconds and if defined, execute the wait status.
* *
* @exception ExecutionException if any of the nested tasks throws an
* @exception AntException if any of the nested tasks throws an
* exception * exception
*/ */
public void execute() throws ExecutionException {
public void execute() throws AntException {
TaskThread[] threads = new TaskThread[nestedTasks.size()]; TaskThread[] threads = new TaskThread[nestedTasks.size()];
int threadNumber = 0; int threadNumber = 0;
for (Iterator i = nestedTasks.iterator(); i.hasNext(); threadNumber++) { for (Iterator i = nestedTasks.iterator(); i.hasNext(); threadNumber++) {
@@ -181,9 +181,9 @@ public class Parallel extends AbstractTask
if (firstException == null) { if (firstException == null) {
firstException = t; firstException = t;
} }
if (t instanceof ExecutionException &&
if (t instanceof AntException &&
firstLocation == Location.UNKNOWN_LOCATION) { firstLocation == Location.UNKNOWN_LOCATION) {
firstLocation = ((ExecutionException) t).getLocation();
firstLocation = ((AntException) t).getLocation();
} }
exceptionMessage.append(lSep); exceptionMessage.append(lSep);
exceptionMessage.append(t.getMessage()); exceptionMessage.append(t.getMessage());
@@ -191,13 +191,13 @@ public class Parallel extends AbstractTask
} }


if (numExceptions == 1) { if (numExceptions == 1) {
if (firstException instanceof ExecutionException) {
throw (ExecutionException) firstException;
if (firstException instanceof AntException) {
throw (AntException) firstException;
} else { } else {
throw new ExecutionException(firstException);
throw new SystemException(firstException);
} }
} else if (numExceptions > 1) { } else if (numExceptions > 1) {
throw new ExecutionException(exceptionMessage.toString(),
throw new SystemException(exceptionMessage.toString(),
firstLocation); firstLocation);
} }
} }


+ 9
- 9
proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/PrimitiveConverter.java View File

@@ -54,8 +54,8 @@
package org.apache.ant.antlib.system; package org.apache.ant.antlib.system;


import org.apache.ant.common.antlib.AbstractConverter; import org.apache.ant.common.antlib.AbstractConverter;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.PropertyUtils; import org.apache.ant.common.util.PropertyUtils;
import org.apache.ant.common.antlib.ConverterException;


/** /**
* A converter to convert to Java's primitie types * A converter to convert to Java's primitie types
@@ -72,8 +72,8 @@ public class PrimitiveConverter extends AbstractConverter {
*/ */
public Class[] getTypes() { public Class[] getTypes() {
return new Class[] { return new Class[] {
Character.class, Character.TYPE, Byte.TYPE, Short.TYPE,
Integer.TYPE, Long.TYPE, Float.TYPE, Double.TYPE,
Character.class, Character.TYPE, Byte.TYPE, Short.TYPE,
Integer.TYPE, Long.TYPE, Float.TYPE, Double.TYPE,
Boolean.class, Boolean.TYPE}; Boolean.class, Boolean.TYPE};
} }


@@ -84,10 +84,10 @@ public class PrimitiveConverter extends AbstractConverter {
* @param value The value to be converted * @param value The value to be converted
* @param type the desired type of the converted object * @param type the desired type of the converted object
* @return the value of the converted object * @return the value of the converted object
* @exception ExecutionException if the conversion cannot be made
* @exception ConverterException if the conversion cannot be made
*/ */
public Object convert(String value, Class type) throws ExecutionException {
if (type.equals(Character.class)
public Object convert(String value, Class type) throws ConverterException {
if (type.equals(Character.class)
|| type.equals(Character.TYPE)) { || type.equals(Character.TYPE)) {
return new Character(value.charAt(0)); return new Character(value.charAt(0));
} else if (type.equals(Byte.TYPE)) { } else if (type.equals(Byte.TYPE)) {
@@ -102,12 +102,12 @@ public class PrimitiveConverter extends AbstractConverter {
return new Float(value); return new Float(value);
} else if (type.equals(Double.TYPE)) { } else if (type.equals(Double.TYPE)) {
return new Double(value); return new Double(value);
} else if (type.equals(Boolean.class)
} else if (type.equals(Boolean.class)
|| type.equals(Boolean.TYPE)) { || type.equals(Boolean.TYPE)) {
return new Boolean(PropertyUtils.toBoolean(value)); return new Boolean(PropertyUtils.toBoolean(value));
} }
throw new ExecutionException("This converter does not handle "
+ type.getName());
throw new ConverterException("This converter does not handle "
+ type.getName());
} }
} }



+ 5
- 5
proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/Ref.java View File

@@ -55,7 +55,7 @@ package org.apache.ant.antlib.system;
import java.io.File; import java.io.File;
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.util.ExecutionException;
import org.apache.ant.common.util.AntException;


/** /**
* A Task to create a project reference. * A Task to create a project reference.
@@ -77,10 +77,10 @@ public class Ref extends SubBuild {
* @param context core's context * @param context core's context
* @param componentType the component type of this component (i.e its * @param componentType the component type of this component (i.e its
* defined name in the build file) * defined name in the build file)
* @exception ExecutionException if we can't access the data service
* @exception AntException if we can't access the data service
*/ */
public void init(AntContext context, String componentType) public void init(AntContext context, String componentType)
throws ExecutionException {
throws AntException {
super.init(context, componentType); super.init(context, componentType);
} }


@@ -109,9 +109,9 @@ public class Ref extends SubBuild {
/** /**
* Create the project reference * Create the project reference
* *
* @exception ExecutionException if the project cannot be referenced.
* @exception AntException if the project cannot be referenced.
*/ */
public void execute() throws ExecutionException {
public void execute() throws AntException {
Project model = getExecService().parseXMLBuildFile(projectFile); Project model = getExecService().parseXMLBuildFile(projectFile);


getExecService().createProjectReference(name, model, getProperties()); getExecService().createProjectReference(name, model, getProperties());


+ 3
- 3
proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/Sequential.java View File

@@ -61,7 +61,7 @@ import org.apache.ant.common.antlib.AntContext;
import org.apache.ant.common.antlib.Task; import org.apache.ant.common.antlib.Task;
import org.apache.ant.common.antlib.TaskContainer; import org.apache.ant.common.antlib.TaskContainer;
import org.apache.ant.common.service.ExecService; import org.apache.ant.common.service.ExecService;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;


/** /**
* Implements a single threaded task execution. <p> * Implements a single threaded task execution. <p>
@@ -94,10 +94,10 @@ public class Sequential extends AbstractTask
/** /**
* Execute all nestedTasks. * Execute all nestedTasks.
* *
* @exception ExecutionException if any of the nested tasks throws an
* @exception AntException if any of the nested tasks throws an
* exception * exception
*/ */
public void execute() throws ExecutionException {
public void execute() throws AntException {
AntContext context = getAntContext(); AntContext context = getAntContext();
ExecService execService ExecService execService
= (ExecService) context.getCoreService(ExecService.class); = (ExecService) context.getCoreService(ExecService.class);


+ 21
- 20
proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/SubBuild.java View File

@@ -57,9 +57,10 @@ import java.util.Map;
import org.apache.ant.common.antlib.AbstractComponent; import org.apache.ant.common.antlib.AbstractComponent;
import org.apache.ant.common.antlib.AbstractTask; import org.apache.ant.common.antlib.AbstractTask;
import org.apache.ant.common.antlib.AntContext; import org.apache.ant.common.antlib.AntContext;
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.ExecutionException;
import org.apache.ant.common.util.AntException;


/** /**
* Common Base class all tasks that can pass references and property overrides * Common Base class all tasks that can pass references and property overrides
@@ -127,15 +128,15 @@ public abstract class SubBuild extends AbstractTask {
/** /**
* Validate this data type instance * Validate this data type instance
* *
* @exception ExecutionException if either attribute has not been set
* @exception ValidationException if either attribute has not been set
*/ */
public void validateComponent() throws ExecutionException {
public void validateComponent() throws ValidationException {
if (name == null) { if (name == null) {
throw new ExecutionException("\"name\" attribute of "
throw new ValidationException("\"name\" attribute of "
+ "<property> must be supplied"); + "<property> must be supplied");
} }
if (value == null) { if (value == null) {
throw new ExecutionException("\"value\" attribute of "
throw new ValidationException("\"value\" attribute of "
+ "<property> must be supplied"); + "<property> must be supplied");
} }
} }
@@ -152,7 +153,7 @@ public abstract class SubBuild extends AbstractTask {
/** The id of the reference to be passed */ /** The id of the reference to be passed */
private String refId; private String refId;
/** The id to be used in the sub-build for this reference */ /** The id to be used in the sub-build for this reference */
private String toId;
private String toRefId;




/** /**
@@ -170,8 +171,8 @@ public abstract class SubBuild extends AbstractTask {
* *
* @return the toId value * @return the toId value
*/ */
public String getToId() {
return toId;
public String getToRefId() {
return toRefId;
} }




@@ -188,22 +189,22 @@ public abstract class SubBuild extends AbstractTask {
/** /**
* Sets the toId of the Reference * Sets the toId of the Reference
* *
* @param toId the new toId value
* @param toRefId the new toId value
*/ */
public void setToId(String toId) {
this.toId = toId;
public void setToRefId(String toRefId) {
this.toRefId = toRefId;
} }




/** /**
* Validate this data type instance * Validate this data type instance
* *
* @exception ExecutionException if the refid attribute has not been
* @exception ValidationException if the refid attribute has not been
* set * set
*/ */
public void validateComponent() throws ExecutionException {
public void validateComponent() throws ValidationException {
if (refId == null) { if (refId == null) {
throw new ExecutionException("\"refid\" attribute of "
throw new ValidationException("\"refid\" attribute of "
+ "<reference> must be supplied"); + "<reference> must be supplied");
} }
} }
@@ -234,17 +235,17 @@ 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 ExecutionException if the reference does not reference a
* @exception AntException if the reference does not reference a
* valid object * valid object
*/ */
public void addReference(Reference reference) throws ExecutionException {
public void addReference(Reference reference) throws AntException {
String refId = reference.getRefId(); String refId = reference.getRefId();


if (!dataService.isDataValueSet(refId)) { if (!dataService.isDataValueSet(refId)) {
throw new ExecutionException("RefId \"" + refId + "\" is not set");
throw new ValidationException("RefId \"" + refId + "\" is not set");
} }
Object value = dataService.getDataValue(refId); Object value = dataService.getDataValue(refId);
String toId = reference.getToId();
String toId = reference.getToRefId();


if (toId == null) { if (toId == null) {
toId = refId; toId = refId;
@@ -290,10 +291,10 @@ public abstract class SubBuild extends AbstractTask {
* @param context core's context * @param context core's context
* @param componentType the component type of this component (i.e its * @param componentType the component type of this component (i.e its
* defined name in the build file) * defined name in the build file)
* @exception ExecutionException if we can't access the data service
* @exception AntException if we can't access the data service
*/ */
public void init(AntContext context, String componentType) public void init(AntContext context, String componentType)
throws ExecutionException {
throws AntException {
super.init(context, componentType); super.init(context, componentType);
dataService = (DataService) getCoreService(DataService.class); dataService = (DataService) getCoreService(DataService.class);
execService = (ExecService) getCoreService(ExecService.class); execService = (ExecService) getCoreService(ExecService.class);


+ 129
- 0
proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/SystemException.java View File

@@ -0,0 +1,129 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.ant.antlib.system;

import org.apache.ant.common.util.Location;
import org.apache.ant.common.util.AntException;

/**
* A System task related exception
*
* @author Conor MacNeill
*/
public class SystemException extends AntException {
/**
* Constructs an exception with the given descriptive message.
*
* @param msg Description of or information about the exception.
*/
public SystemException(String msg) {
super(msg);
}

/**
* Constructs an exception with the given descriptive message and a
* location in a file.
*
* @param msg Description of or information about the exception.
* @param location Location in the project file where the error occured.
*/
public SystemException(String msg, Location location) {
super(msg, location);
}

/**
* Constructs an exception with the given message and exception as a
* root cause.
*
* @param msg Description of or information about the exception.
* @param cause Throwable that might have cause this one.
*/
public SystemException(String msg, Throwable cause) {
super(msg, cause);
}

/**
* Constructs an exception with the given message and exception as a
* root cause and a location in a file.
*
* @param msg Description of or information about the exception.
* @param cause Exception that might have cause this one.
* @param location Location in the project file where the error occured.
*/
public SystemException(String msg, Throwable cause,
Location location) {
super(msg, cause, location);
}

/**
* Constructs an exception with the given exception as a root cause.
*
* @param cause Exception that might have caused this one.
*/
public SystemException(Throwable cause) {
super(cause);
}

/**
* Constructs an exception with the given exception as a root cause and
* a location in a file.
*
* @param cause Exception that might have cause this one.
* @param location Location in the project file where the error occured.
*/
public SystemException(Throwable cause, Location location) {
super(cause, location);
}
}


+ 5
- 5
proposal/mutant/src/java/antlibs/system/org/apache/ant/antlib/system/URLConverter.java View File

@@ -56,10 +56,10 @@ package org.apache.ant.antlib.system;
import java.net.URL; import java.net.URL;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import org.apache.ant.common.antlib.AbstractConverter; import org.apache.ant.common.antlib.AbstractConverter;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.antlib.ConverterException;


/** /**
* A converter to convert to URLs relative to the project base dir
* A converter to convert to URLs relative to the project base dir
* *
* @author Conor MacNeill * @author Conor MacNeill
*/ */
@@ -82,13 +82,13 @@ public class URLConverter extends AbstractConverter {
* @param value The value to be converted * @param value The value to be converted
* @param type the desired type of the converted object * @param type the desired type of the converted object
* @return the value of the converted object * @return the value of the converted object
* @exception ExecutionException if the conversion cannot be made
* @exception ConverterException if the conversion cannot be made
*/ */
public Object convert(String value, Class type) throws ExecutionException {
public Object convert(String value, Class type) throws ConverterException {
try { try {
return new URL(value); return new URL(value);
} catch (MalformedURLException e) { } catch (MalformedURLException e) {
throw new ExecutionException(e);
throw new ConverterException(e);
} }
} }
} }


+ 34
- 24
proposal/mutant/src/java/common/org/apache/ant/common/antlib/AbstractAspect.java View File

@@ -53,7 +53,7 @@
*/ */
package org.apache.ant.common.antlib; package org.apache.ant.common.antlib;


import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;
import org.apache.ant.common.model.BuildElement; import org.apache.ant.common.model.BuildElement;
import org.apache.ant.common.model.AspectValueCollection; import org.apache.ant.common.model.AspectValueCollection;


@@ -63,19 +63,19 @@ import org.apache.ant.common.model.AspectValueCollection;
* @author Conor MacNeill * @author Conor MacNeill
*/ */
public class AbstractAspect implements Aspect { public class AbstractAspect implements Aspect {
/**
* The Ant context for this aspect which can be used to access core
/**
* The Ant context for this aspect which can be used to access core
* services. * services.
*/ */
private AntContext context; private AntContext context;
/** /**
* Initialise the aspect with a context.
* Initialise the aspect with a context.
* *
* @param context the aspect's context * @param context the aspect's context
* @exception ExecutionException if the aspect cannot be initialised
* @exception AntException if the aspect cannot be initialised
*/ */
public void init(AntContext context) throws ExecutionException {
public void init(AntContext context) throws AntException {
this.context = context; this.context = context;
} }


@@ -90,35 +90,35 @@ public class AbstractAspect implements Aspect {


/** /**
* This join point is activated before a component is to be created. * This join point is activated before a component is to be created.
* The aspect can return an object to be used rather than the core creating
* the object.
* The aspect can return an object to be used rather than the core creating
* the object.
* *
* @param component the component that has been created. This will be null * @param component the component that has been created. This will be null
* unless another aspect has created the component * unless another aspect has created the component
* @param model the Build model that applies to the component * @param model the Build model that applies to the component
* *
* @return a component to use. * @return a component to use.
* @exception ExecutionException if the aspect cannot process the component.
*/
* @exception AntException if the aspect cannot process the component.
*/
public Object preCreateComponent(Object component, BuildElement model) public Object preCreateComponent(Object component, BuildElement model)
throws ExecutionException {
throws AntException {
return component; return component;
} }


/** /**
* This join point is activated after a component has been created and * This join point is activated after a component has been created and
* configured. If the aspect wishes, an object can be returned in place * configured. If the aspect wishes, an object can be returned in place
* of the one created by Ant.
* of the one created by Ant.
* *
* @param component the component that has been created. * @param component the component that has been created.
* @param model the Build model used to create the component. * @param model the Build model used to create the component.
* *
* @return a replacement for the component if desired. If null is returned * @return a replacement for the component if desired. If null is returned
* the current component is used. * the current component is used.
* @exception ExecutionException if the aspect cannot process the component.
*/
public Object postCreateComponent(Object component, BuildElement model)
throws ExecutionException {
* @exception AntException if the aspect cannot process the component.
*/
public Object postCreateComponent(Object component, BuildElement model)
throws AntException {
return component; return component;
} }


@@ -126,20 +126,20 @@ public class AbstractAspect implements Aspect {
* This join point is activated just prior to task execution. * This join point is activated just prior to task execution.
* *
* @param task the task being executed. * @param task the task being executed.
* @param aspectValues a collection of aspect attribute values for use
* @param aspectValues a collection of aspect attribute values for use
* during the task execution - may be null if no aspect values are * during the task execution - may be null if no aspect values are
* provided. * provided.
* @return an object which indicates that this aspect wishes to
* @return an object which indicates that this aspect wishes to
* be notified after execution has been completed, in which case the obkect * be notified after execution has been completed, in which case the obkect
* is returned to provide the aspect its context. If this returns null * is returned to provide the aspect its context. If this returns null
* the aspect's postExecuteTask method will not be invoked. * the aspect's postExecuteTask method will not be invoked.
* @exception ExecutionException if the aspect cannot process the task.
* @exception AntException if the aspect cannot process the task.
*/ */
public Object preExecuteTask(Task task, AspectValueCollection aspectValues)
throws ExecutionException {
public Object preExecuteTask(Task task, AspectValueCollection aspectValues)
throws AntException {
return null; return null;
} }
/** /**
* This join point is activated after a task has executed. The aspect * This join point is activated after a task has executed. The aspect
* may override the task's failure cause by returning a new failure. * may override the task's failure cause by returning a new failure.
@@ -167,7 +167,7 @@ public class AbstractAspect implements Aspect {
} }


/** /**
* This point is activated when the task is to receive error content that
* This point is activated when the task is to receive error content that
* has been sent to error stream and redirected into the task. * has been sent to error stream and redirected into the task.
* *
* @param context the context the aspect provided in preExecuteTask. * @param context the context the aspect provided in preExecuteTask.
@@ -178,5 +178,15 @@ public class AbstractAspect implements Aspect {
public String taskError(Object context, String line) { public String taskError(Object context, String line) {
return line; return line;
} }

/**
* Log a message as a build event
*
* @param message the message to be logged
* @param level the priority level of the message
*/
protected void log(String message, int level) {
context.log(message, level);
}
} }



+ 7
- 7
proposal/mutant/src/java/common/org/apache/ant/common/antlib/AbstractComponent.java View File

@@ -53,7 +53,7 @@
*/ */
package org.apache.ant.common.antlib; package org.apache.ant.common.antlib;


import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;


/** /**
* Abstract implementation of the ExecutionComponent * Abstract implementation of the ExecutionComponent
@@ -96,10 +96,10 @@ public abstract class AbstractComponent implements ExecutionComponent {
* *
* @param context the component's context * @param context the component's context
* @param componentType the type of the component * @param componentType the type of the component
* @exception ExecutionException if initialisation fails
* @exception AntException if initialisation fails
*/ */
public void init(AntContext context, String componentType) public void init(AntContext context, String componentType)
throws ExecutionException {
throws AntException {
this.context = context; this.context = context;
this.componentType = componentType; this.componentType = componentType;
} }
@@ -109,9 +109,9 @@ public abstract class AbstractComponent implements ExecutionComponent {
* configured from its build model. The element may perform validation * configured from its build model. The element may perform validation
* of its configuration * of its configuration
* *
* @exception ExecutionException if validation fails
* @exception ValidationException if validation fails
*/ */
public void validateComponent() throws ExecutionException {
public void validateComponent() throws ValidationException {
// no validation by default // no validation by default
} }


@@ -121,11 +121,11 @@ public abstract class AbstractComponent implements ExecutionComponent {
* @param serviceClass the required interface of which an instance is * @param serviceClass the required interface of which an instance is
* required * required
* @return the core's instance of the requested service * @return the core's instance of the requested service
* @exception ExecutionException if the core does not support the
* @exception AntException if the core does not support the
* requested service * requested service
*/ */
protected Object getCoreService(Class serviceClass) protected Object getCoreService(Class serviceClass)
throws ExecutionException {
throws AntException {
return context.getCoreService(serviceClass); return context.getCoreService(serviceClass);
} }




+ 5
- 5
proposal/mutant/src/java/common/org/apache/ant/common/antlib/AbstractTask.java View File

@@ -53,7 +53,7 @@
*/ */
package org.apache.ant.common.antlib; package org.apache.ant.common.antlib;
import org.apache.ant.common.event.MessageLevel; import org.apache.ant.common.event.MessageLevel;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;


/** /**
* Abstract implementation of the Task interface * Abstract implementation of the Task interface
@@ -90,9 +90,9 @@ public abstract class AbstractTask extends AbstractComponent implements Task {
* directly or indirectly. * directly or indirectly.
* *
* @param line The line of content produce by the task * @param line The line of content produce by the task
* @exception ExecutionException if the output cannot be handled.
* @exception AntException if the output cannot be handled.
*/ */
public void handleSystemOut(String line) throws ExecutionException {
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.MSG_INFO);
} }
@@ -104,9 +104,9 @@ public abstract class AbstractTask extends AbstractComponent implements Task {
* System.err, directly or indirectly. * System.err, directly or indirectly.
* *
* @param line The line of error info produce by the task * @param line The line of error info produce by the task
* @exception ExecutionException if the output cannot be handled.
* @exception AntException if the output cannot be handled.
*/ */
public void handleSystemErr(String line) throws ExecutionException {
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.MSG_WARN);
} }


+ 3
- 3
proposal/mutant/src/java/common/org/apache/ant/common/antlib/AntContext.java View File

@@ -52,7 +52,7 @@
* <http://www.apache.org/>. * <http://www.apache.org/>.
*/ */
package org.apache.ant.common.antlib; package org.apache.ant.common.antlib;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;
import org.apache.ant.common.util.Location; import org.apache.ant.common.util.Location;


/** /**
@@ -80,10 +80,10 @@ public interface AntContext {
* @param serviceInterfaceClass the class object for the required * @param serviceInterfaceClass the class object for the required
* interface * interface
* @return an instance of the requested interface * @return an instance of the requested interface
* @exception ExecutionException if the core service is not supported
* @exception AntException if the core service is not supported
*/ */
Object getCoreService(Class serviceInterfaceClass) Object getCoreService(Class serviceInterfaceClass)
throws ExecutionException;
throws AntException;


/** /**
* Gets the location associated with the AntContext * Gets the location associated with the AntContext


+ 9
- 9
proposal/mutant/src/java/common/org/apache/ant/common/antlib/AntLibFactory.java View File

@@ -52,7 +52,7 @@
* <http://www.apache.org/>. * <http://www.apache.org/>.
*/ */
package org.apache.ant.common.antlib; package org.apache.ant.common.antlib;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;


/** /**
* An Ant Library Factory is a class is used to create instances of the * An Ant Library Factory is a class is used to create instances of the
@@ -68,9 +68,9 @@ public interface AntLibFactory {
* Initialise the factory * Initialise the factory
* *
* @param context the factory's context * @param context the factory's context
* @exception ExecutionException if the factory cannot be initialized
* @exception AntException if the factory cannot be initialized
*/ */
void init(AntContext context) throws ExecutionException;
void init(AntContext context) throws AntException;


/** /**
* Create an instance of the given component class * Create an instance of the given component class
@@ -81,11 +81,11 @@ public interface AntLibFactory {
* @return an instance of the required class * @return an instance of the required class
* @exception InstantiationException if the class cannot be instantiated * @exception InstantiationException if the class cannot be instantiated
* @exception IllegalAccessException if the instance cannot be accessed * @exception IllegalAccessException if the instance cannot be accessed
* @exception ExecutionException if there is a problem creating the task
* @exception AntException if there is a problem creating the task
*/ */
Object createComponent(Class componentClass, String localName) Object createComponent(Class componentClass, String localName)
throws InstantiationException, IllegalAccessException, throws InstantiationException, IllegalAccessException,
ExecutionException;
AntException;


/** /**
* Create an instance of the given class * Create an instance of the given class
@@ -95,12 +95,12 @@ public interface AntLibFactory {
* @return a instance of the required class * @return a instance of the required class
* @exception InstantiationException if the class cannot be instantiated * @exception InstantiationException if the class cannot be instantiated
* @exception IllegalAccessException if the instance cannot be accessed * @exception IllegalAccessException if the instance cannot be accessed
* @exception ExecutionException if there is a problem creating the
* @exception AntException if there is a problem creating the
* converter * converter
*/ */
Object createInstance(Class requiredClass) Object createInstance(Class requiredClass)
throws InstantiationException, IllegalAccessException, throws InstantiationException, IllegalAccessException,
ExecutionException;
AntException;




/** /**
@@ -108,11 +108,11 @@ public interface AntLibFactory {
* create method. * create method.
* *
* @param createdElement the element that the component created * @param createdElement the element that the component created
* @exception ExecutionException if there is a problem registering the
* @exception AntException if there is a problem registering the
* element * element
*/ */
void registerCreatedElement(Object createdElement) void registerCreatedElement(Object createdElement)
throws ExecutionException;
throws AntException;


} }



+ 23
- 23
proposal/mutant/src/java/common/org/apache/ant/common/antlib/Aspect.java View File

@@ -53,73 +53,73 @@
*/ */
package org.apache.ant.common.antlib; package org.apache.ant.common.antlib;


import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;
import org.apache.ant.common.model.BuildElement; import org.apache.ant.common.model.BuildElement;
import org.apache.ant.common.model.AspectValueCollection; import org.apache.ant.common.model.AspectValueCollection;


/** /**
* An aspect is a component which is activated across all task and
* An aspect is a component which is activated across all task and
* component operations. It allows a single implmentation to be applied * component operations. It allows a single implmentation to be applied
* to a number of tasks without requiring changes to the task implementations.
* to a number of tasks without requiring changes to the task implementations.
* *
* @author Conor MacNeill * @author Conor MacNeill
*/ */
public interface Aspect { public interface Aspect {
/** /**
* Initialise the aspect with a context.
* Initialise the aspect with a context.
* *
* @param context the aspect's context * @param context the aspect's context
* @exception ExecutionException if the aspect cannot be initialised
* @exception AntException if the aspect cannot be initialised
*/ */
void init(AntContext context) void init(AntContext context)
throws ExecutionException;
throws AntException;



/** /**
* This join point is activated before a component has been created. * This join point is activated before a component has been created.
* The aspect can return an object to be used rather than the core creating
* the object.
* The aspect can return an object to be used rather than the core creating
* the object.
* *
* @param component the component that has been created. This will be null * @param component the component that has been created. This will be null
* unless another aspect has created the component * unless another aspect has created the component
* @param model the Build model that applies to the component * @param model the Build model that applies to the component
* *
* @return a component to use. * @return a component to use.
* @exception ExecutionException if the aspect cannot process the component.
*/
* @exception AntException if the aspect cannot process the component.
*/
Object preCreateComponent(Object component, BuildElement model) Object preCreateComponent(Object component, BuildElement model)
throws ExecutionException;
throws AntException;


/** /**
* This join point is activated after a component has been created and * This join point is activated after a component has been created and
* configured. If the aspect wishes, an object can be returned in place * configured. If the aspect wishes, an object can be returned in place
* of the one created by Ant.
* of the one created by Ant.
* *
* @param component the component that has been created. * @param component the component that has been created.
* @param model the Build model used to create the component. * @param model the Build model used to create the component.
* *
* @return a component to use * @return a component to use
* @exception ExecutionException if the aspect cannot process the component.
*/
* @exception AntException if the aspect cannot process the component.
*/
Object postCreateComponent(Object component, BuildElement model) Object postCreateComponent(Object component, BuildElement model)
throws ExecutionException;
throws AntException;


/** /**
* This join point is activated just prior to task execution. * This join point is activated just prior to task execution.
* *
* @param task the task being executed. * @param task the task being executed.
* @param aspectValues a collection of aspect attribute values for use
* @param aspectValues a collection of aspect attribute values for use
* during the task execution - may be null if no aspect values are * during the task execution - may be null if no aspect values are
* provided. * provided.
* @return an object which indicates that this aspect wishes to
* @return an object which indicates that this aspect wishes to
* be notified after execution has been completed, in which case the obkect * be notified after execution has been completed, in which case the obkect
* is returned to provide the aspect its context. If this returns null * is returned to provide the aspect its context. If this returns null
* the aspect's postExecuteTask method will not be invoked. * the aspect's postExecuteTask method will not be invoked.
* @exception ExecutionException if the aspect cannot process the task.
* @exception AntException if the aspect cannot process the task.
*/ */
Object preExecuteTask(Task task, AspectValueCollection aspectValues)
throws ExecutionException;
Object preExecuteTask(Task task, AspectValueCollection aspectValues)
throws AntException;
/** /**
* This join point is activated after a task has executed. The aspect * This join point is activated after a task has executed. The aspect
* may override the task's failure cause by returning a new failure. * may override the task's failure cause by returning a new failure.
@@ -143,7 +143,7 @@ public interface Aspect {
String taskOutput(Object context, String line); String taskOutput(Object context, String line);


/** /**
* This point is activated when the task is to receive error content that
* This point is activated when the task is to receive error content that
* has been sent to error stream and redirected into the task. * has been sent to error stream and redirected into the task.
* *
* @param context the context the aspect provided in preExecuteTask. * @param context the context the aspect provided in preExecuteTask.


+ 129
- 0
proposal/mutant/src/java/common/org/apache/ant/common/antlib/AspectException.java View File

@@ -0,0 +1,129 @@
/*
* 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.antlib;

import org.apache.ant.common.util.Location;
import org.apache.ant.common.util.AntException;

/**
* An Aspect Exception is used by Aspects to indicate problems
*
* @author Conor MacNeill
*/
public class AspectException extends AntException {
/**
* Constructs an exception with the given descriptive message.
*
* @param msg Description of or information about the exception.
*/
public AspectException(String msg) {
super(msg);
}

/**
* Constructs an exception with the given descriptive message and a
* location in a file.
*
* @param msg Description of or information about the exception.
* @param location Location in the project file where the error occured.
*/
public AspectException(String msg, Location location) {
super(msg, location);
}

/**
* Constructs an exception with the given message and exception as a
* root cause.
*
* @param msg Description of or information about the exception.
* @param cause Throwable that might have cause this one.
*/
public AspectException(String msg, Throwable cause) {
super(msg, cause);
}

/**
* Constructs an exception with the given message and exception as a
* root cause and a location in a file.
*
* @param msg Description of or information about the exception.
* @param cause Exception that might have cause this one.
* @param location Location in the project file where the error occured.
*/
public AspectException(String msg, Throwable cause,
Location location) {
super(msg, cause, location);
}

/**
* Constructs an exception with the given exception as a root cause.
*
* @param cause Exception that might have caused this one.
*/
public AspectException(Throwable cause) {
super(cause);
}

/**
* Constructs an exception with the given exception as a root cause and
* a location in a file.
*
* @param cause Exception that might have cause this one.
* @param location Location in the project file where the error occured.
*/
public AspectException(Throwable cause, Location location) {
super(cause, location);
}
}


+ 4
- 6
proposal/mutant/src/java/common/org/apache/ant/common/antlib/Converter.java View File

@@ -53,8 +53,6 @@
*/ */
package org.apache.ant.common.antlib; package org.apache.ant.common.antlib;


import org.apache.ant.common.util.ExecutionException;

/** /**
* Convert between a string and a data type * Convert between a string and a data type
* *
@@ -69,9 +67,9 @@ public interface Converter {
* @param value The value to be converted * @param value The value to be converted
* @param type the desired type of the converted object * @param type the desired type of the converted object
* @return the value of the converted object * @return the value of the converted object
* @exception ExecutionException if the conversion cannot be made
* @exception ConverterException if the conversion cannot be made
*/ */
Object convert(String value, Class type) throws ExecutionException;
Object convert(String value, Class type) throws ConverterException;


/** /**
* Initialise the converter. The converter may use the AntContext to * Initialise the converter. The converter may use the AntContext to
@@ -91,12 +89,12 @@ public interface Converter {




/** /**
* This method allows a converter to indicate whether it can create
* This method allows a converter to indicate whether it can create
* the given type which is a sub-type of one of the converter's main * the given type which is a sub-type of one of the converter's main
* types indicated in getTypes. Most converters can return false here. * types indicated in getTypes. Most converters can return false here.
* *
* @param subType the sub-type * @param subType the sub-type
* @return true if this converter can convert a string representation to
* @return true if this converter can convert a string representation to
* the given subclass of one of its main class * the given subclass of one of its main class
*/ */
boolean canConvertSubType(Class subType); boolean canConvertSubType(Class subType);


+ 129
- 0
proposal/mutant/src/java/common/org/apache/ant/common/antlib/ConverterException.java View File

@@ -0,0 +1,129 @@
/*
* 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.antlib;

import org.apache.ant.common.util.Location;
import org.apache.ant.common.util.AntException;

/**
* A Converter Exception indicates a problem converting a value.
*
* @author Conor MacNeill
*/
public class ConverterException extends AntException {
/**
* Constructs an exception with the given descriptive message.
*
* @param msg Description of or information about the exception.
*/
public ConverterException(String msg) {
super(msg);
}

/**
* Constructs an exception with the given descriptive message and a
* location in a file.
*
* @param msg Description of or information about the exception.
* @param location Location in the project file where the error occured.
*/
public ConverterException(String msg, Location location) {
super(msg, location);
}

/**
* Constructs an exception with the given message and exception as a
* root cause.
*
* @param msg Description of or information about the exception.
* @param cause Throwable that might have cause this one.
*/
public ConverterException(String msg, Throwable cause) {
super(msg, cause);
}

/**
* Constructs an exception with the given message and exception as a
* root cause and a location in a file.
*
* @param msg Description of or information about the exception.
* @param cause Exception that might have cause this one.
* @param location Location in the project file where the error occured.
*/
public ConverterException(String msg, Throwable cause,
Location location) {
super(msg, cause, location);
}

/**
* Constructs an exception with the given exception as a root cause.
*
* @param cause Exception that might have caused this one.
*/
public ConverterException(Throwable cause) {
super(cause);
}

/**
* Constructs an exception with the given exception as a root cause and
* a location in a file.
*
* @param cause Exception that might have cause this one.
* @param location Location in the project file where the error occured.
*/
public ConverterException(Throwable cause, Location location) {
super(cause, location);
}
}


+ 5
- 5
proposal/mutant/src/java/common/org/apache/ant/common/antlib/ExecutionComponent.java View File

@@ -52,7 +52,7 @@
* <http://www.apache.org/>. * <http://www.apache.org/>.
*/ */
package org.apache.ant.common.antlib; package org.apache.ant.common.antlib;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;


/** /**
* An execution component is a component from an AntLibrary which is used in * An execution component is a component from an AntLibrary which is used in
@@ -68,20 +68,20 @@ public interface ExecutionComponent {
* *
* @param context the Component's context * @param context the Component's context
* @param componentType the type of the component * @param componentType the type of the component
* @exception ExecutionException if the component cannot be initialised
* @exception AntException if the component cannot be initialised
*/ */
void init(AntContext context, String componentType) void init(AntContext context, String componentType)
throws ExecutionException;
throws AntException;


/** /**
* Validate the component. This is called after the element has been * Validate the component. This is called after the element has been
* configured from its build model. The element may perform validation * configured from its build model. The element may perform validation
* of its configuration * of its configuration
* *
* @exception ExecutionException if the component is not validly
* @exception ValidationException if the component is not validly
* configured * configured
*/ */
void validateComponent() throws ExecutionException;
void validateComponent() throws ValidationException;


/** /**
* Get the AntContext associated with this component * Get the AntContext associated with this component


+ 9
- 9
proposal/mutant/src/java/common/org/apache/ant/common/antlib/StandardLibFactory.java View File

@@ -52,7 +52,7 @@
* <http://www.apache.org/>. * <http://www.apache.org/>.
*/ */
package org.apache.ant.common.antlib; package org.apache.ant.common.antlib;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;


/** /**
* Standard Ant Library Factory * Standard Ant Library Factory
@@ -74,11 +74,11 @@ public class StandardLibFactory implements AntLibFactory {
* @return an instance of the required class * @return an instance of the required class
* @exception InstantiationException if the class cannot be instantiated * @exception InstantiationException if the class cannot be instantiated
* @exception IllegalAccessException if the instance cannot be accessed * @exception IllegalAccessException if the instance cannot be accessed
* @exception ExecutionException if there is a problem creating the task
* @exception AntException if there is a problem creating the task
*/ */
public Object createComponent(Class componentClass, String localName) public Object createComponent(Class componentClass, String localName)
throws InstantiationException, IllegalAccessException, throws InstantiationException, IllegalAccessException,
ExecutionException {
AntException {
return componentClass.newInstance(); return componentClass.newInstance();
} }


@@ -86,9 +86,9 @@ public class StandardLibFactory implements AntLibFactory {
* Initilaise the factory * Initilaise the factory
* *
* @param context the factory's context * @param context the factory's context
* @exception ExecutionException if the factory cannot be initialized
* @exception AntException if the factory cannot be initialized
*/ */
public void init(AntContext context) throws ExecutionException {
public void init(AntContext context) throws AntException {
this.context = context; this.context = context;
} }


@@ -100,12 +100,12 @@ public class StandardLibFactory implements AntLibFactory {
* @return a instance of the required class * @return a instance of the required class
* @exception InstantiationException if the class cannot be instantiated * @exception InstantiationException if the class cannot be instantiated
* @exception IllegalAccessException if the instance cannot be accessed * @exception IllegalAccessException if the instance cannot be accessed
* @exception ExecutionException if there is a problem creating the
* @exception AntException if there is a problem creating the
* converter * converter
*/ */
public Object createInstance(Class requiredClass) public Object createInstance(Class requiredClass)
throws InstantiationException, IllegalAccessException, throws InstantiationException, IllegalAccessException,
ExecutionException {
AntException {
return requiredClass.newInstance(); return requiredClass.newInstance();
} }


@@ -114,11 +114,11 @@ public class StandardLibFactory implements AntLibFactory {
* create method. * create method.
* *
* @param createdElement the element that the component created * @param createdElement the element that the component created
* @exception ExecutionException if there is a problem registering the
* @exception AntException if there is a problem registering the
* element * element
*/ */
public void registerCreatedElement(Object createdElement) public void registerCreatedElement(Object createdElement)
throws ExecutionException {
throws AntException {
// do nothing // do nothing
} }




+ 7
- 7
proposal/mutant/src/java/common/org/apache/ant/common/antlib/Task.java View File

@@ -52,7 +52,7 @@
* <http://www.apache.org/>. * <http://www.apache.org/>.
*/ */
package org.apache.ant.common.antlib; package org.apache.ant.common.antlib;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;


/** /**
* The Task interface defines the methods that a Task must implement. * The Task interface defines the methods that a Task must implement.
@@ -64,9 +64,9 @@ public interface Task extends ExecutionComponent {
/** /**
* Execute the task. * Execute the task.
* *
* @exception ExecutionException if the task has a problem executing.
* @exception AntException if the task has a problem executing.
*/ */
void execute() throws ExecutionException;
void execute() throws AntException;


/** /**
* Sets the taskName of the Task * Sets the taskName of the Task
@@ -89,9 +89,9 @@ public interface Task extends ExecutionComponent {
* directly or indirectly. * directly or indirectly.
* *
* @param line The line of content produce by the task * @param line The line of content produce by the task
* @exception ExecutionException if the output cannot be handled.
* @exception AntException if the output cannot be handled.
*/ */
void handleSystemOut(String line) throws ExecutionException;
void handleSystemOut(String line) throws AntException;


/** /**
* Handle error information produced by the task. When a task prints to * Handle error information produced by the task. When a task prints to
@@ -100,8 +100,8 @@ public interface Task extends ExecutionComponent {
* System.err, directly or indirectly. * System.err, directly or indirectly.
* *
* @param line The line of error info produce by the task * @param line The line of error info produce by the task
* @exception ExecutionException if the output cannot be handled.
* @exception AntException if the output cannot be handled.
*/ */
void handleSystemErr(String line) throws ExecutionException;
void handleSystemErr(String line) throws AntException;
} }



+ 3
- 3
proposal/mutant/src/java/common/org/apache/ant/common/antlib/TaskContainer.java View File

@@ -52,7 +52,7 @@
* <http://www.apache.org/>. * <http://www.apache.org/>.
*/ */
package org.apache.ant.common.antlib; package org.apache.ant.common.antlib;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;


/** /**
* A TaskContainer is an object which can contain and manage ExecutionTasks. * A TaskContainer is an object which can contain and manage ExecutionTasks.
@@ -65,8 +65,8 @@ public interface TaskContainer {
* Add a task to the container. * Add a task to the container.
* *
* @param task the task tobe added * @param task the task tobe added
* @exception ExecutionException if the container cannot add the task
* @exception AntException if the container cannot add the task
*/ */
void addNestedTask(Task task) throws ExecutionException;
void addNestedTask(Task task) throws AntException;
} }



+ 130
- 0
proposal/mutant/src/java/common/org/apache/ant/common/antlib/ValidationException.java View File

@@ -0,0 +1,130 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.ant.common.antlib;

import org.apache.ant.common.util.Location;
import org.apache.ant.common.util.AntException;

/**
* A validation exception is thrown by tasks when they are not configured
* correctly
*
* @author Conor MacNeill
*/
public class ValidationException extends AntException {
/**
* Constructs an exception with the given descriptive message.
*
* @param msg Description of or information about the exception.
*/
public ValidationException(String msg) {
super(msg);
}

/**
* Constructs an exception with the given descriptive message and a
* location in a file.
*
* @param msg Description of or information about the exception.
* @param location Location in the project file where the error occured.
*/
public ValidationException(String msg, Location location) {
super(msg, location);
}

/**
* Constructs an exception with the given message and exception as a
* root cause.
*
* @param msg Description of or information about the exception.
* @param cause Throwable that might have cause this one.
*/
public ValidationException(String msg, Throwable cause) {
super(msg, cause);
}

/**
* Constructs an exception with the given message and exception as a
* root cause and a location in a file.
*
* @param msg Description of or information about the exception.
* @param cause Exception that might have cause this one.
* @param location Location in the project file where the error occured.
*/
public ValidationException(String msg, Throwable cause,
Location location) {
super(msg, cause, location);
}

/**
* Constructs an exception with the given exception as a root cause.
*
* @param cause Exception that might have caused this one.
*/
public ValidationException(Throwable cause) {
super(cause);
}

/**
* Constructs an exception with the given exception as a root cause and
* a location in a file.
*
* @param cause Exception that might have cause this one.
* @param location Location in the project file where the error occured.
*/
public ValidationException(Throwable cause, Location location) {
super(cause, location);
}
}


proposal/mutant/src/java/frontend/org/apache/ant/cli/BuildLogger.java → proposal/mutant/src/java/common/org/apache/ant/common/logger/BuildLogger.java View File

@@ -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.cli;
package org.apache.ant.common.logger;


import java.io.PrintStream; import java.io.PrintStream;
import org.apache.ant.common.event.BuildListener; import org.apache.ant.common.event.BuildListener;

proposal/mutant/src/java/frontend/org/apache/ant/cli/DefaultLogger.java → proposal/mutant/src/java/common/org/apache/ant/common/logger/DefaultLogger.java View File

@@ -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.cli;
package org.apache.ant.common.logger;


import java.io.PrintStream; import java.io.PrintStream;
import org.apache.ant.common.antlib.ExecutionComponent; import org.apache.ant.common.antlib.ExecutionComponent;

+ 63
- 0
proposal/mutant/src/java/common/org/apache/ant/common/service/BuildKey.java View File

@@ -0,0 +1,63 @@
/*
* 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.service;

/**
* Opaque key used to refer to builds setup in the core.
*
* @author Conor MacNeill
*/
public interface BuildKey {
}


+ 24
- 26
proposal/mutant/src/java/common/org/apache/ant/common/service/ComponentService.java View File

@@ -55,7 +55,7 @@ package org.apache.ant.common.service;
import java.net.URL; import java.net.URL;
import java.util.Map; import java.util.Map;
import org.apache.ant.common.antlib.AntLibFactory; import org.apache.ant.common.antlib.AntLibFactory;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;




/** /**
@@ -79,13 +79,11 @@ public interface ComponentService {
* @param libLocation the location of the library or the libraries * @param libLocation the location of the library or the libraries
* @param importAll true if all components of the loaded libraries * @param importAll true if all components of the loaded libraries
* should be imported * should be imported
* @param autoImport true if libraries in the Ant namespace should be
* automatically imported.
* @exception ExecutionException if the library or libraries cannot be
* @exception AntException if the library or libraries cannot be
* imported. * imported.
*/ */
void loadLib(String libLocation, boolean importAll, boolean autoImport)
throws ExecutionException;
void loadLib(URL libLocation, boolean importAll)
throws AntException;


/** /**
* Add a library path to the given library. The library path is used in * Add a library path to the given library. The library path is used in
@@ -94,9 +92,9 @@ public interface ComponentService {
* @param libraryId the library's unique identifier * @param libraryId the library's unique identifier
* @param libPath the path to be added to the list of paths used by the * @param libPath the path to be added to the list of paths used by the
* library. * library.
* @exception ExecutionException if the path cannot be used.
* @exception AntException if the path cannot be used.
*/ */
void addLibPath(String libraryId, URL libPath) throws ExecutionException;
void addLibPath(String libraryId, URL libPath) throws AntException;


/** /**
* Define a new type * Define a new type
@@ -106,11 +104,11 @@ public interface ComponentService {
* instances * instances
* @param loader the class loader to use to create the particular types * @param loader the class loader to use to create the particular types
* @param className the name of the class implementing the type * @param className the name of the class implementing the type
* @exception ExecutionException if the type cannot be defined
* @exception AntException if the type cannot be defined
*/ */
void typedef(AntLibFactory factory, ClassLoader loader, void typedef(AntLibFactory factory, ClassLoader loader,
String typeName, String className) String typeName, String className)
throws ExecutionException;
throws AntException;


/** /**
* Experimental - define a new task * Experimental - define a new task
@@ -120,11 +118,11 @@ public interface ComponentService {
* instances * instances
* @param loader the class loader to use to create the particular tasks * @param loader the class loader to use to create the particular tasks
* @param className the name of the class implementing the task * @param className the name of the class implementing the task
* @exception ExecutionException if the task cannot be defined
* @exception AntException if the task cannot be defined
*/ */
void taskdef(AntLibFactory factory, ClassLoader loader, void taskdef(AntLibFactory factory, ClassLoader loader,
String taskName, String className) String taskName, String className)
throws ExecutionException;
throws AntException;




/** /**
@@ -137,18 +135,18 @@ public interface ComponentService {
* @param alias the name under which this component will be used in the * @param alias the name under which this component will be used in the
* build scripts. If this is null, the components default name is * build scripts. If this is null, the components default name is
* used. * used.
* @exception ExecutionException if the component cannot be imported
* @exception AntException if the component cannot be imported
*/ */
void importComponent(String libraryId, String defName, void importComponent(String libraryId, String defName,
String alias) throws ExecutionException;
String alias) throws AntException;


/** /**
* Import a complete library into the current execution frame * Import a complete library into the current execution frame
* *
* @param libraryId The id of the library to be imported * @param libraryId The id of the library to be imported
* @exception ExecutionException if the library cannot be imported
* @exception AntException if the library cannot be imported
*/ */
void importLibrary(String libraryId) throws ExecutionException;
void importLibrary(String libraryId) throws AntException;


/** /**
* Imports a component defined in another frame. * Imports a component defined in another frame.
@@ -158,10 +156,10 @@ public interface ComponentService {
* @param alias the name under which this component will be used in the * @param alias the name under which this component will be used in the
* build scripts. If this is null, the components default name is * build scripts. If this is null, the components default name is
* used. * used.
* @exception ExecutionException if the component cannot be imported
* @exception AntException if the component cannot be imported
*/ */
void importFrameComponent(String relativeName, String alias) void importFrameComponent(String relativeName, String alias)
throws ExecutionException;
throws AntException;


/** /**
* Create a component. The component will have a context but will not be * Create a component. The component will have a context but will not be
@@ -171,12 +169,12 @@ public interface ComponentService {
* @param componentName the name of the component * @param componentName the name of the component
* @return the created component. The return type of this method depends * @return the created component. The return type of this method depends
* on the component type. * on the component type.
* @exception ExecutionException if the component cannot be created
* @exception AntException if the component cannot be created
*/ */
Object createComponent(String componentName) throws ExecutionException;
Object createComponent(String componentName) throws AntException;


/** /**
* Create a component given its libraryId and local name within the
* Create a component given its libraryId and local name within the
* library. This method is unambiguous in the face of imports, aliases and * library. This method is unambiguous in the face of imports, aliases and
* taskdefs performed in the build. * taskdefs performed in the build.
* *
@@ -184,11 +182,11 @@ public interface ComponentService {
* @param localName the name component within the library. * @param localName the name component within the library.
* @return the created component. The return type of this method depends * @return the created component. The return type of this method depends
* on the component type. * on the component type.
* @exception ExecutionException if the component cannot be created
* @exception AntException if the component cannot be created
*/ */
Object createComponent(String libraryId, String localName) Object createComponent(String libraryId, String localName)
throws ExecutionException;
throws AntException;
/** /**
* configure an object with attribtes from the given map * configure an object with attribtes from the given map
* *
@@ -196,11 +194,11 @@ public interface ComponentService {
* @param attributeValues a map containing named attribute values. * @param attributeValues a map containing named attribute values.
* @param ignoreUnsupported if this is true, attribute names for which no * @param ignoreUnsupported if this is true, attribute names for which no
* setter method exists are ignored. * setter method exists are ignored.
* @exception ExecutionException if the object does not support an
* @exception AntException if the object does not support an
* attribute in the map. * attribute in the map.
*/ */
void configureAttributes(Object object, Map attributeValues, void configureAttributes(Object object, Map attributeValues,
boolean ignoreUnsupported) boolean ignoreUnsupported)
throws ExecutionException;
throws AntException;
} }



+ 13
- 13
proposal/mutant/src/java/common/org/apache/ant/common/service/DataService.java View File

@@ -54,7 +54,7 @@
package org.apache.ant.common.service; package org.apache.ant.common.service;
import java.util.Map; import java.util.Map;


import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;


/** /**
* Service interface for Data value manipulation operations provided by the * Service interface for Data value manipulation operations provided by the
@@ -70,9 +70,9 @@ public interface DataService {
* @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 * @return the current object associated with the name or null if no
* value is currently associated with the name * value is currently associated with the name
* @exception ExecutionException if the value cannot be retrieved.
* @exception AntException if the value cannot be retrieved.
*/ */
Object getDataValue(String valueName) throws ExecutionException;
Object getDataValue(String valueName) throws AntException;


/** /**
* Indicate if a data value has been set * Indicate if a data value has been set
@@ -80,10 +80,10 @@ 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 ExecutionException if the containing frame for the value
* @exception AntException if the containing frame for the value
* does not exist * does not exist
*/ */
boolean isDataValueSet(String name) throws ExecutionException;
boolean isDataValueSet(String name) throws AntException;


/** /**
* Set a data value. If an existing data value exists, associated with * Set a data value. If an existing data value exists, associated with
@@ -91,19 +91,19 @@ public interface DataService {
* *
* @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
* @exception ExecutionException if the value cannot be set
* @exception AntException if the value cannot be set
*/ */
void setDataValue(String valueName, Object value) throws ExecutionException;
void setDataValue(String valueName, Object value) throws AntException;


/** /**
* Set a data value which can be overwritten * Set a data value which can be overwritten
* *
* @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
* @exception ExecutionException if the value cannot be set
* @exception AntException if the value cannot be set
*/ */
void setMutableDataValue(String valueName, Object value) void setMutableDataValue(String valueName, Object value)
throws ExecutionException;
throws AntException;


/** /**
* Replace ${} style constructions in the given value with the string * Replace ${} style constructions in the given value with the string
@@ -111,9 +111,9 @@ public interface DataService {
* *
* @param value the string to be scanned for property references. * @param value the string to be scanned for property references.
* @return the string with all property references replaced * @return the string with all property references replaced
* @exception ExecutionException if any of the properties do not exist
* @exception AntException if any of the properties do not exist
*/ */
String replacePropertyRefs(String value) throws ExecutionException;
String replacePropertyRefs(String value) throws AntException;


/** /**
* Replace ${} style constructions in the given value with the string * Replace ${} style constructions in the given value with the string
@@ -123,10 +123,10 @@ public interface DataService {
* @param value the string to be scanned for property references. * @param value the string to be scanned for property references.
* @param replacementValues the collection of replacement values * @param replacementValues the collection of replacement values
* @return the string with all property references replaced * @return the string with all property references replaced
* @exception ExecutionException if any of the properties do not exist
* @exception AntException if any of the properties do not exist
*/ */
String replacePropertyRefs(String value, Map replacementValues) String replacePropertyRefs(String value, Map replacementValues)
throws ExecutionException;
throws AntException;


/** /**
* Get all the properties from the frame and any references frames. This * Get all the properties from the frame and any references frames. This


+ 5
- 5
proposal/mutant/src/java/common/org/apache/ant/common/service/EventService.java View File

@@ -53,7 +53,7 @@
*/ */
package org.apache.ant.common.service; package org.apache.ant.common.service;
import org.apache.ant.common.event.BuildListener; import org.apache.ant.common.event.BuildListener;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;


/** /**
* Core service to manage receiving of events by components within Ant. * Core service to manage receiving of events by components within Ant.
@@ -66,16 +66,16 @@ public interface EventService {
* Add a build listener to the current frame * Add a build listener to the current frame
* *
* @param listener the lister which will receive build events * @param listener the lister which will receive build events
* @exception ExecutionException if the listener cannot be added
* @exception AntException if the listener cannot be added
*/ */
void addBuildListener(BuildListener listener) throws ExecutionException;
void addBuildListener(BuildListener listener) throws AntException;


/** /**
* Remove a listener from the current frame * Remove a listener from the current frame
* *
* @param listener the listener to be removed * @param listener the listener to be removed
* @exception ExecutionException if the listener could not be removed
* @exception AntException if the listener could not be removed
*/ */
void removeBuildListener(BuildListener listener) throws ExecutionException;
void removeBuildListener(BuildListener listener) throws AntException;
} }



+ 72
- 25
proposal/mutant/src/java/common/org/apache/ant/common/service/ExecService.java View File

@@ -57,8 +57,9 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import org.apache.ant.common.antlib.Task; import org.apache.ant.common.antlib.Task;
import org.apache.ant.common.model.Project; import org.apache.ant.common.model.Project;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;
import org.apache.ant.common.model.AspectValueCollection; import org.apache.ant.common.model.AspectValueCollection;
import org.apache.ant.common.event.BuildListener;


/** /**
* The ExecService provides executiuon services to tasks * The ExecService provides executiuon services to tasks
@@ -72,9 +73,9 @@ public interface ExecService {
* *
* @param xmlBuildFile The file containing the XML build description. * @param xmlBuildFile The file containing the XML build description.
* @return A Project model for the build. * @return A Project model for the build.
* @exception ExecutionException if the build cannot be parsed
* @exception AntException if the build cannot be parsed
*/ */
Project parseXMLBuildFile(File xmlBuildFile) throws ExecutionException;
Project parseXMLBuildFile(File xmlBuildFile) throws AntException;




/** /**
@@ -84,10 +85,10 @@ public interface ExecService {
* referenced. * referenced.
* @param model the project model. * @param model the project model.
* @param initialData the project's initial data load. * @param initialData the project's initial data load.
* @exception ExecutionException if the project cannot be referenced.
* @exception AntException if the project cannot be referenced.
*/ */
void createProjectReference(String referenceName, Project model,
Map initialData) throws ExecutionException;
void createProjectReference(String referenceName, Project model,
Map initialData) throws AntException;




/** /**
@@ -95,22 +96,49 @@ public interface ExecService {
* *
* @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 properties the initiali properties to be used in the build
* @param addListeners true if the current frame's listeners should be
* 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 ExecutionException if the subbuild cannot be setup
* @exception AntException if the subbuild cannot be setup
*/ */
Object setupBuild(Project model, Map properties)
throws ExecutionException;
BuildKey setupBuild(Project model, Map properties, boolean addListeners)
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 properties the initiali properties to be used in the build
* @param addListeners true if the current frame's listeners should be
* 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 ExecutionException if the subbuild cannot be setup
* @exception AntException if the subbuild cannot be setup
*/ */
Object setupBuild(Map properties)
throws ExecutionException;
BuildKey setupBuild(Map properties, boolean addListeners)
throws AntException;


/**
* Force initialisation of a particular ant library in the context of the
* given subbuild.
*
* @param key the build key.
* @param libraryId the id of the library to be initialized.
* @exception AntException if the build cannot be run
*/
void initializeBuildLibrary(BuildKey key, String libraryId)
throws AntException;

/**
* Add a listener to a subbuild
*
* @param key the key identifying the build previously setup
* @param listener the listener to add to the build.
*
* @exception AntException if the build cannot be found.
*/
public void addBuildListener(BuildKey key, BuildListener listener)
throws AntException;




/** /**
@@ -119,36 +147,46 @@ public interface ExecService {
* @param buildKey the buildKey returned previously when the build was * @param buildKey the buildKey returned previously when the build was
* setup * setup
* @param targets A list of targets to be run * @param targets A list of targets to be run
* @exception ExecutionException if the build cannot be run
* @exception AntException if the build cannot be run
*/ */
void runBuild(Object buildKey, List targets) throws ExecutionException;
void runBuild(BuildKey buildKey, List targets)
throws AntException;




/**
* Release a subbuild that is no longer in use.
*
* @param key the BuildKey identifiying the subbuild.
*
* @exception AntException if the build was not registered.
*/
void releaseBuild(BuildKey key) throws AntException;

/** /**
* execute a task. The task should have already been initialised by the * execute a task. The task should have already been initialised by the
* core * core
* *
* @param task the task to be executed. * @param task the task to be executed.
* @exception ExecutionException if there is a problem in execution.
* @exception AntException if there is a problem in execution.
*/ */
void executeTask(Task task) throws ExecutionException;
void executeTask(Task task) throws AntException;




/** /**
* Execute a task with a set of aspect values. Normally aspect values come
* Execute a task with a set of aspect values. Normally aspect values come
* from a build model but not all tasks will be created from a build model. * from a build model but not all tasks will be created from a build model.
* Some may be created dynamically and configured programatically. This
* Some may be created dynamically and configured programatically. This
* method allows aspect values to provided for execution of such tasks since * method allows aspect values to provided for execution of such tasks since
* by their nature, aspect values are not part of the task configuration. * by their nature, aspect values are not part of the task configuration.
* *
* @param task the task to be executed * @param task the task to be executed
* @param aspectValues the aspect attribute values. * @param aspectValues the aspect attribute values.
* @exception ExecutionException if there is an execution problem
* @exception AntException if there is an execution problem
*/ */
void executeTask(Task task, AspectValueCollection aspectValues)
throws ExecutionException;
void executeTask(Task task, AspectValueCollection aspectValues)
throws AntException;
/** /**
* get the name of the project associated with this execution. * get the name of the project associated with this execution.
* *
@@ -164,6 +202,15 @@ public interface ExecService {
*/ */
File getBaseDir(); File getBaseDir();


/**
* Set the basedir for the current execution
*
* @param baseDir the new base directory for this execution of Ant
* @exception AntException if the base directory cannot be set to the given
* value.
*/
void setBaseDir(File baseDir) throws AntException ;



/** /**
* Handle subbuild output. * Handle subbuild output.
@@ -171,9 +218,9 @@ public interface ExecService {
* @param subbuildKey the core's key for managing the subbuild. * @param subbuildKey the core's key for managing the subbuild.
* @param line the content produce by the current thread. * @param line the content produce by the current thread.
* @param isErr true if this content is from the thread's error stream. * @param isErr true if this content is from the thread's error stream.
* @exception ExecutionException if the subbuild cannot be found.
* @exception AntException if the subbuild cannot be found.
*/ */
void handleBuildOutput(Object subbuildKey, String line, boolean isErr) void handleBuildOutput(Object subbuildKey, String line, boolean isErr)
throws ExecutionException;
throws AntException;
} }



+ 3
- 3
proposal/mutant/src/java/common/org/apache/ant/common/service/FileService.java View File

@@ -54,7 +54,7 @@
package org.apache.ant.common.service; package org.apache.ant.common.service;


import java.io.File; import java.io.File;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;


/** /**
* Service interface for File manipulation operations provided by the Ant * Service interface for File manipulation operations provided by the Ant
@@ -70,8 +70,8 @@ public interface FileService {
* *
* @param fileName the file name to be resolved. * @param fileName the file name to be resolved.
* @return the file resolved to the project's base dir * @return the file resolved to the project's base dir
* @exception ExecutionException if the file cannot be resolved
* @exception AntException if the file cannot be resolved
*/ */
File resolveFile(String fileName) throws ExecutionException;
File resolveFile(String fileName) throws AntException;
} }



+ 3
- 3
proposal/mutant/src/java/common/org/apache/ant/common/service/InputService.java View File

@@ -54,7 +54,7 @@
package org.apache.ant.common.service; package org.apache.ant.common.service;


import org.apache.ant.common.input.InputRequest; import org.apache.ant.common.input.InputRequest;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;


/** /**
* Service interface for input management * Service interface for input management
@@ -67,8 +67,8 @@ public interface InputService {
* Handle an input request * Handle an input request
* *
* @param request an input request * @param request an input request
* @exception ExecutionException if the request cannot be handled
* @exception AntException if the request cannot be handled
*/ */
void handleInput(InputRequest request) throws ExecutionException;
void handleInput(InputRequest request) throws AntException;
} }



+ 12
- 0
proposal/mutant/src/java/common/org/apache/ant/common/service/MagicProperties.java View File

@@ -68,5 +68,17 @@ public class MagicProperties {


/** This property provides the location of Ant's home directory */ /** This property provides the location of Ant's home directory */
public static final String ANT_HOME = "ant.home"; public static final String ANT_HOME = "ant.home";
/** The file containing the current project model, if any */
public static final String ANT_FILE = "ant.file";

/** The name of the project */
public static final String ANT_PROJECT_NAME = "ant.project.name";
/** The version of Ant */
public static final String ANT_VERSION = "ant.version";
/** The version of java detected by Ant. */
public static final String ANT_JAVA_VERSION = "ant.java.version";
} }



+ 8
- 8
proposal/mutant/src/java/common/org/apache/ant/common/util/FileUtils.java View File

@@ -90,16 +90,16 @@ public class FileUtils {
* @param file the "reference" file for relative paths. This instance * @param file the "reference" file for relative paths. This instance
* must be an absolute file and must not contain &quot;./&quot; or * must be an absolute file and must not contain &quot;./&quot; or
* &quot;../&quot; sequences (same for \ instead of /). If it is * &quot;../&quot; sequences (same for \ instead of /). If it is
* null, this call is equivalent to
* null, this call is equivalent to
* <code>new java.io.File(filename)</code>. * <code>new java.io.File(filename)</code>.
* @param filename the filename to be resolved * @param filename the filename to be resolved
* @return an absolute file that doesn't contain &quot;./&quot; or * @return an absolute file that doesn't contain &quot;./&quot; or
* &quot;../&quot; sequences and uses the correct separator for the * &quot;../&quot; sequences and uses the correct separator for the
* current platform. * current platform.
* @exception ExecutionException if the file cannot be resolved
* @exception GeneralException if the file cannot be resolved
*/ */
public File resolveFile(File file, String filename) public File resolveFile(File file, String filename)
throws ExecutionException {
throws GeneralException {
String platformFilename = filename.replace('/', File.separatorChar) String platformFilename = filename.replace('/', File.separatorChar)
.replace('\\', File.separatorChar); .replace('\\', File.separatorChar);


@@ -126,7 +126,7 @@ public class FileUtils {
String msg = "The file or path you specified (" String msg = "The file or path you specified ("
+ filename + ") is invalid relative to " + filename + ") is invalid relative to "
+ file.getPath(); + file.getPath();
throw new ExecutionException(msg);
throw new GeneralException(msg);
} }
} else if (part.equals(".")) { } else if (part.equals(".")) {
// Do nothing here // Do nothing here
@@ -153,11 +153,11 @@ public class FileUtils {
* *
* @param path the path to be normalized * @param path the path to be normalized
* @return the normalized path * @return the normalized path
* @exception ExecutionException if there is a problem with the path
* @exception GeneralException if there is a problem with the path
* @throws NullPointerException if the file path is equal to null. * @throws NullPointerException if the file path is equal to null.
*/ */
public File normalize(String path) public File normalize(String path)
throws NullPointerException, ExecutionException {
throws NullPointerException, GeneralException {


String platformPath = path.replace('/', File.separatorChar) String platformPath = path.replace('/', File.separatorChar)
.replace('\\', File.separatorChar); .replace('\\', File.separatorChar);
@@ -168,7 +168,7 @@ public class FileUtils {
Character.isLetter(platformPath.charAt(0)) && Character.isLetter(platformPath.charAt(0)) &&
platformPath.charAt(1) == ':')) { platformPath.charAt(1) == ':')) {
String msg = path + " is not an absolute path"; String msg = path + " is not an absolute path";
throw new ExecutionException(msg);
throw new GeneralException(msg);
} }


boolean dosWithDrive = false; boolean dosWithDrive = false;
@@ -223,7 +223,7 @@ public class FileUtils {
continue; continue;
} else if ("..".equals(thisToken)) { } else if ("..".equals(thisToken)) {
if (s.size() < 2) { if (s.size() < 2) {
throw new ExecutionException("Cannot resolve path "
throw new GeneralException("Cannot resolve path "
+ path); + path);
} else { } else {
s.pop(); s.pop();


proposal/mutant/src/java/common/org/apache/ant/common/util/ExecutionException.java → proposal/mutant/src/java/common/org/apache/ant/common/util/GeneralException.java View File

@@ -54,23 +54,20 @@
package org.apache.ant.common.util; package org.apache.ant.common.util;


/** /**
* An ExecutionException indicates a problem while executing tasks in a
* build
* A General Ant exception. This exception is usually thrown by utility classes.
* *
* @author Conor MacNeill * @author Conor MacNeill
* @created 20 January 2002
*/ */
public class ExecutionException extends AntException {
public class GeneralException extends AntException {
/** /**
* Constructs an exception with the given descriptive message. * Constructs an exception with the given descriptive message.
* *
* @param msg Description of or information about the exception. * @param msg Description of or information about the exception.
*/ */
public ExecutionException(String msg) {
public GeneralException(String msg) {
super(msg); super(msg);
} }



/** /**
* Constructs an exception with the given descriptive message and a * Constructs an exception with the given descriptive message and a
* location in a file. * location in a file.
@@ -78,11 +75,10 @@ public class ExecutionException extends AntException {
* @param msg Description of or information about the exception. * @param msg Description of or information about the exception.
* @param location Location in the project file where the error occured. * @param location Location in the project file where the error occured.
*/ */
public ExecutionException(String msg, Location location) {
public GeneralException(String msg, Location location) {
super(msg, location); super(msg, location);
} }



/** /**
* Constructs an exception with the given message and exception as a * Constructs an exception with the given message and exception as a
* root cause. * root cause.
@@ -90,11 +86,10 @@ public class ExecutionException extends AntException {
* @param msg Description of or information about the exception. * @param msg Description of or information about the exception.
* @param cause Throwable that might have cause this one. * @param cause Throwable that might have cause this one.
*/ */
public ExecutionException(String msg, Throwable cause) {
public GeneralException(String msg, Throwable cause) {
super(msg, cause); super(msg, cause);
} }



/** /**
* Constructs an exception with the given message and exception as a * Constructs an exception with the given message and exception as a
* root cause and a location in a file. * root cause and a location in a file.
@@ -103,21 +98,20 @@ public class ExecutionException extends AntException {
* @param cause Exception that might have cause this one. * @param cause Exception that might have cause this one.
* @param location Location in the project file where the error occured. * @param location Location in the project file where the error occured.
*/ */
public ExecutionException(String msg, Throwable cause, Location location) {
public GeneralException(String msg, Throwable cause,
Location location) {
super(msg, cause, location); super(msg, cause, location);
} }



/** /**
* Constructs an exception with the given exception as a root cause. * Constructs an exception with the given exception as a root cause.
* *
* @param cause Exception that might have caused this one. * @param cause Exception that might have caused this one.
*/ */
public ExecutionException(Throwable cause) {
public GeneralException(Throwable cause) {
super(cause); super(cause);
} }



/** /**
* Constructs an exception with the given exception as a root cause and * Constructs an exception with the given exception as a root cause and
* a location in a file. * a location in a file.
@@ -125,9 +119,8 @@ public class ExecutionException extends AntException {
* @param cause Exception that might have cause this one. * @param cause Exception that might have cause this one.
* @param location Location in the project file where the error occured. * @param location Location in the project file where the error occured.
*/ */
public ExecutionException(Throwable cause, Location location) {
public GeneralException(Throwable cause, Location location) {
super(cause, location); super(cause, location);
} }

} }



+ 3
- 3
proposal/mutant/src/java/common/org/apache/ant/common/util/PropertyUtils.java View File

@@ -72,12 +72,12 @@ public class PropertyUtils {
* @param value the string to be parsed * @param value the string to be parsed
* @param fragments the fragments parsed out of the string * @param fragments the fragments parsed out of the string
* @param propertyRefs the property refs to be replaced * @param propertyRefs the property refs to be replaced
* @exception ExecutionException if there is a problem parsing out the
* @exception GeneralException if there is a problem parsing out the
* values * values
*/ */
public static void parsePropertyString(String value, List fragments, public static void parsePropertyString(String value, List fragments,
List propertyRefs) List propertyRefs)
throws ExecutionException {
throws GeneralException {
int prev = 0; int prev = 0;
int pos; int pos;
while ((pos = value.indexOf("$", prev)) >= 0) { while ((pos = value.indexOf("$", prev)) >= 0) {
@@ -94,7 +94,7 @@ public class PropertyUtils {
} else { } else {
int endName = value.indexOf('}', pos); int endName = value.indexOf('}', pos);
if (endName < 0) { if (endName < 0) {
throw new ExecutionException("Syntax error in property: "
throw new GeneralException("Syntax error in property: "
+ value); + value);
} }
String propertyName = value.substring(pos + 2, endName); String propertyName = value.substring(pos + 2, endName);


+ 48
- 43
proposal/mutant/src/java/frontend/org/apache/ant/cli/Commandline.java View File

@@ -65,18 +65,20 @@ import java.util.Iterator;
import java.util.List; 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.ExecutionManager;
import org.apache.ant.antcore.execution.Frame;
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.model.Project; import org.apache.ant.common.model.Project;
import org.apache.ant.common.util.ConfigException;
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.InitConfig; import org.apache.ant.init.InitConfig;
import org.apache.ant.init.InitUtils; import org.apache.ant.init.InitUtils;
import org.apache.ant.frontend.FrontendUtils; 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.
@@ -141,34 +143,34 @@ public class Commandline {
* Adds a feature to the BuildListeners attribute of the Commandline * Adds a feature to the BuildListeners attribute of the Commandline
* object * object
* *
* @param execManager The feature to be added to the BuildListeners
* attribute
* @exception ConfigException if the necessary listener instances could
* @param eventSource the build event source to which listeners
* will be added.
* @exception FrontendException if the necessary listener instances could
* not be created * not be created
*/ */
protected void addBuildListeners(ExecutionManager execManager)
throws ConfigException {
protected void addBuildListeners(Frame eventSource)
throws FrontendException {


// Add the default listener // Add the default listener
execManager.addBuildListener(logger);
eventSource.addBuildListener(logger);


for (Iterator i = listeners.iterator(); i.hasNext();) { for (Iterator i = listeners.iterator(); i.hasNext();) {
String className = (String) i.next(); String className = (String) i.next();
try { try {
BuildListener listener = BuildListener listener =
(BuildListener) Class.forName(className).newInstance(); (BuildListener) Class.forName(className).newInstance();
execManager.addBuildListener(listener);
eventSource.addBuildListener(listener);
} catch (ClassCastException e) { } catch (ClassCastException e) {
System.err.println("The specified listener class " System.err.println("The specified listener class "
+ className + + className +
" does not implement the Listener interface"); " does not implement the Listener interface");
throw new ConfigException("Unable to instantiate listener "
throw new FrontendException("Unable to instantiate listener "
+ className, e); + className, e);
} catch (Exception e) { } catch (Exception e) {
System.err.println("Unable to instantiate specified listener " System.err.println("Unable to instantiate specified listener "
+ "class " + className + " : " + "class " + className + " : "
+ e.getClass().getName()); + e.getClass().getName());
throw new ConfigException("Unable to instantiate listener "
throw new FrontendException("Unable to instantiate listener "
+ className, e); + className, e);
} }
} }
@@ -182,15 +184,15 @@ public class Commandline {
* be * be
* @param argType the option type * @param argType the option type
* @return the value of the option * @return the value of the option
* @exception ConfigException if the option cannot be read
* @exception FrontendException if the option cannot be read
*/ */
private String getOption(String[] args, int position, String argType) private String getOption(String[] args, int position, String argType)
throws ConfigException {
throws FrontendException {
String value = null; String value = null;
try { try {
value = args[position]; value = args[position];
} catch (IndexOutOfBoundsException e) { } catch (IndexOutOfBoundsException e) {
throw new ConfigException("You must specify a value for the "
throw new FrontendException("You must specify a value for the "
+ argType + " argument"); + argType + " argument");
} }
return value; return value;
@@ -205,7 +207,7 @@ public class Commandline {
*/ */
private void process(String[] args, InitConfig initConfig) { private void process(String[] args, InitConfig initConfig) {
this.initConfig = initConfig; this.initConfig = initConfig;
ExecutionManager executionManager = null;
Frame mainFrame = null;
Project project = null; Project project = null;
try { try {
parseArguments(args); parseArguments(args);
@@ -213,7 +215,7 @@ public class Commandline {
determineBuildFile(); determineBuildFile();


AntConfig config = new AntConfig(); AntConfig config = new AntConfig();
AntConfig userConfig =
AntConfig userConfig =
FrontendUtils.getAntConfig(initConfig.getUserConfigArea()); FrontendUtils.getAntConfig(initConfig.getUserConfigArea());
AntConfig systemConfig AntConfig systemConfig
= FrontendUtils.getAntConfig(initConfig.getSystemConfigArea()); = FrontendUtils.getAntConfig(initConfig.getSystemConfigArea());
@@ -227,28 +229,28 @@ 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") if (!buildFileURL.getProtocol().equals("file")
&& !config.isRemoteProjectAllowed()) { && !config.isRemoteProjectAllowed()) {
throw new ConfigException("Remote Projects are not allowed: "
throw new FrontendException("Remote Projects are not allowed: "
+ buildFileURL); + buildFileURL);
} }


project = parseProject(); project = parseProject();


// create the execution manager to execute the build // create the execution manager to execute the build
executionManager = new ExecutionManager(initConfig, config);
mainFrame = new Frame(initConfig, config);
OutputStream demuxOut OutputStream demuxOut
= new DemuxOutputStream(executionManager, false);
= new DemuxOutputStream(mainFrame, false);
OutputStream demuxErr OutputStream demuxErr
= new DemuxOutputStream(executionManager, 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(executionManager);
addBuildListeners(mainFrame);
} catch (Throwable e) { } catch (Throwable e) {
if (logger != null) { if (logger != null) {
BuildEvent finishedEvent BuildEvent finishedEvent
@@ -261,7 +263,10 @@ public class Commandline {
} }


try { try {
executionManager.runBuild(project, targets, definedProperties);
mainFrame.setProject(project);
mainFrame.initialize(definedProperties);

mainFrame.startBuild(targets);
System.exit(0); System.exit(0);
} catch (Throwable t) { } catch (Throwable t) {
System.exit(1); System.exit(1);
@@ -285,9 +290,9 @@ public class Commandline {
* Handle build file argument * Handle build file argument
* *
* @param url the build file's URL * @param url the build file's URL
* @exception ConfigException if the build file location is not valid
* @exception FrontendException if the build file location is not valid
*/ */
private void argBuildFile(String url) throws ConfigException {
private void argBuildFile(String url) throws FrontendException {
try { try {
if (url.indexOf(":") == -1) { if (url.indexOf(":") == -1) {
// We convert any hash characters to their URL escape. // We convert any hash characters to their URL escape.
@@ -296,7 +301,7 @@ public class Commandline {
buildFileURL = new URL(url); buildFileURL = new URL(url);
} }
} catch (MalformedURLException e) { } catch (MalformedURLException e) {
throw new ConfigException("Build file is not valid", e);
throw new FrontendException("Build file is not valid", e);
} }
} }


@@ -304,15 +309,15 @@ public class Commandline {
* Handle the log file option * Handle the log file option
* *
* @param arg the value of the log file option * @param arg the value of the log file option
* @exception ConfigException if the log file is not writeable
* @exception FrontendException if the log file is not writeable
*/ */
private void argLogFile(String arg) throws ConfigException {
private void argLogFile(String arg) throws FrontendException {
try { try {
File logFile = new File(arg); File logFile = new File(arg);
out = new PrintStream(new FileOutputStream(logFile)); out = new PrintStream(new FileOutputStream(logFile));
err = out; err = out;
} catch (IOException ioe) { } catch (IOException ioe) {
throw new ConfigException("Cannot write on the specified log " +
throw new FrontendException("Cannot write on the specified log " +
"file. Make sure the path exists and " + "file. Make sure the path exists and " +
"you have write permissions.", ioe); "you have write permissions.", ioe);
} }
@@ -322,11 +327,11 @@ public class Commandline {
* Handle the logger attribute * Handle the logger attribute
* *
* @param arg the logger classname * @param arg the logger classname
* @exception ConfigException if a logger has already been defined
* @exception FrontendException if a logger has already been defined
*/ */
private void argLogger(String arg) throws ConfigException {
private void argLogger(String arg) throws FrontendException {
if (loggerClassname != null) { if (loggerClassname != null) {
throw new ConfigException("Only one logger class may be " +
throw new FrontendException("Only one logger class may be " +
"specified."); "specified.");
} }
loggerClassname = arg; loggerClassname = arg;
@@ -336,14 +341,14 @@ public class Commandline {
/** /**
* Determine the build file to use * Determine the build file to use
* *
* @exception ConfigException if the build file cannot be found
* @exception FrontendException if the build file cannot be found
*/ */
private void determineBuildFile() throws ConfigException {
private void determineBuildFile() throws FrontendException {
if (buildFileURL == null) { if (buildFileURL == null) {
File defaultBuildFile
File defaultBuildFile
= new File(FrontendUtils.DEFAULT_BUILD_FILENAME); = new File(FrontendUtils.DEFAULT_BUILD_FILENAME);
if (!defaultBuildFile.exists()) { if (!defaultBuildFile.exists()) {
File ant1BuildFile
File ant1BuildFile
= new File(FrontendUtils.DEFAULT_ANT1_FILENAME); = new File(FrontendUtils.DEFAULT_ANT1_FILENAME);
if (ant1BuildFile.exists()) { if (ant1BuildFile.exists()) {
defaultBuildFile = ant1BuildFile; defaultBuildFile = ant1BuildFile;
@@ -352,7 +357,7 @@ public class Commandline {
try { try {
buildFileURL = InitUtils.getFileURL(defaultBuildFile); buildFileURL = InitUtils.getFileURL(defaultBuildFile);
} catch (MalformedURLException e) { } catch (MalformedURLException e) {
throw new ConfigException("Build file is not valid", e);
throw new FrontendException("Build file is not valid", e);
} }
} }
} }
@@ -361,11 +366,11 @@ public class Commandline {
* Parse the command line arguments. * Parse the command line arguments.
* *
* @param args the command line arguments * @param args the command line arguments
* @exception ConfigException thrown when the command line contains some
* @exception FrontendException thrown when the command line contains some
* sort of error. * sort of error.
*/ */
private void parseArguments(String[] args) private void parseArguments(String[] args)
throws ConfigException {
throws FrontendException {


int i = 0; int i = 0;
while (i < args.length) { while (i < args.length) {
@@ -417,9 +422,9 @@ public class Commandline {
* Creates the default build logger for sending build events to the ant * Creates the default build logger for sending build events to the ant
* log. * log.
* *
* @exception ConfigException if the logger cannot be instantiatd
* @exception FrontendException if the logger cannot be instantiatd
*/ */
private void createLogger() throws ConfigException {
private void createLogger() throws FrontendException {
if (loggerClassname != null) { if (loggerClassname != null) {
try { try {
Class loggerClass = Class.forName(loggerClassname); Class loggerClass = Class.forName(loggerClassname);
@@ -428,13 +433,13 @@ public class Commandline {
System.err.println("The specified logger class " System.err.println("The specified logger class "
+ loggerClassname + + loggerClassname +
" does not implement the BuildLogger interface"); " does not implement the BuildLogger interface");
throw new ConfigException("Unable to instantiate logger "
throw new FrontendException("Unable to instantiate logger "
+ loggerClassname, e); + loggerClassname, e);
} catch (Exception e) { } catch (Exception e) {
System.err.println("Unable to instantiate specified logger " System.err.println("Unable to instantiate specified logger "
+ "class " + loggerClassname + " : " + "class " + loggerClassname + " : "
+ e.getClass().getName()); + e.getClass().getName());
throw new ConfigException("Unable to instantiate logger "
throw new FrontendException("Unable to instantiate logger "
+ loggerClassname, e); + loggerClassname, e);
} }
} else { } else {


+ 129
- 0
proposal/mutant/src/java/frontend/org/apache/ant/frontend/FrontendException.java View File

@@ -0,0 +1,129 @@
/*
* 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.frontend;

import org.apache.ant.common.util.AntException;
import org.apache.ant.common.util.Location;

/**
* An exception in the frontend set up of an Ant run
*
* @author Conor MacNeill
*/
public class FrontendException extends AntException {
/**
* Constructs an exception with the given descriptive message.
*
* @param msg Description of or information about the exception.
*/
public FrontendException(String msg) {
super(msg);
}

/**
* Constructs an exception with the given descriptive message and a
* location in a file.
*
* @param msg Description of or information about the exception.
* @param location Location in the project file where the error occured.
*/
public FrontendException(String msg, Location location) {
super(msg, location);
}

/**
* Constructs an exception with the given message and exception as a
* root cause.
*
* @param msg Description of or information about the exception.
* @param cause Throwable that might have cause this one.
*/
public FrontendException(String msg, Throwable cause) {
super(msg, cause);
}

/**
* Constructs an exception with the given message and exception as a
* root cause and a location in a file.
*
* @param msg Description of or information about the exception.
* @param cause Exception that might have cause this one.
* @param location Location in the project file where the error occured.
*/
public FrontendException(String msg, Throwable cause,
Location location) {
super(msg, cause, location);
}

/**
* Constructs an exception with the given exception as a root cause.
*
* @param cause Exception that might have caused this one.
*/
public FrontendException(Throwable cause) {
super(cause);
}

/**
* Constructs an exception with the given exception as a root cause and
* a location in a file.
*
* @param cause Exception that might have cause this one.
* @param location Location in the project file where the error occured.
*/
public FrontendException(Throwable cause, Location location) {
super(cause, location);
}
}


+ 8
- 9
proposal/mutant/src/java/frontend/org/apache/ant/frontend/FrontendUtils.java View File

@@ -61,7 +61,6 @@ import org.apache.ant.antcore.config.AntConfig;
import org.apache.ant.antcore.config.AntConfigHandler; import org.apache.ant.antcore.config.AntConfigHandler;
import org.apache.ant.antcore.xml.ParseContext; import org.apache.ant.antcore.xml.ParseContext;
import org.apache.ant.antcore.xml.XMLParseException; import org.apache.ant.antcore.xml.XMLParseException;
import org.apache.ant.common.util.ConfigException;
import org.apache.ant.init.InitUtils; import org.apache.ant.init.InitUtils;


/** /**
@@ -84,11 +83,11 @@ public class FrontendUtils {
* @param configArea the config area from which the config may be read * @param configArea the config area from which the config may be read
* @return the AntConfig instance representing the config info read in * @return the AntConfig instance representing the config info read in
* from the config area. May be null if the AntConfig is not present * from the config area. May be null if the AntConfig is not present
* @exception ConfigException if the URL for the config file cannotbe
* @exception FrontendException if the URL for the config file cannotbe
* formed. * formed.
*/ */
public static AntConfig getAntConfig(File configArea) public static AntConfig getAntConfig(File configArea)
throws ConfigException {
throws FrontendException {
File configFile = new File(configArea, "antconfig.xml"); File configFile = new File(configArea, "antconfig.xml");


try { try {
@@ -105,11 +104,11 @@ public class FrontendUtils {
* *
* @param configFile the file containing the XML config * @param configFile the file containing the XML config
* @return the parsed config object * @return the parsed config object
* @exception ConfigException if the config cannot be parsed
* @exception FrontendException if the config cannot be parsed
* @exception FileNotFoundException if the file cannot be found. * @exception FileNotFoundException if the file cannot be found.
*/ */
public static AntConfig getAntConfigFile(File configFile) public static AntConfig getAntConfigFile(File configFile)
throws ConfigException, FileNotFoundException {
throws FrontendException, FileNotFoundException {
try { try {
URL configFileURL = InitUtils.getFileURL(configFile); URL configFileURL = InitUtils.getFileURL(configFile);


@@ -120,15 +119,15 @@ public class FrontendUtils {


return configHandler.getAntConfig(); return configHandler.getAntConfig();
} catch (MalformedURLException e) { } catch (MalformedURLException e) {
throw new ConfigException("Unable to form URL to read config from "
+ configFile, e);
throw new FrontendException("Unable to form URL to read "
+ "config from " + configFile, e);
} catch (XMLParseException e) { } catch (XMLParseException e) {
if (e.getCause() instanceof FileNotFoundException) { if (e.getCause() instanceof FileNotFoundException) {
throw (FileNotFoundException) e.getCause(); throw (FileNotFoundException) e.getCause();
} }


throw new ConfigException("Unable to parse config file from "
+ configFile, e);
throw new FrontendException("Unable to parse config file from "
+ configFile, e, e.getLocation());
} }
} }




Loading…
Cancel
Save