The Apache Tuscany SCA Samples
==============================
The Apache Tuscany SCA samples are built as part of the main Maven build and 
run, using the provided JUnit test cases, as tests in the Maven build.

In the binary distribution of Apache Tuscany most samples can also 
be run using the provided Ant build.xml files. These show the samples running 
from a simple main() method without the need for a JUnit test case. 

In these notes text that appears in angled brackets like this <example> means 
that you need to make a choice and provide your own text at that point. 

These simple samples have been created with the intention of illustrating the 
usage of the SCA API and annotations and certainly not to levels of SCA component 
abstraction.  In real life situations you should use SCA to assemble real and 
usually bigger components, and when you do that you'll get all the benefits of 
SCA, bindings, policies, integration in an SOA environment etc..

Sample Overview
---------------
The samples generally show off different features of the SCA runtime
and the extensions that come packaged with it.

binding-ws-calculator              - Calculator running inside a web app also 
                                     showing webservices binding

calculator                         - Calculator built with java components and 
                                     local wires. 

calculator-equinox                 - Calculator running inside a Equinox OSGi runtime

calculator-osgi                    - Calculator running inside a OSGi runtime

calculator-rmi-reference           - The calculator configured to talk RMI to
                                     the calculator-rmi-service sample
calculator-rmi-service             - The calculator configured to accept RMI
                                     requests from calculator-rmi-reference

implementation-java-calculator


Sample Layout
-------------
All sample directories are organized in the same way based on the default 
project template provided by Maven. For example, take a look at the calculator 
sample;

calculator/        
  src/              - Holds all of the source files for the sample
    main/           - Groups together the files that implement the sample 
      java/         - Java source files
      resources/    - Non java resource files such as composte files
    test/           - Groups together files that provide sample tests
      java          - Java test sources files. Usually JUnit test cases
  target/           - Holds the files generated when the sample is built
    classes/        - For example, Java class files
    test-classes/   - classes from src/test and other test files

Getting Ready To Build
----------------------
You will need to install the following software before you start. 

J2SE Development Kit (JDK) 5.0
Apache Ant 1.7.1                - if you are going to use Ant 
Apache Maven 2.0.9              - if you are going to use Maven

Java and Ant and/or Maven binary directories must be present in your PATH so 
that their executable programs are available in your environment. You may 
find it useful to use a script to set up your environment, for example;

For UNIX:
  JAVA_HOME=/<installation_directory>
  ANT_HOME=/<installation_directory>/apache-ant-1.7.0
  MAVEN_HOME=/<installation_directory>/maven-2.0.6
  export PATH=$JAVA_HOME/bin:$ANT_HOME/bin:$MAVEN_HOME/bin:$PATH

For Windows:
  set JAVA_HOME=C:\<installation_directory>
  set ANT_HOME=C:\<installation_directory>\apache-ant-1.7.0
  set MAVEN_HOME=C:\<installation_directory>\maven-2.0.6
  set PATH=%JAVA_HOME%\bin;%ANT_HOME%\bin;%MAVEN_HOME%\bin;%PATH%


Building And Running The SCA Samples Using Ant
----------------------------------------------
The build.xml files provided with the Apache Tuscany SCA samples are designed 
to work with the binary distribution. They rely on the tuscany-sca-manifest.jar
to describe the class path and this jar is only provided as part of the 
binary distribution.

The binary distribution of SCA also includes precompiled versions of each sample. 
If you look in the target directory of each sample you will see this jar file. To
run a sample based on all of the precompiled artifacts all you have to do is:

cd <sampledir>
ant run

Check each <sampledir>/README file as some samples require that two progams are
run to get the desired result, for example, the two samples that show how
to build extensions are run from their associated application samples. 

If you want to rebuild a sample, for example, if you have changed it, do the
following:

cd <sampledir>
ant compile

Once the sample is built you have the option of running the sample in whatever 
way best suits you. Two alternatives are provided in the ant build files.

The compile target builds the class files and then builds the jar so you can use 
the same command as before:

ant run

This will use the generated jar to run the samples. The command line version of
this is:

on Windows

java -cp ..\..\features\tuscany-sca-manifest.jar;target\<sample jar file> <sample runnable class>

for example : java -cp ..\..\features\tuscany-sca-manifest.jar;target\sample-calculator.jar calculator.CalculatorClient

on *nix 

java -cp ../../features/tuscany-sca-manifest.jar:target/<sample jar file> <sample runnable class>

for example : java -cp ../../features/tuscany-sca-manifest.jar:target/sample-calculator.jar calculator.CalculatorClient


You can use the compiled classes directly using

ant run-classes

The command line version of this is:

on Windows

java -cp ..\..\features\tuscany-sca-manifest.jar;target\classes <sample runnable class>

for example : java -cp ..\..\features\tuscany-sca-manifest.jar;target\classes calculator.CalculatorClient

on *nix 

java -cp ../../features/tuscany-sca-manifest.jar:target/classes <sample runnable class>

for example : java -cp ../../features/tuscany-sca-manifest.jar:target/classes calculator.CalculatorClient

The class specified on the command of course depends on which sample you want to 
run. In the examples we have used we are running the CalculatorClient from the calculator sample. 


Building And Running The SCA Samples Using Maven
------------------------------------------------

The Maven build process will work from both source and binary distributions. 
To build and test all of the Apache Tuscany SCA sources, including the samples,
do the following.

cd sca
mvn

This will take a little while to complete. Experience with Maven tells us that 
sometimes there are problems downloading the dependencies that Apache Tuscany 
SCA requires. If Maven reports that it cannot download required dependencies 
try running the Maven build again. 

Once you have all of the source built you can build and run each sample 
independently if required.

cd <sampledir>
mvn

When using Maven the samples are run within JUnit test cases and so you will 
sometimes not see any test output. You will always see an indication of test 
success or failure. 

Using The Samples In An IDE
---------------------------------------------
The easiest way to use the samples in an IDE is to use Maven to generate all 
of the IDE project files for you automatically. This works best if you 
generate IDE projects for all of the Apache Tuscany modules. You can then 
include the ones you are interested in working with in you IDE. 

To build IDE project files for all of the modules in Apache Tuscany SCA;

cd sca 

If you are an Eclipse user do the following

mvn -Peclipse

If you are an IDEA user do the following 

mvn idea:idea

These commands generate project files for each module in Apache Tuscany SCA. 
The modules you are interested in can now be included in your IDE, for example,
in Eclipse, if you create a new Java project and use the option to "create a 
new project from existing source" you can specify an SCA module directory, 
which includes the generated project files, and Eclipse will treat it like any
other Java project. 

Using The Samples In An IDE Without Maven
-----------------------------------------
We don't provide any IDE project files with our distributions so you will have to 
import the sample files into your IDE manually. Here's an example of how it can be 
done using Eclipse.
 
In a new or existing workspace
    Create a new java project to represent the sample you want to work on, e.g.
        calculator
    Import all of the sample code and resources into this project, e.g.
        File, Import and then select tuscany-sca-1.0-incubating\samples\calculator from the filesystem
    Configure the source path to include
        src/main/java
        src/main/resources
    Configure the output folder to be
        calculator/target
    Configure the build path to include the manifest jar tuscany-sca-manifiest.jar provided in
        features
     If you select calculator.CalculatorClient.java and run as "Java Application" you should see
        3 + 2=5.0
        3 - 2=1.0
        3 * 2=6.0
        3 / 2=1.5

The details of how to do this for other development environments will
vary but the process will be similar. 


