ant-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From dona...@apache.org
Subject cvs commit: jakarta-ant-myrmidon/ant1compat/src/test/org/apache/tools/ant/test/subdir build.xml
Date Sun, 14 Apr 2002 12:38:41 GMT
donaldp     02/04/14 05:38:41

  Added:       ant1compat .cvsignore build.xml project.properties
               ant1compat/src/conf ant-descriptor.xml ant1compat.mf
               ant1compat/src/java/org/apache/tools/ant
                        Ant1CompatConfigurer.java Ant1CompatProject.java
                        Ant1CompatTaskAdapter.java
                        Ant1CompatTypeInstanceTask.java BuildException.java
                        LoaderUtils.java OriginalAnt1Task.java
                        Resources.properties Task.java
               ant1compat/src/java/org/apache/tools/ant/taskdefs
                        AbstractAnt1AntTask.java Ant.java CallTarget.java
               ant1compat/src/java/org/apache/tools/ant/types Path.java
               ant1compat/src/test/org/apache/tools/ant/test
                        Ant1CompatTestCase.java ant-task-test.xml
                        antcall-task-test.xml basic-test.xml
                        if-unless-test.xml
               ant1compat/src/test/org/apache/tools/ant/test/subdir
                        build.xml
  Log:
  Add in source files for ant1 layer.
  
  It currently does not compile as it relies on AbstractProjectTest. We should probably move this into a more accessible location (ie jar it up in framework or antlib or something).
  
  Revision  Changes    Path
  1.1                  jakarta-ant-myrmidon/ant1compat/.cvsignore
  
  Index: .cvsignore
  ===================================================================
  ant.properties
  build
  checkstyle.cache
  distributions
  dist
  aut-*
  *.el
  *.ipr
  
  
  
  1.1                  jakarta-ant-myrmidon/ant1compat/build.xml
  
  Index: build.xml
  ===================================================================
  <?xml version="1.0"?>
  
  <project name="Myrmidon Ant1Compat" default="main" basedir=".">
  
      <!-- load per-project properties -->
      <property file="project.properties"/>
  
      <!--
        Give user a chance to override without editing this file
        (and without typing -D each time he compiles it)
      -->
      <property file="ant.properties"/>
      <property file="../ant.properties"/>
      <property file="${user.home}/.ant.properties"/>
  
      <!-- Settings used to configure compile environment -->
      <property name="build.debug" value="on"/>
      <property name="build.optimize" value="off"/>
      <property name="build.deprecation" value="off"/>
      <property name="build.compress" value="false"/>
      <property name="junit.failonerror" value="false"/>
  
      <!-- location of intermediate products -->
      <property name="build.dir" value="build"/>
      <property name="build.lib" value="${build.dir}/lib"/>
      <property name="build.conf" value="${build.dir}/conf"/>
      <property name="build.classes" value="${build.dir}/classes"/>
      <property name="build.tests" value="${build.dir}/tests"/>
      <property name="build.reports" value="${build.dir}/reports"/>
  
      <!-- Set the properties for source directories -->
      <property name="src.dir" value="src"/>
      <property name="java.dir" value="${src.dir}/java"/>
      <property name="conf.dir" value="${src.dir}/conf"/>
      <property name="test.dir" value="${src.dir}/test"/>
  
      <!-- Set the properties for distribution directories -->
      <property name="dist.dir" value="dist"/>
      <property name="dist.javadocs" value="${dist.dir}/docs/api"/>
  
      <!-- property to specify name of zip/jar files -->
      <property name="dist.name" value="${name}-${version}"/>
  
      <!-- property indicating directory where all distribution archives are placed -->
      <property name="dist.base" value="distributions"/>
  
      <!-- Classpath for product -->
      <path id="project.class.path">
          <pathelement path="${java.class.path}"/>
          <pathelement location="${build.classes}"/>
          <pathelement location="${junit.jar}"/>
          <pathelement location="${checkstyle.jar}"/>
          <pathelement location="../aut/build/lib/myrmidon-aut-1.0.jar"/>
          <pathelement location="../api/build/lib/myrmidon-api-1.0.jar"/>
          <pathelement location="../container/build/lib/myrmidon-container-api-1.0.jar"/>
          <fileset dir="../lib">
              <include name="*.jar"/>
          </fileset>
      </path>
  
      <target name="main" depends="jar" description="Build the project"/>
      <target name="rebuild" depends="clean,main" description="Rebuild the project"/>
  
      <target name="prepare">
          <available property="jcifs.present"
              classname="jcifs.smb.SmbFile"
              classpathref="project.class.path" />
          <available property="netcomp.present"
              classname="com.oroinc.net.ftp.FTPClient"
              classpathref="project.class.path" />
      </target>
  
      <!-- Compiles the source code -->
      <target name="compile" depends="prepare" description="Compiles the source code">
  
          <mkdir dir="${build.classes}"/>
  
          <!-- Compile all classes including the tests. -->
          <javac srcdir="${java.dir}"
              destdir="${build.classes}"
              debug="${build.debug}"
              optimize="${build.optimize}"
              deprecation="${build.deprecation}"
              target="1.2">
              <classpath refid="project.class.path" />
              <src path="${test.dir}"/>
              <include name="**/*.java"/>
              <exclude name="org/apache/aut/vfs/provider/smb/**/*.java"
                       unless="jcifs.present" />
              <exclude name="org/apache/aut/vfs/provider/ftp/**/*.java"
                       unless="netcomp.present" />
          </javac>
  
          <!-- copy resources to same location as .class files -->
          <copy todir="${build.classes}">
              <fileset dir="${java.dir}">
                  <exclude name="**/*.java"/>
              </fileset>
          </copy>
  
          <copy todir="${build.classes}">
              <fileset dir="${test.dir}">
                  <exclude name="**/*.java"/>
              </fileset>
          </copy>
  
      </target>
  
      <!-- Copies and filters the manifest and license. Used by jar and dist -->
      <target name="prepare-conf">
          <mkdir dir="${build.conf}"/>
          <copy todir="${build.conf}" flatten="true">
              <fileset dir="../" includes="LICENSE.txt"/>
              <fileset dir="${conf.dir}">
                  <include name="MANIFEST.MF"/>
                  <include name="*.xml"/>
              </fileset>
              <filterset>
                  <filtersfile file="project.properties"/>
              </filterset>
          </copy>
  
      </target>
  
      <!-- Creates all the .jar file -->
      <target name="jar" depends="compile, prepare-conf" description="Generates the jar files">
  
          <mkdir dir="${build.lib}"/>
  
          <jar jarfile="${build.lib}/${dist.name}.jar"
              basedir="${build.classes}"
              compress="${build.compress}"
              manifest="${build.conf}/MANIFEST.MF">
              <exclude name="**/test/**"/>
              <zipfileset dir="${build.conf}" prefix="META-INF/">
                  <include name="LICENSE.txt"/>
                  <include name="*.xml"/>
              </zipfileset>
          </jar>
      </target>
  
      <!-- Creates all the Javadocs -->
      <target name="javadocs" depends="compile" description="Generates the javadocs">
  
          <mkdir dir="${dist.javadocs}"/>
          <javadoc packagenames="org.apache.*"
              sourcepath="${java.dir}"
              destdir="${dist.javadocs}">
              <classpath refid="project.class.path" />
              <doclet name="com.sun.tools.doclets.standard.Standard">
                  <param name="-author"/>
                  <param name="-version"/>
                  <param name="-doctitle" value="${Name}"/>
                  <param name="-windowtitle" value="${Name} API"/>
                  <param name="-link" value="http://java.sun.com/j2se/1.4/docs/api/"/>
                  <param name="-link" value="http://java.sun.com/j2ee/sdk_1.3/techdocs/api/"/>
                  <param name="-link" value="http://jakarta.apache.org/avalon/api/"/>
                  <param name="-bottom"
                      value="&quot;Copyright &#169; ${year} Apache Jakarta Project. All Rights Reserved.&quot;"/>
              </doclet>
          </javadoc>
      </target>
  
      <target name="mktestdata" depends="prepare" description="Regenerate test data">
  
          <property name="test.vfs.dir" location="src/test/org/apache/aut/vfs/test"/>
          <mkdir dir="${test.vfs.dir}/basedir/emptydir"/>
          <property name="test.zip.dir" location="src/test/org/apache/aut/vfs/provider/zip/test"/>
          <zip zipfile="${test.zip.dir}/test.zip">
              <fileset dir="${test.vfs.dir}" includes="basedir/**"/>
          </zip>
          <zip zipfile="${test.zip.dir}/nested.zip">
              <fileset dir="${test.zip.dir}" includes="test.zip"/>
          </zip>
  
      </target>
  
      <target name="test" depends="compile" description="Perform the unit tests">
  
          <echo message="Performing Unit Tests" />
  
          <mkdir dir="${build.tests}"/>
  
          <property name="test.working.dir" location="${build.dir}/test"/>
  
          <!-- Prepare the VFS tests -->
          <copy todir="${test.working.dir}">
              <fileset dir="${test.dir}">
                  <exclude name="**/*.java"/>
              </fileset>
          </copy>
  
          <junit fork="false"
              haltonfailure="${junit.failonerror}"
              printsummary="yes"
              dir="${build.tests}">
              <classpath refid="project.class.path"/>
              <sysproperty key="test.basedir" value="${test.working.dir}"/>
  
              <formatter type="xml"/>    <!-- xml reports for junitreport -->
              <formatter type="plain"/>  <!-- text reports for humans     -->
  
              <batchtest todir="${build.tests}">
                  <fileset dir="${build.classes}">
                      <include name="**/test/*TestCase.class"/>
                      <exclude name="**/SmbFileSystemTestCase.class" unless="test.smb"/>
                      <exclude name="**/FtpFileSystemTestCase.class" unless="test.ftp"/>
                      <exclude name="**/Abstract*"/>
                  </fileset>
              </batchtest>
          </junit>
  
      </target>
  
      <target name="test-reports" depends="test" description="Generate Reports for the unit tests">
  
          <mkdir dir="${build.reports}/junit"/>
  
          <junitreport todir="${build.reports}/junit">
              <fileset dir="${build.tests}">
                  <include name="TEST-*.xml"/>
              </fileset>
              <report format="frames" todir="${build.reports}/junit"/>
          </junitreport>
  
          <!-- Clean up the xml reports used by the junitreport task -->
          <!--
          <delete>
              <fileset dir="${build.tests}" includes="TEST-*.xml"/>
              <fileset dir="${build.tests}" includes="TESTS-*.xml"/>
          </delete>
          -->
  
      </target>
  
      <target name="checkstyle" if="do.checkstyle" description="Checkstyle">
  
          <!-- this invocation of checkstyle requires that checkstyle be downloaded and setup -->
          <!-- thats why you are required to define do.checkstyle property to generate the report -->
          <taskdef name="checkstyle"
              classname="com.puppycrawl.tools.checkstyle.CheckStyleTask">
              <classpath refid="project.class.path"/>
          </taskdef>
          <checkstyle
              lcurlyType="nl"
              lcurlyMethod="nl"
              lcurlyOther="nl"
              rcurly="ignore"
              allowProtected="false"
              allowPackage="false"
              allowNoAuthor="false"
              maxLineLen="100"
              maxMethodLen="100"
              maxConstructorLen="100"
              memberPattern="^m_[a-z][a-zA-Z0-9]*$"
              staticPattern="^c_[a-z][a-zA-Z0-9]*$"
              constPattern="(^c_[a-z][a-zA-Z0-9]*$)|([A-Z_]*$)"
              ignoreImportLen="true"
              allowTabs="false"
              javadocScope="protected"
              ignoreWhitespace="true"
              cacheFile="checkstyle.cache"
              failOnViolation="false"
              ignoreCastWhitespace="true">
              <fileset dir="${java.dir}">
                  <include name="**/*.java"/>
              </fileset>
              <formatter type="plain"/>
              <formatter type="xml" toFile="build/checkstyle-results.xml"/>
          </checkstyle>
      </target>
  
      <target name="checkstyle-report"
          depends="checkstyle"
          if="do.checkstyle"
          description="Generate Checkstyle Report">
  
          <mkdir dir="${build.reports}/checkstyle"/>
          <property name="checkstyle.pathhack" location="."/>
          <style style="../tools/etc/checkstyle-frames.xsl" in="build/checkstyle-results.xml"
              out="${build.reports}/checkstyle/delete-me.html">
              <param name="pathhack" expression="${checkstyle.pathhack}"/>
          </style>
  
      </target>
  
      <!-- Creates the distribution -->
      <target name="dist"
          depends="prepare-conf, jar, test-reports, checkstyle-report, javadocs"
          description="Generates the jar files">
  
          <mkdir dir="${dist.dir}"/>
          <copy file="${build.lib}/${dist.name}.jar" todir="${dist.dir}"/>
          <copy file="${build.conf}/LICENSE.txt" todir="${dist.dir}"/>
          <copy file="../KEYS" todir="${dist.dir}"/>
          <copy file="README.txt" todir="${dist.dir}"/>
  
          <mkdir dir="${dist.base}"/>
  
          <zip zipfile="${dist.base}/${dist.name}-bin.zip" compress="true">
              <zipfileset dir="${dist.dir}" prefix="${dist.name}"/>
          </zip>
  
          <!--
            Not supported by released ant but when it is we should enable this across
            all of the products
          <tar longfile="gnu" tarfile="${dist.base}/${dist.name}-bin.tar">
            <tarfileset dir="${dist.dir}"
                        prefix="${dist.name}"
                        username="avalon"
                        group="avalon"/>
          </tar>
  
          <gzip zipfile="${dist.base}/${dist.name}-bin.tar.gz"
                src="${dist.name}-bin.tar"/>
          <bzip2 zipfile="${dist.base}/${dist.name}-bin.tar.gz"
                 src="${dist.name}-bin.tar"/>
  
          <delete file="${dist.base}/${dist.name}-bin.tar"/>
  
          <checksum fileext=".md5">
            <fileset dir="${dist.base}" />
          </checksum>
          -->
          <delete dir="${dist.dir}" />
  
      </target>
  
      <!-- Cleans up build and distribution directories -->
      <target name="clean" description="Cleans up the project">
          <delete file="checkstyle.cache"/>
          <delete dir="${build.dir}" />
          <delete dir="${dist.dir}" />
          <delete dir="test" /> <!-- unit testing output directory -->
          <delete>
              <fileset dir="." includes="**/*~" defaultexcludes="no"/>
          </delete>
      </target>
  
      <target name="real-clean" depends="clean" description="Cleans up the project, including distributions">
          <delete dir="${dist.base}" />
      </target>
  
  </project>
  
  
  
  1.1                  jakarta-ant-myrmidon/ant1compat/project.properties
  
  Index: project.properties
  ===================================================================
  name=Amyrmidon-ant1compat
  Name=Myrmidon Ant1Compat
  dir-name=ant1compat
  version=1.0
  year=2000-2002
  
  
  
  1.1                  jakarta-ant-myrmidon/ant1compat/src/conf/ant-descriptor.xml
  
  Index: ant-descriptor.xml
  ===================================================================
  <ant-lib version="1.0">
  
      <types>
          <!-- Type instance tasks -->
          <task name="ant1.path"
              classname="org.apache.tools.ant.Ant1CompatTypeInstanceTask" />
          <task name="ant1.patternset"
              classname="org.apache.tools.ant.Ant1CompatTypeInstanceTask" />
          <task name="ant1.filterset"
              classname="org.apache.tools.ant.Ant1CompatTypeInstanceTask" />
  
          <!-- TaskAdapter tasks -->
          <task name="ant1.condition"
              classname="org.apache.tools.ant.Ant1CompatTaskAdapter" />
              
          <!-- Tasks specialised for myrmidon -->
          <task name="ant1.ant"
                classname="org.apache.tools.ant.taskdefs.Ant" />
           <task name="ant1.antcall"
              classname="org.apache.tools.ant.taskdefs.CallTarget" />
  
          <!-- standard ant tasks -->
          <task name="ant1.mkdir"
              classname="org.apache.tools.ant.taskdefs.Mkdir" />
          <task name="ant1.javac"
              classname="org.apache.tools.ant.taskdefs.Javac" />
          <task name="ant1.chmod"
              classname="org.apache.tools.ant.taskdefs.Chmod" />
          <task name="ant1.delete"
              classname="org.apache.tools.ant.taskdefs.Delete" />
          <task name="ant1.copy"
              classname="org.apache.tools.ant.taskdefs.Copy" />
          <task name="ant1.move"
              classname="org.apache.tools.ant.taskdefs.Move" />
          <task name="ant1.jar"
              classname="org.apache.tools.ant.taskdefs.Jar" />
          <task name="ant1.rmic"
              classname="org.apache.tools.ant.taskdefs.Rmic" />
          <task name="ant1.cvs"
              classname="org.apache.tools.ant.taskdefs.Cvs" />
          <task name="ant1.get"
              classname="org.apache.tools.ant.taskdefs.Get" />
          <task name="ant1.unzip"
              classname="org.apache.tools.ant.taskdefs.Expand" />
          <task name="ant1.unjar"
              classname="org.apache.tools.ant.taskdefs.Expand" />
          <task name="ant1.unwar"
              classname="org.apache.tools.ant.taskdefs.Expand" />
          <task name="ant1.echo"
              classname="org.apache.tools.ant.taskdefs.Echo" />
          <task name="ant1.javadoc"
              classname="org.apache.tools.ant.taskdefs.Javadoc" />
          <task name="ant1.zip"
              classname="org.apache.tools.ant.taskdefs.Zip" />
          <task name="ant1.gzip"
              classname="org.apache.tools.ant.taskdefs.GZip" />
          <task name="ant1.gunzip"
              classname="org.apache.tools.ant.taskdefs.GUnzip" />
          <task name="ant1.replace"
              classname="org.apache.tools.ant.taskdefs.Replace" />
          <task name="ant1.java"
              classname="org.apache.tools.ant.taskdefs.Java" />
          <task name="ant1.tstamp"
              classname="org.apache.tools.ant.taskdefs.Tstamp" />
          <task name="ant1.property"
              classname="org.apache.tools.ant.taskdefs.Property" />
          <task name="ant1.taskdef"
              classname="org.apache.tools.ant.taskdefs.Taskdef" />
          <task name="ant1.exec"
              classname="org.apache.tools.ant.taskdefs.ExecTask" />
          <task name="ant1.tar"
              classname="org.apache.tools.ant.taskdefs.Tar" />
          <task name="ant1.untar"
              classname="org.apache.tools.ant.taskdefs.Untar" />
          <task name="ant1.available"
              classname="org.apache.tools.ant.taskdefs.Available" />
          <task name="ant1.filter"
              classname="org.apache.tools.ant.taskdefs.Filter" />
          <task name="ant1.fixcrlf"
              classname="org.apache.tools.ant.taskdefs.FixCRLF" />
          <task name="ant1.patch"
              classname="org.apache.tools.ant.taskdefs.Patch" />
          <task name="ant1.style"
              classname="org.apache.tools.ant.taskdefs.XSLTProcess" />
          <task name="ant1.touch"
              classname="org.apache.tools.ant.taskdefs.Touch" />
          <task name="ant1.signjar"
              classname="org.apache.tools.ant.taskdefs.SignJar" />
          <task name="ant1.genkey"
              classname="org.apache.tools.ant.taskdefs.GenerateKey" />
          <task name="ant1.antstructure"
              classname="org.apache.tools.ant.taskdefs.AntStructure" />
          <task name="ant1.execon"
              classname="org.apache.tools.ant.taskdefs.ExecuteOn" />
          <task name="ant1.sql"
              classname="org.apache.tools.ant.taskdefs.SQLExec" />
          <task name="ant1.mail"
              classname="org.apache.tools.ant.taskdefs.email.EmailTask" />
          <task name="ant1.fail"
              classname="org.apache.tools.ant.taskdefs.Exit" />
          <task name="ant1.war"
              classname="org.apache.tools.ant.taskdefs.War" />
          <task name="ant1.uptodate"
              classname="org.apache.tools.ant.taskdefs.UpToDate" />
          <task name="ant1.apply"
              classname="org.apache.tools.ant.taskdefs.Transform" />
          <task name="ant1.record"
              classname="org.apache.tools.ant.taskdefs.Recorder" />
          <task name="ant1.cvspass"
              classname="org.apache.tools.ant.taskdefs.CVSPass" />
          <task name="ant1.typedef"
              classname="org.apache.tools.ant.taskdefs.Typedef" />
          <task name="ant1.sleep"
              classname="org.apache.tools.ant.taskdefs.Sleep" />
          <task name="ant1.pathconvert"
              classname="org.apache.tools.ant.taskdefs.PathConvert" />
          <task name="ant1.ear"
              classname="org.apache.tools.ant.taskdefs.Ear" />
          <task name="ant1.parallel"
              classname="org.apache.tools.ant.taskdefs.Parallel" />
          <task name="ant1.sequential"
              classname="org.apache.tools.ant.taskdefs.Sequential" />
          <task name="ant1.dependset"
              classname="org.apache.tools.ant.taskdefs.DependSet" />
          <task name="ant1.bzip2"
              classname="org.apache.tools.ant.taskdefs.BZip2" />
          <task name="ant1.bunzip2"
              classname="org.apache.tools.ant.taskdefs.BUnzip2" />
          <task name="ant1.checksum"
              classname="org.apache.tools.ant.taskdefs.Checksum" />
          <task name="ant1.waitfor"
              classname="org.apache.tools.ant.taskdefs.WaitFor" />
          <task name="ant1.input"
              classname="org.apache.tools.ant.taskdefs.Input" />
          <task name="ant1.loadfile"
              classname="org.apache.tools.ant.taskdefs.LoadFile" />
          <task name="ant1.manifest"
              classname="org.apache.tools.ant.taskdefs.Manifest" />
          <task name="ant1.loadproperties"
              classname="org.apache.tools.ant.taskdefs.LoadProperties" />
  
          <!-- optional tasks -->
          <task name="ant1.script"
              classname="org.apache.tools.ant.taskdefs.optional.Script" />
          <task name="ant1.netrexxc"
              classname="org.apache.tools.ant.taskdefs.optional.NetRexxC" />
          <task name="ant1.renameext"
              classname="org.apache.tools.ant.taskdefs.optional.RenameExtensions" />
          <task name="ant1.ejbc"
              classname="org.apache.tools.ant.taskdefs.optional.ejb.Ejbc" />
          <task name="ant1.ddcreator"
              classname="org.apache.tools.ant.taskdefs.optional.ejb.DDCreator" />
          <task name="ant1.wlrun"
              classname="org.apache.tools.ant.taskdefs.optional.ejb.WLRun" />
          <task name="ant1.wlstop"
              classname="org.apache.tools.ant.taskdefs.optional.ejb.WLStop" />
          <task name="ant1.vssget"
              classname="org.apache.tools.ant.taskdefs.optional.vss.MSVSSGET" />
          <task name="ant1.ejbjar"
              classname="org.apache.tools.ant.taskdefs.optional.ejb.EjbJar" />
          <task name="ant1.mparse"
              classname="org.apache.tools.ant.taskdefs.optional.metamata.MParse" />
          <task name="ant1.mmetrics"
              classname="org.apache.tools.ant.taskdefs.optional.metamata.MMetrics" />
          <task name="ant1.maudit"
              classname="org.apache.tools.ant.taskdefs.optional.metamata.MAudit" />
          <task name="ant1.junit"
              classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTask" />
          <task name="ant1.cab"
              classname="org.apache.tools.ant.taskdefs.optional.Cab" />
          <task name="ant1.ftp"
              classname="org.apache.tools.ant.taskdefs.optional.net.FTP" />
          <task name="ant1.icontract"
              classname="org.apache.tools.ant.taskdefs.optional.IContract" />
          <task name="ant1.javacc"
              classname="org.apache.tools.ant.taskdefs.optional.javacc.JavaCC" />
          <task name="ant1.jjtree"
              classname="org.apache.tools.ant.taskdefs.optional.javacc.JJTree" />
          <task name="ant1.stcheckout"
              classname="org.apache.tools.ant.taskdefs.optional.starteam.StarTeamCheckout" />
          <task name="ant1.stcheckin"
              classname="org.apache.tools.ant.taskdefs.optional.starteam.StarTeamCheckin" />
          <task name="ant1.stlabel"
              classname="org.apache.tools.ant.taskdefs.optional.starteam.StarTeamLabel" />
          <task name="ant1.stlist"
              classname="org.apache.tools.ant.taskdefs.optional.starteam.StarTeamList" />
          <task name="ant1.wljspc"
              classname="org.apache.tools.ant.taskdefs.optional.jsp.WLJspc" />
          <task name="ant1.jlink"
              classname="org.apache.tools.ant.taskdefs.optional.jlink.JlinkTask" />
          <task name="ant1.native2ascii"
              classname="org.apache.tools.ant.taskdefs.optional.Native2Ascii" />
          <task name="ant1.propertyfile"
              classname="org.apache.tools.ant.taskdefs.optional.PropertyFile" />
          <task name="ant1.depend"
              classname="org.apache.tools.ant.taskdefs.optional.depend.Depend" />
          <task name="ant1.antlr"
              classname="org.apache.tools.ant.taskdefs.optional.ANTLR" />
          <task name="ant1.vajload"
              classname="org.apache.tools.ant.taskdefs.optional.ide.VAJLoadProjects" />
          <task name="ant1.vajexport"
              classname="org.apache.tools.ant.taskdefs.optional.ide.VAJExport" />
          <task name="ant1.vajimport"
              classname="org.apache.tools.ant.taskdefs.optional.ide.VAJImport" />
          <task name="ant1.telnet"
              classname="org.apache.tools.ant.taskdefs.optional.net.TelnetTask" />
          <task name="ant1.csc"
              classname="org.apache.tools.ant.taskdefs.optional.dotnet.CSharp" />
          <task name="ant1.ilasm"
              classname="org.apache.tools.ant.taskdefs.optional.dotnet.Ilasm" />
          <task name="ant1.stylebook"
              classname="org.apache.tools.ant.taskdefs.optional.StyleBook" />
          <task name="ant1.test"
              classname="org.apache.tools.ant.taskdefs.optional.Test" />
          <task name="ant1.pvcs"
              classname="org.apache.tools.ant.taskdefs.optional.pvcs.Pvcs" />
          <task name="ant1.p4change"
              classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Change" />
          <task name="ant1.p4label"
              classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Label" />
          <task name="ant1.p4have"
              classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Have" />
          <task name="ant1.p4sync"
              classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Sync" />
          <task name="ant1.p4edit"
              classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Edit" />
          <task name="ant1.p4submit"
              classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Submit" />
          <task name="ant1.p4counter"
              classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Counter" />
          <task name="ant1.javah"
              classname="org.apache.tools.ant.taskdefs.optional.Javah" />
          <task name="ant1.ccupdate"
              classname="org.apache.tools.ant.taskdefs.optional.clearcase.CCUpdate" />
          <task name="ant1.cccheckout"
              classname="org.apache.tools.ant.taskdefs.optional.clearcase.CCCheckout" />
          <task name="ant1.cccheckin"
              classname="org.apache.tools.ant.taskdefs.optional.clearcase.CCCheckin" />
          <task name="ant1.ccuncheckout"
              classname="org.apache.tools.ant.taskdefs.optional.clearcase.CCUnCheckout" />
          <task name="ant1.sound"
              classname="org.apache.tools.ant.taskdefs.optional.sound.SoundTask" />
          <task name="ant1.junitreport"
              classname="org.apache.tools.ant.taskdefs.optional.junit.XMLResultAggregator" />
          <task name="ant1.vsslabel"
              classname="org.apache.tools.ant.taskdefs.optional.vss.MSVSSLABEL" />
          <task name="ant1.vsshistory"
              classname="org.apache.tools.ant.taskdefs.optional.vss.MSVSSHISTORY" />
          <task name="ant1.blgenclient"
              classname="org.apache.tools.ant.taskdefs.optional.ejb.BorlandGenerateClient" />
          <task name="ant1.rpm"
              classname="org.apache.tools.ant.taskdefs.optional.Rpm" />
          <task name="ant1.xmlvalidate"
              classname="org.apache.tools.ant.taskdefs.optional.XMLValidateTask" />
          <task name="ant1.vsscheckin"
              classname="org.apache.tools.ant.taskdefs.optional.vss.MSVSSCHECKIN" />
          <task name="ant1.vsscheckout"
              classname="org.apache.tools.ant.taskdefs.optional.vss.MSVSSCHECKOUT" />
          <task name="ant1.iplanet-ejbc"
              classname="org.apache.tools.ant.taskdefs.optional.ejb.IPlanetEjbcTask" />
          <task name="ant1.jdepend"
              classname="org.apache.tools.ant.taskdefs.optional.jdepend.JDependTask" />
          <task name="ant1.mimemail"
              classname="org.apache.tools.ant.taskdefs.optional.net.MimeMail" />
          <task name="ant1.ccmcheckin"
              classname="org.apache.tools.ant.taskdefs.optional.ccm.CCMCheckin" />
          <task name="ant1.ccmcheckout"
              classname="org.apache.tools.ant.taskdefs.optional.ccm.CCMCheckout" />
          <task name="ant1.ccmcheckintask"
              classname="org.apache.tools.ant.taskdefs.optional.ccm.CCMCheckinDefault" />
          <task name="ant1.ccmreconfigure"
              classname="org.apache.tools.ant.taskdefs.optional.ccm.CCMReconfigure" />
          <task name="ant1.ccmcreatetask"
              classname="org.apache.tools.ant.taskdefs.optional.ccm.CCMCreateTask" />
          <task name="ant1.jpcoverage"
              classname="org.apache.tools.ant.taskdefs.optional.sitraka.Coverage" />
          <task name="ant1.jpcovmerge"
              classname="org.apache.tools.ant.taskdefs.optional.sitraka.CovMerge" />
          <task name="ant1.jpcovreport"
              classname="org.apache.tools.ant.taskdefs.optional.sitraka.CovReport" />
          <task name="ant1.p4add"
              classname="org.apache.tools.ant.taskdefs.optional.perforce.P4Add" />
          <task name="ant1.jspc"
              classname="org.apache.tools.ant.taskdefs.optional.jsp.JspC" />
          <task name="ant1.replaceregexp"
              classname="org.apache.tools.ant.taskdefs.optional.ReplaceRegExp" />
          <task name="ant1.translate"
              classname="org.apache.tools.ant.taskdefs.optional.i18n.Translate" />
          <task name="ant1.sosget"
              classname="org.apache.tools.ant.taskdefs.optional.sos.SOSGet" />
          <task name="ant1.soscheckin"
              classname="org.apache.tools.ant.taskdefs.optional.sos.SOSCheckin" />
          <task name="ant1.soscheckout"
              classname="org.apache.tools.ant.taskdefs.optional.sos.SOSCheckout" />
          <task name="ant1.soslabel"
              classname="org.apache.tools.ant.taskdefs.optional.sos.SOSLabel" />
          <task name="ant1.echoproperties"
              classname="org.apache.tools.ant.taskdefs.optional.EchoProperties" />
  
          <!-- deprecated ant tasks (kept for back compatibility) -->
          <task name="ant1.starteam"
              classname="org.apache.tools.ant.taskdefs.optional.scm.AntStarTeamCheckOut" />
          <task name="ant1.javadoc2"
              classname="org.apache.tools.ant.taskdefs.Javadoc" />
          <task name="ant1.copydir"
              classname="org.apache.tools.ant.taskdefs.Copydir" />
          <task name="ant1.copyfile"
              classname="org.apache.tools.ant.taskdefs.Copyfile" />
          <task name="ant1.deltree"
              classname="org.apache.tools.ant.taskdefs.Deltree" />
          <task name="ant1.rename"
              classname="org.apache.tools.ant.taskdefs.Rename" />
      </types>
  </ant-lib>
  
  
  
  1.1                  jakarta-ant-myrmidon/ant1compat/src/conf/ant1compat.mf
  
  Index: ant1compat.mf
  ===================================================================
  Manifest-Version: 1.0
  Created-By: Apache Ant Project
  Extension-Name: ant1.compat
  Specification-Title: Myrmidon Ant1 Compatibility Layer
  Specification-Version: 0.01
  Specification-Vendor: Jakarta Apache
  Implementation-Vendor-Id: org.apache.jakarta
  Implementation-Vendor: Jakarta Apache Project
  Implementation-Version: 0.01
  Extension-List: tools
  tools-Extension-Name: com.sun.tools
  tools-Specification-Version: 1.0
  
  
  
  1.1                  jakarta-ant-myrmidon/ant1compat/src/java/org/apache/tools/ant/Ant1CompatConfigurer.java
  
  Index: Ant1CompatConfigurer.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included  with this distribution in
   * the LICENSE.txt file.
   */
  package org.apache.tools.ant;
  
  import java.util.Locale;
  import org.apache.avalon.framework.configuration.Configuration;
  import org.apache.avalon.framework.configuration.ConfigurationException;
  
  /**
   * A helper class which uses reflection to configure any Object,
   * with the help of the Ant1 IntrospectionHelper.
   * This aims to mimic (to some extent) the Ant1-style configuration rules
   * implemented by ProjectHelperImpl.
   *
   * @author <a href="mailto:darrell@apache.org">Darrell DeBoer</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 12:38:40 $
   */
  class Ant1CompatConfigurer
  {
      private final Object m_configuredObject;
      private Configuration m_configuration;
      private final Project m_project;
      private final IntrospectionHelper m_helper;
  
      private Object[] m_childObjects;
      private Ant1CompatConfigurer[] m_childConfigurers;
      private String[] m_childNames;
  
      Ant1CompatConfigurer( Object configuredObject,
                            Configuration config,
                            Project project )
      {
          m_configuredObject = configuredObject;
          m_configuration = config;
          m_project = project;
          m_helper = IntrospectionHelper.getHelper( m_configuredObject.getClass() );
      }
  
      /**
       * Create all child elements, recursively.
       */
      void createChildren() throws ConfigurationException
      {
          Configuration[] childConfigs = m_configuration.getChildren();
  
          m_childObjects = new Object[ childConfigs.length ];
          m_childConfigurers = new Ant1CompatConfigurer[ childConfigs.length ];
          m_childNames = new String[ childConfigs.length ];
  
          for( int i = 0; i < childConfigs.length; i++ )
          {
              Configuration childConfig = childConfigs[ i ];
              String name = childConfig.getName();
              Object childObject =
                  m_helper.createElement( m_project, m_configuredObject, name );
              Ant1CompatConfigurer childConfigurer =
                  new Ant1CompatConfigurer( childObject, childConfig, m_project );
  
              m_childObjects[ i ] = childObject;
              m_childNames[ i ] = name;
              m_childConfigurers[ i ] = childConfigurer;
  
              // Recursively create children
              childConfigurer.createChildren();
          }
      }
  
      /**
       * Configure attributes and text, recursively.
       */
      void configure() throws ConfigurationException
      {
          // Configure the attributes.
          final String[] attribs = m_configuration.getAttributeNames();
          for( int i = 0; i < attribs.length; i++ )
          {
              final String name = attribs[ i ];
              final String value =
                  m_project.replaceProperties( m_configuration.getAttribute( name ) );
              try
              {
                  m_helper.setAttribute( m_project, m_configuredObject,
                                         name.toLowerCase( Locale.US ), value );
              }
              catch( BuildException be )
              {
                  // id attribute must be set externally
                  if( !name.equals( "id" ) )
                  {
                      throw be;
                  }
              }
          }
  
          // Configure the text content.
          String text = m_configuration.getValue( null );
          if( text != null )
          {
              m_helper.addText( m_project, m_configuredObject, text );
          }
  
          // Configure and add all children
          for( int i = 0; i < m_childConfigurers.length; i++ )
          {
              m_childConfigurers[ i ].configure();
  
              // Store child if neccessary (addConfigured)
              m_helper.storeElement( m_project, m_configuredObject,
                                     m_childObjects[ i ], m_childNames[ i ] );
          }
  
          // Set the reference, if id was specified.
          String id = m_configuration.getAttribute( "id", null );
          if( id != null )
          {
              m_project.addReference( id, m_configuredObject );
          }
  
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/ant1compat/src/java/org/apache/tools/ant/Ant1CompatProject.java
  
  Index: Ant1CompatProject.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included  with this distribution in
   * the LICENSE.txt file.
   */
  package org.apache.tools.ant;
  
  import java.io.File;
  import java.io.IOException;
  import java.io.InputStream;
  import java.util.Enumeration;
  import java.util.HashSet;
  import java.util.Hashtable;
  import java.util.Iterator;
  import java.util.Map;
  import java.util.Properties;
  import java.util.Set;
  import org.apache.aut.converter.Converter;
  import org.apache.aut.converter.ConverterException;
  import org.apache.myrmidon.api.TaskContext;
  import org.apache.myrmidon.api.TaskException;
  import org.apache.myrmidon.interfaces.type.DefaultTypeFactory;
  import org.apache.myrmidon.interfaces.type.TypeManager;
  
  import org.apache.tools.ant.types.Path;
  
  /**
   * Ant1 Project proxy for Myrmidon. Provides hooks between Myrmidon TaskContext
   * and Ant1 project.
   * Note that there is no logical separation between Ant1Project and this extension -
   * they could easily be flattened. Ant1Project is barely modified from the
   * Ant1 original, this class contains the extensions.
   *
   * @author <a href="mailto:darrell@apache.org">Darrell DeBoer</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 12:38:40 $
   */
  public class Ant1CompatProject extends Project
  {
      public static final String ANT1_TASK_PREFIX = "ant1.";
      public static final String MYRMIDON_PROJECT_PROP =
          org.apache.myrmidon.interfaces.model.Project.PROJECT;
      public static final String ANT1_PROJECT_PROP = "ant1.project";
  
      // Add everything in the current classloader to the
      // java.class.path property.
      private static String javaclasspath = Path.systemClasspath.toString();
  
      private final Converter m_converter;
  
      private Set m_userProperties = new HashSet();
      private TaskContext m_context;
      private TaskContext m_underlyingContext;
  
      /**
       * Create an Ant1 project.
       * @param context The context for the first Ant1 Task loaded.
       */
      public Ant1CompatProject( TaskContext context )
          throws TaskException
      {
          super();
          recontextulize( context );
  
          setBaseDir( m_context.getBaseDirectory() );
          String projectName =
              (String)m_context.getProperty( MYRMIDON_PROJECT_PROP );
          if( projectName != null )
          {
              setName( projectName );
          }
  
          m_converter = (Converter)m_context.getService( Converter.class );
      }
  
      /**
       * Update the TaskContext for the current task.
       * @param context The TaskContext for the currently executing Task.
       */
      void recontextulize( TaskContext context )
          throws TaskException
      {
          // Only reset the context if it is a different instance.
          if( m_underlyingContext == context )
          {
              return;
          }
  
          // Need the underlying context for setting properties which
          // should be propogated to other Tasks.
          m_underlyingContext = context;
  
          // The main context allows Ant1 specific property overrides.
          m_context = context.createSubContext( "ant1-overrides" );
          m_context.setProperty( "java.class.path", javaclasspath );
      }
  
      /**
       * Writes a project level message to the log with the given log level.
       * @param msg The text to log. Should not be <code>null</code>.
       * @param msgLevel The priority level to log at.
       */
      public void log( String msg, int msgLevel )
      {
  
          doLog( msg, msgLevel );
          super.log( msg, msgLevel );
      }
  
      /**
       * Writes a task level message to the log with the given log level.
       * @param task The task to use in the log. Must not be <code>null</code>.
       * @param msg The text to log. Should not be <code>null</code>.
       * @param msgLevel The priority level to log at.
       */
      public void log( Task task, String msg, int msgLevel )
      {
          doLog( msg, msgLevel );
          super.log( task, msg, msgLevel );
      }
  
      /**
       * Writes a target level message to the log with the given log level.
       * @param target The target to use in the log.
       *               Must not be <code>null</code>.
       * @param msg The text to log. Should not be <code>null</code>.
       * @param msgLevel The priority level to log at.
       */
      public void log( Target target, String msg, int msgLevel )
      {
          doLog( msg, msgLevel );
          super.log( target, msg, msgLevel );
      }
  
      private void doLog( String msg, int msgLevel )
      {
          switch( msgLevel )
          {
              case Ant1CompatProject.MSG_ERR:
                  m_context.error( msg );
                  break;
              case Ant1CompatProject.MSG_WARN:
                  m_context.warn( msg );
                  break;
              case Ant1CompatProject.MSG_INFO:
                  m_context.info( msg );
                  break;
              case Ant1CompatProject.MSG_VERBOSE:
                  m_context.verbose( msg );
                  break;
              case Ant1CompatProject.MSG_DEBUG:
                  m_context.debug( msg );
          }
      }
  
      /**
       * This is a copy of init() from the Ant1 Project, which adds Ant1 tasks and
       * DataTypes to the underlying Ant1 Project, but calling add methods on the
       * superclass to avoid adding everything to the TypeManager.
       *
       * @exception BuildException if the default task list cannot be loaded
       */
      public void init() throws BuildException
      {
          setJavaVersionProperty();
  
          String defs = "/org/apache/tools/ant/taskdefs/defaults.properties";
  
          try
          {
              Properties props = new Properties();
              InputStream in = this.getClass().getResourceAsStream( defs );
              if( in == null )
              {
                  throw new BuildException( "Can't load default task list" );
              }
              props.load( in );
              in.close();
  
              Enumeration enum = props.propertyNames();
              while( enum.hasMoreElements() )
              {
                  String key = (String)enum.nextElement();
                  String value = props.getProperty( key );
                  try
                  {
                      Class taskClass = Class.forName( value );
  
                      // NOTE: Line modified from Ant1 Project.
                      super.addTaskDefinition( key, taskClass );
  
                  }
                  catch( NoClassDefFoundError ncdfe )
                  {
                      log( "Could not load a dependent class ("
                           + ncdfe.getMessage() + ") for task " + key, MSG_DEBUG );
                  }
                  catch( ClassNotFoundException cnfe )
                  {
                      log( "Could not load class (" + value
                           + ") for task " + key, MSG_DEBUG );
                  }
              }
          }
          catch( IOException ioe )
          {
              throw new BuildException( "Can't load default task list" );
          }
  
          String dataDefs = "/org/apache/tools/ant/types/defaults.properties";
  
          try
          {
              Properties props = new Properties();
              InputStream in = this.getClass().getResourceAsStream( dataDefs );
              if( in == null )
              {
                  throw new BuildException( "Can't load default datatype list" );
              }
              props.load( in );
              in.close();
  
              Enumeration enum = props.propertyNames();
              while( enum.hasMoreElements() )
              {
                  String key = (String)enum.nextElement();
                  String value = props.getProperty( key );
                  try
                  {
                      Class dataClass = Class.forName( value );
  
                      // NOTE: Line modified from Ant1 Project.
                      super.addDataTypeDefinition( key, dataClass );
  
                  }
                  catch( NoClassDefFoundError ncdfe )
                  {
                      // ignore...
                  }
                  catch( ClassNotFoundException cnfe )
                  {
                      // ignore...
                  }
              }
          }
          catch( IOException ioe )
          {
              throw new BuildException( "Can't load default datatype list" );
          }
  
          setSystemProperties();
      }
  
      /**
       * Adds a new task definition to the project, registering it with the
       * TypeManager, as well as the underlying Ant1 Project.
       *
       * @param taskName The name of the task to add.
       *                 Must not be <code>null</code>.
       * @param taskClass The full name of the class implementing the task.
       *                  Must not be <code>null</code>.
       *
       * @exception BuildException if the class is unsuitable for being an Ant
       *                           task. An error level message is logged before
       *                           this exception is thrown.
       *
       * @see #checkTaskClass(Class)
       */
      public void addTaskDefinition( String taskName, Class taskClass )
          throws BuildException
      {
          String ant2name = ANT1_TASK_PREFIX + taskName;
          try
          {
              registerType( org.apache.myrmidon.api.Task.ROLE, ant2name, taskClass );
          }
          catch( Exception e )
          {
              throw new BuildException( e );
          }
  
          super.addTaskDefinition( taskName, taskClass );
      }
  
      /**
       * Utility method to register a type.
       */
      protected void registerType( final String roleType,
                                   final String typeName,
                                   final Class type )
          throws Exception
      {
          final ClassLoader loader = type.getClassLoader();
          final DefaultTypeFactory factory = new DefaultTypeFactory( loader );
          factory.addNameClassMapping( typeName, type.getName() );
  
          TypeManager typeManager = (TypeManager)m_context.getService( TypeManager.class );
          typeManager.registerType( roleType, typeName, factory );
      }
  
      /**
       * Sets a property. Any existing property of the same name
       * is overwritten, unless it is a user property.
       * @param name The name of property to set.
       *             Must not be <code>null</code>.
       * @param value The new value of the property.
       *              Must not be <code>null</code>.
       */
      public void setProperty( String name, String value )
      {
          if( m_userProperties.contains( name ) )
          {
              log( "Override ignored for user property " + name, MSG_VERBOSE );
              return;
          }
  
          if( null != m_context.getProperty( name ) )
          {
              log( "Overriding previous definition of property " + name,
                   MSG_VERBOSE );
          }
  
          log( "Setting project property: " + name + " -> " +
               value, MSG_DEBUG );
          doSetProperty( name, value );
      }
  
      /**
       * Sets a property if no value currently exists. If the property
       * exists already, a message is logged and the method returns with
       * no other effect.
       *
       * @param name The name of property to set.
       *             Must not be <code>null</code>.
       * @param value The new value of the property.
       *              Must not be <code>null</code>.
       * @since 1.5
       */
      public void setNewProperty( String name, String value )
      {
          if( null != m_context.getProperty( name ) )
          {
              log( "Override ignored for property " + name, MSG_VERBOSE );
              return;
          }
  
          log( "Setting project property: " + name + " -> " +
               value, MSG_DEBUG );
          doSetProperty( name, value );
      }
  
      /**
       * Sets a user property, which cannot be overwritten by
       * set/unset property calls. Any previous value is overwritten.
       * @param name The name of property to set.
       *             Must not be <code>null</code>.
       * @param value The new value of the property.
       *              Must not be <code>null</code>.
       * @see #setProperty(String,String)
       */
      public void setUserProperty( String name, String value )
      {
          log( "Setting ro project property: " + name + " -> " +
               value, MSG_DEBUG );
          m_userProperties.add( name );
          doSetProperty( name, value );
      }
  
      /**
       * Sets a property value in the underlying context, wrapping exceptions as
       * Ant1 BuildExceptions.
       * @param name property name
       * @param value property value
       */
      private void doSetProperty( String name, String value )
      {
          try
          {
              m_underlyingContext.setProperty( name, value );
          }
          catch( TaskException e )
          {
              throw new BuildException( "Could not set property: " + name, e );
          }
      }
  
      /**
       * Returns the value of a property, if it is set.
       *
       * @param name The name of the property.
       *             May be <code>null</code>, in which case
       *             the return value is also <code>null</code>.
       * @return the property value, or <code>null</code> for no match
       *         or if a <code>null</code> name is provided.
       */
      public String getProperty( String name )
      {
          Object value = m_context.getProperty( name );
  
          if( value == null )
          {
              return null;
          }
          else if( value instanceof String )
          {
              return (String)value;
          }
          else
          {
              try
              {
                  return (String)m_converter.convert( String.class, value, m_context );
              }
              catch( ConverterException e )
              {
                  throw new BuildException( e );
              }
          }
      }
  
      /**
       * Returns the value of a user property, if it is set.
       *
       * @param name The name of the property.
       *             May be <code>null</code>, in which case
       *             the return value is also <code>null</code>.
       * @return the property value, or <code>null</code> for no match
       *         or if a <code>null</code> name is provided.
       */
      public String getUserProperty( String name )
      {
          if( m_userProperties.contains( name ) )
          {
              return getProperty( name );
          }
          else
          {
              return null;
          }
      }
  
      /**
       * Returns a copy of the properties table.
       * @return a hashtable containing all properties
       *         (including user properties).
       */
      public Hashtable getProperties()
      {
          final Hashtable propsCopy = new Hashtable();
  
          final Map contextProps;
          try
          {
              contextProps = m_context.getProperties();
          }
          catch( final TaskException e )
          {
              throw new BuildException( e );
          }
          final Iterator propNames = contextProps.keySet().iterator();
          while( propNames.hasNext() )
          {
              final String name = (String)propNames.next();
              final String value = getProperty( name );
              if( value != null )
              {
                  propsCopy.put( name, value );
              }
          }
  
          return propsCopy;
      }
  
      /**
       * Returns a copy of the user property hashtable
       * @return a hashtable containing just the user properties
       */
      public Hashtable getUserProperties()
      {
          Hashtable propsCopy = new Hashtable();
  
          Iterator userPropNames = m_userProperties.iterator();
          while( userPropNames.hasNext() )
          {
              String name = (String)userPropNames.next();
              String value = getProperty( name );
              propsCopy.put( name, value );
          }
  
          return propsCopy;
      }
  
      /**
       * Replaces ${} style constructions in the given value with the
       * string value of the corresponding data types.
       *
       * @param value The string to be scanned for property references.
       *              May be <code>null</code>.
       *
       * @return the given string with embedded property names replaced
       *         by values, or <code>null</code> if the given string is
       *         <code>null</code>.
       *
       * @exception BuildException if the given value has an unclosed
       *                           property name, e.g. <code>${xxx</code>
       */
      public String replaceProperties( String value )
          throws BuildException
      {
          return ProjectHelper.replaceProperties( this, value,
                                                  this.getProperties() );
      }
  
      /**
       * Make the Ant1 project set the java version property, and then
       * copy it into the context properties.
       *
       * @exception BuildException if this Java version is not supported
       *
       * @see #getJavaVersion()
       */
      public void setJavaVersionProperty() throws BuildException
      {
          String javaVersion = getJavaVersion();
          doSetProperty( "ant.java.version", javaVersion );
  
          log( "Detected Java version: " + javaVersion + " in: "
               + System.getProperty( "java.home" ), MSG_VERBOSE );
  
          log( "Detected OS: " + System.getProperty( "os.name" ), MSG_VERBOSE );
      }
  
      /**
       * Sets the base directory for the project, checking that
       * the given filename exists and is a directory.
       *
       * @param baseD The project base directory.
       *              Must not be <code>null</code>.
       *
       * @exception BuildException if the directory if invalid
       */
      public void setBaseDir( File baseD ) throws BuildException
      {
          super.setBaseDir( baseD );
          doSetProperty( "basedir", super.getProperty( "basedir" ) );
      }
  
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/ant1compat/src/java/org/apache/tools/ant/Ant1CompatTaskAdapter.java
  
  Index: Ant1CompatTaskAdapter.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included  with this distribution in
   * the LICENSE.txt file.
   */
  package org.apache.tools.ant;
  
  import org.apache.avalon.framework.configuration.Configuration;
  import org.apache.avalon.framework.configuration.ConfigurationException;
  import org.apache.avalon.excalibur.i18n.Resources;
  import org.apache.avalon.excalibur.i18n.ResourceManager;
  
  /**
   * An adapter for running (in Myrmidon) Ant1 tasks which do not extend Task
   *
   * @author <a href="mailto:darrell@apache.org">Darrell DeBoer</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 12:38:40 $
   */
  public class Ant1CompatTaskAdapter
      extends TaskAdapter
  {
      private static final Resources REZ =
          ResourceManager.getPackageResources( Ant1CompatTaskAdapter.class );
  
      /**
       * Gets the adapted task name from the configuration, and looks up the
       * Class for the adapted task. The adapted task is then instantiated and
       * configured.
       * @param configuration The Task Model
       * @throws ConfigurationException If the configuration is invalid.
       */
      public void configure( Configuration configuration )
          throws ConfigurationException
      {
          // Create a new instance of the proxy object,
          // and configure it.
          String taskName = getAnt1Name( configuration.getName() );
  
          Class taskClass = (Class)project.getTaskDefinitions().get( taskName );
  
          if( taskClass == null )
          {
              String message =
                  REZ.getString( "taskadapter.invalid-task-name.error", taskName );
              throw new ConfigurationException( message );
          }
  
          Object adaptedTask = null;
          try
          {
              adaptedTask = taskClass.newInstance();
          }
          catch( Exception e )
          {
              String message =
                  REZ.getString( "taskadapter.no-create.error", taskClass.getName() );
              throw new ConfigurationException( message );
          }
  
          configure( adaptedTask, configuration );
  
          setProxy( adaptedTask );
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/ant1compat/src/java/org/apache/tools/ant/Ant1CompatTypeInstanceTask.java
  
  Index: Ant1CompatTypeInstanceTask.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included  with this distribution in
   * the LICENSE.txt file.
   */
  package org.apache.tools.ant;
  
  import org.apache.avalon.framework.configuration.Configuration;
  import org.apache.avalon.framework.configuration.ConfigurationException;
  import org.apache.avalon.excalibur.i18n.ResourceManager;
  import org.apache.avalon.excalibur.i18n.Resources;
  
  /**
   * A task for instantiating Ant1 datatypes.
   *
   * @author <a href="mailto:darrell@apache.org">Darrell DeBoer</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 12:38:40 $
   */
  public class Ant1CompatTypeInstanceTask
      extends Task
  {
      private static final Resources REZ =
          ResourceManager.getPackageResources( Ant1CompatTypeInstanceTask.class );
  
      public void configure( Configuration configuration ) throws ConfigurationException
      {
          if( configuration.getAttribute( "id", null ) == null )
          {
              final String message = REZ.getString( "type.no-id.error" );
              throw new ConfigurationException( message );
          }
  
          String typeName = configuration.getName();
          Object datatype = project.createDataType( getAnt1Name( typeName ) );
  
          // Configure the datatype. The type is added to the project
          // as a reference during configuration.
          configure( datatype, configuration );
      }
  
      /**
       * Execute task. Don't do anything.
       */
      public void execute()
      {
          // Everything is done during configuration.
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/ant1compat/src/java/org/apache/tools/ant/BuildException.java
  
  Index: BuildException.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 java.io.PrintWriter;
  import java.io.PrintStream;
  import org.apache.tools.ant.Location;
  
  /**
   *-----------------------------------------------------------------
   * Ant1Compatability layer version of BuildException, modified slightly
   * from original Ant1 BuildException, to provide a Myrmidon-friendly
   * getCause(), so that cascading exceptions are followed.
   * -----------------------------------------------------------------
   *
   * Signals an error condition during a build
   *
   * @author James Duncan Davidson
   */
  public class BuildException extends RuntimeException {
  
      /** Exception that might have caused this one. */
      private Throwable m_cause;
  
      /** Location in the build file where the exception occured */
      private Location m_location = Location.UNKNOWN_LOCATION;
  
      /**
       * Constructs a build exception with no descriptive information.
       */
      public BuildException() {
      }
  
      /**
       * Constructs an exception with the given descriptive message.
       * 
       * @param msg A description of or information about the exception.
       *            Should not be <code>null</code>.
       */
      public BuildException(final String msg) {
          super(msg);
      }
  
      /**
       * Constructs an exception with the given message and exception as
       * a root cause.
       * 
       * @param msg A description of or information about the exception.
       *            Should not be <code>null</code> unless a cause is specified.
       * @param cause The exception that might have caused this one.
       *              May be <code>null</code>.
       */
      public BuildException(final String msg, final Throwable cause) {
          super(msg);
          m_cause = cause;
      }
  
      /**
       * Constructs an exception with the given message and exception as
       * a root cause and a location in a file.
       * 
       * @param msg A description of or information about the exception.
       *            Should not be <code>null</code> unless a cause is specified.
       * @param cause The exception that might have caused this one.
       *              May be <code>null</code>.
       * @param location The location in the project file where the error 
       *                 occurred. Must not be <code>null</code>.
       */
      public BuildException( final String msg,
                             final Throwable cause,
                             final Location location) {
          this(msg, cause);
          m_location = location;
      }
  
      /**
       * Constructs an exception with the given exception as a root cause.
       * 
       * @param cause The exception that might have caused this one.
       *              Should not be <code>null</code>.
       */
      public BuildException(final Throwable cause ) {
          this(cause.getMessage(), cause);
      }
  
      /**
       * Constructs an exception with the given descriptive message and a 
       * location in a file.
       * 
       * @param msg A description of or information about the exception.
       *            Should not be <code>null</code>.
       * @param location The location in the project file where the error 
       *                 occurred. Must not be <code>null</code>.
       */
      public BuildException(final String msg, final Location location) {
          super(msg);
          m_location = location;
      }
  
      /**
       * Constructs an exception with the given exception as
       * a root cause and a location in a file.
       * 
       * @param cause The exception that might have caused this one.
       *              Should not be <code>null</code>.
       * @param location The location in the project file where the error 
       *                 occurred. Must not be <code>null</code>.
       */
      public BuildException(final Throwable cause, final Location location) {
          this(cause);
          m_location = location;
      }
  
      /**
       * Returns the nested exception, if any.
       * 
       * @return the nested exception, or <code>null</code> if no
       *         exception is associated with this one
       */
      public Throwable getException() {
          return m_cause;
      }
  
      /**
       * Returns the location of the error and the error message.
       * 
       * @return the location of the error and the error message
       */
      public String toString() {
          return m_location.toString() + getMessage();
      }
  
      /**
       * Sets the file location where the error occurred.
       * 
       * @param location The file location where the error occurred.
       *                 Must not be <code>null</code>.
       */
      public void setLocation(final Location location) {
          m_location = location;
      }
  
      /**
       * Returns the file location where the error occurred.
       *
       * @return the file location where the error occurred.
       */
      public Location getLocation() {
          return m_location;
      }
  
      /**
       * Prints the stack trace for this exception and any 
       * nested exception to <code>System.err</code>.
       */
      public void printStackTrace() {
          printStackTrace(System.err);
      }
      
      /**
       * Prints the stack trace of this exception and any nested
       * exception to the specified PrintStream.
       * 
       * @param ps The PrintStream to print the stack trace to.
       *           Must not be <code>null</code>.
       */
      public void printStackTrace(PrintStream ps) {
          synchronized (ps) {
              super.printStackTrace(ps);
              if (m_cause != null) {
                  ps.println("--- Nested Exception ---");
                  m_cause.printStackTrace(ps);
              }
          }
      }
      
      /**
       * Prints the stack trace of this exception and any nested
       * exception to the specified PrintWriter.
       * 
       * @param pw The PrintWriter to print the stack trace to.
       *           Must not be <code>null</code>.
       */
      public void printStackTrace(PrintWriter pw) {
          synchronized (pw) {
              super.printStackTrace(pw);
              if (m_cause != null) {
                  pw.println("--- Nested Exception ---");
                  m_cause.printStackTrace(pw);
              }
          }
      }
  
      /**
       * Myrmidon-friendly cascading exception method.
       * @return the cascading cause of this exception.
       */
      public Throwable getCause()
      {
          return m_cause;
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/ant1compat/src/java/org/apache/tools/ant/LoaderUtils.java
  
  Index: LoaderUtils.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.tools.ant;
  import java.io.BufferedReader;
  import java.io.File;
  import java.io.FilenameFilter;
  import java.io.IOException;
  import java.io.InputStreamReader;
  import java.io.PrintStream;
  import java.net.MalformedURLException;
  import java.net.URL;
  import java.net.URLClassLoader;
  import java.util.ArrayList;
  import java.util.List;
  
  /**
   * LoaderUtils is a utility class with methods for configuring a class
   * loader from a URL.
   *
   * @author Conor MacNeill
   * @created 9 January 2002
   */
  public class LoaderUtils {
  
      /**
       * This is the file that is consulted on remote systems to specify
       * available jars
       */
      public static final String LIST_FILE = "file.list";
  
  
      /**
       * Get the URLs of a set of libraries in the given location
       *
       * @param location the location to be searched
       * @param defaultFile default file if none can be found
       * @return an array of URLs for the relevant jars
       * @exception MalformedURLException the URLs cannot be created
       */
      public static URL[] getLocationURLs(URL location, String defaultFile)
           throws MalformedURLException {
          return getLocationURLs(location, defaultFile, new String[]{".jar"});
      }
  
      /**
       * Get the URLs of a set of libraries in the given location
       *
       * @param location the location to be searched
       * @param extensions array of allowable file extensions
       * @param defaultFile default file if none can be found
       * @return an array of URLs for the relevant jars
       * @exception MalformedURLException if the URL to the jars could not be
       *      formed
       */
      public static URL[] getLocationURLs(URL location, String defaultFile,
                                          String[] extensions)
           throws MalformedURLException {
          URL[] urls = null;
          if (location.getProtocol().equals("file")) {
              // URL is local filesystem.
              urls = getLocalURLs(new File(location.getFile()), extensions);
          } else {
              // URL is remote - try to read a file with the list of jars
              URL jarListURL = new URL(location, LIST_FILE);
              BufferedReader reader = null;
              List jarList = new ArrayList();
              try {
                  InputStreamReader isr
                       = new InputStreamReader(jarListURL.openStream());
                  reader = new BufferedReader(isr);
                  String line = null;
                  while ((line = reader.readLine().trim()) != null) {
                      for (int i = 0; i < extensions.length; ++i) {
                          if (line.endsWith(extensions[i])) {
                              jarList.add(new URL(location, line));
                              break;
                          }
                      }
                  }
                  urls = (URL[])jarList.toArray(new URL[0]);
              } catch (IOException e) {
                  // use the default location
                  if (defaultFile != null) {
                      urls = new URL[]{new URL(location, defaultFile)};
                  }
              } finally {
                  if (reader != null) {
                      try {
                          reader.close();
                      } catch (IOException e) {
                      }
                  }
              }
          }
  
          return urls;
      }
  
      /**
       * Get the classpath from a classloader. This can only extract path
       * components from the loaders which are instances of URLClassLoaders
       *
       * @param loader the loader whose path is required
       * @return the loader's configuration expressed as a classpath
       */
      public static String getClasspath(ClassLoader loader) {
          StringBuffer pathBuffer = null;
          if (loader instanceof URLClassLoader) {
              URLClassLoader urlLoader = (URLClassLoader)loader;
              URL[] urls = urlLoader.getURLs();
              for (int i = 0; i < urls.length; ++i) {
                  if (!urls[i].getProtocol().equals("file")) {
                      continue;
                  }
                  String pathElement = urls[i].getFile();
                  if (pathBuffer == null) {
                      pathBuffer = new StringBuffer(pathElement);
                  } else {
                      pathBuffer.append(File.pathSeparatorChar);
                      pathBuffer.append(pathElement);
                  }
              }
          }
          String path = pathBuffer == null ? "" : pathBuffer.toString();
          ClassLoader parentLoader = loader.getParent();
          if (parentLoader != null) {
              String parentPath = getClasspath(parentLoader);
              if (parentPath.length() != 0) {
                  path = parentPath + File.pathSeparator + path;
              }
          }
  
          return path;
      }
  
  
      /**
       * Debug method to dump a class loader hierarchy to a PrintStream
       * URLClassLoaders dump their URLs
       *
       * @param loader the class loaders whose configuration is dumped
       * @param ps PrintStream to which info is sent
       */
      public static void dumpLoader(PrintStream ps, ClassLoader loader) {
          if (loader instanceof URLClassLoader) {
              URLClassLoader urlLoader = (URLClassLoader)loader;
              URL[] urls = urlLoader.getURLs();
              if (urls.length == 0) {
                  ps.println("   No URLs");
              } else {
                  for (int i = 0; i < urls.length; ++i) {
                      ps.println("   URL: " + urls[i]);
                  }
              }
          } else {
              ps.println("Class Loader: " + loader.getClass().getName());
          }
          ps.println();
  
          ClassLoader parentLoader = loader.getParent();
          if (parentLoader != null) {
              ps.println("Parent Loader:");
              dumpLoader(ps, parentLoader);
          }
      }
  
  
      /**
       * Get an array of URLs for each file in the filesystem. If the given
       * location is a directory, it is searched for files of the given
       * extension. If it is a file, it is returned as a URL if it matches the
       * given extension list.
       *
       * @param location the location within the local filesystem to be
       *      searched
       * @param extensions an array of file extensions to be considered in the
       *      search
       * @return an array of URLs for the file found in the directory.
       * @exception MalformedURLException if the URLs to the jars cannot be
       *      formed
       */
      private static URL[] getLocalURLs(File location,
                                        final String[] extensions)
           throws MalformedURLException {
          URL[] urls = new URL[0];
  
          if (!location.exists()) {
              return urls;
          }
  
          if (!location.isDirectory()) {
              String path = location.getPath();
              for (int i = 0; i < extensions.length; ++i) {
                  if (path.endsWith(extensions[i])) {
                      urls[0] = location.toURL();
                      break;
                  }
              }
              return urls;
          }
  
          File[] jars = location.listFiles(
              new FilenameFilter() {
                  public boolean accept(File dir, String name) {
                      for (int i = 0; i < extensions.length; ++i) {
                          if (name.endsWith(extensions[i])) {
                              return true;
                          }
                      }
                      return false;
                  }
              });
          urls = new URL[jars.length];
          for (int i = 0; i < jars.length; ++i) {
              urls[i] = jars[i].toURL();
          }
          return urls;
      }
  
      /**
       * Set the context loader of the current thread and returns the existing
       * classloader
       *
       * @param newLoader the new context loader
       * @return the old context loader
       */
      public static ClassLoader setContextLoader(ClassLoader newLoader) {
          Thread thread = Thread.currentThread();
          ClassLoader currentLoader = thread.getContextClassLoader();
          thread.setContextClassLoader(newLoader);
          return currentLoader;
      }
  
  }
  
  
  
  
  1.1                  jakarta-ant-myrmidon/ant1compat/src/java/org/apache/tools/ant/OriginalAnt1Task.java
  
  Index: OriginalAnt1Task.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;
  
  /**
   * Base class for all tasks.
   *
   * Use Project.createTask to create a new task instance rather than
   * using this class directly for construction.
   * 
   * @see Project#createTask
   */
  public abstract class OriginalAnt1Task extends ProjectComponent {
      /** Target this task belongs to, if any. */
      protected Target target = null;
      /** Description of this task, if any. */
      protected String description = null;
      /** Location within the build file of this task definition. */
      protected Location location = Location.UNKNOWN_LOCATION;
      /** 
       * Name of this task to be used for logging purposes. 
       * This defaults to the same as the type, but may be
       * overridden by the user. For instance, the name "java"
       * isn't terribly descriptive for a task used within
       * another task - the outer task code can probably
       * provide a better one.
       */
      protected String taskName = null;
      /** Type of this task. */
      protected String taskType = null;
      /** Wrapper for this object, used to configure it at runtime. */
      protected RuntimeConfigurable wrapper;
      /** 
       * Whether or not this task is invalid. A task becomes invalid
       * if a conflicting class is specified as the implementation for
       * its type.
       */
      private boolean invalid = false;
  
      /** Sole constructor. */
      public OriginalAnt1Task() {
      }
  
      /**
       * Sets the target container of this task.
       *
       * @param target Target in whose scope this task belongs.
       *               May be <code>null</code>, indicating a top-level task.
       */
      public void setOwningTarget(Target target) {
          this.target = target;
      }
  
      /**
       * Returns the container target of this task.
       *
       * @return The target containing this task, or <code>null</code> if
       *         this task is a top-level task.
       */
      public Target getOwningTarget() {
          return target;
      }
      
      /**
       * Sets the name to use in logging messages.
       *
       * @param name The name to use in logging messages.
       *             Should not be <code>null</code>.
       */
      public void setTaskName(String name) {
          this.taskName = name;
      }
  
      /**
       * Returns the name to use in logging messages.
       *
       * @return the name to use in logging messages. 
       */
      public String getTaskName() {
          return taskName;
      }
  
      /**
       * Sets the name with which the task has been invoked.
       *
       * @param type The name the task has been invoked as.
       *             Should not be <code>null</code>.
       */
      void setTaskType(String type) {
          this.taskType = type;
      }
  
      /** 
       * Sets a description of the current action. This may be used for logging
       * purposes.
       * 
       * @param desc Description of the current action. 
       *             May be <code>null</code>, indicating that no description is
       *             available.
       *             
       */
      public void setDescription( String desc ) {
          description = desc;
      }
  
      /**
       * Returns the description of the current action.
       * 
       * @return the description of the current action, or <code>null</code> if
       *         no description is available.
       */
      public String getDescription() {
          return description;
      }
  
      /**
       * Called by the project to let the task initialize properly.
       * The default implementation is a no-op.
       *
       * @exception BuildException if someting goes wrong with the build
       */
      public void init() throws BuildException {}
  
      /**
       * Called by the project to let the task do its work. This method may be 
       * called more than once, if the task is invoked more than once. 
       * For example, 
       * if target1 and target2 both depend on target3, then running 
       * "ant target1 target2" will run all tasks in target3 twice.
       *
       * @exception BuildException if something goes wrong with the build
       */
      public void execute() throws BuildException {}
  
      /**
       * Returns the file/location where this task was defined.
       * 
       * @return the file/location where this task was defined. 
       *         Should not return <code>null</code>. Location.UNKNOWN_LOCATION
       *         is used for unknown locations.
       * 
       * @see Location#UNKNOWN_LOCATION
       */
      public Location getLocation() {
          return location;
      }
  
      /**
       * Sets the file/location where this task was defined.
       * 
       * @param location The file/location where this task was defined.
       *                 Should not be <code>null</code> - use
       *                 Location.UNKNOWN_LOCATION if the location isn't known.
       * 
       * @see Location#UNKNOWN_LOCATION
       */
      public void setLocation(Location location) {
          this.location = location;
      }
  
      /**
       * 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() {
          if (wrapper == null) {
              wrapper = new RuntimeConfigurable(this, getTaskName());
          }
          return wrapper;
      }
  
      /**
       * Sets the wrapper to be used for runtime configuration.
       * 
       * @param wrapper The wrapper to be used for runtime configuration.
       *                May be <code>null</code>, in which case the next call
       *                to getRuntimeConfigurableWrapper will generate a new
       *                wrapper.
       */
      protected void setRuntimeConfigurableWrapper(RuntimeConfigurable wrapper) {
          this.wrapper = wrapper;
      }
  
      // XXX: (Jon Skeet) The comment "if it hasn't been done already" may
      // not be strictly true. wrapper.maybeConfigure() won't configure the same
      // attributes/text more than once, but it may well add the children again,
      // unless I've missed something.
      /**
       * Configures this task - if it hasn't been done already.
       * If the task has been invalidated, it is replaced with an 
       * UnknownElement task which uses the new definition in the project.
       *
       * @exception BuildException if the task cannot be configured.
       */
      public void maybeConfigure() throws BuildException {
          if (!invalid) {
              if (wrapper != null) {
                  wrapper.maybeConfigure(project);
              }
          } else {
              getReplacement();
          }
      }
  
      /** 
       * Handles a line of output by logging it with the INFO priority.
       * 
       * @param line The line of output to log. Should not be <code>null</code>.
       */
      protected void handleOutput(String line) {
          log(line, Project.MSG_INFO);
      }
      
      /** 
       * Handles an error line by logging it with the INFO priority.
       * 
       * @param line The error line to log. Should not be <code>null</code>.
       */
      protected void handleErrorOutput(String line) {
          log(line, Project.MSG_ERR);
      }
          
      /**   
       * Logs a message with the default (INFO) priority.   
       *   
       * @param msg The message to be logged. Should not be <code>null</code>.
       */   
      public void log(String msg) {
          log(msg, Project.MSG_INFO);
      }   
      
      /**   
       * Logs a mesage with the given priority. This delegates
       * the actual logging to the project.
       *   
       * @param msg The message to be logged. Should not be <code>null</code>.
       * @param msgLevel The message priority at which this message is to 
       *                 be logged.
       */   
      public void log(String msg, int msgLevel) {
          project.log(getThis(), msg, msgLevel);
      }   
      
      /**
       * Performs this task if it's still valid, or gets a replacement
       * version and performs that otherwise.
       * 
       * Performing a task consists of firing a task started event,
       * configuring the task, executing it, and then firing task finished
       * event. If a runtime exception is thrown, the task finished event
       * is still fired, but with the exception as the cause.
       */
      public final void perform() {
          if (!invalid) {
              try {
                  project.fireTaskStarted(getThis());
                  maybeConfigure();
                  execute();
                  project.fireTaskFinished(getThis(), null);
              }
              catch (RuntimeException exc) {
                  if (exc instanceof BuildException) {
                      BuildException be = (BuildException) exc;
                      if (be.getLocation() == Location.UNKNOWN_LOCATION) {
                          be.setLocation(getLocation());
                      }
                  }
                  project.fireTaskFinished(getThis(), exc);
                  throw exc;
              }
          } else {
              UnknownElement ue = getReplacement();
              Task task = ue.getTask();
              task.perform();
          }
      }
  
      /**
       * Marks this task as invalid. Any further use of this task
       * will go through a replacement with the updated definition.
       */
      final void markInvalid() {
          invalid = true;
      }
  
      /**
       * Replacement element used if this task is invalidated.
       */
      private UnknownElement replacement;
  
      /**
       * Creates an UnknownElement that can be used to replace this task.
       * Once this has been created once, it is cached and returned by
       * future calls.
       *
       * @return the UnknownElement instance for the new definition of this task.
       */
      private UnknownElement getReplacement() {
          if (replacement == null) {
              replacement = new UnknownElement(taskType);
              replacement.setProject(project);
              replacement.setTaskType(taskType);
              replacement.setTaskName(taskName);
              replacement.setLocation(location);
              replacement.setOwningTarget(target);
              replacement.setRuntimeConfigurableWrapper(wrapper);
              wrapper.setProxy(replacement);
              target.replaceChild(getThis(), replacement);
              replacement.maybeConfigure();
          }
          return replacement;
      }
  
      private Task getThis()
      {
          return (Task) this;
      }
  
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/ant1compat/src/java/org/apache/tools/ant/Resources.properties
  
  Index: Resources.properties
  ===================================================================
  type.no-id.error=Id must be specified.
  
  taskadapter.invalid-task-name.error=Invalid task name for TaskAdapter: {0}.
  taskadapter.no-create.error=Could not instantiate adapted task: {0}.
  
  
  
  1.1                  jakarta-ant-myrmidon/ant1compat/src/java/org/apache/tools/ant/Task.java
  
  Index: Task.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included  with this distribution in
   * the LICENSE.txt file.
   */
  package org.apache.tools.ant;
  
  import java.util.Locale;
  import org.apache.avalon.framework.configuration.Configurable;
  import org.apache.avalon.framework.configuration.Configuration;
  import org.apache.avalon.framework.configuration.ConfigurationException;
  import org.apache.myrmidon.api.TaskContext;
  import org.apache.myrmidon.api.TaskException;
  
  /**
   * Ant1 Task proxy for Myrmidon.
   * Note that this class and OriginalAnt1Task (superclass) comprise a single logical
   * class, but the code is kept separate for ease of development. OriginalAnt1Task
   * is barely modified from the Ant1 original, whereas this class contains
   * all of the Myrmidon-specific adaptations.
   *
   * @author <a href="mailto:darrell@apache.org">Darrell DeBoer</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 12:38:40 $
   */
  public class Task extends OriginalAnt1Task
      implements org.apache.myrmidon.api.Task, Configurable
  {
      protected TaskContext m_context;
  
      /**
       * Specify the context in which the task operates in.
       * The Task will use the TaskContext to receive information
       * about it's environment.
       */
      public void contextualize( TaskContext context )
          throws TaskException
      {
          m_context = context;
  
          this.setTaskType( context.getName() );
          this.setTaskName( context.getName() );
  
          // Create/recontextualise the Ant1 Project.
          Ant1CompatProject project =
              (Ant1CompatProject)context.getProperty( Ant1CompatProject.ANT1_PROJECT_PROP );
          if( project == null )
          {
              project = createProject();
              m_context.setProperty( Ant1CompatProject.ANT1_PROJECT_PROP, project );
          }
          else
          {
              project.recontextulize( context );
          }
  
          this.setProject( project );
      }
  
      /**
       * Create and initialise an Ant1CompatProject
       */
      private Ant1CompatProject createProject()
          throws TaskException
      {
          Ant1CompatProject project = new Ant1CompatProject( m_context );
          project.init();
          return project;
      }
  
      /**
       * Uses the task Configuration to perform Ant1-style configuration
       * on the Ant1 task. This method configures *all* tasks the way Ant1
       * configures tasks inside a target.
       *
       * @param configuration The TaskModel for this Ant1 Task.
       * @throws ConfigurationException if the Configuration supplied is not valid
       */
      public void configure( Configuration configuration ) throws ConfigurationException
      {
          configure( this, configuration );
      }
  
      /**
       * Uses reflection to configure any Object, with the help of the Ant1
       * IntrospectionHelper. using . This aims to mimic (to some extent) the
       * Ant1-style configuration rules implemented by ProjectHelperImpl.
       * @param target
       *          The object to be configured.
       * @param configuration
       *          The data to configure the object with.
       * @throws ConfigurationException
       *          If the Configuration is not valid for the configured object
       */
      protected void configure( Object target, Configuration configuration ) throws ConfigurationException
      {
          //TODO Maybe provide different configuration order for tasks not in a target,
          // elements in a TaskContainer etc...
          Ant1CompatConfigurer configurer =
              new Ant1CompatConfigurer( target, configuration, project );
          configurer.createChildren();
          configurer.configure();
          this.init();
      }
  
      /**
       * Returns the name of a Task/Datatype as referred to by Ant1 code, without
       * the "ant1." prefix.
       * @param fullName The full name as known by Myrmidon.
       * @return the name without the Ant1 prefix.
       */
      protected String getAnt1Name( String fullName )
      {
          return fullName.substring( Ant1CompatProject.ANT1_TASK_PREFIX.length() );
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/ant1compat/src/java/org/apache/tools/ant/taskdefs/AbstractAnt1AntTask.java
  
  Index: AbstractAnt1AntTask.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included  with this distribution in
   * the LICENSE.txt file.
   */
  package org.apache.tools.ant.taskdefs;
  
  import java.util.Iterator;
  import java.util.Vector;
  import org.apache.avalon.framework.configuration.Configuration;
  import org.apache.avalon.framework.configuration.DefaultConfiguration;
  import org.apache.myrmidon.api.TaskException;
  import org.apache.myrmidon.interfaces.executor.ExecutionFrame;
  import org.apache.myrmidon.interfaces.executor.Executor;
  import org.apache.tools.ant.Ant1CompatProject;
  import org.apache.tools.ant.BuildException;
  import org.apache.tools.ant.Task;
  
  /**
   * A base class for Ant1 versions of &lt;ant&gt; and &lt;antcall&gt; tasks,
   * which delegate to the Myrmidon versions of these tasks.
   *
   * @author <a href="mailto:darrell@apache.org">Darrell DeBoer</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 12:38:41 $
   */
  public abstract class AbstractAnt1AntTask
      extends Task
  {
      /** the target to call if any */
      private String target = null;
      /** should we inherit properties from the parent ? */
      private boolean inheritAll = true;
      /** the properties to pass to the new project */
      private Vector properties = new Vector();
      /** the references to pass to the new project */
      private Vector references = new Vector();
  
      /**
       * If true, inherit all properties from parent Project
       * If false, inherit only userProperties and those defined
       * inside the ant call itself
       */
      public void setInheritAll( boolean value )
      {
          inheritAll = value;
      }
  
      /**
       * set the target to execute. If none is defined it will
       * execute the default target of the build file
       */
      public void setTarget( String s )
      {
          this.target = s;
      }
  
      /**
       * Create a nested property (ant) or param (antcall) element.
       */
      protected Property doCreateProperty()
      {
          Property p = new Property( true );
          properties.addElement( p );
          return p;
      }
  
      /**
       * create a reference element that identifies a data type that
       * should be carried over to the new project.
       */
      public void addReference( Reference r )
      {
          references.addElement( r );
      }
  
      /**
       * Helper class that implements the nested &lt;reference&gt;
       * element of &lt;ant&gt; and &lt;antcall&gt;.
       */
      public static class Reference
          extends org.apache.tools.ant.types.Reference
      {
  
          public Reference()
          {
              super();
          }
  
          private String targetid = null;
  
          public void setToRefid( String targetid )
          {
              this.targetid = targetid;
          }
  
          public String getToRefid()
          {
              return targetid;
          }
      }
  
      /**
       * Removes the Ant1CompatProject from the properties, builds a TaskModel for
       * executing the Myrmidon task, and executes that TaskModel.
       * @throws BuildException on error
       */
      public void execute() throws BuildException
      {
          Object ant1project = unsetAnt1Project();
  
          try
          {
              Configuration antConfig = constructTaskModel();
  
              executeTask( antConfig );
          }
          finally
          {
              resetAnt1Project( ant1project );
          }
      }
  
      /**
       * Executes the Myrmidon task detailed in the TaskModel provided.
       * @param taskModel the TaskModel for the task to execute.
       */
      private void executeTask( Configuration taskModel )
      {
          try
          {
              Executor executor = (Executor)m_context.getService( Executor.class );
              ExecutionFrame frame =
                  (ExecutionFrame)m_context.getService( ExecutionFrame.class );
              executor.execute( taskModel, frame );
          }
          catch( TaskException e )
          {
              throw new BuildException( e );
          }
      }
  
      /**
       * Removes the Ant1CompatProject from the TaskContext properties.
       * @return the removed project
       * @throws BuildException
       */
      private Object unsetAnt1Project() throws BuildException
      {
          Object ant1project = null;
          try
          {
              ant1project =
                  m_context.getProperty( Ant1CompatProject.ANT1_PROJECT_PROP );
              m_context.setProperty( Ant1CompatProject.ANT1_PROJECT_PROP, null );
          }
          catch( TaskException e )
          {
              throw new BuildException( e );
          }
          return ant1project;
      }
  
      /**
       * Adds the Ant1CompatProject back into the TaskContext properties.
       * @param ant1project the project to add.
       * @throws BuildException
       */
      private void resetAnt1Project( Object ant1project ) throws BuildException
      {
          try
          {
              m_context.setProperty( Ant1CompatProject.ANT1_PROJECT_PROP,
                                     ant1project );
          }
          catch( TaskException e )
          {
              throw new BuildException( e );
          }
      }
  
      /**
       * Builds the TaskModel for executing the Myrmidon version of a task.
       * @return a Configuration containing the TaskModel
       */
      protected Configuration constructTaskModel()
      {
          DefaultConfiguration antConfig = buildTaskModel();
  
          antConfig.setAttribute( "inherit-all", String.valueOf( inheritAll ) );
  
          // Ignore inheritRefs for now ( inheritAll == inheritRefs )
  
          if( target != null )
          {
              antConfig.setAttribute( "target", target );
          }
  
          addProperties( antConfig );
          addReferences( antConfig );
  
          return antConfig;
      }
  
      /**
       * Create the Myrmidon TaskModel, and configure with subclass-specific config.
       */
      protected abstract DefaultConfiguration buildTaskModel();
  
      /**
       * Adds all defined properties to the supplied Task model.
       * @param taskModel
       */
      protected void addProperties( DefaultConfiguration taskModel )
      {
          // Add all of the properties.
          Iterator iter = properties.iterator();
          while( iter.hasNext() )
          {
              DefaultConfiguration param = new DefaultConfiguration( "param", "" );
              Property property = (Property)iter.next();
              param.setAttribute( "name", property.getName() );
              param.setAttribute( "value", property.getValue() );
              taskModel.addChild( param );
          }
      }
  
      /**
       * Adds all defined references to the supplied Task model.
       * @param taskModel
       */
      protected void addReferences( DefaultConfiguration taskModel )
      {
          // TODO: Handle references.
      }
  
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/ant1compat/src/java/org/apache/tools/ant/taskdefs/Ant.java
  
  Index: Ant.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.taskdefs;
  
  import java.io.File;
  import org.apache.avalon.framework.configuration.DefaultConfiguration;
  import org.apache.tools.ant.util.FileUtils;
  
  /**
   * Ant1Compat version of &lt;ant&gt;, which delegates to the Myrmidon version.
   *
   * @author costin@dnt.ro
   * @author <a href="mailto:darrell@apache.org">Darrell DeBoer</a>
   */
  public class Ant
      extends AbstractAnt1AntTask
  {
  
      /** the basedir where is executed the build file */
      private File dir = null;
  
      /** the build.xml file (can be absolute) in this case dir will be ignored */
      private String antFile = null;
  
      /** the output */
      private String output = null;
  
      /** should we inherit references from the parent ? */
      private boolean inheritRefs = false;
  
      /**
       * If true, inherit all references from parent Project
       * If false, inherit only those defined
       * inside the ant call itself
       */
      public void setInheritRefs( boolean value )
      {
          inheritRefs = value;
      }
  
      /**
       * ...
       */
      public void setDir( File d )
      {
          this.dir = d;
      }
  
      /**
       * set the build file, it can be either absolute or relative.
       * If it is absolute, <tt>dir</tt> will be ignored, if it is
       * relative it will be resolved relative to <tt>dir</tt>.
       */
      public void setAntfile( String s )
      {
          // @note: it is a string and not a file to handle relative/absolute
          // otherwise a relative file will be resolved based on the current
          // basedir.
          this.antFile = s;
      }
  
      public void setOutput( String s )
      {
          this.output = s;
      }
  
      /** create a property to pass to the new project as a 'user property' */
      public Property createProperty()
      {
          return doCreateProperty();
      }
  
      /**
       * Construct a TaskModel for the Myrmidon &lt;ant&gt; task, and configure it
       * with sub-class specific values (antfile).
       * @return the TaskModel
       */
      protected DefaultConfiguration buildTaskModel()
      {
          DefaultConfiguration antConfig = new DefaultConfiguration( "ant", "" );
  
          // Get the "file" value.
          if( antFile == null )
          {
              antFile = "build.xml";
          }
  
          if( dir == null )
          {
              dir = project.getBaseDir();
          }
  
          File file = FileUtils.newFileUtils().resolveFile( dir, antFile );
          antFile = file.getAbsolutePath();
  
          antConfig.setAttribute( "file", antFile );
  
          return antConfig;
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/ant1compat/src/java/org/apache/tools/ant/taskdefs/CallTarget.java
  
  Index: CallTarget.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included  with this distribution in
   * the LICENSE.txt file.
   */
  package org.apache.tools.ant.taskdefs;
  
  import org.apache.avalon.framework.configuration.DefaultConfiguration;
  
  /**
   * The Ant1Compat version of the &lt;antcall&gt; task, which delegates to the
   * Myrmidon version.
   *
   * @author <a href="mailto:darrell@apache.org">Darrell DeBoer</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 12:38:41 $
   */
  public class CallTarget extends AbstractAnt1AntTask
  {
      /**
       * Properties are referred to as Parameters in &lt;antcall&gt;
       */
      public Property createParam()
      {
          return doCreateProperty();
      }
  
      /**
       * The only configuration not done by base class is the task name.
       */
      protected DefaultConfiguration buildTaskModel()
      {
          return new DefaultConfiguration( "ant-call", "" );
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/ant1compat/src/java/org/apache/tools/ant/types/Path.java
  
  Index: Path.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.types;
  
  import org.apache.tools.ant.BuildException;
  import org.apache.tools.ant.DirectoryScanner;
  import org.apache.tools.ant.Project;
  import org.apache.tools.ant.PathTokenizer;
  import org.apache.tools.ant.LoaderUtils;
  
  import java.io.File;
  
  import java.util.Enumeration;
  import java.util.Locale;
  import java.util.Stack;
  import java.util.Vector;
  
  
  
  /**
   * ***********************************************************************
   * Ant1Compatibility Layer version of Path, hacked to provide Ant1 runtime
   * files in System Classpath.
   * ***********************************************************************
   *
   * This object represents a path as used by CLASSPATH or PATH
   * environment variable.
   * <p>
   * <code>
   * &lt;sometask&gt;<br>
   * &nbsp;&nbsp;&lt;somepath&gt;<br>
   * &nbsp;&nbsp;&nbsp;&nbsp;&lt;pathelement location="/path/to/file.jar" /&gt;<br>
   * &nbsp;&nbsp;&nbsp;&nbsp;&lt;pathelement path="/path/to/file2.jar:/path/to/class2;/path/to/class3" /&gt;<br>
   * &nbsp;&nbsp;&nbsp;&nbsp;&lt;pathelement location="/path/to/file3.jar" /&gt;<br>
   * &nbsp;&nbsp;&nbsp;&nbsp;&lt;pathelement location="/path/to/file4.jar" /&gt;<br>
   * &nbsp;&nbsp;&lt;/somepath&gt;<br>
   * &lt;/sometask&gt;<br>
   * </code>
   * <p>
   * The object implemention <code>sometask</code> must provide a method called
   * <code>createSomepath</code> which returns an instance of <code>Path</code>.
   * Nested path definitions are handled by the Path object and must be labeled
   * <code>pathelement</code>.<p>
   *
   * The path element takes a parameter <code>path</code> which will be parsed
   * and split into single elements. It will usually be used
   * to define a path from an environment variable.
   *
   * @author Thomas.Haas@softwired-inc.com
   * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
   */
  
  public class Path extends DataType implements Cloneable {
  
      private Vector elements;
  
  
       public static Path systemClasspath =
          new Path(null, System.getProperty("java.class.path"));
  
  
      //Modified from original source.
      //Append Ant1Compat classpath to systemclasspath.
      // ------------------Modified--------------------------------
      static
      {
          // Add Ant1Compat.atl to system classpath.
          String classpath = LoaderUtils.getClasspath( Path.class.getClassLoader() );
          systemClasspath.append( new Path( null, classpath ) );
      }
      //-----------------End Modified------------------------------
  
  
      /**
       * Helper class, holds the nested <code>&lt;pathelement&gt;</code> values.
       */
      public class PathElement {
          private String[] parts;
  
          public void setLocation(File loc) {
              parts = new String[] {translateFile(loc.getAbsolutePath())};
          }
  
          public void setPath(String path) {
              parts = Path.translatePath(getProject(), path);
          }
  
          public String[] getParts() {
              return parts;
          }
      }
  
      /**
       * Invoked by IntrospectionHelper for <code>setXXX(Path p)</code>
       * attribute setters.  
       */
      public Path(Project p, String path) {
          this(p);
          createPathElement().setPath(path);
      }
  
      public Path(Project project) {
          setProject(project);
          elements = new Vector();
      }
  
      /**
       * Adds a element definition to the path.
       * @param location the location of the element to add (must not be
       * <code>null</code> nor empty.
       */
      public void setLocation(File location) throws BuildException {
          if (isReference()) {
              throw tooManyAttributes();
          }
          createPathElement().setLocation(location);
      }
  
  
      /**
       * Parses a path definition and creates single PathElements.
       * @param path the path definition.
       */
      public void setPath(String path) throws BuildException {
          if (isReference()) {
              throw tooManyAttributes();
          }
          createPathElement().setPath(path);
      }
  
      /**
       * Makes this instance in effect a reference to another Path instance.
       *
       * <p>You must not set another attribute or nest elements inside
       * this element if you make it a reference.</p>
       */
      public void setRefid(Reference r) throws BuildException {
          if (!elements.isEmpty()) {
              throw tooManyAttributes();
          }
          elements.addElement(r);
          super.setRefid(r);
      }
  
      /**
       * Creates the nested <code>&lt;pathelement&gt;</code> element.
       */
      public PathElement createPathElement() throws BuildException {
          if (isReference()) {
              throw noChildrenAllowed();
          }
          PathElement pe = new PathElement();
          elements.addElement(pe);
          return pe;
      }
  
      /**
       * Adds a nested <code>&lt;fileset&gt;</code> element.
       */
      public void addFileset(FileSet fs) throws BuildException {
          if (isReference()) {
              throw noChildrenAllowed();
          }
          elements.addElement(fs);
          checked = false;
      }
  
      /**
       * Creates a nested <code>&lt;path&gt;</code> element.
       */
      public Path createPath() throws BuildException {
          if (isReference()) {
              throw noChildrenAllowed();
          }
          Path p = new Path(getProject());
          elements.addElement(p);
          checked = false;
          return p;
      }
  
      /**
       * Append the contents of the other Path instance to this.
       */
      public void append(Path other) {
          if (other == null) {
            return;
          }
          String[] l = other.list();
          for (int i=0; i<l.length; i++) {
              if (elements.indexOf(l[i]) == -1) {
                  elements.addElement(l[i]);
              }
          }
      }
  
       /**
       * Adds the components on the given path which exist to this
       * Path. Components that don't exist, aren't added.
       *
       * @param source - source path whose components are examined for existence
       */
      public void addExisting(Path source) {
          String[] list = source.list();
          for (int i=0; i<list.length; i++) {
              File f = null;
              if (getProject() != null) {
                  f = getProject().resolveFile(list[i]);
              }
              else {
                  f = new File(list[i]);
              }
  
              if (f.exists()) {
                  setLocation(f);
              } else {
                  log("dropping " + f + " from path as it doesn't exist", 
                      Project.MSG_VERBOSE);
              }
          }
      }
  
      /**
       * Returns all path elements defined by this and nested path objects.
       * @return list of path elements.
       */
      public String[] list() {
          if (!checked) {
              // make sure we don't have a circular reference here
              Stack stk = new Stack();
              stk.push(this);
              dieOnCircularReference(stk, getProject());
          }
  
          Vector result = new Vector(2*elements.size());
          for (int i=0; i<elements.size(); i++) {
              Object o = elements.elementAt(i);
              if (o instanceof Reference) {
                  Reference r = (Reference) o;
                  o = r.getReferencedObject(getProject());
                  // we only support references to paths right now
                  if (!(o instanceof Path)) {
                      String msg = r.getRefId()+" doesn\'t denote a path";
                      throw new BuildException(msg);
                  }
              }
              
              if (o instanceof String) {
                  // obtained via append
                  addUnlessPresent(result, (String) o);
              } else if (o instanceof PathElement) {
                  String[] parts = ((PathElement) o).getParts();
                  if (parts == null) {
                      throw new BuildException("You must either set location or path on <pathelement>");
                  }
                  for (int j=0; j<parts.length; j++) {
                      addUnlessPresent(result, parts[j]);
                  }
              } else if (o instanceof Path) {
                  Path p = (Path) o;
                  if (p.getProject() == null) {
                      p.setProject(getProject());
                  }
                  String[] parts = p.list();
                  for (int j=0; j<parts.length; j++) {
                      addUnlessPresent(result, parts[j]);
                  }
              } else if (o instanceof FileSet) {
                  FileSet fs = (FileSet) o;
                  DirectoryScanner ds = fs.getDirectoryScanner(getProject());
                  String[] s = ds.getIncludedFiles();
                  File dir = fs.getDir(getProject());
                  for (int j=0; j<s.length; j++) {
                      File f = new File(dir, s[j]);
                      String absolutePath = f.getAbsolutePath();
                      addUnlessPresent(result, translateFile(absolutePath));
                  } 
              }
          }
          String[] res = new String[result.size()];
          result.copyInto(res);
          return res;
      }
  
  
      /**
       * Returns a textual representation of the path, which can be used as
       * CLASSPATH or PATH environment variable definition.
       * @return a textual representation of the path.
       */
      public String toString() {
          final String[] list = list();
  
          // empty path return empty string
          if (list.length == 0) {
            return "";
          }
  
          // path containing one or more elements
          final StringBuffer result = new StringBuffer(list[0].toString());
          for (int i=1; i < list.length; i++) {
              result.append(File.pathSeparatorChar);
              result.append(list[i]);
          }
  
          return result.toString();
      }
  
      /**
       * Splits a PATH (with : or ; as separators) into its parts.
       */
      public static String[] translatePath(Project project, String source) {
          final Vector result = new Vector();
          if (source == null) {
            return new String[0];
          }
  
          PathTokenizer tok = new PathTokenizer(source);
          StringBuffer element = new StringBuffer();
          while (tok.hasMoreTokens()) {
              element.setLength(0);
              String pathElement = tok.nextToken();
              try {
                  element.append(resolveFile(project, pathElement));
              }
              catch (BuildException e) {
                  project.log("Dropping path element " + pathElement + " as it is not valid relative to the project", 
                              Project.MSG_VERBOSE);
              }
              for (int i=0; i<element.length(); i++) {
                  translateFileSep(element, i);
              }
              result.addElement(element.toString());
          }
          String[] res = new String[result.size()];
          result.copyInto(res);
          return res;
      }
  
      /**
       * Returns its argument with all file separator characters
       * replaced so that they match the local OS conventions.  
       */
      public static String translateFile(String source) {
          if (source == null) {
            return "";
          }
  
          final StringBuffer result = new StringBuffer(source);
          for (int i=0; i < result.length(); i++) {
              translateFileSep(result, i);
          }
  
          return result.toString();
      }
  
      /**
       * Translates all occurrences of / or \ to correct separator of the
       * current platform and returns whether it had to do any
       * replacements.  
       */
      protected static boolean translateFileSep(StringBuffer buffer, int pos) {
          if (buffer.charAt(pos) == '/' || buffer.charAt(pos) == '\\') {
              buffer.setCharAt(pos, File.separatorChar);
              return true;
          }
          return false;
      }
  
      /**
       * How many parts does this Path instance consist of.
       */
      public int size() {
          return list().length;
      }
  
      /**
       * Return a Path that holds the same elements as this instance.
       */
      public Object clone() {
          Path p = new Path(getProject());
          p.append(this);
          return p;
      }
  
      /**
       * Overrides the version of DataType to recurse on all DataType
       * child elements that may have been added.  
       */
      protected void dieOnCircularReference(Stack stk, Project p) 
          throws BuildException {
  
          if (checked) {
              return;
          }
  
          Enumeration enum = elements.elements();
          while (enum.hasMoreElements()) {
              Object o = enum.nextElement();
              if (o instanceof Reference) {
                  o = ((Reference) o).getReferencedObject(p);
              }
  
              if (o instanceof DataType) {
                  if (stk.contains(o)) {
                      throw circularReference();
                  } else {
                      stk.push(o);
                      ((DataType) o).dieOnCircularReference(stk, p);
                      stk.pop();
                  }
              }
          }
          checked = true;
      }
  
      /**
       * Resolve a filename with Project's help - if we know one that is.
       *
       * <p>Assume the filename is absolute if project is null.</p>
       */
      private static String resolveFile(Project project, String relativeName) {
          if (project != null) {
              File f = project.resolveFile(relativeName);
              return f.getAbsolutePath();
          }
          return relativeName;
      }
  
      /**
       * Adds a String to the Vector if it isn't already included.
       */
      private static void addUnlessPresent(Vector v, String s) {
          if (v.indexOf(s) == -1) {
              v.addElement(s);
          }
      }
  
      /**
       * Concatenates the system class path in the order specified by
       * the ${build.sysclasspath} property - using &quot;last&quot; as
       * default value.
       */
      public Path concatSystemClasspath() {
          return concatSystemClasspath("last");
      }
  
      /**
       * Concatenates the system class path in the order specified by
       * the ${build.sysclasspath} property - using the supplied value
       * if ${build.sysclasspath} has not been set.
       */
      public Path concatSystemClasspath(String defValue) {
  
          Path result = new Path(getProject());
  
          String order = defValue;
          if (getProject() != null) {
              String o = getProject().getProperty("build.sysclasspath");
              if (o != null) {
                  order = o;
              }
          }
          
          if (order.equals("only")) {
              // only: the developer knows what (s)he is doing
              result.addExisting(Path.systemClasspath);
          
          } else if (order.equals("first")) {
              // first: developer could use a little help
              result.addExisting(Path.systemClasspath);
              result.addExisting(this);
  
          } else if (order.equals("ignore")) {
              // ignore: don't trust anyone
              result.addExisting(this);
  
          } else {
              // last: don't trust the developer
              if (!order.equals("last")) {
                  log("invalid value for build.sysclasspath: " + order, 
                      Project.MSG_WARN);
              }
  
              result.addExisting(this);
              result.addExisting(Path.systemClasspath);
          }
          
  
          return result;
  
      }
  
      /**
       * Add the Java Runtime classes to this Path instance.
       */
      public void addJavaRuntime() {
          if (System.getProperty("java.vendor").toLowerCase(Locale.US).indexOf("microsoft") >= 0) {
              // Pull in *.zip from packages directory
              FileSet msZipFiles = new FileSet();
              msZipFiles.setDir(new File(System.getProperty("java.home") + File.separator + "Packages"));
              msZipFiles.setIncludes("*.ZIP");
              addFileset(msZipFiles);
          } else if("Kaffe".equals(System.getProperty("java.vm.name"))) {
              FileSet kaffeJarFiles = new FileSet();
              kaffeJarFiles.setDir(new File(System.getProperty("java.home") 
                                            + File.separator + "share"
                                            + File.separator + "kaffe"));
              
              kaffeJarFiles.setIncludes("*.jar");
              addFileset(kaffeJarFiles);
          }
          else if (Project.getJavaVersion() == Project.JAVA_1_1) {
              addExisting(new Path(null,
                                   System.getProperty("java.home")
                                   + File.separator + "lib"
                                   + File.separator
                                   + "classes.zip"));
          } else {
              // JDK > 1.1 seems to set java.home to the JRE directory.
              addExisting(new Path(null,
                                   System.getProperty("java.home")
                                   + File.separator + "lib"
                                   + File.separator + "rt.jar"));
              // Just keep the old version as well and let addExisting
              // sort it out.
              addExisting(new Path(null,
                                   System.getProperty("java.home")
                                   + File.separator +"jre"
                                   + File.separator + "lib"
                                   + File.separator + "rt.jar"));
              
              // Added for MacOS X
              addExisting(new Path(null,
                                   System.getProperty("java.home")
                                   + File.separator + ".."
                                   + File.separator + "Classes"
                                   + File.separator + "classes.jar"));
              addExisting(new Path(null,
                                   System.getProperty("java.home")
                                   + File.separator + ".."
                                   + File.separator + "Classes"
                                   + File.separator + "ui.jar"));
          }
      }
  
      /**
       * Emulation of extdirs feature in java >= 1.2.
       * This method adds all files in the given
       * directories (but not in sub-directories!) to the classpath,
       * so that you don't have to specify them all one by one.
       * @param extdirs - Path to append files to
       */
      public void addExtdirs(Path extdirs) {
          if (extdirs == null) {
              String extProp = System.getProperty("java.ext.dirs");
              if (extProp != null) {
                  extdirs = new Path(getProject(), extProp);
              } else {
                  return;
              }
          }
  
          String[] dirs = extdirs.list();
          for (int i=0; i<dirs.length; i++) {
              File dir = getProject().resolveFile(dirs[i]);
              if (dir.exists() && dir.isDirectory()) {
                  FileSet fs = new FileSet();
                  fs.setDir(dir);
                  fs.setIncludes("*");
                  addFileset(fs);
              }
          }
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/ant1compat/src/test/org/apache/tools/ant/test/Ant1CompatTestCase.java
  
  Index: Ant1CompatTestCase.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included  with this distribution in
   * the LICENSE.txt file.
   */
  package org.apache.tools.ant.test;
  
  import java.io.File;
  import org.apache.myrmidon.AbstractProjectTest;
  import org.apache.myrmidon.LogMessageTracker;
  
  /**
   * Simple tests for the Ant1 Compatibility layer.
   *
   * @author <a href="mailto:darrell@apache.org">Darrell DeBoer</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 12:38:41 $
   */
  public class Ant1CompatTestCase
      extends AbstractProjectTest
  {
      public Ant1CompatTestCase( final String name )
      {
          super( name );
      }
  
      public void testBasic() throws Exception
      {
          final File projectFile = getTestResource( "basic-test.xml" );
  
          // <echo> test
          LogMessageTracker tracker = new LogMessageTracker();
          tracker.addExpectedMessage( "echo-test", "Hello, hello, hello" );
          executeTarget( projectFile, "echo-test", tracker );
  
          // Property resolution tests
          tracker = new LogMessageTracker();
          tracker.addExpectedMessage( "property-test", "prop-1 = [value-1]" );
          tracker.addExpectedMessage( "property-test", "prop-2 = [value-2]" );
          tracker.addExpectedMessage( "property-test", "prop-undefined = [${prop-undefined}]" );
          tracker.addExpectedMessage( "property-test", "Omit, replace$, but keep ${} and $" );
          executeTarget( projectFile, "property-test", tracker );
      }
  
      public void testIfUnless() throws Exception
      {
          final File projectFile = getTestResource( "if-unless-test.xml" );
  
          // if/unless tests.
          LogMessageTracker tracker = new LogMessageTracker();
          // Should pass if for "set", "true" and "false"
          tracker.addExpectedMessage( "if-set-test", "Ran target: if-set-test" );
          tracker.addExpectedMessage( "if-true-test", "Ran target: if-true-test" );
          tracker.addExpectedMessage( "if-false-test", "Ran target: if-false-test" );
  
          // Should only pass unless, when not defined.
          tracker.addExpectedMessage( "unless-unset-test",
                                      "Ran target: unless-unset-test" );
  
          // If combined with unless on a single target.
          tracker.addExpectedMessage( "if-with-unless-test-1",
                                      "Ran target: if-with-unless-test-1" );
  
          executeTarget( projectFile, "if-unless-tests", tracker );
      }
  
      public void testAntTask() throws Exception
      {
          final File projectFile = getTestResource( "ant-task-test.xml" );
  
          // TODO - Get the <ant> project listeners working, so we can test log messages.
  
          LogMessageTracker tracker = new LogMessageTracker();
          tracker.addExpectedMessage( "default-target", "In default target." );
          tracker.addExpectedMessage( "echo-test", "Hello, hello, hello" );
          //        executeTarget( projectFile, "ant-samefile-test", tracker );
          executeTarget( projectFile, "ant-samefile-test" );
  
          tracker = new LogMessageTracker();
          tracker.addExpectedMessage( "main",
                                      "Executed subdir/build.xml (default target)" );
          tracker.addExpectedMessage( "main",
                                      "Executed subdir/build.xml (default target)" );
          tracker.addExpectedMessage( "main",
                                      "Executed subdir/build.xml (default target)" );
          tracker.addExpectedMessage( "echo",
                                      "Executed subdir/build.xml (echo target)" );
          //        executeTarget( projectFile, "ant-otherfile-test", tracker );
          executeTarget( projectFile, "ant-otherfile-test" );
  
          tracker = new LogMessageTracker();
          tracker.addExpectedMessage( "property-test",
                                      "test-prop = [test-value]" );
          tracker.addExpectedMessage( "property-test",
                                      "test-prop = [set in calling task]" );
          tracker.addExpectedMessage( "property-test",
                                      "test-prop = [set in calling target]" );
          tracker.addExpectedMessage( "property-test",
                                         "test-prop = [test-value]" );
             //        executeTarget( projectFile, "ant-setprops-test", tracker );
          executeTarget( projectFile, "ant-setprops-test" );
      }
  
      public void testAntcallTask() throws Exception
      {
          final File projectFile = getTestResource( "antcall-task-test.xml" );
  
          // TODO - Get the <ant> project listeners working, so we can test log messages.
  
          LogMessageTracker tracker = new LogMessageTracker();
          tracker.addExpectedMessage( "default-target",
                                      "In default target." );
          tracker.addExpectedMessage( "antcall-target",
                                      "In antcall-target:  test-prop = [test-value]" );
          tracker.addExpectedMessage( "antcall-target",
                                      "In antcall-target:  test-prop = [set in calling task]" );
          tracker.addExpectedMessage( "antcall-target",
                                      "In antcall-target:  test-prop = [set in calling target]" );
          tracker.addExpectedMessage( "antcall-target",
                                      "In antcall-target:  test-prop = [test-value]" );
          //        executeTarget( projectFile, "ant-samefile-test", tracker );
          executeTarget( projectFile, "antcall-test" );
      }
  
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/ant1compat/src/test/org/apache/tools/ant/test/ant-task-test.xml
  
  Index: ant-task-test.xml
  ===================================================================
  <project name="ant-task-test"
           default="default-target">
  
      <target name="default-target">
          <echo message="In default target."/>
      </target>
  
      <target name="echo-test">
          <echo message="Hello, hello, hello"/>
      </target>
  
      <!-- Test <ant> on this build file. -->
      <target name="ant-samefile-test">
          <!-- Default target -->
          <ant antfile="ant-task-test.xml"/>
  
          <!-- Named target -->
          <ant antfile="ant-task-test.xml" target="echo-test"/>
      </target>
  
      <!-- Test <ant> on another build file. -->
      <target name="ant-otherfile-test">
          <!-- Full path to file. -->
          <ant antfile="subdir/build.xml"/>
  
          <!-- Dir and file specified -->
          <ant dir="subdir" antfile="build.xml"/>
  
          <!-- Dir with default filename -->
          <ant dir="subdir"/>
  
          <!-- Call named target -->
          <ant antfile="subdir/build.xml" target="echo"/>
      </target>
  
      <!-- Test <ant> with property overrides -->
      <target name="ant-setprops-test">
          <!-- No property overrides -->
          <ant antfile="subdir/build.xml" target="property-test"/>
  
          <!-- Override property within task def -->
          <ant antfile="subdir/build.xml" target="property-test">
              <property name="test-prop" value="set in calling task"/>
          </ant>
  
          <!-- Override property in containing project -->
          <property name="test-prop" value="set in calling target"/>
          <ant antfile="subdir/build.xml" target="property-test"/>
  
          <!-- Test inherit-all = false -->
          <ant antfile="subdir/build.xml" target="property-test"
               inheritall="false"/>
      </target>
  
  </project>
  
  
  
  1.1                  jakarta-ant-myrmidon/ant1compat/src/test/org/apache/tools/ant/test/antcall-task-test.xml
  
  Index: antcall-task-test.xml
  ===================================================================
  <project name="antcall-task-test"
           default="default-target">
  
      <target name="default-target">
          <echo message="In default target."/>
      </target>
  
      <target name="antcall-target">
          <property name="test-prop" value="test-value"/>
          <echo message="In antcall-target: test-prop = [${test-prop}]"/>
      </target>
  
      <!-- Basic <antcall> -->
      <target name="antcall-test">
          <!-- <antcall with default target -->
          <antcall/>
  
          <!-- <antcall> with defined target (No property overrides) -->
          <antcall target="antcall-target"/>
  
          <!-- Override property within task def -->
          <antcall target="antcall-target">
              <param name="test-prop" value="set in calling task"/>
          </antcall>
  
          <!-- Override property in containing project -->
          <property name="test-prop" value="set in calling target"/>
          <antcall target="antcall-target"/>
  
          <!-- Test inherit-all = false -->
          <antcall target="antcall-target" inheritall="false"/>
      </target>
  
  </project>
  
  
  
  1.1                  jakarta-ant-myrmidon/ant1compat/src/test/org/apache/tools/ant/test/basic-test.xml
  
  Index: basic-test.xml
  ===================================================================
  <project name="ant1compat-test"
           default="echo-test">
  
      <property name="prop-1" value="value-1"/>
  
      <target name="main" depends="echo-test, property-test"/>
  
      <target name="echo-test">
          <echo message="Hello, hello, hello"/>
      </target>
  
      <target name="property-test">
          <property name="prop-2" value="value-2"/>
  
          <echo message="prop-1 = [${prop-1}]"/>
          <echo message="prop-2 = [${prop-2}]"/>
          <echo message="prop-undefined = [${prop-undefined}]"/>
          <echo message="Omit$, replace$$, but keep ${} and $"/>
      </target>
  
  </project>
  
  
  
  1.1                  jakarta-ant-myrmidon/ant1compat/src/test/org/apache/tools/ant/test/if-unless-test.xml
  
  Index: if-unless-test.xml
  ===================================================================
  <project name="if-unless-test"
           default="if-unless-tests">
  
      <target name="if-unless-tests"
              depends="setup-props,
                       if-set-test, if-unset-test,
                       if-true-test, if-false-test,
                       unless-set-test, unless-unset-test,
                       unless-true-test, unless-false-test,
                       if-with-unless-test-1, if-with-unless-test-2,
                       if-with-unless-test-3"/>
  
      <target name="setup-props">
          <property name="prop-set" value="set"/>
          <property name="prop-true" value="true"/>
          <property name="prop-false" value="false"/>
      </target>
  
      <target name="if-set-test" if="prop-set">
          <echo message="Ran target: if-set-test"/>
      </target>
  
      <target name="if-unset-test" if="prop-unset">
          <echo message="Ran target: if-unset-test"/>
      </target>
  
      <target name="if-true-test" if="prop-true">
          <echo message="Ran target: if-true-test"/>
      </target>
  
      <target name="if-false-test" if="prop-false">
          <echo message="Ran target: if-false-test"/>
      </target>
  
      <target name="unless-set-test" unless="prop-set">
          <echo message="Ran target: unless-set-test"/>
      </target>
  
      <target name="unless-unset-test" unless="prop-unset">
          <echo message="Ran target: unless-unset-test"/>
      </target>
  
      <target name="unless-true-test" unless="prop-true">
          <echo message="Ran target: unless-true-test"/>
      </target>
  
      <target name="unless-false-test" unless="prop-false">
          <echo message="Ran target: unless-false-test"/>
      </target>
  
      <target name="if-with-unless-test-1" if="prop-set" unless="prop-unset">
          <echo message="Ran target: if-with-unless-test-1"/>
      </target>
  
      <target name="if-with-unless-test-2" if="prop-unset" unless="prop-unset">
          <echo message="Ran target: if-with-unless-test-2"/>
      </target>
  
      <target name="if-with-unless-test-3" if="prop-set" unless="prop-set">
          <echo message="Ran target: if-with-unless-test-3"/>
      </target>
  </project>
  
  
  
  1.1                  jakarta-ant-myrmidon/ant1compat/src/test/org/apache/tools/ant/test/subdir/build.xml
  
  Index: build.xml
  ===================================================================
  <project name="call-target"
           description="Simple build for testing ant and antcall tasks."
           default="main">
  
      <property name="test-prop" value="test-value"/>
  
      <target name="main">
          <echo message="Executed subdir/build.xml (default target)"/>
      </target>
  
      <target name="echo">
          <echo message="Executed subdir/build.xml (echo target)"/>
      </target>
  
      <target name="property-test">
          <echo message="test-prop = [${test-prop}]"/>
      </target>
  </project>
  
  

--
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