<!--
 * 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"> 
	
	<echo>${java.home}</echo>
	<!-- 
	    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"> 
    	
        <ant antfile="build.xml"
    	     dir="${distro.root}/samples/learning-more/binding-jsonrpc/calculator-contribution"/>
    	
    </target>

</project>
