<!--
  ~ 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 default="build.sample">

    
	<!--<classpath id="classpath1">
		<pathelement location="lib/*.jar"/>
	</classpath>-->
	
	<target name="build.sample">
		<property name="eventing.temp.dir" value="build/temp" />
	    <property name="listner1.temp.dir" value="${eventing.temp.dir}/listner1" />
	    <property name="listner2.temp.dir" value="${eventing.temp.dir}/listner2" />
	    <property name="publisher.temp.dir" value="${eventing.temp.dir}/publisher" />
	        
	    <mkdir dir="${listner1.temp.dir}" />
	    <mkdir dir="${listner1.temp.dir}/META-INF" />
	    <mkdir dir="${listner2.temp.dir}" />
	    <mkdir dir="${listner2.temp.dir}/META-INF" />
	    <mkdir dir="${publisher.temp.dir}" />
	    <mkdir dir="${publisher.temp.dir}/META-INF" />

	    <mkdir dir="build/classes" />
	    <mkdir dir="build/lib" />
	    	
		<javac srcdir="src" destdir="build/classes">
			<classpath>
			    <fileset dir="build/lib">
			        <include name="*.jar"/>
			    </fileset>
			</classpath>
		</javac>
		
	    <copy toFile="${listner1.temp.dir}/META-INF/services.xml" file="listner1.services.xml"/>
	    <copy toFile="${listner2.temp.dir}/META-INF/services.xml" file="listner2.services.xml"/>
	        <copy toFile="${publisher.temp.dir}/META-INF/services.xml" file="publisher.services.xml"/>
	        
	        <jar destfile="build/ListnerService1.aar">
	            <fileset dir="build/classes">
	                <include name="sample/eventing/**/**/*ListnerService1*" />
	            </fileset>
	            <fileset dir="${listner1.temp.dir}">
	                <include name="META-INF/**"/>
	            </fileset>
	        </jar>
	        
	        <jar destfile="build/ListnerService2.aar">
	            <fileset dir="build/classes">
	                <include name="sample/eventing/**/**/*ListnerService2*" />
	            </fileset>
	            <fileset dir="${listner2.temp.dir}">
	                <include name="META-INF/**"/>
	            </fileset>
	        </jar>
	        
	        <jar destfile="build/PublisherService.aar">
	            <fileset dir="build/classes">
	                <include name="sample/eventing/**/**/*PublisherService*" />
	            </fileset>
	            <fileset dir="${publisher.temp.dir}">
	                <include name="META-INF/**"/>
	            </fileset>
	        </jar>
	        
	        <jar destfile="build/ListnerService1.aar">
	            <fileset dir="build/classes">
	                <include name="sample/eventing/**/**/*ListnerService1*" />
	            </fileset>
	            <fileset dir="${listner1.temp.dir}">
	                <include name="META-INF/**"/>
	            </fileset>
	        </jar>
	        
	        <jar destfile="build/EventingSample.jar">
	            <fileset dir="build/classes">
	                <include name="sample/eventing/**"/>
	            </fileset>
	        </jar>
	        
	        <copy todir="build">
	            <fileset dir=".">
	            	 <include name="*.sh"/>
	            	 <include name="*.bat"/>
	        	</fileset>
	        </copy>
	</target>

</project>