<!--
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements. See the NOTICE file
 distributed with this work for additional information
 regarding copyright ownership. The ASF licenses this file
 to you under the Apache License, Version 2.0 (the
 "License"); you may not use this file except in compliance
 with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing,
 software distributed under the License is distributed on an
 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 KIND, either express or implied. See the License for the
 specific language governing permissions and limitations
 under the License.
-->
<project name="tutorial" default="tutorial" basedir=".">

  <description>Thrift Java Tutorial</description>

  <property name="src" location="src" />
  <property name="gen" location="gen-java" />
  <property name="build" location="build" />

  <path id="libs.classpath">
    <fileset dir="../../lib/java/build">
      <include name="*.jar" />
      <exclude name="-test.jar" />
    </fileset>
    <fileset dir="../../lib/java/build/lib">
      <include name="*.jar" />
    </fileset>
  </path>
  <path id="build.classpath">
    <path refid="libs.classpath" />
    <pathelement path="${gen}" />
  </path>
  <path id="tutorial.classpath">
    <path refid="build.classpath" />
    <pathelement path="${build}" />
    <pathelement path="tutorial.jar" />
  </path>
  
  <target name="init">
    <tstamp />
    <mkdir dir="${build}"/>
    <mkdir dir="${build}/log"/>
  </target>

  <target name="compile" depends="init, generate">
    <javac includeantruntime="false" srcdir="${gen}" destdir="${build}" classpathref="libs.classpath" />
    <javac includeantruntime="false" srcdir="${src}" destdir="${build}" classpathref="build.classpath" />
  </target>

  <target name="test" depends="tutorial" />

  <target name="tutorial" description="Run the tutorial" depends="compile">
    <jar jarfile="tutorial.jar" basedir="${build}"/>
    <parallel>
      <java classname="JavaServer" fork="true" timeout="10000"
        classpathref="tutorial.classpath" failonerror="false" output="${build}/log/tutorial.log">
      </java>
      <sequential>
        <sleep seconds="2"/>
        <echo>tutorial client simple:</echo>
        <java classname="JavaClient"
          classpathref="tutorial.classpath" failonerror="true">
          <arg line="simple"/>
        </java>
        <echo>tutorial client secure:</echo>
        <java classname="JavaClient"
          classpathref="tutorial.classpath" failonerror="true">
          <arg line="secure"/>
        </java>
      </sequential>
    </parallel>
  </target>

  <target name="generate">
    <!-- Generate the thrift gen-java source -->
    <exec executable="../../compiler/cpp/thrift" failonerror="true">
      <arg line="--gen java -r  ../tutorial.thrift"/>
    </exec>
  </target>

  <target name="tutorialclient" description="Run a tutorial client" depends="compile">
    <echo>tutorial client simple:</echo>
    <java classname="JavaClient"
      classpathref="tutorial.classpath" failonerror="true">
      <arg line="simple"/>
    </java>
    <echo>tutorial client secure:</echo>
    <java classname="JavaClient"
      classpathref="tutorial.classpath" failonerror="true">
      <arg line="secure"/>
    </java>
  </target>

  <target name="tutorialserver" description="Run a tutorial server" depends="compile">
      <java classname="JavaServer" fork="true"
        classpathref="tutorial.classpath" failonerror="false" output="${build}/log/tutorial.log">
      </java>
  </target>

  <target name="clean">
    <delete dir="${build}" />
    <delete dir="${gen}"/>
    <delete file="tutorial.jar" />
  </target>

</project>
