<!--
 * 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="scatours-launchers" default="compile">

    <target name="compile">
        <antcall target="allsubdirs">
            <param name="target" value="compile"/>
        </antcall>
    </target>

    <target name="test">
        <antcall target="allsubdirs">
            <param name="target" value="test"/>
        </antcall>
    </target>

    <target name="clean">
        <antcall target="allsubdirs">
            <param name="target" value="clean"/>
        </antcall>
    </target>

    <target name="allsubdirs">
        <ant dir="blog-feed" target="${target}"/>
        <ant dir="buildingblocks" target="${target}"/>
        <ant dir="currency-converter" target="${target}"/>
        <ant dir="currency-converter-corba" target="${target}"/>
        <ant dir="currency-converter-jms" target="${target}"/>
        <ant dir="currency-converter-rmi" target="${target}"/>
        <ant dir="currency-converter-ws" target="${target}"/>
        <ant dir="databinding" target="${target}"/>
        <ant dir="feed-logger" target="${target}"/>
        <ant dir="fullapp" target="${target}"/>
        <ant dir="fullapp-domain" target="${target}"/>
        <ant dir="fullapp-nodes" target="${target}"/>
        <ant dir="help-pages" target="${target}"/>
        <ant dir="interaction" target="${target}"/>
        <ant dir="introducing" target="${target}"/>
        <ant dir="introducing-client" target="${target}"/>
        <ant dir="introducing-domain" target="${target}"/>
        <ant dir="introducing-tours" target="${target}"/>
        <ant dir="introducing-trips" target="${target}"/>
        <ant dir="jumpstart" target="${target}"/>
        <ant dir="notification-corba" target="${target}"/>
        <ant dir="notification-ejb" target="${target}"/>
        <ant dir="notification-jms" target="${target}"/>
        <ant dir="notification-rmi" target="${target}"/>
        <ant dir="notification-ws" target="${target}"/>
        <ant dir="payment-java" target="${target}"/>
        <ant dir="payment-java-callback" target="${target}"/>
        <ant dir="payment-java-policy" target="${target}"/>
        <ant dir="payment-java-reference-pass" target="${target}"/>
        <ant dir="payment-spring" target="${target}"/>
        <ant dir="payment-spring-scatag" target="${target}"/>
        <ant dir="payment-bpel" target="${target}"/>
        <ant dir="payment-groovy" target="${target}"/>
        <ant dir="payment-python" target="${target}"/>
        <ant dir="policy" target="${target}"/>
        <ant dir="usingsca" target="${target}"/>
    </target>

</project>
