<!--
 * 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-bpel" default="compile">
    <property name="test.class"   value="helloworld.BPELClient" />
    <property name="test.jar"     value="sample-helloworld-bpel.jar" />
    <property name="manifest.jar" value="../../lib/tuscany-sca-manifest.jar" />

    <target name="init">
        <mkdir dir="target/classes"/>
        <mkdir dir="target/wsdl2java-source"/>
    </target>

    <target name="generate-wsdl" depends="init">
        <java classname="org.apache.tuscany.sdo.generate.XSD2JavaGenerator" fork="true">
            <arg value="-targetDirectory"/>
            <arg value="target/wsdl2java-source"/>
            <arg value="-prefix"/>
            <arg value="HelloWorld"/>
            <arg value="-noContainment"/>
            <arg value="-noUnsettable"/>
            <arg value="src/main/resources/helloworld.wsdl"/>

            <classpath>
                <pathelement location="${manifest.jar}"/>
            </classpath>
        </java>
        
        <java classname="org.apache.tuscany.tools.wsdl2java.generate.WSDL2JavaGenerator" fork="true">
            <arg value="-targetDirectory"/>
            <arg value="target/wsdl2java-source"/>
            <arg value="src/main/resources/helloworld.wsdl"/>

            <classpath>
                <pathelement location="${manifest.jar}"/>
            </classpath>
        </java>
    </target>

    <target name="unzip-ode-db" depends="init">
        <unzip src="../../lib/ode-dao-jpa-ojpa-derby-1.1.1.zip" dest="target/database"/>
    </target> 

    <target name="compile" depends="init,generate-wsdl,unzip-ode-db">
        <javac destdir="target/classes" debug="on" source="1.5" target="1.5">
            <src path="src/main/java"/>
            <src path="target/wsdl2java-source"/>
            <classpath>
                <pathelement location="${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">
        <java classname="${test.class}" fork="true">
            <!-- jvmarg value="-Xdebug"/ -->
            <!-- jvmarg value="-Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y"/ -->
            <classpath>
                <pathelement location="target/classes"/>
                <pathelement location="target/database"/>
                <pathelement location="${manifest.jar}"/>
            </classpath>
        </java>
    </target>
    
    <target name="clean">
        <delete includeemptydirs="true">
            <fileset dir="target"/>
        </delete>
    </target>

</project>
