Simple Callback Sample Using Web Services
=========================================
This sample demonstrates asynchronous messaging using a callback over the
Web Service binding.  It is very similar to the simple-callback sample.
The only differences are that simplecallback.composite has been updated
to use the Web Service binding, and there is a simplecallback.wsdl file.

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

If you just want to run it to see what happens 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-simple-callback.jar simplecallback.SimpleCallbackClient

and on *nix do

java -cp ../../lib/tuscany-sca-manifest.jar:target/sample-simple-callback.jar simplecallback.SimpleCallbackClient


Sample Overview
---------------
The sample provides a single composite with two components. MyClientComponent is 
wired to MyServiceComponent. The interface of MyServiceComponent describes one
method as ONEWAY and with a callback semantic. When a message passes from 
client to service the response is returned via the callback asynchronously.  

simple-callback/
  src/
    main/
      java/
        simplecallback/
          MyClient.java           - client interface 
          MyClientImpl.java       - implements the client and service callback
                                    interfaces
          MyService.java          - service interface
          MyServiceCallback.java  - service callback interface, implemented by the 
                                    client
          MyServiceImpl.java      - implements the service interface
          SimpleCallbackClient.java - starts the SCA Runtime and 
                                    deploys the simplecallback.composite. 
                                    It then calls MyClientComponent which in turn
                                    calls MyServiceComponent
      resources/
        simplecallback.composite  - the SCA assembly for this sample
        wsdl/
          simplecallback.wsdl     - the service description and callback binding  
    test/
      java/
        simplecallback/
          SimpleCallbackTestCase.java - JUnit test case 
  simple-callback.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 as 
follows

cd simple-callback-ws
ant compile
ant run

You should see the following output from the run target.

run:
     [java] 14-Jan-2008 14:25:02 org.apache.tuscany.sca.http.jetty.JettyServer a
ddServletMapping
     [java] INFO: Added Servlet mapping: http://L3AW203:8085/MyServiceCallbackCo
mponent
     [java] 14-Jan-2008 14:25:02 org.apache.tuscany.sca.http.jetty.JettyServer a
ddServletMapping
     [java] INFO: Added Servlet mapping: http://L3AW203:8085/MyServiceComponent
     [java] Main thread Thread[main,5,main]
     [java] aClientMethod on thread Thread[main,5,main]
     [java] aClientMethod return from someMethod on thread Thread[main,5,main]
     [java] setMyServiceCallback on thread Thread[pool-1-thread-2,5,main]
     [java] someMethod on thread Thread[pool-1-thread-2,5,main]
     [java] receiveResult on thread Thread[pool-1-thread-4,5,main]
     [java] Result: -> someMethod -> receiveResult


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 simple-callback-ws
mvn

You should see the following output from the test phase.

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running simplecallback.SimpleCallbackTestCase
14-Jan-2008 14:26:28 org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/6.0.10
14-Jan-2008 14:26:28 org.apache.catalina.startup.ContextConfig defaultWebConfig
INFO: No default web.xml
14-Jan-2008 14:26:28 org.apache.catalina.startup.DigesterFactory register
WARNING: Could not get url for /javax/servlet/jsp/resources/jsp_2_0.xsd
14-Jan-2008 14:26:28 org.apache.catalina.startup.DigesterFactory register
WARNING: Could not get url for /javax/servlet/jsp/resources/web-jsptaglibrary_1_
1.dtd
14-Jan-2008 14:26:28 org.apache.catalina.startup.DigesterFactory register
WARNING: Could not get url for /javax/servlet/jsp/resources/web-jsptaglibrary_1_
2.dtd
14-Jan-2008 14:26:28 org.apache.catalina.startup.DigesterFactory register
WARNING: Could not get url for /javax/servlet/jsp/resources/web-jsptaglibrary_2_
0.xsd
14-Jan-2008 14:26:28 org.apache.catalina.startup.DigesterFactory register
WARNING: Could not get url for /javax/servlet/resources/j2ee_web_services_1_1.xs
d
14-Jan-2008 14:26:28 org.apache.coyote.http11.Http11Protocol init
INFO: Initializing Coyote HTTP/1.1 on http-8085
14-Jan-2008 14:26:28 org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-8085
14-Jan-2008 14:26:28 org.apache.tuscany.sca.http.tomcat.TomcatServer addServletM
apping
INFO: Added Servlet mapping: http://L3AW203:8085/MyServiceCallbackComponent
14-Jan-2008 14:26:28 org.apache.tuscany.sca.http.tomcat.TomcatServer addServletM
apping
INFO: Added Servlet mapping: http://L3AW203:8085/MyServiceComponent
Main thread Thread[main,5,main]
aClientMethod on thread Thread[main,5,main]
aClientMethod return from someMethod on thread Thread[main,5,main]
Sleeping ...
setMyServiceCallback on thread Thread[pool-1-thread-1,5,main]
someMethod on thread Thread[pool-1-thread-1,5,main]
receiveResult on thread Thread[pool-1-thread-2,5,main]
Result: -> someMethod -> receiveResult
14-Jan-2008 14:26:31 org.apache.coyote.http11.Http11Protocol destroy
INFO: Stopping Coyote HTTP/1.1 on http-8085
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 8.312 sec

This shows that the Junit test cases have run successfully.
