<!--
 * 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="sample-helloworld-ws-service-webapp" default="package">
    <property file="${user.home}/tuscany/build.properties" />
    <property file="${user.home}/build.properties" />

    <property name="tuscany.sca.manifest.location" value="../../lib/tuscany-sca-manifest.jar"/>
    <property name="tuscany.sca.lib.location" value="../../lib"/>
    <property name="tuscany.sca.modules.location" value="../../modules"/>
            
    <path id="project.classpath">
        <pathelement path="target/classes"/>
        <pathelement path="target/sdo-source"/>
        <pathelement location="${tuscany.sca.manifest.location}"/>
    </path>
    	
    <target name="init">
        <mkdir dir="target/classes"/>
        <mkdir dir="target/sdo-source"/>
    </target>
	
    	
    <target name="compile" depends="init">
        <javac destdir="target/classes"
               debug="on"
               source="1.5"
               target="1.5">
               <src location="src/main/java"/>
               <src location="target/sdo-source"/>
               <classpath refid="project.classpath"/>
        </javac> 
        <copy todir="target/classes">
            <fileset dir="src/main/resources"/>
            <fileset dir="target/sdo-source"/>
        </copy>
    </target>	
	
    <target name="package" depends="compile">
        <war destfile="target/sample-helloworld-ws-service-webapp.war" 
             webxml="src/main/webapp/WEB-INF/web.xml">
            <fileset dir="src/main/webapp"/>       	
            <zipfileset dir="${tuscany.sca.modules.location}" prefix="WEB-INF/lib">
            	<include name="sca-api-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-assembly-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-assembly-xml-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-binding-feed-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-binding-jsonrpc-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-binding-sca-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-binding-sca-xml-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-binding-ws-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-binding-ws-axis2-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-binding-ws-xml-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-contribution-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-contribution-impl-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-contribution-java-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-contribution-namespace-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-core-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-core-databinding-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-core-spi-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-databinding-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-databinding-axiom-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-databinding-jaxb-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-databinding-sdo-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-distributed-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-extension-helper-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-host-embedded-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-host-http-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-host-webapp-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-implementation-java-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-implementation-java-runtime-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-implementation-java-xml-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-interface-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-interface-java-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-interface-java-xml-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-interface-wsdl-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-interface-wsdl-runtime-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-interface-wsdl-xml-1.7-SNAPSHOT.jar"/>         	
            	<include name="tuscany-policy-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-policy-xml-1.7-SNAPSHOT.jar"/>
            </zipfileset>
            <lib dir="${tuscany.sca.lib.location}">
            	<include name="XmlSchema-1.3.1.jar"/>
            	<include name="activation-1.1.jar"/>
            	<include name="annogen-0.1.0.jar"/>
            	<include name="ant-1.7.0.jar"/>
            	<include name="ant-launcher-1.7.0.jar"/>
            	<include name="axiom-api-1.2.4.jar"/>
            	<include name="axiom-dom-1.2.4.jar"/>
            	<include name="axiom-impl-1.2.4.jar"/>
            	<include name="axis2-java2wsdl-1.2.jar"/>
            	<include name="axis2-kernel-1.2.jar"/>
            	<include name="backport-util-concurrent-2.2.jar"/>
            	<include name="backport-util-concurrent-3.0.jar"/>
            	<include name="cglib-nodep-2.1_3.jar"/>
            	<include name="common-2.2.3.jar"/>
            	<include name="commons-codec-1.3.jar"/>
            	<include name="commons-fileupload-1.1.1.jar"/>
            	<include name="commons-httpclient-3.1.jar"/>
            	<include name="commons-io-1.1.jar"/>
            	<include name="commons-logging-1.1.jar"/>
            	<include name="ecore-2.2.3.jar"/>
            	<include name="ecore-change-2.2.3.jar"/>
            	<include name="ecore-xmi-2.2.3.jar"/>
            	<include name="geronimo-commonj_1.1_spec-1.0.jar"/>
            	<include name="geronimo-jms_1.1_spec-1.1.jar"/>
            	<include name="jakarta-httpcore-4.0-alpha4.jar"/>
            	<include name="jaxb-api-2.1.jar"/>
            	<include name="jaxb-impl-2.1.4.jar"/>
            	<include name="jaxen-1.1-beta-9.jar"/>
            	<include name="jaxws-api-2.1.jar"/>
            	<include name="jdom-1.0.jar"/>
            	<include name="json-rpc-1.0.jar"/>
            	<include name="jsr181-api-1.0-MR1.jar"/>
            	<include name="jsr250-api-1.0.jar"/>
            	<include name="mail-1.4.jar"/>
            	<include name="neethi-2.0.1.jar"/>
            	<include name="rome-0.9.jar"/>
            	<include name="saaj-api-1.3.jar"/>
            	<include name="sca-api-1.7-SNAPSHOT.jar"/>
            	<include name="stax-api-1.0-2.jar"/>
            	<include name="stax-api-1.0.1.jar"/>
            	<include name="woden-1.0-incubating-M7a.jar"/>
            	<include name="wsdl4j-1.6.2.jar"/>
            	<include name="wstx-asl-3.2.1.jar"/>
            	<include name="xercesImpl-2.8.1.jar"/>
            	<include name="xml-apis-1.3.03.jar"/>
            	<include name="xsd-2.2.3.jar"/>
            	<include name="tuscany-sdo-api-r2.1-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-sdo-impl-1.7-SNAPSHOT.jar"/>
            	<include name="tuscany-sdo-lib-1.7-SNAPSHOT.jar"/>
            </lib>        	
            <classes dir="target/classes"/>
            <classes dir="target/sdo-source"/>
        </war>
     </target>
		
    <target name="clean">
        <delete dir="target" includeemptydirs="true"/>
    </target>
</project>
