<!--
 * 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="tuscany-tutorial-store" default="compile">

    <target name="compile">
        <antcall target="allsubdirs">
            <param name="target" value="compile"/>
        </antcall>
    </target>

    <target name="clean">
        <antcall target="allsubdirs">
            <param name="target" value="clean"/>
        </antcall>
    </target>

    <target name="setup">
        <ant dir="store-db" target="create-db"/>
        <ant dir="store-eu" target="create-db"/>
        <ant dir="store-supplier" target="create-db"/>
    </target>

    <target name="allsubdirs">
        <ant dir="domain" target="${target}"/>
        <ant dir="assets" target="${target}"/>
        <ant dir="store" target="${target}"/>
        <ant dir="store-merger" target="${target}"/>
        <ant dir="store-client" target="${target}"/>
        <ant dir="store-db" target="${target}"/>
        <ant dir="store-supplier" target="${target}"/>
        <ant dir="store-market" target="${target}"/>
        <ant dir="store-eu" target="${target}"/>
        <ant dir="store-mashup" target="${target}"/>
        <ant dir="store-enterprise" target="${target}"/>
        <ant dir="warehouse-spring" target="${target}"/>
        <ant dir="web-services" target="${target}"/>
        <ant dir="catalog-webapp" target="${target}"/>
        <ant dir="catalog-ejb" target="${target}"/>
        <ant dir="catalog-mediation" target="${target}"/>
        <ant dir="store-test" target="${target}"/>
    </target>

</project>
