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

	<property name="service.name" value="WeatherService" />
	<property name="dest.dir" value="build" />
	<property name="dest.dir.classes" value="${dest.dir}/${service.name}" />
	<property name="dest.dir.lib" value="${dest.dir}/lib" />	
	<property name="axis2.home" value="../../" />
	<property name="repository.path" value="${axis2.home}/repository" />

	<path id="build.class.path">
		<fileset dir="${axis2.home}/lib">
			<include name="*.jar" />
		</fileset>
	</path>

	<path id="client.class.path">
		<fileset dir="${axis2.home}/lib">
			<include name="*.jar" />
		</fileset>
		<fileset dir="${dest.dir.lib}">
			<include name="*.jar" />
		</fileset>

	</path>
	<target name="clean">
		<delete dir="${dest.dir}" />
		<delete dir="src" includes="sample/pojo/stub/**"/>
	</target>

	<target name="prepare">
		<mkdir dir="${dest.dir}" />
		<mkdir dir="${dest.dir}/lib" />
		<mkdir dir="${dest.dir.classes}" />
		<mkdir dir="${dest.dir.classes}/META-INF" />
	</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}" includes="sample/pojo/service/**,sample/pojo/data/**">
			<classpath refid="build.class.path" />
		</javac>
		
		<jar basedir="${dest.dir.classes}" destfile="${dest.dir}/${service.name}.aar" />

		<copy file="${dest.dir}/${service.name}.aar" tofile="${repository.path}/services/${service.name}.aar" overwrite="true" />
		
	</target>

	<target name="rpc.client" depends="clean,prepare">

		<antcall target="rpc.client.compile" />

		<antcall target="rpc.client.jar" />

		<antcall target="rpc.client.run" />

	</target>

	<target name="rpc.client.compile">
		<javac srcdir="src" destdir="${dest.dir.classes}" includes="sample/pojo/rpcclient/**,sample/pojo/data/**">
			<classpath refid="build.class.path" />
		</javac>
	</target>

	<target name="rpc.client.jar">
		<jar basedir="${dest.dir.classes}" destfile="${dest.dir.lib}/rpc-client.jar" includes="sample/pojo/rpcclient/**,sample/pojo/data/**" />
	</target>

	<target name="rpc.client.run">
		<java classname="sample.pojo.rpcclient.WeatherRPCClient" fork="true">
			<classpath refid="client.class.path" />
		</java>
	</target>
</project>
