Calculator Script Sample
========================
This sample implements a simple calculator using SCA components implemented 
using Java, JavaScript, Ruby, Python and Groovy. 

The README in the samples directory (the directory above this) provides 
general instructions about building and running samples. Take a look there 
first. 

If you just want to run it to see what happens open a command prompt, navigate
to this sample directory and do:

ant run

OR if you don't have ant, on Windows do

java -cp ..\..\lib\tuscany-sca-manifest.jar;target\sample-calculator-script.jar calculator.CalculatorClient

and on *nix do

java -cp ../../lib/tuscany-sca-manifest.jar:target/sample-calculator-script.jar calculator.CalculatorClient

Sample Overview
---------------
The sample provides a single calculator service with a default SCA (java) 
binding. The CalculatorClient exercises this interface by calling add, 
subtract, multiply and divide operations. This results in messages passing 
to the appropriate components in the composite across the local wires. Each
component is implemented using a different language.

calculator-script/
  src/
    main/
      java/
        calculator/
          CalculatorService.java  - the first component calls +-/* as 
                                    appropriate
          CalculatorServiceImpl.java
          AddService.java         - adds two numbers
          SubtractService.java    - subtracts one number from another
          MultiplyService.java    - multiplies two numbers
          DivideService.java      - divides one number by another
          CalculatorClient.java   - starts the SCA Runtime and 
                                    deploys the Calculator.composite. 
                                    It then calls the deployed Calculator 
                                    Components services
      resources/
        calculator/
          AddServiceImpl.js       - A JavaScript implementation of the
                                    Add component
          SubtractServiceImpl.rb  - A Ruby implementation of the Subtract
                                    component
          MultiplyServiceImpl.py  - A Python implementation of the 
                                    Multiple component
          DivideServiceImpl.groovy- A Groovy implementation of the 
                                    Divide component
        Calculator.composite      - the SCA assembly for this sample
        
    test/
      java/
        calculator/
          CalculatorTestCase.java - JUnit test case 
  calculator-script.png           - a pictorial representation of the 
                                    sample .composite file
  build.xml                       - the Ant build file
  pom.xml                         - the Maven build file        

Building And Running The Sample Using Ant
-----------------------------------------
With the binary distribution the sample can be built and run using Ant as 
follows

cd calculator-script
ant compile
ant run

You should see the following output from the run target.

run:
     [java] 3 + 2=5.0
     [java] 3 - 2=1.0
     [java] 3 * 2=6.0
     [java] 3 / 2=1.5

Building And Running The Sample Using Maven 
-------------------------------------------
With either the binary or source distributions the sample can be built and run 
using Maven as follows. 

cd calculator-script
mvn

You should see the following output from the test phase.

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running calculator.CalculatorTestCase
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 5.918 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

This shows that the Junit test cases have run successfully. 
