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

<path id="classpath.parser">
<fileset dir="${lib.dir}/parser" includes="*.jar"/>
</path>
<path id="classpath.common">
<pathelement location="${distlib.dir}/init.jar"/>
</path>
@@ -29,13 +29,13 @@
<path refid="classpath.antcore"/>
<pathelement location="${distlib.dir}/antcore/antcore.jar"/>
</path>
<path id="classpath.start">
<pathelement location="${distlib.dir}/init.jar"/>
</path>

<target name="buildsetup">
<available classname="com.puppycrawl.tools.checkstyle.CheckStyleTask"
<available classname="com.puppycrawl.tools.checkstyle.CheckStyleTask"
property="checkstyle.available"/>
<mkdir dir="${bin.dir}"/>
<mkdir dir="${distlib.dir}"/>
@@ -123,7 +123,7 @@
<target name="ant1compat" depends="common">
<ant antfile="build/ant1compat.xml" />
</target>
<target name="remote" depends="init">
<mkdir dir="${bin.dir}/remote"/>
<depend destdir="${bin.dir}/remote" srcdir="${java.dir}/remote" closure="yes">
@@ -138,38 +138,46 @@
</manifest>
</jar>
</target>
<target name="clean">
<delete dir="${bin.dir}"/>
<delete dir="${dist.dir}"/>
</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 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 refid="classpath.common"/>
<pathelement location="${distlib.dir}/common/common.jar"/>
</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"/>
</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"/>
</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"/>
</jar>
</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"
classname="com.puppycrawl.tools.checkstyle.CheckStyleTask"/>
<mkdir dir="${bin.dir}/check"/>
@@ -184,7 +192,7 @@
<exclude name="**/builder/Ant1CompatBuilder.java"/>
</fileset>
</checkstyle>
<checkstyle allowProtected="true"
<checkstyle allowProtected="true"
headerFile="../../src/etc/RequiredHeader.txt"
headerIgnoreLine="4">
<fileset dir="${java.dir}">
@@ -194,14 +202,14 @@
</fileset>
</checkstyle>
</target>
<target name="javadocs">
<mkdir dir="${javadocs.dir}"/>
<javadoc packagenames="org.apache.*"
useexternalfile="yes"
sourcepath="${java.dir}/antcore:${java.dir}/init:${java.dir}/common:${java.dir}/frontend:${java.dir}/start"
destdir="${javadocs.dir}"
author="true"
author="true"
private ="true"
version="true"
windowtitle="Mutant API"
@@ -216,4 +224,12 @@
<tag name="created" description="Date Created:" scope="types"/>
</javadoc>
</target>


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



</project>

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

@@ -1,36 +1,72 @@
<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="lib.dir" value="lib"/>
<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="dist.dir" value="dist"/>
<property name="javadocs.dir" value="${dist.dir}/javadocs"/>
<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="optional.package" value="${ant.package}/taskdefs/optional"/>
<property name="optional.type.package" value="${ant.package}/types/optional"/>
<property name="util.package" value="${ant.package}/util"/>
<property name="regexp.package" value="${util.package}/regexp"/>

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


<path id="classpath">
<pathelement location="${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">
<exclude name="org/apache/tools/ant/taskdefs/Copydir.java"/>
<exclude name="org/apache/tools/ant/taskdefs/Copyfile.java"/>
</patternset>
<patternset id="toohard">
<exclude name="org/apache/tools/ant/taskdefs/Do.java"/>
</patternset>
<patternset id="converted">
<exclude name="org/apache/tools/ant/taskdefs/Ant.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/UnknownElement.java"/>
</patternset>

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

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

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

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

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

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

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

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

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

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

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

<mkdir dir="${distlib.dir}/antlibs/"/>
<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"/>
</jar>
</target>

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

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

<patternset refid="needs.antlr" />

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

</fileset>
</batchtest>

</junit>
</target>

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


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

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

