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 the samples can also be built 
and 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-notification-broker        - A broker for notifications
binding-notification-consumer      - A consumer of notifications
binding-notification-producer      - A producer of notifications

calculator                         - Calculator built with java components and 
                                     local wires. 
calculator-distributed             - A calculator built using SCA nodes running 
                                     on multiple JVMs
calculator-implementation-policies - Shows logging policites associated with 
                                     SCA implementations
calculator-corba-reference         - The calculator configured to use existing
                                     CORBA service
calculator-corba-service           - The calculator configured to be accessible
                                     as CORBA service
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
calculator-script                  - Calculator built using various script languages
calculator-webapp                  - Calculator running inside a web app
calculator-ws-webapp               - Calculator running inside a web app also 
                                     showing webservices binding

callbacks-jms                      - Shows how to use callbacks with JMS

callback-ws-client                 - The client for showing callbacks across web services
callback-ws-service                - The server for showing callbacks across web serviced

chat-webapp                        - A simple chat style web app demonstrating
                                     use of AJAX binding

databinding-echo                   - An SCA application that shows how databindings 
                                     transform data

domain-management                  - Shows how to use domain management APIs

feed-aggregator                    - Demonstrates using the ATOM binding
feed-aggregator-webapp             - feed-aggregator running in webapp

helloworld-bpel                    - Demonstrates an SCA component invoking a BPEL 
                                     process in a composition

helloworld-dojo-webapp             - An SCA application that exposes a service using 
                                     JSONRPC and a client using the Dojo toolkit
helloworld-jsonrpc-webapp          - helloworld using jsonrpc binding
helloworld-reference-jms           - The client side of a hello world sample that uses a 
                                     JMS binding (requires helloworld-service-jms)
helloworld-service-jms             - The server side of a hello world sample that uses a 
                                     JMS binding
helloworld-ws-reference            - The client side of a hello world sample that uses a 
                                     web service binding (requires helloworld-ws-service)
helloworld-ws-service              - The server side of a hello world sample that uses a 
                                     web service binding
helloworld-ws-reference-jms        - The client side of a hello world sample that uses a 
                                     web service binding with SOAP/JMS (requires 
                                     helloworld-ws-service-jms)
helloworld-ws-service-jms          - The server side of a hello world sample that 
                                     uses a web service binding with SOAP/JMS
helloworld-ws-reference-secure     - The client side of a hello world sample that 
                                     shows how policy intent can be used.
helloworld-ws-service-secure       - The client side of a hello world sample that 
                                     shows how policy intent can be used.
helloworld-ws-sdo                  - helloworld using ws binding and SDO
helloworld-ws-sdo-webapp           - helloworld using ws binding and SDO within a webapp

holder-ws-service                  - Sample web service that uses a JAX-WS holder

implementation-composite           - Shows how SCA composites are used 
                     
osgi-supplychain                   - SCA asynchronous API with OSGi and Java 
                                     implementation types

photo-gallery                      - A sample SCA picture gallery application

quote-xquery                       - Demonstrate SCA components using XQuery

simple-bigbank                     - A banking application built with java components 
                                     and local wire

simple-bigbank-spring              - A banking application showing how SCA works with Spring
spring-bigbank-calculator          - part of the simple-bigbank-spring sample
spring-bigbank-checkaccount        - part of the simple-bigbank-spring sample
spring-bigbank-stockquote          - part of the simple-bigbank-spring sample

simple-callback                    - demonstrates the callback interface
simple-callback-ws                 - demonstrates use of callback interface across WS binding

store                              - Step by step guide for creating an online store
store-secure                       - the Store application using security policies
store-webapp                       - the Store application running as a webapp 

supplychain                        - shows how asynchronous callbacks can be used

web-resource                       - Demonstrates using an SCA Web resource component

Samples for building extensions
-------------------------------
There are samples that demonstrate how to build extensions for the 
Tuscany SCA runtime. These samples are slightly different from the samples
above in that the provided code is concerned with building the extension
and not with building an application that uses it. The application
that shows how the new extension can be used is provided in an associated
sample. 

implementation-crud-extension - Shows how to build new implementation type 
                                extensions
implementation-crud           - A sample application that exercises the new 
                                implementation extensions
binding-echo-extension        - Shows how to build new binding extensions
binding-echo                  - A sample application that exercises the new 
                                 binding extension
implementation-notification   - Illustrates the use of <implementation.notification/>
implementation-pojo-extension - shows how new implementation types are constructed 

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 or higher
Apache Ant 1.7.1 or higher      - if you are going to use Ant 
Apache Maven 2.0.10 or higher   - 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.1
  M2_HOME=/<installation_directory>/maven-2.0.10
  export PATH=$JAVA_HOME/bin:$ANT_HOME/bin:$M2_HOME/bin:$PATH

For Windows:
  set JAVA_HOME=C:\<installation_directory>
  set ANT_HOME=C:\<installation_directory>\apache-ant-1.7.1
  set M2_HOME=C:\<installation_directory>\maven-2.0.10
  set PATH=%JAVA_HOME%\bin;%ANT_HOME%\bin;%M2_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 ..\..\lib\tuscany-sca-manifest.jar;target\<sample jar file> <sample runnable class>

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

on *nix 

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

for example : java -cp ../../lib/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 ..\..\lib\tuscany-sca-manifest.jar;target\classes <sample runnable class>

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

on *nix 

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

for example : java -cp ../../lib/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 samples
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.

If you are using the Apache Tuscany SCA source distribution, you can find
details of how to generate IDE project files (including IDE project files
for the samples) in the "Using an IDE" section of the BUILDING file.

If you are using the Apache Tuscany SCA binary distribution, follow these
steps to generate IDE project files for all of the samples;

cd samples

If you are an Eclipse user do the following

mvn eclipse:eclipse
mvn -Declipse.workspace=<path-to-eclipse-workspace> eclipse:add-maven-repo

If you are an IDEA user do the following 

mvn idea:idea

These commands generate project files for each module in the samples directory. 
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 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 all of the jars provided in
        lib
     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. 
