Tuscany - Learning More - Binding Comet - Autocomplete Webapp
-----------------------------------------------------------------

This sample demonstrates how Tuscany can expose services via Comet techniques 
as well as how to interact with them using Tuscany's javascript API.

This project contains a service (CountryService) that handles requests asking
for country names starting with a certain prefix. The service implementation
uses a country repository to fetch the necessary data.

By adding <tuscany:binding.comet/> to a service definition, the Tuscany runtime 
will handle the communication between the browser client and the service 
implementation using Comet techniques. This enables bidirectional communication
over HTTP, therefore enabling server push. For more information, check 
http://en.wikipedia.org/wiki/Comet_(programming).

The comet binding is using the Atmosphere Framework under the hood to acomodate
as many deployment envorinments as possible. Basically, it checks if the 
application server supports Servlet 3.0 falling back to a number of native
comet solutions provided by vendors (Jetty, Tomcat, WebLogic, GlassFish and
others). If none is available, Atmosphere will fallback to blocking IO.

Invoking comet services can be done using Tuscany's javascript API which simulates
SCA in the browser. It uses the Atmosphere jQuery plugin under the hood. In order 
to use it, the following script has to be included in the client page: 
    <script type="text/javascript" 
            src="tuscany-comet-js/org.apache.tuscany.sca.CometComponentContext.js">
    </script>
	
The javascript toolkit permits choosing between two comet techniques: HTTP streaming 
and long polling. More detailed information about them can be found on the previously
mentioned wikipedia page.

First, a connect operation has to be issued in order to initiate communication
with the server side using the technique of your choice. This is done using the
connection method as follows:
	SCA.TuscanyComet.connect('streaming'); // for HTTP streaming
	SCA.TuscanyComet.connect('long-polling'); // for long polling
	SCA.TuscanyComet.connect(); // starts with HTTP streaming and falls back to long polling if necessary
		
The Tuscany Comet toolkit will inject proxies for all services defined in the composite 
that are using binding.comet. All invocation and connection management is handled
under the hood so in order to invoke a comet service, the following should be called:
	SCA.CometComponentContext.<service name>.<operation name>(<parameters>, callback);

The callback parameter is the function that will handle responses received for a 
certain service operation. It has a single argument which is the response:
    function callback(response) {
        // handle response
    };
	
Note that the data exchange is automatically handled by the binding, so the
parameters should have the same structure as the data types defined in the method
definition. Also, the response will have the same data type as the return type of
the service method. Objects are passed over the wire in JSON format.

Another detail worth mentioning is that the binding will use a single HTTP 
connection to handle communication between a browser client and all services 
defined using binding.comet in the same composite. Requests and responses will get
multiplexed via the same channel and get routed to the appropriate service 
implementation, respectively javascript function. This is done in order to avoid
the 2 HTTP connection limit imposed by browsers. For more info, check
http://www.openajax.org/runtime/wiki/The_Two_HTTP_Connection_Limit_Issue.

In order to run the sample, you can execute "mvn clean install t7:run" which will 
start a Tomcat 7 instance automatically or use "mvn package" and deploy the resulting 
war to the application server of your choice.

Next, point your browser at 
    http://localhost:8080/sample-binding-comet-autocomplete-webapp/
	
You can see how suggestions are being received in real time when characters are
entered in the text field. You can see the persistent HTTP streaming connection
or long polling subsequent connections using the developer tools provided by 
your browser.

The comet binding is an experimental binding so community feedback is much 
appreciated. Feel free to send comments or suggestions on the Apache Tuscany 
dev mailing list (dev@tuscany.apache.org).