Hello World Erlang Reference Sample
===================================
This sample demonstrates an SCA reference that uses a Erlang binding 

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

In order to run Erlang samples you need to have Erlang/OTP distribution installed - 
epmd binary is required in your system path. See http://erlang.org for downloads.
The Tuscany SCA Erlang binding is compatible with Erlang/OTP version R12B but
doesn't work correctly with some later versions including R14B. See TUSCANY-3759
for details.

If you just want to run it to see what happens you need to run the server first 
so open a command prompt, navigate to the helloworld-erlang-service 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-helloworld-erlang-service.jar helloworld.HelloWorldServer

and on *nix do

java -cp ../../lib/tuscany-sca-manifest.jar:target/sample-helloworld-erlang-service.jar helloworld.HelloWorldServer


Once the server is running 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-helloworld-erlang-reference.jar helloworld.HelloWorldErlangClient

and on *nix do

java -cp ../../lib/tuscany-sca-manifest.jar:target/sample-helloworld-erlang-reference.jar helloworld.HelloWorldErlangClient


Sample Overview
---------------
The sample provides a component that has a reference with a Erlang binding. 
The binding refers to Erlang module and communicates with a service
exposed by the helloworld-service-erlang sample. 

helloworld-erlang-reference/
  src/
    main/
      java/
        helloworld/
          HelloWorldImpl                  - HelloWorld service implementation
          HelloWorldService.java          - interface description for 
                                            HelloWorldServiceComponent
          HelloWorldServiceComponent.java - component implementation
          HelloWorldErlangClient.java         - starts the SCA Runtime and 
                                            deploys the helloworldwserlangclient
                                            .composite. It then calls the 
                                            HelloWorldServiceComponent
      resources/
        helloworlderlangreference.composite     - the SCA assembly for this sample
        helloworlderlangservice.composite       - the SCA assembly for the server
                                                  that is used by the JUnit tests
        logging.properties                      - log4j configuration file
    test/
      java/
        helloworld/
          HelloWorldErlangClientTestCase.java - JUnit test case
        dynaignore/							  - internal Java classes for ignoring test 
        										in case of missing Erlang/OTP distribution
          
  helloworld-reference.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. Before
you do this start up the service that the reference will talk to. To do this
run up the helloworld-erlang-service sample. Take a look at the README in that sample
and you will see you need the following commands

cd helloworld-erlang-service
ant run

Once done you can now compile and run this sample using the following commands;

cd helloworld-erlang-reference
ant compile
ant run

You should see the following output from the run target.

run:
     [java] 2009-05-26 12:03:54 org.apache.tuscany.sca.node.impl.NodeImpl <init>
     [java] INFO: Creating node: helloworlderlangreference.composite
     [java] 2009-05-26 12:03:55 org.apache.tuscany.sca.node.impl.NodeImpl configureNode
     [java] 2009-05-26 12:03:56 org.apache.tuscany.sca.node.impl.NodeImpl configureNode
     [java] 2009-05-26 12:03:56 org.apache.tuscany.sca.node.impl.NodeImpl start
     [java] INFO: Starting node: helloworlderlangreference.composite
     [java] Hello World
     [java] 2009-05-26 12:03:56 org.apache.tuscany.sca.node.impl.NodeImpl stop
     [java] INFO: Stopping node: helloworlderlangreference.composite

BUILD SUCCESSFUL


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. When using Maven you don't need to run the helloworld-
erlang-service sample first as the JUnit test does this for you. 

cd helloworld-erlang-reference
mvn

You should see the following output from the test phase.

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.569 sec

Results :

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


This shows that the Junit test cases have run successfully. 
