<!--
 * 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="tutorial-store-supplier" default="compile">

    <target name="compile">
        <mkdir dir="target/classes"/>
        <copy todir="target/classes">
            <fileset dir="." excludes="**/*.java, **/.*/**, pom.xml, build*.xml, target/**, derby.log"/>
        </copy>
        <jar destfile="target/tutorial-store-supplier.jar" basedir="target/classes">
            <manifest>
            </manifest>
        </jar>
        <antcall target="create-db"/>
    </target>

    <target name="create-db">
        <!--
           Create the example database.  This database is needed by the unit test
           in ../store-test.
        -->
        <sql driver="org.apache.derby.jdbc.EmbeddedDriver"
             url="jdbc:derby:${basedir}/target/cart-db;create=true"
             userid=""
             password=""
             autocommit="true"
             onerror="continue"
             src="${basedir}/../assets/services/db/cart.sql"
             classpath="${basedir}/../../../lib/derby-10.3.1.4.jar"/>
        
        <!--
           Shutdown the example database.  This is commented out for now because
           Ant 1.8.0 or higher is needed to handle the failOnConnectionError="true"
           parameter.  It's OK to skip this shutdown when using Ant to create the
           database because the shutdown will happen when the "ant" command exits.
           When using maven to create the database, the shutdown is essential
           because the mvn command goes on to run the unit test in ../store-test,
           and this test would have problems if the database isn't shut down first.

        <sql driver="org.apache.derby.jdbc.EmbeddedDriver"
             url="jdbc:derby:${basedir}/target/cart-db;shutdown=true"
             userid=""
             password=""
             failOnConnectionError="true"
             classpath="${basedir}/../../../lib/derby-10.3.1.4.jar">
            NONE
        </sql>
        -->
    </target>

    <target name="package" depends="compile"/>

    <target name="clean">
        <delete dir="target" includeemptydirs="true"/>
    </target>

</project>
