<!--
 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/libs">
      <include name="libthrift*.jar" />
      <exclude name="libthrift*test.jar" />
      <exclude name="libthrift*javadoc.jar" />
      <exclude name="libthrift*sources.jar" />
    </fileset>
    <fileset dir="../../lib/java/build/deps">
      <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 compiler="modern" includeantruntime="false" srcdir="${gen}" destdir="${build}" classpathref="libs.classpath" />
    <javac compiler="modern" 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>
