<!--
  ~ 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="userguide" default="generate.service">
    <property name="mainDir" value="../.."/>
    <property name="classes.dir" value="build/classes"/>
    <path id="axis.classpath">
        <fileset dir="../../lib">
            <include name="*.jar"/>
        </fileset>
        <pathelement location="build/userguide.jar"/>
    </path>
<mkdir dir="${basedir}/build/classes"/>


    <target name="run.client.all"
            depends="run.client.rest,run.client.ping,run.client.blocking,run.client.blockingdual,run.client.nonblocking,run.client.nonblockingdual,run.client.servicewithmodule">
    </target>
    
    <target name="compile">
    		<mkdir dir="${classes.dir}" />
		<javac srcdir="src" destdir="${classes.dir}" includeantruntime="false">
                        <exclude name="**/springboot/**/*.java" />
			<classpath refid="axis.classpath" />
		</javac>
		<jar destfile="build/userguide.jar">
            		<fileset dir="${classes.dir}">
                		<include name="userguide/**"/>
            		</fileset>
       		</jar>
    </target>
    
    <target name="generate.service" depends="compile">
            <jar destfile="build/MyService.aar">
            <fileset dir="src/userguide/example1/">
                <include name="META-INF/**"/>
            </fileset>
            <fileset dir="${classes.dir}">
                <include name="userguide/example1/**/*.class"/>
            </fileset>
        </jar>
        <copy file="build/MyService.aar" tofile="../../repository/services/sample-MyService.aar" overwrite="true"/>
        <jar destfile="build/MyServiceWithModule.aar" >
            <fileset dir="src/userguide/example2/">
                <include name="META-INF/**"/>
            </fileset>
            <fileset dir="${classes.dir}">
                <include name="userguide/example2/**/*.class"/>
            </fileset>
        </jar>
        <copy file="build/MyServiceWithModule.aar" tofile="../../repository/services/sample-MyServiceWithModule.aar" overwrite="true"/>
        <jar destfile="build/WsaMappingService.aar">
            <fileset dir="src/userguide/example3/">
                <include name="META-INF/**"/>
            </fileset>
            <fileset dir="${classes.dir}">
                <include name="userguide/example3/**/*.class"/>
            </fileset>
        </jar>
        <copy file="build/WsaMappingService.aar" tofile="../../repository/services/sample-WsaMappingService.aar" overwrite="true"/>
    </target>
    
    <target name="generate.module" depends="compile">
       <jar destfile="build/logging.mar">
            <fileset dir="src/userguide/loggingmodule/">
                <include name="META-INF/**"/>
            </fileset>
            <fileset dir="${classes.dir}">
                <include name="userguide/loggingmodule/**/*.class"/>
            </fileset>
       </jar>
       <copy file="build/logging.mar" tofile="../../repository/modules/sample-logging.mar" overwrite="true"/>
       <echo message="*** Please add the logging phase to the ../../conf/axis2.xml. For more details please refer to the http://ws.apache.org/axis2/1_2/modules.html ***"/>
    </target>

    <target name="run.client.blocking" depends="compile">
        <java classname="userguide.clients.EchoBlockingClient"
              classpathref="axis.classpath" fork="true">
            <jvmarg value="-Daxis2.repo=${mainDir}/repository"/>
	    <jvmarg value="-Daxis2.xml=conf/axis2.xml"/>
        </java>
    </target>
    <target name="run.client.blockingdual" depends="compile">
        <java classname="userguide.clients.EchoBlockingDualClient"
              classpathref="axis.classpath" fork="true">
            <jvmarg value="-Daxis2.repo=${mainDir}/repository"/>
	    <jvmarg value="-Daxis2.xml=conf/axis2.xml"/>
        </java>
    </target>
    
    <target name="run.client.nonblocking" depends="compile">
        <java classname="userguide.clients.EchoNonBlockingClient"
              classpathref="axis.classpath" fork="true">
            <jvmarg value="-Daxis2.repo=${mainDir}/repository"/>
	    <jvmarg value="-Daxis2.xml=conf/axis2.xml"/>
        </java>
    </target>
    
    <target name="run.client.nonblockingdual" depends="compile">
        <java classname="userguide.clients.EchoNonBlockingDualClient"
              classpathref="axis.classpath" fork="true">
            <jvmarg value="-Daxis2.repo=${mainDir}/repository"/>
	    <jvmarg value="-Daxis2.xml=conf/axis2.xml"/>
        </java>
    </target>
    
    <target name="run.client.ping" depends="compile">
        <java classname="userguide.clients.PingClient"
              classpathref="axis.classpath" fork="true">
            <jvmarg value="-Daxis2.repo=${mainDir}/repository"/>
	    <jvmarg value="-Daxis2.xml=conf/axis2.xml"/>
        </java>
    </target>
    
    <target name="run.client.rest" depends="compile">
        <java classname="userguide.clients.RESTClient"
              classpathref="axis.classpath" fork="true">
            <jvmarg value="-Daxis2.repo=${mainDir}/repository"/>
	    <jvmarg value="-Daxis2.xml=conf/axis2.xml"/>
        </java>
    </target>

    <target name="run.client.servicewithmodule" depends="compile">
    	<echo message="${mainDir}" />
	<echo message="${mainDir}/repository/conf/axis2.xml" />
        <java classname="userguide.clients.ClientForWebServiceWithModule"
              classpathref="axis.classpath" fork="true">
           <jvmarg value="-Daxis2.repo=${mainDir}/repository"/>	   
	   <jvmarg value="-Daxis2.xml=conf/axis2.xml"/>
        </java>
    </target>
    
    <target name="run.client">
	<echo message="Please use the following ant targets to run the clients" />
	<echo message="run.client.ping" />
	<echo message="run.client.blocking" />
	<echo message="run.client.blockingdual" />
	<echo message="run.client.nonblocking" />
	<echo message="run.client.nonblockingdual" />
	<echo message="run.client.servicewithmodule" />
	<echo message="run.client.all  -  run all clients" />
    </target>
    <target name="clean">
	<delete dir="build" />
    </target>
</project>
