<!--
 * 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-nodes-two-jvms-hazelcast" default="run">
	
    <target name="run"> 
       <parallel failonany="true">          
            
            <!-- start a node that will be part of the domain -->
            <java classpath="../../../../distribution/all/target/apache-tuscany-sca-all-2.0-Beta3.dir/tuscany-sca-2.0-Beta3/features/tuscany-sca-manifest.jar:./target/classes"        
                  classname="org.apache.tuscany.sca.impl.Tuscany"
                  fork="true"
                  failonerror="true">   
                <arg value="domain1"/>
                <arg value="nodeService"/>
                <arg value="8088"/>
            </java>            
        
            <sequential>         
                <!-- give the first node a chance to start --> 
                <sleep seconds="5"/>   
                <!-- start a second node that automatically tries to call a service in the first node -->            
                <java classpath="../../../../distribution/all/target/apache-tuscany-sca-all-2.0-Beta3.dir/tuscany-sca-2.0-Beta3/features/tuscany-sca-manifest.jar:./target/classes"        
                      classname="org.apache.tuscany.sca.impl.Tuscany"
                      fork="true"
                      failonerror="true">   
                    <arg value="domain1"/>
                    <arg value="nodeClient"/>
                </java> 
                <!-- use a HTTP GET to ping the first node to tell it to stop -->
                <get src="http://localhost:8088" 
                     dest="target/deamon.txt"
                     ignoreerrors="true"/>
            </sequential>

       </parallel>         
    </target>

</project>