</project>

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
* <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
* @created 9 January 2002
*/
public class ConfigException extends AntException {
public class AntLibException extends AntException {
/**
* Constructs an exception with the given descriptive message.
*
* @param msg Description of or information about the exception.
*/
public ConfigException(String msg) {
public AntLibException(String msg) {
super(msg);
}

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

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

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

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

@@ -125,7 +126,7 @@ public class ConfigException extends AntException {
* @param cause Exception that might have cause this one.
* @param location Location in the project file where the error occured.
*/
public ConfigException(Throwable cause, Location location) {
public AntLibException(Throwable cause, Location 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/>.
*/
package org.apache.ant.antcore.antlib;
import org.apache.ant.common.util.ConfigException;
import org.apache.ant.antcore.xml.ElementHandler;
import org.xml.sax.Attributes;
import org.xml.sax.SAXParseException;
@@ -80,7 +79,7 @@ public class AntLibHandler extends ElementHandler {
/** The extends attribute name */
public static final String ISOLATED_ATTR = "isolated";

/** The list of allowed Attributes */
public static final String[] ALLOWED_ATTRIBUTES
= {LIBID_ATTR, HOME_ATTR, REQXML_ATTR, REQTOOLS_ATTR,
@@ -166,8 +165,8 @@ public class AntLibHandler extends ElementHandler {
} else {
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/>.
*/
package org.apache.ant.antcore.antlib;
import java.io.File;
import java.io.FileNotFoundException;
import java.net.MalformedURLException;
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.common.util.CircularDependencyChecker;
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.InitUtils;
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
* @created 29 January 2002
*/
public class AntLibManager {
/**
* These are AntLibraries which have been loaded into the system
*/
private Map antLibraries = new HashMap();

/** The list of extensions which are examined for ant libraries */
public static final String[] ANTLIB_EXTENSIONS
@@ -85,14 +88,25 @@ public class AntLibManager {
/** Flag which indicates whether non-file URLS are used */
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
*
* @param initConfig the init config of the system.
* @param remoteAllowed true if remote libraries can be used and
* configured
*/
public AntLibManager(boolean remoteAllowed) {
public AntLibManager(InitConfig initConfig, boolean remoteAllowed) {
this.remoteAllowed = remoteAllowed;
this.initConfig = initConfig;
}

/**
@@ -101,47 +115,53 @@ public class AntLibManager {
* @param librarySpecs A map to which additional library specifications
* are added.
* @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)
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
*
* @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
* @exception ExecutionException if a library cannot be configured from
* @exception AntLibException if a library cannot be configured from
* 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
for (Iterator i = librarySpecs.keySet().iterator(); i.hasNext();) {
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?
AntLibrarySpec spec
= (AntLibrarySpec) librarySpecs.get(libraryId);
AntLibrarySpec spec
= (AntLibrarySpec) librarySpecs.get(libraryId);
URL specURL = spec.getLibraryURL();
if (!specURL.equals(currentVersion.getDefinitionURL())) {
throw new ExecutionException("Ant Library \"" + libraryId
throw new AntLibException("Ant Library \"" + libraryId
+ "\" is already loaded from "
+ currentVersion.getDefinitionURL()
+ " new version found at "
+ currentVersion.getDefinitionURL()
+ " new version found at "
+ specURL);
}
}
@@ -187,12 +202,12 @@ public class AntLibManager {
= new CircularDependencyChecker("configuring Ant libraries");
for (Iterator i = librarySpecs.keySet().iterator(); i.hasNext();) {
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;
}

@@ -200,87 +215,74 @@ public class AntLibManager {
* Load either a set of libraries or a single library.
*
* @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")
&& !remoteAllowed) {
throw new ExecutionException("The config library "
throw new AntLibException("The config library "
+ "location \"" + libLocationURL
+ "\" cannot be used because config does "
+ "not allow remote libraries");
}

Map librarySpecs = new HashMap();
addAntLibraries(librarySpecs, libLocationURL);
}
/**
* 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
*
* @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
*/
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) {
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.
*
* @param initConfig Ant's init config passed in from the front end.
* @param librarySpecs the library specs from which this library is to
* be configured.
* @param libraryId the global identifier for the library
* @param configuring A circualr dependency chcker for library
* 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,
Map libraries, Map newLibraries, Map libPathsMap)
throws ExecutionException {
Map newLibraries)
throws AntLibException {

try {
configuring.visitNode(libraryId);
@@ -289,15 +291,15 @@ public class AntLibManager {
= (AntLibrarySpec) librarySpecs.get(libraryId);
String extendsId = librarySpec.getExtendsLibraryId();
if (extendsId != null) {
if (!libraries.containsKey(extendsId) &&
if (!antLibraries.containsKey(extendsId) &&
!newLibraries.containsKey(extendsId)) {
if (!librarySpecs.containsKey(extendsId)) {
throw new ExecutionException("Could not find library, "
throw new AntLibException("Could not find library, "
+ extendsId + ", upon which library "
+ 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());
}
if (extendsId != null) {
AntLibrary extendsLibrary
= (AntLibrary) libraries.get(extendsId);
AntLibrary extendsLibrary = getLibrary(extendsId);
if (extendsLibrary == null) {
extendsLibrary = (AntLibrary) newLibraries.get(extendsId);
}
antLibrary.setExtendsLibrary(extendsLibrary);
}
antLibrary.setParentLoader(initConfig.getCommonLoader());
@@ -344,14 +345,13 @@ public class AntLibManager {
if (libPaths != null) {
for (Iterator j = libPaths.iterator(); j.hasNext();) {
URL pathURL = (URL) j.next();
addLibPath(antLibrary, pathURL);
antLibrary.addLibraryURL(pathURL);
}
}
}

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

@@ -374,5 +374,25 @@ public class AntLibManager {
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 org.apache.ant.common.antlib.AntContext;
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.
@@ -221,10 +221,10 @@ public class AntLibrary implements ComponentLibrary {
* required
* @return an instance of the factory, or null if this library does not
* support a factory
* @exception ExecutionException if the factory cannot be created
* @exception AntException if the factory cannot be created
*/
public AntLibFactory getFactory(AntContext context)
throws ExecutionException {
throws AntException {
try {
AntLibFactory libFactory = null;
if (factoryClassName != null) {
@@ -236,20 +236,20 @@ public class AntLibrary implements ComponentLibrary {
}
return libFactory;
} catch (ClassNotFoundException e) {
throw new ExecutionException("Unable to create factory "
throw new AntLibException("Unable to create factory "
+ factoryClassName + " for the \"" + libraryId
+ "\" Ant library", 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 "
+ factoryClassName + " for the \"" + libraryId
+ "\" Ant library", e);
} catch (InstantiationException e) {
throw new ExecutionException("Unable to instantiate factory "
throw new AntLibException("Unable to instantiate factory "
+ factoryClassName + " for the \"" + libraryId
+ "\" Ant library", e);
} catch (IllegalAccessException e) {
throw new ExecutionException("Unable to access factory "
throw new AntLibException("Unable to access factory "
+ factoryClassName + " for the \"" + libraryId
+ "\" 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.List;
import java.util.Map;
import org.apache.ant.common.util.ConfigException;

/**
* This class represents the specification of an Ant library. It is merely
@@ -291,7 +290,7 @@ public class AntLibrarySpec {
public void addAspect(String className) {
aspectClassNames.add(className);
}
/**
* 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 definitionTypeName the name of the definition type. This is
* 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,
String classname)
throws ConfigException {
throws AntLibException {
if (definitions.containsKey(name)) {
throw new ConfigException("More than one definition "
throw new AntLibException("More than one definition "
+ "in library for " + name);
}
int definitionType = 0;
@@ -324,7 +323,7 @@ public class AntLibrarySpec {
} else if (definitionTypeName.equals("taskdef")) {
definitionType = AntLibrary.TASKDEF;
} else {
throw new ConfigException("Unknown type of definition "
throw new AntLibException("Unknown type of definition "
+ definitionTypeName);
}
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;
import org.apache.ant.common.antlib.AntContext;
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.
@@ -83,9 +83,9 @@ public interface ComponentLibrary {
* required
* @return an instance of the factory, or null if this library does not
* 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


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

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

/**
@@ -75,10 +73,15 @@ public class AntConfig {
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.
*
@@ -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.
*/
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) {
this.unsetProperties = allowUnsetProperties;
}
/**
* Merge in another configuration. The configuration being merged in
* takes precedence
@@ -162,7 +191,32 @@ public class AntConfig {
remoteLibs = otherConfig.remoteLibs;
remoteProjects = otherConfig.remoteProjects;
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;
import org.apache.ant.antcore.xml.ElementHandler;
import org.apache.ant.antcore.modelparser.BuildElementHandler;
import org.apache.ant.common.model.BuildElement;
import org.xml.sax.Attributes;
import org.xml.sax.SAXParseException;

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

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

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

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

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

// everything else is a task
// configs support two task collections as elements
BuildElementHandler buildElementHandler = new BuildElementHandler();
buildElementHandler.start(getParseContext(), getXMLReader(),
this, getLocator(), attributes, getElementSource(),
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.Method;
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
@@ -69,25 +69,25 @@ import org.apache.ant.common.util.ExecutionException;
public class AttributeSetter {
/** The method that will perform the setting */
private Method method;
/**
* A converter to convert the string value to a value to be given to
* the setter method
*/
/**
* A converter to convert the string value to a value to be given to
* the setter method
*/
private Converter converter;
/**
* A constructor used to create the string value to an object to be used
* by the setter
* by the setter
*/
private Constructor valueConstructor;
/** The depth of the setter in the class hierarchy */
private int depth;

/**
* Create a setter which just uses string values
*
* Create a setter which just uses string values
*
* @param method the method to be invoked.
* @param depth the depth of this method declaraion in the class hierarchy.
*/
@@ -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 depth the depth of this method declaraion in the class hierarchy.
* @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 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.
*/
public AttributeSetter(Method method, int depth,
public AttributeSetter(Method method, int depth,
Constructor valueConstructor) {
this(method, depth);
this.valueConstructor = valueConstructor;
}
/**
* Set the attribute value on an object
*
@@ -131,17 +131,17 @@ public class AttributeSetter {
* @exception InvocationTargetException 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
*/
void set(Object obj, String stringValue)
throws InvocationTargetException, IllegalAccessException,
ExecutionException {
AntException {
Object value = null;
if (converter != null) {
Class type = getType();
value = converter.convert(stringValue, type);
value = converter.convert(stringValue, type);
} else if (valueConstructor != null) {
try {
value = valueConstructor.newInstance(new String[]{stringValue});
@@ -151,19 +151,19 @@ public class AttributeSetter {
} else {
value = stringValue;
}
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.
*/
public int getDepth() {
return depth;
}
/**
* 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.util.DemuxOutputReceiver;
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
@@ -239,11 +239,11 @@ public class BuildEventSupport implements DemuxOutputReceiver {
task.handleSystemOut(line);
}
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);
}
}


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

@@ -52,7 +52,6 @@
* <http://www.apache.org/>.
*/
package org.apache.ant.antcore.execution;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
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.model.BuildElement;
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.init.LoaderUtils;

@@ -91,11 +90,6 @@ import org.apache.ant.init.LoaderUtils;
*/
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
* Tasks to handle special type conversions.
@@ -129,12 +123,6 @@ public class ComponentManager implements ComponentService {
/** The definitions which have been imported into this frame. */
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. */
private Map setters = new HashMap();

@@ -143,16 +131,17 @@ public class ComponentManager implements ComponentService {
* Constructor
*
* @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.
*/
protected ComponentManager(Frame frame) throws ExecutionException {
protected ComponentManager(Frame frame, AntLibManager libManager)
throws ExecutionException {
this.frame = frame;
AntConfig config = frame.getConfig();
libManager = new AntLibManager(config.isRemoteLibAllowed());
this.libManager = libManager;
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 importAll if true all tasks are imported as the library is
* 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
* path is being defined
* @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)
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
*
* @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) {
throw new ExecutionException("Unable to import library " + libraryId
+ " 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
* build scripts. If this is null, the components default name is
* used.
* @exception ExecutionException if the component cannot be imported
* @exception AntException if the component cannot be imported
*/
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) {
throw new ExecutionException("Unable to import component from "
+ "library \"" + libraryId + "\" as it has not been loaded");
@@ -331,10 +309,10 @@ public class ComponentManager implements ComponentService {
* @param componentName the name of the component
* @return the created component. The return type of this method depends
* 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)
throws ExecutionException {
throws AntException {
return createComponent(componentName, (BuildElement) null);
}

@@ -347,12 +325,11 @@ public class ComponentManager implements ComponentService {
* @param localName the name component within the library.
* @return the created component. The return type of this method depends
* 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)
throws ExecutionException {
AntLibrary library
= (AntLibrary) antLibraries.get(libraryId);
throws AntException {
AntLibrary library = libManager.getLibrary(libraryId);
if (library == null) {
throw new ExecutionException("No library with libraryId \""
+ libraryId + "\" is available");
@@ -377,6 +354,21 @@ public class ComponentManager implements ComponentService {
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
* 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
* is required
* @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)
throws ExecutionException {
throws AntException {
String libraryId = componentLibrary.getLibraryId();
if (libFactories.containsKey(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
* configuration
* @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
*/
protected Object createComponent(BuildElement model)
throws ExecutionException {
throws AntException {
String componentName = model.getType();
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
* component is created but not configured.
* @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
*/
private Object createComponent(String componentName, BuildElement model)
throws ExecutionException {
throws AntException {

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

@@ -485,13 +477,13 @@ public class ComponentManager implements ComponentService {
* @param libDefinition the component's definition
* @param model the BuildElement model of the component's configuration.
* @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,
ComponentLibrary componentLibrary,
AntLibDefinition libDefinition,
BuildElement model)
throws ExecutionException {
throws AntException {

Location location = Location.UNKNOWN_LOCATION;
if (model != null) {
@@ -633,12 +625,12 @@ public class ComponentManager implements ComponentService {
* @param libFactory the factory object of the typeClass's Ant library
* @param localName the name of the type within its Ant library
* @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
*/
private Object createTypeInstance(Class typeClass, AntLibFactory libFactory,
BuildElement model, String localName)
throws ExecutionException {
throws AntException {
try {
Object typeInstance
= libFactory.createComponent(typeClass, localName);
@@ -646,7 +638,7 @@ public class ComponentManager implements ComponentService {
if (typeInstance instanceof ExecutionComponent) {
ExecutionComponent component
= (ExecutionComponent) typeInstance;
ExecutionContext context
ExecutionContext context
= new ExecutionContext(frame, component, model);
component.init(context, localName);
configureElement(libFactory, typeInstance, model);
@@ -680,16 +672,16 @@ public class ComponentManager implements ComponentService {
* @param model the model of the nested element
* @param factory Ant Library factory associated with the element to which
* 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,
Object element, BuildElement model)
throws ExecutionException {
throws AntException {
String nestedElementName = model.getType();
Class nestedType = setter.getType(nestedElementName);

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

Object typeInstance = null;
@@ -734,11 +726,11 @@ public class ComponentManager implements ComponentService {
* @param model the build model for the nestd element
* @param factory Ant Library factory associated with the element creating
* 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,
Object element, BuildElement model)
throws ExecutionException {
throws AntException {
String nestedElementName = model.getType();
try {
Object nestedElement
@@ -747,7 +739,7 @@ public class ComponentManager implements ComponentService {
if (nestedElement instanceof ExecutionComponent) {
ExecutionComponent component
= (ExecutionComponent) nestedElement;
ExecutionContext context
ExecutionContext context
= new ExecutionContext(frame, component, model);
component.init(context, nestedElementName);
configureElement(factory, nestedElement, model);
@@ -770,12 +762,12 @@ public class ComponentManager implements ComponentService {
* @param attributeValues a map containing named attribute values.
* @param ignoreUnsupported if this is true, attribute names for which no
* 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.
*/
public void configureAttributes(Object object, Map attributeValues,
boolean ignoreUnsupported)
throws ExecutionException {
throws AntException {
Setter setter = getSetter(object.getClass());
for (Iterator i = attributeValues.keySet().iterator(); i.hasNext();) {
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 factory Ant Library factory associated with the element being
* configured
* @exception ExecutionException if the element cannot be configured
* @exception AntException if the element cannot be configured
*/
private void configureElement(AntLibFactory factory, Object element,
BuildElement model)
throws ExecutionException {
throws AntException {
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();) {
BuildElement nestedElementModel = (BuildElement) i.next();
String nestedElementName = nestedElementModel.getType();
@@ -851,13 +820,37 @@ public class ComponentManager implements ComponentService {
createNestedElement(factory, setter, element,
nestedElementModel);
} else {
throw new ExecutionException(model.getType()
throw new ExecutionException("<" + model.getType() + ">"
+ " does not support the \"" + nestedElementName
+ "\" nested element",
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.
*
* @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()
|| loadedAspects.contains(library.getLibraryId())) {
return;
@@ -912,7 +905,7 @@ public class ComponentManager implements ComponentService {
+ " does not implement the Aspect interface");
}
Aspect aspect = (Aspect) libFactory.createInstance(aspectClass);
ExecutionContext context
ExecutionContext context
= new ExecutionContext(frame, null, null);
aspect.init(context);
aspects.add(aspect);
@@ -946,11 +939,11 @@ public class ComponentManager implements ComponentService {
* frame.
*
* @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
*/
private void addConverters(AntLibrary library)
throws ExecutionException {
throws AntException {
if (!library.hasConverters()
|| loadedConverters.contains(library.getLibraryId())) {
return;
@@ -972,7 +965,7 @@ public class ComponentManager implements ComponentService {
}
Converter converter
= (Converter) libFactory.createInstance(converterClass);
ExecutionContext context
ExecutionContext context
= new ExecutionContext(frame, null, null);
converter.init(context);
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.
*/


+ 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.Map;
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.AntException;

/**
* 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.
* @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)
throws ExecutionException {
throws AntException {
if (value == null) {
return null;
}
@@ -199,10 +199,10 @@ public class CoreDataService implements DataService {
* @param value the string to be scanned for property references.
* @param replacementValues the collection of replacement values
* @return the string with all property references replaced
* @exception 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)
throws ExecutionException {
throws AntException {
if (value == 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;
import org.apache.ant.common.event.BuildListener;
import org.apache.ant.common.service.EventService;
import org.apache.ant.common.util.ExecutionException;

/**
* 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.BuildElement;
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.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.
@@ -98,9 +100,9 @@ public class CoreExecService implements ExecService {
* core. This is checked
*
* @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);

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

@@ -130,25 +132,25 @@ public class CoreExecService implements ExecService {
}
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.
* 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
* by their nature, aspect values are not part of the task configuration.
*
* @param task the task to be executed
* @param aspectValues the aspect attribute values.
* @exception 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);

frame.executeTask(task, aspectValues);
}


/**
@@ -160,6 +162,17 @@ public class CoreExecService implements ExecService {
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.
@@ -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
*
* @param targets A list of targets to be run
* @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);
}


/**
* 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);
}

@@ -245,12 +297,12 @@ public class CoreExecService implements ExecService {
* referenced.
* @param model the project model.
* @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)
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 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
* @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);
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);
return key;
@@ -279,12 +337,14 @@ public class CoreExecService implements ExecService {
* Setup a sub-build using the current frame's project model
*
* @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
* @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;
import java.io.File;
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.AntException;

/**
* 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.
* @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();
return fileUtils.resolveFile(fileUtils.normalize(base.getPath()),
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;
import org.apache.ant.common.service.InputService;
import org.apache.ant.common.util.ExecutionException;
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;
import org.apache.ant.common.antlib.DeferredTask;
import org.apache.ant.common.util.ExecutionException;

/**
* 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;
import org.apache.ant.common.antlib.AntContext;
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.model.BuildElement;

@@ -90,7 +89,7 @@ public class ExecutionContext implements AntContext {
*
* @param frame the frame containing this context
* @param component the component associated with this context - may be null
* @param model the build model associated with this component if any.
* @param model the build model associated with this component if any.
*/
protected ExecutionContext(Frame frame, ExecutionComponent component,
BuildElement model) {
@@ -170,7 +169,7 @@ public class ExecutionContext implements AntContext {
protected ExecutionComponent getExecutionComponent() {
return component;
}
/**
* 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.Set;
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.Aspect;
import org.apache.ant.common.event.BuildListener;
import org.apache.ant.common.event.MessageLevel;
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.Target;
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.MagicProperties;
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.Location;
import org.apache.ant.common.util.AntException;
import org.apache.ant.init.InitConfig;
import org.apache.ant.init.LoaderUtils;

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

/**
/**
* 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
* particular task.
*/
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.
*/
private Map overrides = new HashMap();
/**
* The context of this execution. This contains all data object's created
* 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
*/
private DataService dataService;
private CoreDataService dataService;

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

/**
* the Component Manager used to manage the importing of library
@@ -160,19 +163,41 @@ public class Frame implements DemuxOutputReceiver {
/** The core's execution Service */
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 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.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.
* @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);
}

@@ -194,12 +219,12 @@ public class Frame implements DemuxOutputReceiver {
* Sets the Project of the Frame
*
* @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;
referencedFrames.clear();
project.validate();
}


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

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

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

if (mutable || !frameOverrides.containsKey(relativeName)) {
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.
*
* @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.
* @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 {
int refIndex = name.indexOf(Project.REF_DELIMITER);
if (refIndex == -1) {
throw new ExecutionException("Property overrides can only be"
+ " returned for properties in referenced projects - not "
throw new ExecutionException("Property overrides can only be"
+ " returned for properties in referenced projects - not "
+ name);
}
String firstFrameName = name.substring(0, refIndex);
String relativeName
String relativeName
= name.substring(refIndex + Project.REF_DELIMITER.length());

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

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.
*
* @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.
* @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 {
int refIndex = name.indexOf(Project.REF_DELIMITER);
if (refIndex == -1) {
throw new ExecutionException("Property overrides can only be"
+ " returned for properties in referenced projects - not "
throw new ExecutionException("Property overrides can only be"
+ " returned for properties in referenced projects - not "
+ name);
}
String firstFrameName = name.substring(0, refIndex);
String relativeName
String relativeName
= name.substring(refIndex + Project.REF_DELIMITER.length());

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

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
* 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) {
addProperties(properties);
}

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


/**
* 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();
String antHomeString = null;

@@ -378,7 +406,25 @@ public class Frame implements DemuxOutputReceiver {
} else {
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.
* @param project the project model.
* @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,
Map initialData)
throws ExecutionException {
Map initialData)
throws AntException {
Frame referencedFrame = createFrame(project);
addListeners(referencedFrame);

referencedFrame.initialize(initialData);

if (initialData != null) {
referencedFrame.setInitialProperties(initialData);
}
// does the frame have any overrides?
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);
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
* @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)
throws ExecutionException {
throws ModelException {
Frame newFrame
= new Frame(initConfig, config);
= new Frame(initConfig, config, this);

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();) {
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
*/
protected void addBuildListener(BuildListener listener) {
public void addBuildListener(BuildListener listener) {
for (Iterator i = getReferencedFrames(); i.hasNext();) {
Frame referencedFrame = (Frame) i.next();

@@ -735,15 +788,26 @@ public class Frame implements DemuxOutputReceiver {
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
*
* @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()) {
// we just execute the default target if any
String defaultTarget = project.getDefaultTarget();
@@ -787,10 +851,12 @@ public class Frame implements DemuxOutputReceiver {
* @param flattenedList the List of targets that must be executed before
* the given 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
* project hierarchy
*/
private void flattenDependency(List flattenedList, String fullTargetName)
private void flattenDependency(List flattenedList, String fullTargetName,
Location targetRefLocation)
throws ExecutionException {
if (flattenedList.contains(fullTargetName)) {
return;
@@ -800,17 +866,18 @@ public class Frame implements DemuxOutputReceiver {
String localTargetName = getNameInFrame(fullTargetName);
Target target = frame.getProject().getTarget(localTargetName);
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();) {
String localDependencyName = (String) i.next();
String fullDependencyName = localDependencyName;
if (fullProjectName != null) {
fullDependencyName = fullProjectName + Project.REF_DELIMITER
fullDependencyName = fullProjectName + Project.REF_DELIMITER
+ localDependencyName;
}
flattenDependency(flattenedList, fullDependencyName);
flattenDependency(flattenedList, fullDependencyName,
target.getLocation());
if (!flattenedList.contains(fullDependencyName)) {
flattenedList.add(fullDependencyName);
}
@@ -829,7 +896,7 @@ public class Frame implements DemuxOutputReceiver {
protected List getTargetDependencies(String fullTargetName)
throws ExecutionException {
List flattenedList = new ArrayList();
flattenDependency(flattenedList, fullTargetName);
flattenDependency(flattenedList, fullTargetName, null);
flattenedList.add(fullTargetName);
return flattenedList;
}
@@ -839,10 +906,10 @@ public class Frame implements DemuxOutputReceiver {
* 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
* @exception ExecutionException if there is a problem executing the tasks
* @exception AntException if there is a problem executing the tasks
* 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
// execute them in order.
@@ -864,10 +931,10 @@ public class Frame implements DemuxOutputReceiver {
*
* @param task the task to be executed.
* @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();
Map aspectContexts = new HashMap();
@@ -881,7 +948,7 @@ public class Frame implements DemuxOutputReceiver {
if (aspectContexts.size() != 0) {
aspectContextsMap.put(task, aspectContexts);
}
eventSupport.fireTaskStarted(task);

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

/**
* Run the tasks returned by the given iterator
*
* @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
*/
protected void executeTasks(Iterator taskIterator)
throws ExecutionException {
throws AntException {

if (taskIterator == null) {
return;
}

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

@@ -938,7 +1009,7 @@ public class Frame implements DemuxOutputReceiver {
Object component = componentManager.createComponent(model);
if (component instanceof Task) {
execService.executeTask((Task) component);
}
}
} catch (ExecutionException e) {
e.setLocation(model.getLocation(), false);
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
@@ -959,10 +1087,13 @@ public class Frame implements DemuxOutputReceiver {
*
* @param targetName the name of the target within this frame that is to
* 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)
throws ExecutionException {
throws AntException {
checkRecursion(targetName);
currentTarget = targetName;

Throwable failureCause = null;
Target target = project.getTarget(targetName);
String ifCondition = target.getIfCondition();
@@ -1000,51 +1131,104 @@ public class Frame implements DemuxOutputReceiver {
throw ee;
} finally {
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
URL systemLibs
URL systemLibs
= 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
URL antLibs = new URL(initConfig.getLibraryURL(), "antlibs/");
componentManager.loadLib(antLibs.toString(), false, true);
executeTasks(project.getTasks());
componentManager.loadLib(antLibs, false);

} catch (MalformedURLException 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
*/
private void determineBaseDir() throws ExecutionException {
private void determineBaseDir() throws AntException {
if (isDataValueSet(MagicProperties.BASEDIR)) {
baseDir
= new File(getDataValue(MagicProperties.BASEDIR).toString());
String baseDirString
= getDataValue(MagicProperties.BASEDIR).toString();
setBaseDir(new File(baseDirString));
} else {
URL projectURL = project.getSourceURL();

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

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

baseDir = fileUtils.resolveFile(projectFileParent, base);
setBaseDir(fileUtils.resolveFile(projectFileParent, base));
}
} 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
* components
*
* @exception ExecutionException if the services required by the core
* @exception ExecutionException if the services required by the core
* could not be configured.
*/
private void configureServices() throws ExecutionException {
// create services and make them available in our services map
fileService = new CoreFileService(this);
componentManager = new ComponentManager(this);
componentManager = new ComponentManager(this, libManager);
dataService = new CoreDataService(this,
config.isUnsetPropertiesAllowed());
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.Map;
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
@@ -145,12 +145,12 @@ public class Reflector implements Setter {
* @param obj the object on which the value is being set
* @param attributeName the name of the attribute
* @param value the string represenation of the attribute's value
* @exception ExecutionException if the object does not support the
* @exception AntException if the object does not support the
* attribute or the object has a problem setting the value
*/
public void setAttribute(Object obj, String attributeName,
String value)
throws ExecutionException {
throws AntException {
String name = attributeName.toLowerCase();
AttributeSetter as
= (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
* 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.
* @param setter the AttribnuteSetter instance to use.
*/
private void addAttributeSetter(String attributeName,
private void addAttributeSetter(String attributeName,
AttributeSetter setter) {
String name = attributeName.toLowerCase();
AttributeSetter currentSetter
AttributeSetter currentSetter
= (AttributeSetter) attributeSetters.get(name);
if (currentSetter != null) {
// there is a setter, is it lower down in the class hierarchy
@@ -359,11 +359,11 @@ public class Reflector implements Setter {
return;
}
}
}
}
attributeSetters.put(name, setter);
}
/**
* Determine if the class associated with this reflector supports a
* particular nested element
@@ -380,13 +380,13 @@ public class Reflector implements Setter {
* Add a method to the reflector for setting an attribute value
*
* @param m the method, obtained by introspection.
* @param depth the depth of this method's declaration in the class
* @param depth the depth of this method's declaration in the class
* hierarchy
* @param propertyName the property name the method will set.
* @param converters A map of converter classes used to convert strings
* to different types.
*/
public void addAttributeMethod(Method m, int depth,
public void addAttributeMethod(Method m, int depth,
String propertyName, Map converters) {
Class type = m.getParameterTypes()[0];

@@ -471,7 +471,7 @@ public class Reflector implements Setter {
* Add an attribute setter with an associated converter
*
* @param m the attribute setter method
* @param depth the depth of this method's declaration in the class
* @param depth the depth of this method's declaration in the class
* hierarchy
* @param propertyName the name of the attribute this method supports
* @param converter the converter to be used to construct the value
@@ -479,7 +479,7 @@ public class Reflector implements Setter {
*/
private void addConvertingSetter(Method m, int depth,
String propertyName, Converter converter) {
addAttributeSetter(propertyName,
addAttributeSetter(propertyName,
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/>.
*/
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
@@ -68,12 +68,12 @@ public interface Setter {
* @param obj the object on which the value is being set
* @param attributeName the name of the attribute
* @param value the string represenation of the attribute's value
* @exception ExecutionException if the object does not support the
* @exception AntException if the object does not support the
* attribute or the object has a problem setting the value
*/
void setAttribute(Object obj, String attributeName,
String value)
throws ExecutionException;
throws AntException;

/**
* 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;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
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
@@ -105,7 +105,16 @@ public class TaskAdapter extends AbstractTask {
public void execute() throws ExecutionException {
try {
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) {
log("Error in " + worker.getClass(), MessageLevel.MSG_ERR);
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;

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.Path;

@@ -96,9 +96,9 @@ public class Ant1Converter extends AbstractConverter {
* @param value The value to be converted
* @param type the desired type 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)) {
return new Path(project, value);
} else if (EnumeratedAttribute.class.isAssignableFrom(type)) {
@@ -108,13 +108,13 @@ public class Ant1Converter extends AbstractConverter {
ea.setValue(value);
return ea;
} catch (InstantiationException e) {
throw new ExecutionException(e);
throw new ConverterException(e);
} catch (IllegalAccessException e) {
throw new ExecutionException(e);
throw new ConverterException(e);
}

} else {
throw new ExecutionException("This converter does not handle "
throw new ConverterException("This converter does not handle "
+ 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.StandardLibFactory;
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;

/**
@@ -78,9 +78,9 @@ public class Ant1Factory extends StandardLibFactory {
*
* @param context the context for this factory to use to access core
* 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) {
return;
}
@@ -109,11 +109,11 @@ public class Ant1Factory extends StandardLibFactory {
* @return an instance of the required class
* @exception InstantiationException if the class cannot be instantiated
* @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)
throws InstantiationException, IllegalAccessException,
ExecutionException {
Ant1CompatException {
try {
java.lang.reflect.Constructor constructor = null;
// 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]);
component = constructor.newInstance(new Object[0]);
} catch (NoSuchMethodException nse) {
constructor
constructor
= componentClass.getConstructor(new Class[]{Project.class});
component = constructor.newInstance(new Object[]{project});
}
@@ -136,9 +136,9 @@ public class Ant1Factory extends StandardLibFactory {
Throwable t = ite.getTargetException();
String msg = "Could not create component of type: "
+ componentClass.getName() + " due to " + t;
throw new ExecutionException(msg, t);
throw new Ant1CompatException(msg, t);
} 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);
}
}
@@ -151,12 +151,12 @@ public class Ant1Factory extends StandardLibFactory {
* @return a instance of the required class
* @exception InstantiationException if the class cannot be instantiated
* @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
*/
public Object createInstance(Class requiredClass)
throws InstantiationException, IllegalAccessException,
ExecutionException {
Ant1CompatException {

java.lang.reflect.Constructor c = null;

@@ -175,9 +175,9 @@ public class Ant1Factory extends StandardLibFactory {
Throwable t = ite.getTargetException();
String msg = "Could not create instance of type: "
+ requiredClass.getName() + " due to " + t;
throw new ExecutionException(msg, t);
throw new Ant1CompatException(msg, t);
} 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);
}
}
@@ -187,11 +187,11 @@ public class Ant1Factory extends StandardLibFactory {
* create method.
*
* @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
*/
public void registerCreatedElement(Object createdElement)
throws ExecutionException {
throws AntException {
if (createdElement instanceof ProjectComponent) {
ProjectComponent component = (ProjectComponent) createdElement;
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;

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.InputRequest;

@@ -87,7 +87,7 @@ public class Ant1InputHandler implements InputHandler {
public void handleInput(InputRequest request) throws BuildException {
try {
inputService.handleInput(request);
} catch (ExecutionException e) {
} catch (AntException 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.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import java.util.Properties;
import java.util.Stack;
import java.util.Vector;
import org.apache.ant.common.antlib.AntContext;
import org.apache.ant.common.antlib.AntLibFactory;
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.DataService;
import org.apache.ant.common.service.ExecService;
import org.apache.ant.common.service.FileService;
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.tools.ant.input.InputHandler;
import org.apache.tools.ant.types.FilterSet;
@@ -84,6 +88,11 @@ import org.apache.tools.ant.util.FileUtils;
* @created 30 January 2002
*/
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 */
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 */
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 */
private FileUtils fileUtils;
/** 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 */
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 {

// 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
*/
public Project(AntLibFactory factory) {
proxying = false;
this.factory = factory;
fileUtils = FileUtils.newFileUtils();
}

/**
* The old constructor fopr Project instances - not used now.
* The old constructor for Project instances - legacy support.
*
* @deprecated
*/
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
*/
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
*/
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) {
try {
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
*/
public void setNewProperty(String name, String value) {
if (dataService == null) {
if (!proxyProperties.containsKey(name)) {
proxyProperties.put(name, value);
}
return;
}
try {
dataService.setDataValue(name, value);
} catch (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
*/
public void setUserProperty(String name, String value) {
if (dataService == null) {
proxyProperties.put(name, value);
return;
}

try {
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.
* <p>
* This is useful for logging purposes.
*
*
* @param element The element to describe.
* Must not be <code>null</code>.
*
*
* @return a description of the element type
*
* @since 1.95, Ant 1.5
@@ -467,8 +651,8 @@ public class Project implements org.apache.ant.common.event.BuildListener {
try {
Object value = dataService.getDataValue(name);
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) {
try {
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) {
try {
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
*/
public void registerThreadTask(Thread thread, Task task) {
// XXX
// if (task != null) {
// threadTasks.put(thread, task);
// } else {
@@ -601,7 +786,7 @@ public class Project implements org.apache.ant.common.event.BuildListener {
*/
public Task getThreadTask(Thread thread) {
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
*/
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
*/
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
*/
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
*/
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) {
try {
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
* 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>.
*
* @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
* 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>.
*
* @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);
}



/**
* 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
* @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;
if (sharedContext == null) {
sharedContext = context;
}

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

InputService inputService
= (InputService) context.getCoreService(InputService.class);
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
*/
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
*/
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) {
try {
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) {
try {
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(),
taskName, taskClass.getName());
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(),
typeName, typeClass.getName());
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);
return task;
} 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 {
return componentService.createComponent(typeName);
} 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;

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

/**
* ProjectComponent facade
@@ -113,10 +113,10 @@ public abstract class ProjectComponent {
*
* @param context the core context for 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.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.service.DataService;
import org.apache.ant.common.util.AntException;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.PropertyUtils;

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

/**
* Old method to build a project.
*
*
* @param project The project to configure. Must not be <code>null</code>.
* @param buildFile An XML file giving the project's configuration.
* Must not be <code>null</code>.
*
*
* @exception BuildException always
* @deprecated
*/
public static void configureProject(Project project, File buildFile)
throws BuildException {
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.service.ExecService;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;

/**
* Ant1 Task facade
@@ -77,10 +77,10 @@ public abstract class Task extends ProjectComponent
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.
*
* @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.
*
* @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)
throws ExecutionException {
throws AntException {

if (!(this instanceof TaskContainer)) {
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 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 {
throws AntException {
super.init(context, componentType);

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

@@ -225,7 +225,7 @@ public abstract class Task extends ProjectComponent
ExecService execService
= (ExecService) context.getCoreService(ExecService.class);
execService.executeTask(this);
} catch (ExecutionException e) {
} catch (AntException e) {
throw new BuildException(e);
}
}
@@ -281,7 +281,7 @@ public abstract class Task extends ProjectComponent
void setTaskType(String type) {
this.taskType = type;
}
/**
* 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.AntLibFactory;
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.Task;

@@ -147,7 +147,7 @@ public class Ant extends Task {
AntLibFactory factory = getProject().getFactory();
realAnt = (org.apache.ant.antlib.system.Ant)
componentService.createComponent("ant.system", "ant");
} catch (ExecutionException e) {
} catch (AntException e) {
throw new BuildException(e);
}
}
@@ -156,7 +156,7 @@ public class Ant extends Task {
/**
* 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
*/
public void execute() throws BuildException {
@@ -169,7 +169,7 @@ public class Ant extends Task {
}
try {
realAnt.execute();
} catch (ExecutionException e) {
} catch (AntException e) {
throw new BuildException(e);
}
}
@@ -194,7 +194,7 @@ public class Ant extends Task {
public void addReference(AntBase.Reference r) {
try {
realAnt.addReference(r);
} catch (ExecutionException e) {
} catch (AntException e) {
throw new BuildException(e);
}
}
@@ -203,11 +203,11 @@ public class Ant extends Task {
* Gets the componentService
*
* @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();
return (ComponentService)
return (ComponentService)
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.AntLibFactory;
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.Task;

@@ -104,7 +104,7 @@ public class CallTarget extends Task {
AntLibFactory factory = getProject().getFactory();
antCall = (AntCall) componentService.createComponent("ant.system",
"antcall");
} catch (ExecutionException e) {
} catch (AntException e) {
throw new BuildException(e);
}
}
@@ -120,7 +120,7 @@ public class CallTarget extends Task {
}
try {
antCall.execute();
} catch (ExecutionException e) {
} catch (AntException e) {
throw new BuildException(e);
}
}
@@ -145,7 +145,7 @@ public class CallTarget extends Task {
public void addReference(AntBase.Reference r) {
try {
antCall.addReference(r);
} catch (ExecutionException e) {
} catch (AntException e) {
throw new BuildException(e);
}
}
@@ -154,11 +154,11 @@ public class CallTarget extends Task {
* Gets the componentService
*
* @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();
return
return
(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 org.apache.ant.common.antlib.AbstractTask;
import org.apache.ant.common.antlib.DeferredTask;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.antlib.AntContext;

/**
@@ -113,9 +112,9 @@ public class ScriptBase extends AbstractTask implements DeferredTask {
/**
* 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 script = factory.getScript(scriptName);

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

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
@@ -98,9 +98,9 @@ public class ScriptDef extends AbstractTask {
* Define the script. The script itself is stored in the factory where
* 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.
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.StandardLibFactory;
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
@@ -120,19 +120,19 @@ public class ScriptFactory extends StandardLibFactory {
* Initialise the factory
*
* @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);
componentService = (ComponentService)
componentService = (ComponentService)
context.getCoreService(ComponentService.class);
try {
Class.forName("com.ibm.bsf.BSFManager");
} catch (ClassNotFoundException e) {
throw new ExecutionException("The script Ant library requires "
throw new ScriptException("The script Ant library requires "
+ "bsf.jar to be available");
} 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()
+ "appears to be missing");
}
@@ -147,11 +147,10 @@ public class ScriptFactory extends StandardLibFactory {
* @return an instance of the required class
* @exception InstantiationException if the class cannot be instantiated
* @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)
throws InstantiationException, IllegalAccessException,
ExecutionException {
throws InstantiationException, IllegalAccessException, AntException {
Object component = super.createComponent(componentClass, localName);

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 language the language of the scripr
* @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)
throws ExecutionException {
throws AntException {
ScriptInfo scriptDefinition = new ScriptInfo(language, script);
scripts.put(name, scriptDefinition);
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;
import java.io.File;
import java.io.PrintStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.ant.common.model.Project;
import org.apache.ant.common.service.BuildKey;
import org.apache.ant.common.service.ExecService;
import org.apache.ant.common.service.FileService;
import org.apache.ant.common.service.MagicProperties;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;
import org.apache.ant.common.util.FileUtils;
import org.apache.ant.common.logger.DefaultLogger;
import org.apache.ant.common.event.MessageLevel;

/**
* The Ant task - used to execute a different build file
@@ -71,7 +78,7 @@ public class Ant extends AntBase {
/** the base directory to use for the run */
private File baseDir;
/** 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
*
* @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
*
* @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) {
baseDir = getExecService().getBaseDir();
}
@@ -130,10 +137,36 @@ public class Ant extends AntBase {

ExecService execService = getExecService();
Project model = execService.parseXMLBuildFile(antFile);
Object key = execService.setupBuild(model, getProperties());
BuildKey key = execService.setupBuild(model, getProperties(), true);

setSubBuildKey(key);

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

File outfile = null;
if (baseDir != null) {
outfile = FileUtils.newFileUtils().resolveFile(baseDir, output);
} else {
outfile = fileService.resolveFile(output);
}
try {
PrintStream out
= new PrintStream(new FileOutputStream(outfile));
DefaultLogger logger = new DefaultLogger();
logger.setMessageOutputLevel(MessageLevel.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.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.AntContext;
import org.apache.ant.common.antlib.Task;
import org.apache.ant.common.antlib.AspectException;
import org.apache.ant.common.service.DataService;
import org.apache.ant.common.service.ComponentService;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;
import org.apache.ant.common.model.BuildElement;
import org.apache.ant.common.model.AspectValueCollection;

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

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

/**
* Initialise the aspect with a context.
* Initialise the aspect with a 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);
dataService = (DataService) context.getCoreService(DataService.class);
componentService
componentService
= (ComponentService) context.getCoreService(ComponentService.class);
}

/**
* This join point is activated before a component has been created.
* The aspect can return an object to be used rather than the core creating
* the object.
* 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 ExecutionException if the aspect cannot process the component.
*/
* @exception AntException if the aspect cannot process the component.
*/
public Object preCreateComponent(Object component, BuildElement model)
throws ExecutionException {
throws AntException {
String refId = model.getAspectAttributeValue(ANT_ASPECT, "refid");
if (refId != null) {
if (model.getAttributeNames().hasNext() ||
model.getNestedElements().hasNext() ||
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 "
+ "any attributes, nested elements or content",
model.getLocation());
}
Object referredComponent = dataService.getDataValue(refId);
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());
}
return referredComponent;
}
}
return component;
}
/**
* This join point is activated after a component has been created and
* configured. If the aspect wishes, an object can be returned in place
* of the one created by Ant.
* 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 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");
if (typeId != null) {
dataService.setMutableDataValue(typeId, component);
}
return super.postCreateComponent(component, model);
}

@@ -153,31 +154,31 @@ public class AntAspect extends AbstractAspect {
* 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
* @param aspectValues a collection of aspect attribute values for use
* 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
* is returned to provide the aspect its context. If this returns null
* 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();
Map antAspectValues = aspectValues.getAttributes(ANT_ASPECT);
if (antAspectValues == null) {
return null;
}
componentService.configureAttributes(aspectContext, antAspectValues,
componentService.configureAttributes(aspectContext, antAspectValues,
true);
if (aspectContext.isRequired()) {
return aspectContext;
}
return null;
return null;
}
/**
* This join point is activated after a task has executed. The aspect
* may override the task's failure cause by returning a new failure.


+ 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.List;
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
@@ -80,7 +81,7 @@ public abstract class AntBase extends 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 */
private String targetName;
@@ -125,9 +126,9 @@ public abstract class AntBase extends SubBuild {
* System.err, directly or indirectly.
*
* @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) {
super.handleSystemErr(line);
} else {
@@ -143,9 +144,9 @@ public abstract class AntBase extends SubBuild {
* or indirectly.
*
* @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) {
super.handleSystemOut(line);
} else {
@@ -180,7 +181,7 @@ public abstract class AntBase extends 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;
}



+ 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/>.
*/
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.BuildKey;

/**
* The Ant task - used to execute a different build file
@@ -65,15 +66,16 @@ public class AntCall extends AntBase {
/**
* 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());

Object key = getExecService().setupBuild(getProperties());
BuildKey key = getExecService().setupBuild(getProperties(), true);
setSubBuildKey(key);
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 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.service.FileService;

@@ -85,15 +85,15 @@ public class FileConverter extends AbstractConverter {
* @param value The value to be converted
* @param type the desired type 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 {
FileService fileService
FileService fileService
= (FileService) getContext().getCoreService(FileService.class);
return fileService.resolveFile(value);
} catch (AntException e) {
throw new ExecutionException("Unable to resolve file: "
throw new ConverterException("Unable to resolve file: "
+ 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.AntContext;
import org.apache.ant.common.antlib.ValidationException;
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
@@ -116,22 +117,22 @@ public class Import extends AbstractTask {
/**
* 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 (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 "
+ "not present");
}
} else {
if (libraryId == null) {
throw new ExecutionException("You must specify a library "
throw new ValidationException("You must specify a library "
+ "identifier with the \"libraryid\" attribute");
}
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");
}
}
@@ -140,9 +141,9 @@ public class Import extends AbstractTask {
/**
* 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();
ComponentService componentService = (ComponentService)
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.AntContext;
import org.apache.ant.common.antlib.ValidationException;
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.init.InitUtils;

@@ -91,9 +92,9 @@ public class LibPath extends AbstractTask {
* Sets the URL of the library 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();
this.url = url;
}
@@ -102,14 +103,14 @@ public class LibPath extends AbstractTask {
* Set 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();
try {
this.url = InitUtils.getFileURL(file);
} 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.
*
* @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();
try {
this.url = InitUtils.getFileURL(dir);
} catch (MalformedURLException e) {
throw new ExecutionException(e);
throw new ValidationException(e);
}
}

/**
* 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) {
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");
}
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");
}
}
@@ -147,15 +148,15 @@ public class LibPath extends AbstractTask {
/**
* 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
*/
public void execute() throws ExecutionException {
public void execute() throws AntException {
AntContext context = getAntContext();
ComponentService componentService = (ComponentService)
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);
}

@@ -163,12 +164,13 @@ public class LibPath extends AbstractTask {
* Check if any of the location specifying attributes have already been
* 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) {
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.AntContext;
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;

/**
@@ -81,9 +82,9 @@ public class LoadLib extends AbstractTask {
* Sets the URL of the library 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();
this.url = url;
}
@@ -92,14 +93,14 @@ public class LoadLib extends AbstractTask {
* Set 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();
try {
this.url = InitUtils.getFileURL(file);
} 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.
*
* @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();
try {
this.url = InitUtils.getFileURL(dir);
} 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
*
* @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) {
throw new ExecutionException("A location from which to load "
throw new ValidationException("A location from which to load "
+ "libraries must be provided");
}
}
@@ -144,26 +145,27 @@ public class LoadLib extends AbstractTask {
/**
* 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.
*/
public void execute() throws ExecutionException {
public void execute() throws AntException {
AntContext context = getAntContext();
ComponentService componentService = (ComponentService)
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
* 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) {
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.TaskContainer;
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;

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

if (numExceptions == 1) {
if (firstException instanceof ExecutionException) {
throw (ExecutionException) firstException;
if (firstException instanceof AntException) {
throw (AntException) firstException;
} else {
throw new ExecutionException(firstException);
throw new SystemException(firstException);
}
} else if (numExceptions > 1) {
throw new ExecutionException(exceptionMessage.toString(),
throw new SystemException(exceptionMessage.toString(),
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;

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.antlib.ConverterException;

/**
* A converter to convert to Java's primitie types
@@ -72,8 +72,8 @@ public class PrimitiveConverter extends AbstractConverter {
*/
public Class[] getTypes() {
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};
}

@@ -84,10 +84,10 @@ public class PrimitiveConverter extends AbstractConverter {
* @param value The value to be converted
* @param type the desired type 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)) {
return new Character(value.charAt(0));
} else if (type.equals(Byte.TYPE)) {
@@ -102,12 +102,12 @@ public class PrimitiveConverter extends AbstractConverter {
return new Float(value);
} else if (type.equals(Double.TYPE)) {
return new Double(value);
} else if (type.equals(Boolean.class)
} else if (type.equals(Boolean.class)
|| type.equals(Boolean.TYPE)) {
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 org.apache.ant.common.antlib.AntContext;
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.
@@ -77,10 +77,10 @@ public class Ref extends SubBuild {
* @param context core's context
* @param componentType the component type of this component (i.e its
* 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)
throws ExecutionException {
throws AntException {
super.init(context, componentType);
}

@@ -109,9 +109,9 @@ public class Ref extends SubBuild {
/**
* 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);

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.TaskContainer;
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>
@@ -94,10 +94,10 @@ public class Sequential extends AbstractTask
/**
* Execute all nestedTasks.
*
* @exception ExecutionException if any of the nested tasks throws an
* @exception AntException if any of the nested tasks throws an
* exception
*/
public void execute() throws ExecutionException {
public void execute() throws AntException {
AntContext context = getAntContext();
ExecService execService
= (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.AbstractTask;
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.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
@@ -127,15 +128,15 @@ public abstract class SubBuild extends AbstractTask {
/**
* 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) {
throw new ExecutionException("\"name\" attribute of "
throw new ValidationException("\"name\" attribute of "
+ "<property> must be supplied");
}
if (value == null) {
throw new ExecutionException("\"value\" attribute of "
throw new ValidationException("\"value\" attribute of "
+ "<property> must be supplied");
}
}
@@ -152,7 +153,7 @@ public abstract class SubBuild extends AbstractTask {
/** The id of the reference to be passed */
private String refId;
/** 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
*/
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
*
* @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
*
* @exception ExecutionException if the refid attribute has not been
* @exception ValidationException if the refid attribute has not been
* set
*/
public void validateComponent() throws ExecutionException {
public void validateComponent() throws ValidationException {
if (refId == null) {
throw new ExecutionException("\"refid\" attribute of "
throw new ValidationException("\"refid\" attribute of "
+ "<reference> must be supplied");
}
}
@@ -234,17 +235,17 @@ public abstract class SubBuild extends AbstractTask {
* Add a 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
*/
public void addReference(Reference reference) throws ExecutionException {
public void addReference(Reference reference) throws AntException {
String refId = reference.getRefId();

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);
String toId = reference.getToId();
String toId = reference.getToRefId();

if (toId == null) {
toId = refId;
@@ -290,10 +291,10 @@ public abstract class SubBuild extends AbstractTask {
* @param context core's context
* @param componentType the component type of this component (i.e its
* 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)
throws ExecutionException {
throws AntException {
super.init(context, componentType);
dataService = (DataService) getCoreService(DataService.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.MalformedURLException;
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
*/
@@ -82,13 +82,13 @@ public class URLConverter extends AbstractConverter {
* @param value The value to be converted
* @param type the desired type 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 {
return new URL(value);
} 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;

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.AspectValueCollection;

@@ -63,19 +63,19 @@ import org.apache.ant.common.model.AspectValueCollection;
* @author Conor MacNeill
*/
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.
*/
private AntContext context;
/**
* Initialise the aspect with a context.
* Initialise the aspect with a 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;
}

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

/**
* 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
* unless another aspect has created the component
* @param model the Build model that applies to the component
*
* @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)
throws ExecutionException {
throws AntException {
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.
* 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 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;
}

@@ -126,20 +126,20 @@ public class AbstractAspect implements Aspect {
* 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
* @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
* @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 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;
}
/**
* This join point is activated after a task has executed. The aspect
* 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.
*
* @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) {
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;

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

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

@@ -121,11 +121,11 @@ public abstract class AbstractComponent implements ExecutionComponent {
* @param serviceClass the required interface of which an instance is
* required
* @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
*/
protected Object getCoreService(Class serviceClass)
throws ExecutionException {
throws AntException {
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;
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
@@ -90,9 +90,9 @@ public abstract class AbstractTask extends AbstractComponent implements Task {
* directly or indirectly.
*
* @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
log(line, MessageLevel.MSG_INFO);
}
@@ -104,9 +104,9 @@ public abstract class AbstractTask extends AbstractComponent implements Task {
* System.err, directly or indirectly.
*
* @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
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/>.
*/
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;

/**
@@ -80,10 +80,10 @@ public interface AntContext {
* @param serviceInterfaceClass the class object for the required
* 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)
throws ExecutionException;
throws AntException;

/**
* 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/>.
*/
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
@@ -68,9 +68,9 @@ public interface AntLibFactory {
* Initialise the factory
*
* @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
@@ -81,11 +81,11 @@ public interface AntLibFactory {
* @return an instance of the required class
* @exception InstantiationException if the class cannot be instantiated
* @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)
throws InstantiationException, IllegalAccessException,
ExecutionException;
AntException;

/**
* Create an instance of the given class
@@ -95,12 +95,12 @@ public interface AntLibFactory {
* @return a instance of the required class
* @exception InstantiationException if the class cannot be instantiated
* @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
*/
Object createInstance(Class requiredClass)
throws InstantiationException, IllegalAccessException,
ExecutionException;
AntException;


/**
@@ -108,11 +108,11 @@ public interface AntLibFactory {
* create method.
*
* @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
*/
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;

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.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
* 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
*/
public interface Aspect {
/**
* Initialise the aspect with a context.
* Initialise the aspect with a 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)
throws ExecutionException;
throws AntException;


/**
* 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
* unless another aspect has created the component
* @param model the Build model that applies to the component
*
* @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)
throws ExecutionException;
throws AntException;

/**
* 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.
* 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 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)
throws ExecutionException;
throws AntException;

/**
* 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
* @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
* @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 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
* 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);

/**
* 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.
*
* @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;

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

/**
* Convert between a string and a data type
*
@@ -69,9 +67,9 @@ public interface Converter {
* @param value The value to be converted
* @param type the desired type 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
@@ -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
* types indicated in getTypes. Most converters can return false here.
*
* @param subType the sub-type
* @return true if this converter can convert a string representation to
* @return true if this converter can convert a string representation to
* the given subclass of one of its main class
*/
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/>.
*/
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
@@ -68,20 +68,20 @@ public interface ExecutionComponent {
*
* @param context the Component's context
* @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)
throws ExecutionException;
throws AntException;

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

/**
* 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/>.
*/
package org.apache.ant.common.antlib;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.AntException;

/**
* Standard Ant Library Factory
@@ -74,11 +74,11 @@ public class StandardLibFactory implements AntLibFactory {
* @return an instance of the required class
* @exception InstantiationException if the class cannot be instantiated
* @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)
throws InstantiationException, IllegalAccessException,
ExecutionException {
AntException {
return componentClass.newInstance();
}

@@ -86,9 +86,9 @@ public class StandardLibFactory implements AntLibFactory {
* Initilaise the factory
*
* @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;
}

@@ -100,12 +100,12 @@ public class StandardLibFactory implements AntLibFactory {
* @return a instance of the required class
* @exception InstantiationException if the class cannot be instantiated
* @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
*/
public Object createInstance(Class requiredClass)
throws InstantiationException, IllegalAccessException,
ExecutionException {
AntException {
return requiredClass.newInstance();
}

@@ -114,11 +114,11 @@ public class StandardLibFactory implements AntLibFactory {
* create method.
*
* @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
*/
public void registerCreatedElement(Object createdElement)
throws ExecutionException {
throws AntException {
// 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/>.
*/
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.
@@ -64,9 +64,9 @@ public interface Task extends ExecutionComponent {
/**
* 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
@@ -89,9 +89,9 @@ public interface Task extends ExecutionComponent {
* directly or indirectly.
*
* @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
@@ -100,8 +100,8 @@ public interface Task extends ExecutionComponent {
* System.err, directly or indirectly.
*
* @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/>.
*/
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.
@@ -65,8 +65,8 @@ public interface TaskContainer {
* Add a task to the container.
*
* @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
* <http://www.apache.org/>.
*/
package org.apache.ant.cli;
package org.apache.ant.common.logger;

import java.io.PrintStream;
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
* <http://www.apache.org/>.
*/
package org.apache.ant.cli;
package org.apache.ant.common.logger;

import java.io.PrintStream;
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.util.Map;
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 importAll true if all components of the loaded libraries
* 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.
*/
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
@@ -94,9 +92,9 @@ public interface ComponentService {
* @param libraryId the library's unique identifier
* @param libPath the path to be added to the list of paths used by the
* 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
@@ -106,11 +104,11 @@ public interface ComponentService {
* instances
* @param loader the class loader to use to create the particular types
* @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,
String typeName, String className)
throws ExecutionException;
throws AntException;

/**
* Experimental - define a new task
@@ -120,11 +118,11 @@ public interface ComponentService {
* instances
* @param loader the class loader to use to create the particular tasks
* @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,
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
* build scripts. If this is null, the components default name is
* used.
* @exception ExecutionException if the component cannot be imported
* @exception AntException if the component cannot be imported
*/
void importComponent(String libraryId, String defName,
String alias) throws ExecutionException;
String alias) throws AntException;

/**
* Import a complete library into the current execution frame
*
* @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.
@@ -158,10 +156,10 @@ public interface ComponentService {
* @param alias the name under which this component will be used in the
* build scripts. If this is null, the components default name is
* used.
* @exception ExecutionException if the component cannot be imported
* @exception AntException if the component cannot be imported
*/
void importFrameComponent(String relativeName, String alias)
throws ExecutionException;
throws AntException;

/**
* 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
* @return the created component. The return type of this method depends
* 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
* taskdefs performed in the build.
*
@@ -184,11 +182,11 @@ public interface ComponentService {
* @param localName the name component within the library.
* @return the created component. The return type of this method depends
* 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)
throws ExecutionException;
throws AntException;
/**
* 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 ignoreUnsupported if this is true, attribute names for which no
* 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.
*/
void configureAttributes(Object object, Map attributeValues,
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;
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
@@ -70,9 +70,9 @@ public interface DataService {
* @param valueName the name of the data value
* @return the current object associated with the name or null if no
* value is currently associated with the name
* @exception ExecutionException if the value cannot be retrieved.
* @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
@@ -80,10 +80,10 @@ public interface DataService {
* @param name the name of the data value - may contain reference
* delimiters
* @return true if the value exists
* @exception ExecutionException if the containing frame for the value
* @exception AntException if the containing frame for the value
* 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
@@ -91,19 +91,19 @@ public interface DataService {
*
* @param valueName the name of the data value
* @param value the value to be associated with the name
* @exception ExecutionException if the value cannot be set
* @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
*
* @param valueName the name of the data value
* @param value the value to be associated with the name
* @exception ExecutionException if the value cannot be set
* @exception AntException if the value cannot be set
*/
void setMutableDataValue(String valueName, Object value)
throws ExecutionException;
throws AntException;

/**
* 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.
* @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
@@ -123,10 +123,10 @@ public interface DataService {
* @param value the string to be scanned for property references.
* @param replacementValues the collection of replacement values
* @return the string with all property references replaced
* @exception 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)
throws ExecutionException;
throws AntException;

/**
* 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;
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.
@@ -66,16 +66,16 @@ public interface EventService {
* Add a build listener to the current frame
*
* @param listener the lister which will receive build events
* @exception ExecutionException if the listener cannot be added
* @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
*
* @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 org.apache.ant.common.antlib.Task;
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.event.BuildListener;

/**
* The ExecService provides executiuon services to tasks
@@ -72,9 +73,9 @@ public interface ExecService {
*
* @param xmlBuildFile The file containing the XML build description.
* @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.
* @param model the project model.
* @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 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
* @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
*
* @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
* @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
* setup
* @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
* core
*
* @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.
* 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
* by their nature, aspect values are not part of the task configuration.
*
* @param task the task to be executed
* @param aspectValues the aspect attribute values.
* @exception 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.
*
@@ -164,6 +202,15 @@ public interface ExecService {
*/
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.
@@ -171,9 +218,9 @@ public interface ExecService {
* @param subbuildKey the core's key for managing the subbuild.
* @param line the content produce by the current thread.
* @param isErr true if this content is from the thread's error stream.
* @exception ExecutionException if the subbuild cannot be found.
* @exception AntException if the subbuild cannot be found.
*/
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;

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
@@ -70,8 +70,8 @@ public interface FileService {
*
* @param fileName the file name to be resolved.
* @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;

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
@@ -67,8 +67,8 @@ public interface InputService {
* Handle 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 */
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
* must be an absolute file and must not contain &quot;./&quot; or
* &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>.
* @param filename the filename to be resolved
* @return an absolute file that doesn't contain &quot;./&quot; or
* &quot;../&quot; sequences and uses the correct separator for the
* 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)
throws ExecutionException {
throws GeneralException {
String platformFilename = filename.replace('/', File.separatorChar)
.replace('\\', File.separatorChar);

@@ -126,7 +126,7 @@ public class FileUtils {
String msg = "The file or path you specified ("
+ filename + ") is invalid relative to "
+ file.getPath();
throw new ExecutionException(msg);
throw new GeneralException(msg);
}
} else if (part.equals(".")) {
// Do nothing here
@@ -153,11 +153,11 @@ public class FileUtils {
*
* @param path the path to be normalized
* @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.
*/
public File normalize(String path)
throws NullPointerException, ExecutionException {
throws NullPointerException, GeneralException {

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

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

/**
* 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
* @created 20 January 2002
*/
public class ExecutionException extends AntException {
public class GeneralException extends AntException {
/**
* Constructs an exception with the given descriptive message.
*
* @param msg Description of or information about the exception.
*/
public ExecutionException(String msg) {
public GeneralException(String msg) {
super(msg);
}


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


/**
* Constructs an exception with the given message and exception as a
* root cause.
@@ -90,11 +86,10 @@ public class ExecutionException extends AntException {
* @param msg Description of or information about the exception.
* @param cause Throwable that might have cause this one.
*/
public ExecutionException(String msg, Throwable cause) {
public GeneralException(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.
@@ -103,21 +98,20 @@ public class ExecutionException extends AntException {
* @param cause Exception that might have cause this one.
* @param location Location in the project file where the error occured.
*/
public ExecutionException(String msg, Throwable cause, Location location) {
public GeneralException(String msg, Throwable cause,
Location location) {
super(msg, cause, location);
}


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


/**
* Constructs an exception with the given exception as a root cause and
* a location in a file.
@@ -125,9 +119,8 @@ public class ExecutionException extends AntException {
* @param cause Exception that might have cause this one.
* @param location Location in the project file where the error occured.
*/
public ExecutionException(Throwable cause, Location location) {
public GeneralException(Throwable cause, Location 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 fragments the fragments parsed out of the string
* @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
*/
public static void parsePropertyString(String value, List fragments,
List propertyRefs)
throws ExecutionException {
throws GeneralException {
int prev = 0;
int pos;
while ((pos = value.indexOf("$", prev)) >= 0) {
@@ -94,7 +94,7 @@ public class PropertyUtils {
} else {
int endName = value.indexOf('}', pos);
if (endName < 0) {
throw new ExecutionException("Syntax error in property: "
throw new GeneralException("Syntax error in property: "
+ value);
}
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.Map;
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.xml.XMLParseException;
import org.apache.ant.common.event.BuildEvent;
import org.apache.ant.common.event.BuildListener;
import org.apache.ant.common.event.MessageLevel;
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.logger.DefaultLogger;
import org.apache.ant.common.logger.BuildLogger;
import org.apache.ant.init.InitConfig;
import org.apache.ant.init.InitUtils;
import org.apache.ant.frontend.FrontendUtils;
import org.apache.ant.frontend.FrontendException;

/**
* This is the command line front end. It drives the core.
@@ -141,34 +143,34 @@ public class Commandline {
* Adds a feature to the BuildListeners attribute of the Commandline
* object
*
* @param execManager The feature to be added to the BuildListeners
* attribute
* @exception ConfigException if the necessary listener instances could
* @param eventSource the build event source to which listeners
* will be added.
* @exception FrontendException if the necessary listener instances could
* not be created
*/
protected void addBuildListeners(ExecutionManager execManager)
throws ConfigException {
protected void addBuildListeners(Frame eventSource)
throws FrontendException {

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

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

AntConfig config = new AntConfig();
AntConfig userConfig =
AntConfig userConfig =
FrontendUtils.getAntConfig(initConfig.getUserConfigArea());
AntConfig systemConfig
= FrontendUtils.getAntConfig(initConfig.getSystemConfigArea());
@@ -227,28 +229,28 @@ public class Commandline {

for (Iterator i = configFiles.iterator(); i.hasNext();) {
File configFile = (File) i.next();
AntConfig runConfig
AntConfig runConfig
= FrontendUtils.getAntConfigFile(configFile);
config.merge(runConfig);
}

if (!buildFileURL.getProtocol().equals("file")
&& !config.isRemoteProjectAllowed()) {
throw new ConfigException("Remote Projects are not allowed: "
throw new FrontendException("Remote Projects are not allowed: "
+ buildFileURL);
}

project = parseProject();

// create the execution manager to execute the build
executionManager = new ExecutionManager(initConfig, config);
mainFrame = new Frame(initConfig, config);
OutputStream demuxOut
= new DemuxOutputStream(executionManager, false);
= new DemuxOutputStream(mainFrame, false);
OutputStream demuxErr
= new DemuxOutputStream(executionManager, true);
= new DemuxOutputStream(mainFrame, true);
System.setOut(new PrintStream(demuxOut));
System.setErr(new PrintStream(demuxErr));
addBuildListeners(executionManager);
addBuildListeners(mainFrame);
} catch (Throwable e) {
if (logger != null) {
BuildEvent finishedEvent
@@ -261,7 +263,10 @@ public class Commandline {
}

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

mainFrame.startBuild(targets);
System.exit(0);
} catch (Throwable t) {
System.exit(1);
@@ -285,9 +290,9 @@ public class Commandline {
* Handle build file argument
*
* @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 {
if (url.indexOf(":") == -1) {
// We convert any hash characters to their URL escape.
@@ -296,7 +301,7 @@ public class Commandline {
buildFileURL = new URL(url);
}
} 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
*
* @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 {
File logFile = new File(arg);
out = new PrintStream(new FileOutputStream(logFile));
err = out;
} 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 " +
"you have write permissions.", ioe);
}
@@ -322,11 +327,11 @@ public class Commandline {
* Handle the logger attribute
*
* @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) {
throw new ConfigException("Only one logger class may be " +
throw new FrontendException("Only one logger class may be " +
"specified.");
}
loggerClassname = arg;
@@ -336,14 +341,14 @@ public class Commandline {
/**
* 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) {
File defaultBuildFile
File defaultBuildFile
= new File(FrontendUtils.DEFAULT_BUILD_FILENAME);
if (!defaultBuildFile.exists()) {
File ant1BuildFile
File ant1BuildFile
= new File(FrontendUtils.DEFAULT_ANT1_FILENAME);
if (ant1BuildFile.exists()) {
defaultBuildFile = ant1BuildFile;
@@ -352,7 +357,7 @@ public class Commandline {
try {
buildFileURL = InitUtils.getFileURL(defaultBuildFile);
} 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.
*
* @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.
*/
private void parseArguments(String[] args)
throws ConfigException {
throws FrontendException {

int i = 0;
while (i < args.length) {
@@ -417,9 +422,9 @@ public class Commandline {
* Creates the default build logger for sending build events to the ant
* 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) {
try {
Class loggerClass = Class.forName(loggerClassname);
@@ -428,13 +433,13 @@ public class Commandline {
System.err.println("The specified logger class "
+ loggerClassname +
" does not implement the BuildLogger interface");
throw new ConfigException("Unable to instantiate logger "
throw new FrontendException("Unable to instantiate logger "
+ loggerClassname, e);
} catch (Exception e) {
System.err.println("Unable to instantiate specified logger "
+ "class " + loggerClassname + " : "
+ e.getClass().getName());
throw new ConfigException("Unable to instantiate logger "
throw new FrontendException("Unable to instantiate logger "
+ loggerClassname, e);
}
} 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.xml.ParseContext;
import org.apache.ant.antcore.xml.XMLParseException;
import org.apache.ant.common.util.ConfigException;
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
* @return the AntConfig instance representing the config info read in
* from the config area. May be null if the AntConfig is not present
* @exception ConfigException if the URL for the config file cannotbe
* @exception FrontendException if the URL for the config file cannotbe
* formed.
*/
public static AntConfig getAntConfig(File configArea)
throws ConfigException {
throws FrontendException {
File configFile = new File(configArea, "antconfig.xml");

try {
@@ -105,11 +104,11 @@ public class FrontendUtils {
*
* @param configFile the file containing the XML config
* @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.
*/
public static AntConfig getAntConfigFile(File configFile)
throws ConfigException, FileNotFoundException {
throws FrontendException, FileNotFoundException {
try {
URL configFileURL = InitUtils.getFileURL(configFile);

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

return configHandler.getAntConfig();
} 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) {
if (e.getCause() instanceof FileNotFoundException) {
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