Calculator Sample
=================
This sample implements a simple calculator using SCA components. 

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.jar calculator.CalculatorClient

and on *nix do

java -cp ../../lib/tuscany-sca-manifest.jar:target/sample-calculator.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.

calculator/
  src/
    main/
      java/
        calculator/
          CalculatorService.java  - the first component, calls +-/* as 
                                    appropriate
          CalculatorServiceImpl.java
          AddService.java         - adds two numbers
          AddServiceImpl.java
          SubtractService.java    - subtracts one number from another
          SubtractServiceImpl.java
          MultiplyService.java    - multiplies two numbers
          MultiplyServiceImpl.java
          DivideService.java      - divides one number by another
          DivideServiceImpl.java
          CalculatorClient.java   - starts the SCA Runtime and 
                                    deploys the Calculator.composite. 
                                    It then calls the deployed Calculator 
                                    Components services
      resources/
        Calculator.composite      - the SCA assembly for this sample
    test/
      java/
        calculator/
          CalculatorTestCase.java - JUnit test case 
  calculator.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
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
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: 1.272 sec

Results :

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

This shows that the Junit test cases have run successfully. 
