<!--
 * 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="binding-notification-producer" default="compile">
    <property name="test.class" value="notification.producer.TrafficAdvisoryServer" />
	<property name="test.jar"   value="sample-binding-notification-producer.jar" />
	
    <target name="init">
        <mkdir dir="target/classes"/>
    </target>
	
    <target name="compile" depends="init">
        <javac srcdir="src/main/java"
               destdir="target/classes"
               debug="on"
               source="1.5"
               target="1.5">
            <classpath>
            	<pathelement location="../../lib/tuscany-sca-manifest.jar"/>
            </classpath>
        </javac> 
        <copy todir="target/classes">
            <fileset dir="src/main/resources"/>
        </copy>
        <jar destfile="target/${test.jar}" basedir="target/classes">
            <manifest>
                <attribute name="Main-Class" value="${test.class}" /> 
            </manifest>
        </jar>    	
    </target>	
	
    <target name="run-classes">
        <java classname="${test.class}"
              fork="true">
            <classpath>
                <pathelement path="target/classes"/>
            	<pathelement location="../../lib/tuscany-sca-manifest.jar"/>
            </classpath>
        	<sysproperty key="notification.httpPort" value="8081"/>
        	<arg value="end"/>
        </java>
    </target>
	
    <target name="run">
        <java classname="${test.class}"
              fork="true">
            <classpath>
                <pathelement path="target/${test.jar}"/>
            	<pathelement location="../../lib/tuscany-sca-manifest.jar"/>
            </classpath>
        	<sysproperty key="notification.httpPort" value="8081"/>
        </java>    	
    </target>
	
    <target name="clean">
        <delete dir="target" includeemptydirs="true"/>
    </target>
</project>
