<!--
 * 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-db" 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-db.jar" basedir="target/classes">
            <manifest>
            </manifest>
        </jar>

        <!--
           Create the example database.
        -->
        <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"/>
    </target>

    <target name="package" depends="compile"/>

    <target name="clean">
        <delete dir="target" includeemptydirs="true"/>
    </target>

</project>
