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.

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. 
