<!--
 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="."
  xmlns:artifact="antlib:org.apache.maven.artifact.ant">

  <description>Thrift Java Tutorial</description>

  <property name="src" location="src" />
  <property name="gen" location="gen-java" />
  <property name="build" location="build" />
  <property file="${basedir}/build.properties"/>

  <!-- the root directory, where you unpack thrift distibution (e.g.: thrift-0.x.x.tar.gz) -->
  <property name="thrift.dir" location="../.." />
  <property name="thrift.java.dir" location="${thrift.dir}/lib/java" />
  <property name="build.tools.dir" location="${thrift.java.dir}/build/tools/"/>

  <path id="libs.classpath">
    <fileset dir="${thrift.java.dir}/build/libs">
      <include name="libthrift*.jar" />
      <exclude name="libthrift*test.jar" />
      <exclude name="libthrift*javadoc.jar" />
      <exclude name="libthrift*sources.jar" />
    </fileset>
    <fileset dir="${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.tools.dir}"/>
    <mkdir dir="${build}"/>
    <mkdir dir="${build}/log"/>
    <mkdir dir="${build}/lib"/>
  </target>

  <target name="compile" depends="init, generate, resolve">
    <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>

  <target name="mvn.ant.tasks.download" depends="init, mvn.ant.tasks.check" unless="mvn.ant.tasks.found">
    <get src="${mvn.ant.task.url}/${mvn.ant.task.jar}" dest="${build.tools.dir}/${mvn.ant.task.jar}" usetimestamp="true"/>
  </target>

  <target name="mvn.ant.tasks.check">
    <condition property="mvn.ant.tasks.found">
      <typefound uri="antlib:org.apache.maven.artifact.ant" name="artifact"/>
    </condition>
  </target>

  <target name="resolve" depends="mvn.ant.tasks.download" unless="mvn.finished">
    <typedef uri="antlib:org.apache.maven.artifact.ant" classpath="${thrift.java.dir}/build/tools/${mvn.ant.task.jar}"/>

    <artifact:dependencies filesetId="tutorial.dependency.jars">
      <dependency groupId="org.apache.httpcomponents" artifactId="httpclient" version="4.0.1"/>
      <dependency groupId="com.googlecode.jslint4java" artifactId="jslint4java-ant" version="1.4.6"/>
      <dependency groupId="eu.medsea.mimeutil" artifactId="mime-util" version="2.1.3"/>
      <dependency groupId="javax.annotation" artifactId="javax.annotation-api" version="1.3.2"/>
      <remoteRepository url="${mvn.repo}"/>
    </artifact:dependencies>

    <!-- Copy the dependencies to the build/lib dir -->
    <copy todir="${build}/lib">
      <fileset refid="tutorial.dependency.jars"/>
      <mapper type="flatten"/>
    </copy>

    <property name="mvn.finished" value="true"/>
  </target>

</project>
