<!--
 * 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="itest-samples" default="run"> 
	
	<!-- 
	    compile and run each sample as though the user were running
	    samples from the binary distribution. Here we use ant targets
	    in the first instance but for some tests we may want to run 
	    jars directly or fire up webapp containers and deploy wars. In other cases
	    we may need to run two samples together to provide reference and 
	    service sides of the sample.
	-->

    <property name="distro.root" value="../../../distribution/all/target/apache-tuscany-sca-all-${tuscany.version}-dir/tuscany-sca-${tuscany.version}" />

    <target name="run"> 
    	
       <parallel>

            <daemons>
               <ant antfile="build.xml" 
                    dir="${distro.root}/samples/calculator-rmi-service"/>
            </daemons>

            <sequential>
                <sleep seconds="2"/>
                <ant antfile="build.xml"
                     dir="${distro.root}/samples/calculator-rmi-reference"/>
            </sequential>

       </parallel>    	

    </target>

</project>
