<!--
  ~ 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="json" basedir="." default="generate.service">

    <property name="dest.dir" value="build" />

    <property name="dest.dir.classes" value="${dest.dir}/classes" />

    <property name="dest.dir.lib" value="${dest.dir}/lib" />

    <property name="axis2.home" value="../.." />

    <property name="repository.path" value="${axis2.home}/repository/services" />

    <path id="axis.classpath">
        <fileset dir="${axis2.home}/lib">
            <include name="*.jar" />
        </fileset>
        <pathelement location="${dest.dir}/json-client.jar" />
    </path>

    <target name="clean">
        <delete dir="${dest.dir}" />
    </target>

    <target name="prepare" >
        <mkdir dir="${dest.dir}" />
        <mkdir dir="${dest.dir.classes}" />
        <mkdir dir="${dest.dir.lib}" />
        <mkdir dir="${dest.dir.classes}/META-INF" />
        <!--<copy file="resources/axis2.xml" tofile="${axis2.home}/conf/axis2.xml" overwrite="true" />-->

    </target>

    <target name="generate.service" depends="clean,prepare">
        <copy file="src/META-INF/services.xml" tofile="${dest.dir.classes}/META-INF/services.xml" overwrite="true" />

        <javac srcdir="src" destdir="${dest.dir.classes}" fork="true">
            <classpath refid="axis.classpath" />
        </javac>

        <jar basedir="${dest.dir.classes}" destfile="${dest.dir}/JsonService.aar" includes="sample/json/service/**,META-INF/**/"/>

        <copy file="${dest.dir}/JsonService.aar" tofile="${repository.path}/JsonService.aar" overwrite="true" />

    </target>

    <target name="client.compile">
        <javac srcdir="src" destdir="${dest.dir.classes}" includes="sample.json.client/**" fork="true">
            <classpath refid="axis.classpath"/>
        </javac>
    </target>

    <target name="client.jar" depends="client.compile">
        <jar basedir="${dest.dir.classes}" destfile="${dest.dir}/json-client.jar" includes="sample/json/client/**"/>
    </target>

    <target name="run.client" depends="client.jar">
        <java classname="sample.json.client.JsonClient"  fork="true">
            <classpath refid="axis.classpath"  />
        </java>
    </target>


</project>