<!--
  ~ 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="SOAPWithAttachmentsSample" default="generate.service">
	<property environment="env" />
	<property name="axis2.home" value="../../" />
	<property name="axis2.repo" value="${axis2.home}/repository" />
	<property name="build.dir" value="build" />
	<property name="client.classes.dir" value="${build.dir}/classes" />
	<path id="axis.classpath">
		<fileset dir="${axis2.home}/lib">
			<include name="*.jar" />
		</fileset>
		<pathelement location="build/swaSampleClient.jar" />
	</path>

	<target name="generate.service" depends="compile">
		<jar destfile="${build.dir}/sample-swa.aar">	
			<fileset dir="resources/">
				<include name="META-INF/services.xml" />
			</fileset>
			<fileset dir="${build.dir}/classes">
				<include name="sample/soapwithattachments/service/**/*.class" />
			</fileset>
		</jar>
		<copy file="${build.dir}/sample-swa.aar" tofile="${axis2.home}/repository/services/sample-swa.aar" overwrite="true" />
	</target>

	<target name="compile">
		<mkdir dir="${client.classes.dir}" />
		<!-- Compile client -->
		<javac debug="on"  srcdir="src" destdir="${client.classes.dir}">
			<classpath refid="axis.classpath" />
		</javac>
	</target>
	<target name="check-parameters">
		<condition property="parameters.set">
			<and>
				<isset property="dest" />
				<isset property="file" />
			</and>
		</condition>
		<!-- This is a hack to get a if-else working in ant. Some much more "ANTy" person is welcome to improve this -->
		<antcall target="print-usage" />
	</target>

	<target name="print-usage" unless="parameters.set">
		<echo message="ant -Dfile &lt;file to be transfered&gt;  -Ddest &lt;name of the destination file&gt;" />
	</target>

	<target name="run.client" depends="compile,check-parameters" if="parameters.set">
		<jar destfile="${build.dir}/swaSampleClient.jar">
			<fileset dir="${build.dir}/classes">
				<include name="sample/soapwithattachments/client/**/*.class" />
			</fileset>
		</jar>
		<java classname="sample.soapwithattachments.client.SWAClient" classpathref="axis.classpath" fork="true">
			<arg value="-file" />
			<arg value="${file}" />
			<arg value="-dest" />
			<arg value="${dest}" />
			<jvmarg value="-Daxis2.repo=${axis2.repo}" />
		</java>
	</target>
	<target name="clean">
		<delete dir="build" />
	</target>
</project>
