<!--
 * 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="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>
