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

    <property environment="env"/>
    <property name="AXIS2_HOME" value="../.."/>

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

    <path id="axis2.classpath">
        <fileset dir="${AXIS2_HOME}/lib">
            <include name="*.jar"/>
        </fileset>
    </path>

    <target name="compile.service">
        <mkdir dir="${build.dir}"/>
        <mkdir dir="${build.dir}/classes"/>

        <!--First let's compile the classes-->
        <javac debug="on" 
               fork="true"
               destdir="${build.dir}/classes" 
               srcdir="${basedir}/src"
               classpathref="axis2.classpath"
               includeantruntime="false">
        </javac>
    </target>

    <target name="generate.wsdl" depends="compile.service">
        <taskdef name="java2wsdl"
                 classname="org.apache.ws.java2wsdl.Java2WSDLTask"
                 classpathref="axis2.classpath"/>
        <java2wsdl className="samples.quickstart.service.pojo.StockQuoteService"
                   outputLocation="${build.dir}"
                   targetNamespace="http://quickstart.samples/"
                   schemaTargetNamespace="http://quickstart.samples/xsd">
            <classpath>
                <pathelement path="${axis2.classpath}"/>
                <pathelement location="${build.dir}/classes"/>
            </classpath>
        </java2wsdl>
    </target>

    <target name="generate.service" depends="compile.service">
        <!--aar them up -->
        <copy toDir="${build.dir}/classes" failonerror="false">
            <fileset dir="${basedir}/resources">
                <include name="**/*.xml"/>
            </fileset>
        </copy>
        <jar destfile="${build.dir}/StockQuoteService.aar">
            <fileset excludes="**/Test.class" dir="${build.dir}/classes"/>
        </jar>
        <copy file="${build.dir}/StockQuoteService.aar"
              toDir="${basedir}/../../repository/services"
              overwrite="yes">  
        </copy> 
    </target>

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