<!--
  ~ 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/**" includeantruntime="false">
			<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>
