<!--
 * 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-demos" 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="alert-aggregator-webapp" target="${target}"/>
        <ant dir="bigbank-account" target="${target}"/>
        <ant dir="bigbank" target="${target}"/>
        <ant dir="bigbank-calculator" target="${target}"/>
        <ant dir="bigbank-stockquote" target="${target}"/>
        <ant dir="mortgage-creditcheck" target="${target}"/>
        <ant dir="mortgage-loanapproval" target="${target}"/>
        <ant dir="xml-bigbank" target="${target}"/>
    </target>

</project>
