DataBinding Echo Sample
=======================

This sample demonstrates how databindings are used to convert data formats as 
the data flows between components. 

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;..\binding-echo-extension\target\sample-binding-echo-extension.jar;target\sample-databinding-echo.jar dbecho.EchoDataBindingClient

and on *nix do

java -cp ../../lib/tuscany-sca-manifest.jar:../binding-echo-extension/target/sample-binding-echo-extension.jar:target/sample-databinding-echo.jar dbecho.EchoDataBindingClient


Sample Overview
---------------
If reference and service interfaces are the same in all but the formats of 
data being passed to and returned from the operations of the interfaces,
then SCA will try to apply appropriate transformations to the data formats
to allow messages to pass. 

This sample shows this happening. ComponentA implements Interface1 which
defines;

 String call(String msg)
 String call1(String msg) 
 
ComponentA defines a reference to ComponentB with Interface1. ComponentB 
however implements Interface2 which defines;

 Node call(Node msg);
 XMLStreamReader call1(XMLStreamReader msg);
 
You can see from the test output below that SCA converts the call() msg from a 
String to a DOM object (org.apache.xerces.dom.DeferredDocumentImpl). It
converts the call1() msg from a String to a XML stream reader 
(com.ctc.wstx.sr.ValidatingStreamReader).

databinding-echo/
  src/
    main/
      java/
        dbecho/
          ComponentAImpl.java                           - component implementation 
          ComponentBImpl.java                           - component implementation
          Echo.java                                     - service interface with data binding
          EchoDataBindingClient.java                    - sample client code
          Interface1.java                               - service interface with data binding
          Interface2.java                               - service interface with data bindings
      resources/
        META-INF/
          services/
            org.apache.tuscany.sca.core.ModuleActivator - specifies the module activation class to call
        EchoDataBinding.composite                       - composite definition
        wsdl/
          echo.wsdl                                     - WSDL deinitions
    test/
      java/ 
        dbecho/
          EchoDataBindingTestCase.java - junit test case
  databinding-echo.png - pictorial representation of the sample .composite file
  build.xml            - the Ant build file
  pom.xml              - the Maven build file
  
TODO - Needs more description of what else is going on in this test
       properties, wsdl?

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

cd databinding-echo
ant compile
ant run

You should see the following output from the run target.

run:
     [java] [Property] prefix: ABC
     [java] [Property] prefix1: ABC
     [java] [Property] bar: BAR
     [java] ComponentA --> Received message: <message><foo>123</foo></message> [java.lang.String]
     [java] ComponentB --> Received message: [#document: null] [org.apache.xerces.dom.DeferredDocumentImpl]
     [java] ComponentB --> Returned message: [#document: null] [org.apache.xerces.dom.DeferredDocumentImpl]
     [java] ComponentA --> Returned message: <?xml version="1.0" encoding="UTF-8"?><message><foo>123</foo></message> [java.lang.String]
     [java] [Property] prefix: ABC
     [java] [Property] prefix1: ABC
     [java] [Property] bar: BAR
     [java] ComponentA --> Received message: <message><foo>123</foo></message> [java.lang.String]
     [java] ComponentB --> Received message: com.ctc.wstx.sr.ValidatingStreamReader@4c444c44 [com.ctc.wstx.sr.ValidatingStreamReader]
     [java] ComponentB --> Returned message: com.ctc.wstx.sr.ValidatingStreamReader@4c444c44 [com.ctc.wstx.sr.ValidatingStreamReader]
     [java] ComponentA --> Returned message: <?xml version='1.0' encoding='UTF-8'?><message><foo>123</foo></message> [java.lang.String]
     [java] call  response = <?xml version="1.0" encoding="UTF-8"?><message><foo>123</foo></message>
     [java] call1 response = <?xml version='1.0' encoding='UTF-8'?><message><foo>123</foo></message>


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 databinding-echo
mvn

You should see the following output from the test phase.

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running dbecho.EchoDataBindingTestCase
[Property] prefix: ABC
[Property] prefix1: ABC
[Property] bar: BAR
ComponentA --> Received message: <message><foo>123</foo></message> [java.lang.String]
ComponentB --> Received message: [#document: null] [org.apache.xerces.dom.DeferredDocumentImpl]
ComponentB --> Returned message: [#document: null] [org.apache.xerces.dom.DeferredDocumentImpl]
ComponentA --> Returned message: <?xml version="1.0" encoding="UTF-8"?><message><foo>123</foo></message> [java.lang.String]
[Property] prefix: ABC
[Property] prefix1: ABC
[Property] bar: BAR
ComponentA --> Received message: <message><foo>123</foo></message> [java.lang.String]
ComponentB --> Received message: com.ctc.wstx.sr.ValidatingStreamReader@74e274e2 [com.ctc.wstx.sr.ValidatingStreamReader]
ComponentB --> Returned message: com.ctc.wstx.sr.ValidatingStreamReader@74e274e2 [com.ctc.wstx.sr.ValidatingStreamReader]
ComponentA --> Returned message: <?xml version='1.0' encoding='UTF-8'?><message><foo>123</foo></message> [java.lang.String]
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.653 sec

Results :

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

This shows that the Junit test cases have run successfully. 
