Hello World Dojo RPC Sample
===========================

Note. This sample is currently not working correctly on WebSphere - see TUSCANY-1990

This sample demostrates the SCA JSONRPC binding using a simple web app that
uses the RPC support of the Dojo Toolkit to an SCA service.  

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

As this sample provides a web app there is a manual step where the WAR file
that contains the sample is copied to your web app container. If you just want 
to give this sample a go, deploy the WAR file (target/sample-helloworld-dojo-webapp.war)
to your web application server. 

To save space, the WAR file isn't included in the binary distribution. You can
build it by following the instructions below in "Building And Running The Sample
Using Ant" or "Building And Running The Sample Using Maven". 
  
Once the web app is deployed use your browser to visit the following URL;

http://localhost:8080/sample-helloworld-dojo-webapp

The port and hostname will of course vary depending on your local installation. 

See also the similar helloworld-jsonrpc-webapp sample which also uses the SCA JSONRPC binding
but uses SCA scaDomain.js script on the client instead of the Dojo Toolkit. 

Sample Overview
---------------
The sample provides a single service with an operation that reflects
a greeting back to the caller. The service is exposed using the JSONRPC
binding. The web app provided shows how the Dojo Toolkit JSON-RPC support can be 
used to invoke the SCA service. 

The web app provided shows how the service can be called by using the DOJO toolkit. 

helloworld-dojo-webapp/
  build-dojo.xml                      - This file is an Ant script used by the 
                                        sample build process to download the Dojo Toolkit 
                                        and get it included in the WAR file 
                                        for use by the sample.
  src/
    main/
      java/
        helloworldjsonrpc/
          HelloWorldService.java      - service interface
          HelloWorldServiceImpl.java  - service implementation
      resources/
        jsonrpc.composite             - the SCA assembly for this sample
      webapp
        dojo/                         - the Dojo toolkit (this directory is created only 
                                        when you build the samples from the source distribution)
        META-INF/
          sca-contribution.xml        - specifies the composite to be deployed
        WEB-INF/
          web.xml                     - defines the listener that starts up the 
                                        Tuscany SCA runtime
        HelloWorldJSONRPC.html        - the web application that calls the 
                                        SCA service via JSONRPC
        style.css                     - style sheet     
           
  helloworld-jsonrpc-webapp.png              - a pictorial representation of the 
                                        sample .composite file
  build.xml                           - the Ant build file that unpacks the
                                        dojo installation
  pom.xml                             - the Maven build file  

Building And Running The Sample Using Ant
-----------------------------------------
With the binary distribution the sample can be built using Ant as 
follows

cd helloworld-dojo-webapp
ant package

This should result in a war file (sample-helloworld-dojo-webapp.war) in the target 
directory. Copy this war file to your web app deployment directory in your
web app container. 

The process for getting the web app running will depend on which web app container
you are using. For example, if you are using Tomcat then it is simply a matter
of copying the WAR file to the webapps directory. 

Once the web app is deployed use your browser to visit the following URL;

http://localhost:8080/sample-helloworld-dojo-webapp

The port and hostname will of course vary depending on your local installation. 

You should see a web page that allows you to send messages, via JSONRPC, to the 
application running in the Tuscany SCA Runtime

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 helloworld-dojo-webapp 
mvn

Again this should result in a war file (sample-helloworld-dojo-webapp.war) in the target 
directory. Follow the steps described in the previous section for running the web 
app and for the expected results.


