<!--
 * 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-eu" 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-eu.jar" basedir="target/classes">
            <manifest>
            </manifest>
        </jar>
        <antcall target="create-db"/>
    </target>

    <target name="create-db">
        <!--
           Create the example database.
        -->
        <sql driver="org.apache.derby.jdbc.EmbeddedDriver"
             url="jdbc:derby:${basedir}/target/cart-eu-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>
