<!--
 * 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="quote-xquery" default="compile">
    <property name="test.class" value="xquery.quote.XQueryQuoteClient" />
    <property name="test.server.class" value="xquery.quote.XQueryQuoteServer" />
    <property name="test.jar" value="sample-quote-xquery.jar" />

    <target name="init">
        <mkdir dir="target/classes" />
    </target>

    <property name="tuscany.sca.manifest.location" value="../../lib/tuscany-sca-manifest.jar" />

    <target name="generate-sdo" depends="init">
        <java classname="org.apache.tuscany.sdo.generate.XSD2JavaGenerator" fork="true">
            <arg value="-targetDirectory" />
            <arg value="target/sdo-source" />
            <arg value="-noNotification" />
            <!-- Make sure the -noUnsettable is not used, otherwise, the SDO cannot be
            properly transformed to Node as some properties are treated as unset -->
            <arg value="src/main/resources/wsdl/quotejoin.wsdl" />

            <classpath location="${tuscany.sca.manifest.location}" />
        </java>
        <java classname="org.apache.tuscany.sdo.generate.XSD2JavaGenerator" fork="true">
            <arg value="-targetDirectory" />
            <arg value="target/sdo-source" />
            <arg value="-noNotification" />
            <!-- Make sure the -noUnsettable is not used, otherwise, the SDO cannot be
            properly transformed to Node as some properties are treated as unset -->
            <arg value="src/main/resources/wsdl/Quote.xsd" />

            <classpath location="${tuscany.sca.manifest.location}" />
        </java>
        <java classname="org.apache.tuscany.sdo.generate.XSD2JavaGenerator" fork="true">
            <arg value="-targetDirectory" />
            <arg value="target/sdo-source" />
            <arg value="-noNotification" />
            <!-- Make sure the -noUnsettable is not used, otherwise, the SDO cannot be
            properly transformed to Node as some properties are treated as unset -->
            <arg value="src/main/resources/wsdl/AvailQuote.xsd" />

            <classpath location="${tuscany.sca.manifest.location}" />
        </java>
        <java classname="org.apache.tuscany.sdo.generate.XSD2JavaGenerator" fork="true">
            <arg value="-targetDirectory" />
            <arg value="target/sdo-source" />
            <arg value="-noNotification" />
            <!-- Make sure the -noUnsettable is not used, otherwise, the SDO cannot be
            properly transformed to Node as some properties are treated as unset -->
            <arg value="src/main/resources/wsdl/PriceQuote.xsd" />

            <classpath location="${tuscany.sca.manifest.location}" />
        </java>

    </target>


    <target name="compile" depends="init, generate-sdo">
        <javac destdir="target/classes" debug="on" source="1.5" target="1.5">
            <src path="target/sdo-source"/>
            <src path="src/main/java"/>
            <classpath location="${tuscany.sca.manifest.location}" />
        </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="${tuscany.sca.manifest.location}" />
            </classpath>
        </java>
    </target>

    <target name="run">
        <java classname="${test.class}" fork="true">
            <classpath>
                <pathelement path="target/${test.jar}" />
                <pathelement location="${tuscany.sca.manifest.location}" />
            </classpath>
        </java>
    </target>

    <target name="run-server">
        <java classname="${test.server.class}" fork="true">
            <classpath>
                <pathelement path="target/${test.jar}" />
                <pathelement location="${tuscany.sca.manifest.location}" />
            </classpath>
        </java>
    </target>

    <target name="clean">
        <delete quiet="true" includeemptydirs="true">
            <fileset dir="target" />
        </delete>
    </target>
</project>
