ant-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From co...@apache.org
Subject cvs commit: jakarta-ant/proposal/mutant/src/script mutant
Date Wed, 26 Jun 2002 14:45:49 GMT
conor       2002/06/26 07:45:49

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

--
To unsubscribe, e-mail:   <mailto:ant-dev-unsubscribe@jakarta.apache.org>
For additional commands, e-mail: <mailto:ant-dev-help@jakarta.apache.org>


Mime
View raw message