<!-- -*- Mode: SGML; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-     -->
<!--                                                                                -->
<!-- This file is part of the compiler and core tools for the AspectJ(tm)           -->
<!-- programming language; see http://aspectj.org                                   -->
<!--                                                                                -->
<!-- The contents of this file are subject to the Mozilla Public License            -->
<!-- Version 1.1 (the "License"); you may not use this file except in               -->
<!-- compliance with the License. You may obtain a copy of the License at           -->
<!-- either http://www.mozilla.org/MPL/ or http://aspectj.org/MPL/.                 -->
<!--                                                                                -->
<!-- Software distributed under the License is distributed on an "AS IS" basis,     -->
<!-- WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License       -->
<!-- for the specific language governing rights and limitations under the           -->
<!-- License.                                                                       -->
<!--                                                                                -->
<!-- The Original Code is AspectJ.                                                  -->
<!--                                                                                -->
<!-- The Initial Developer of the Original Code is Xerox Corporation. Portions      -->
<!-- created by Xerox Corporation are Copyright (C) 1999, 2000 Xerox Corporation.   -->
<!-- All Rights Reserved.                                                           -->

<!-- todo: non-distribution license?? -->

<!DOCTYPE build SYSTEM "build.dtd">

<project name="ant-example" default="test" basedir=".">

    <!-- define target init.product -->
    &aspectj_initProduct;

    <!-- ========================================================================== -->
    <!-- Init                                                                       -->
    <!-- ========================================================================== -->
    <target name="init" depends="init.product"
     description="caller must define jdk.tools.jar and product.dir or run from product.dir">
      <echo message="init ant-examples.xml"/> 
      <!-- directory produced during test install -->
      <property name="ajx.base.dir"
            location="${productTest.output.dir}/ajx-output"/>
      <property name="ajx.expect.dir"
            location="${productTest.expect.dir}/ajx"/>
      <property name="noclass"
               value="noclass"/>
      <property name="noclass.dir"
            location="${productTest.output.dir}/${noclass}"/>
      <property name="aj.public.taskdef.package"
               value="org.aspectj.tools.ant.taskdef"/>
      <property name="taskdef.classpath"
               value="${product.taskdefs.jar}${PS}${product.tools.jar}${PS}${jdk.tools.jar}"/>
    </target>

    <target name="init.taskdefs" depends="init,product.taskdefs.jar,product.tools.jar">
      <!-- define taskdefs used here - requires jars, etc. -->
      <taskdef name="ajc"
          classname="${aj.public.taskdef.package}.Ajc" >
       <classpath>
          <pathelement path="${product.taskdefs.jar}"/>
          <pathelement path="${product.tools.jar}"/>
          <pathelement path="${jdk.tools.jar}"/>
       </classpath>
      </taskdef>
      <taskdef name="ajdoc"
          classname="${aj.public.taskdef.package}.Ajdoc">
       <classpath>
          <pathelement path="${product.taskdefs.jar}"/>
          <pathelement path="${product.tools.jar}"/>
          <pathelement path="${jdk.tools.jar}"/>
       </classpath>
      </taskdef>
    </target>


    <!-- ========================================================================== -->
    <!-- Clean everything in created dirs                                           -->
    <!-- ========================================================================== -->

    <target name="clean" depends="init"
     description="clean output created by this script">
      <antcall target="mkdir"><param name="dir" value="${ajx.base.dir}"/>
      </antcall>
      <antcall target="mkdir"><param name="dir" value="${noclass.dir}"/>
      </antcall>
    </target>

    <target name="noclass.setup" depends="init"
     description="setup no-op dummy class to invoke when test class n/a or requires gui">
      <echo file="${noclass}.java">
        public class ${noclass} { public static void main(String[]args){}}
      </echo>
      <mkdir dir="${noclass.dir}"/>
      <delete dir="${noclass.dir}"/>
      <mkdir dir="${noclass.dir}"/>
      <javac srcdir="." 
           includes="${noclass}.java" 
            destdir="${noclass.dir}"
        failonerror="true"/>
      <delete file="${noclass}.java"/>
      <echo message=" todo check file: ${noclass}.java"/>
      <java classname="${noclass}"
          failonerror="true" 
          classpath="${noclass.dir}"/>
    </target>

    <!-- ========================================================================== -->
    <!-- Run        tests                                                          -->
    <!-- ========================================================================== -->
    <target name="Ajx" depends="init.taskdefs"
       description="for {example}, compile {list}, doc {list}, and run {class}">
       <echo message="##### START Ajx example=${example} list=${list} class=${class}" />
        <property name="exdir" 
                 value="${ajx.base.dir}/${example}"/>
        <property name="expect.exdir" value="${ajx.expect.dir}/${example}"/>
        <mkdir  dir="${exdir}/classes"/>
        <mkdir  dir="${exdir}/output"/>
        <mkdir  dir="${exdir}/docs"/>
        <delete dir="${exdir}/classes"/>
        <delete dir="${exdir}/output"/>
        <delete dir="${exdir}/docs"/>
        <mkdir  dir="${exdir}/classes"/>
        <mkdir  dir="${exdir}/output"/>
        <mkdir  dir="${exdir}/docs"/>

        <echo message="##################### Ajx ajc ${list}"/>
        <ajc 
            destdir="${exdir}/classes"
           argfile="${list}" 
        failonerror="false" >
          <classpath>
            <pathelement location="${product.rt.jar}" />
            <pathelement location="${jdk.tools.jar}" /> <!-- to compile ajdoc -->
          </classpath>
        </ajc>
        <!-- copying resources, etc. as javac does todo weak -->
        <copy todir="${exdir}/classes">
            <fileset dir="${srcDir}" 
                includes="**/*.properties,**/*.gif,**/*.jpg,**/*.props" />
        </copy>

        <echo message="##################### Ajx ajdoc ${list} "/>
        <ajdoc  fork="yes"
            private="yes"
            verbose="yes"
            sourcepath="${product.examples.dir}"
            destdir="${exdir}/docs"
           argfile="${list}" 
           classpath="${product.rt.jar}${PS}${jdk.tools.jar}"
        failonerror="false" >
         <!-- internalclasspath 
           internalclasspath="${taskdef.classpath}" 
         is required now - but still not producing docs
          <classpath>
            <pathelement location="${product.rt.jar}" />
          </classpath>
        -->
        </ajdoc>

        <echo message="##################### Ajx run ${class} START - output in ${exdir}/output/out.txt"/>
        <java classname="${class}"
                 output="${exdir}/output/out.txt"
                   fork="yes"  
            failonerror="false" >
            <!-- fork because ajc does a System.exit -->
          <classpath>
            <pathelement location="${exdir}/classes"/>
            <pathelement location="${product.rt.jar}"/>
            <pathelement location="${noclass.dir}"/>
            <pathelement location="${jdk.tools.jar}" /> <!-- to run ajdoc and old ajc -->
          </classpath>
        </java>
        <echo message="##################### Ajx run ${class} STOP"/>
        <echo message="##################### Ajx run ${class} check output START "/>
        <comparefiles rhsFile="${exdir}/output/out.txt"
                      lhsFile="${expect.exdir}/output/out.txt"/>
        <echo message="##################### Ajx run ${class} check output STOP "/>
       <echo message="##### FINISH Ajx example=${example} list=${list} class=${class}" />
    </target>

    <target name="test" depends="test.examples,test.sources"/>

    <target name="test.sources" depends="init,noclass.setup,productTest.expect.dir"
      description="compile, doc, and run the tools-source targets using taskdefs" >
      <property name="tools.src.dir"
            location="${product.source.tools.dir}/src"/>
      <antcall target="Ajx">
        <param name="list"    value="${tools.src.dir}/runtime.lst"/>
        <param name="example" value="source-tools-runtime"/>
        <param name="class"   value="${noclass}"/>
        <param name="srcDir"  value="${tools.src.dir}"/>
      </antcall>
      <antcall target="Ajx">
        <param name="list"    value="${tools.src.dir}/ajc.lst"/>
        <param name="example" value="source-tools-ajc"/>
        <param name="class"   value="org.aspectj.tools.ajc.Main"/>
        <param name="srcDir"  value="${tools.src.dir}"/>
        <!-- ajc does a System.exit -->
      </antcall>
      <antcall target="Ajx">
        <param name="list"    value="${tools.src.dir}/tools.lst"/>
        <param name="example" value="source-tools-all"/>
        <param name="class"   value="${noclass}"/>
        <param name="srcDir"  value="${tools.src.dir}"/>
      </antcall>
      <antcall target="Ajx">
        <param name="list"    value="${tools.src.dir}/ajbrowser.lst"/>
        <param name="example" value="source-tools-ajbrowser"/>
        <param name="class"   value="${noclass}"/>
        <param name="srcDir"  value="${tools.src.dir}"/>
      </antcall>
      <antcall target="Ajx">
        <param name="list"    value="${tools.src.dir}/ajdoc.lst"/>
        <param name="example" value="source-tools-ajdoc"/>
        <param name="class"   value="org.aspectj.tools.ajdoc.Main"/>
        <param name="srcDir"  value="${tools.src.dir}"/>
      </antcall>
    </target>

    <target name="test.examples" depends="init,noclass.setup,productTest.expect.dir"
      description="compile, doc, and run the valid examples using taskdefs" >
      <antcall target="Ajx">
        <param name="list"    value="bean/files.lst"/>
        <param name="example" value="bean"/>
        <param name="class"   value="bean.Demo"/>
        <param name="srcDir"  value="."/>
      </antcall>
      <antcall target="Ajx">
        <param name="list"    value="coordination/lib.lst"/>
        <param name="example" value="coordination"/>
        <param name="class"   value="${noclass}"/>
        <param name="srcDir"  value="."/>
      </antcall>
      <antcall target="Ajx">
        <param name="list"    value="introduction/files.lst"/>
        <param name="example" value="introduction-point"/>
        <param name="class"   value="introduction.Point"/>
        <param name="srcDir"  value="."/>
      </antcall>
      <antcall target="Ajx">
        <param name="list"    value="introduction/files.lst"/>
        <param name="example" value="introduction-cloneablepoint"/>
        <param name="class"   value="introduction.CloneablePoint"/>
        <param name="srcDir"  value="."/>
      </antcall>
      <antcall target="Ajx">
        <param name="list"    value="introduction/files.lst"/>
        <param name="example" value="introduction-comparablepoint"/>
        <param name="class"   value="introduction.ComparablePoint"/>
        <param name="srcDir"  value="."/>
      </antcall>
      <antcall target="Ajx">
        <param name="list"    value="introduction/files.lst"/>
        <param name="example" value="introduction-hashablepoint"/>
        <param name="class"   value="introduction.HashablePoint"/>
        <param name="srcDir"  value="."/>
      </antcall>
      <antcall target="Ajx">
        <param name="list"    value="observer/files.lst"/>
        <param name="example" value="observer"/>
        <param name="class"   value="${noclass}"/>
        <param name="srcDir"  value="."/>
        <!-- uses gui: param name="class"   value="observer.Demo" -->
      </antcall>
      <antcall target="Ajx">
        <param name="list"    value="spacewar/debug.lst"/>
        <param name="example" value="spacewar-debug"/>
        <param name="class"   value="${noclass}"/>
        <param name="srcDir"  value="."/>
      </antcall>
      <antcall target="Ajx">
        <param name="list"    value="spacewar/demo.lst"/>
        <param name="example" value="spacewar-demo"/>
        <param name="class"   value="${noclass}"/>
        <param name="srcDir"  value="."/>
      </antcall>
      <antcall target="Ajx">
        <param name="list"    value="telecom/basic.lst"/>
        <param name="example" value="telecom-basic"/>
        <param name="class"   value="telecom.BasicSimulation"/>
        <param name="srcDir"  value="."/>
      </antcall>
      <antcall target="Ajx">
        <param name="list"    value="telecom/billing.lst"/>
        <param name="example" value="telecom-billing"/>
        <param name="class"   value="telecom.BillingSimulation"/>
        <param name="srcDir"  value="."/>
      </antcall>
      <antcall target="Ajx">
        <param name="list"    value="telecom/timing.lst"/>
        <param name="example" value="telecom-timing"/>
        <param name="class"   value="telecom.TimingSimulation"/>
        <param name="srcDir"  value="."/>
      </antcall>
    <!-- timeserver not in product - todo check 
      <antcall target="Ajx">
        <param name="list"    value="timeserver/abort.lst"/>
        <param name="example" value="timeserver-abort"/>
        <param name="class"   value="${noclass}"/>
        <param name="srcDir"  value="."/>
      </antcall>
      <antcall target="Ajx">
        <param name="list"    value="timeserver/retry.lst"/>
        <param name="example" value="timeserver-retry"/>
        <param name="class"   value="${noclass}"/>
        <param name="srcDir"  value="."/>
      </antcall>
     -->
      <antcall target="Ajx">
        <param name="list"    value="tjp/files.lst"/>
        <param name="example" value="tjp"/>
        <param name="class"   value="tjp.Demo"/>
        <param name="srcDir"  value="."/>
      </antcall>
      <antcall target="Ajx">
        <param name="list"    value="tracing/notrace.lst"/>
        <param name="example" value="tracing-none"/>
        <param name="class"   value="tracing.ExampleMain"/>
        <param name="srcDir"  value="."/>
      </antcall>
      <antcall target="Ajx">
        <param name="list"    value="tracing/tracelib.lst"/>
        <param name="example" value="tracing-ExampleMain"/>
        <param name="class"   value="tracing.ExampleMain"/>
        <param name="srcDir"  value="."/>
      </antcall>
      <antcall target="Ajx">
        <param name="list"    value="tracing/tracev1.lst"/>
        <param name="example" value="tracing-v1"/>
        <param name="class"   value="tracing.ExampleMain"/>
        <param name="srcDir"  value="."/>
      </antcall>
      <antcall target="Ajx">
        <param name="list"    value="tracing/tracev2.lst"/>
        <param name="example" value="tracing-v2"/>
        <param name="class"   value="tracing.ExampleMain"/>
        <param name="srcDir"  value="."/>
      </antcall>
      <antcall target="Ajx">
        <param name="list"    value="tracing/tracev3.lst"/>
        <param name="example" value="tracing-v3"/>
        <param name="class"   value="tracing.ExampleMain"/>
        <param name="srcDir"  value="."/>
      </antcall>
    </target>
</project>