<!--
  ~ 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="version" basedir="." default="generate.service">
	
	<property name="dest.dir" value="build" />
	
	<property name="dest.dir.classes" value="${dest.dir}/classes" />
	
	<property name="axis2.home" value="../../" />
	
	<property name="repository.path" value="${axis2.home}/repository/services" />
	
	<path id="build.class.path">
		<fileset dir="${axis2.home}/lib">
			<include name="*.jar" />
		</fileset>
	</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.classes}/META-INF" />
	
	</target>
	
	<target name="generate.service" depends="clean,prepare">
		
		<copy file="src/sample/axisversion/META-INF/services.xml" tofile="${dest.dir.classes}/META-INF/services.xml" overwrite="true" />
		
		<javac srcdir="src" destdir="${dest.dir.classes}" includes="sample/axisversion/**">
			<classpath refid="build.class.path" />
		</javac>
		
		<jar basedir="${dest.dir.classes}" destfile="${dest.dir}/version.aar" />
		
		<copy file="${dest.dir}/version.aar" tofile="${repository.path}/version.aar" overwrite="true" />
	
	</target>
	
</project>
