Tuscany - Learning More - Binding Comet - PubSub Webapp
-----------------------------------------------------------------

This sample demonstrates how Tuscany can expose services via Comet techniques 
as well as how to interact with them using Tuscany's javascript toolkit. It 
also demonstrates how to push multiple responses for a single request using 
SCA callbacks via comet techniques.

This project contains a component that registers browser clients' interest in a 
certain event type. When an event of that type comes in, it notifies all registered
clients. The event processor exposes a service via the websocket binding which 
enables server push to clients. Note that Tuscany 2.x doesn't have any conversational
support so this has to be handled at application level by passing ids back and forth
between the client and the server. 

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.

In order to enable callbacks to push multiple responses, you need to declare the 
CometCallback in the service definition as follows:
		<interface.java interface="org.apache.tuscany.sca.sample.comet.ChatService"
				callbackInterface="org.apache.tuscany.sca.binding.comet.runtime.callback.CometCallback" />
		<tuscany:binding.comet />
		<callback>
			<tuscany:binding.comet />
		</callback>
    
The callback object has methods that facilitate sending messages back to the 
calling client. It can be injected in the service implementation using the @Callback
annotation. 

One requirement that service methods have to meet to enable multiple response 
support is that they have to be annotated with @OneWay to enable non-blocking 
support. Without it, methods are treated synchronously sending a single response
which is the object returned by the method call.  

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 parameters 
will be mapped to the data types defined in the method definition. Also, the response 
will have the same data type as the server side object used to wrap the response. 
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-chat-webapp/
	
You can now register or unregister for any of a number of events. When an event is fired
on the server side, the browser client will receive a notification which will be displayed 
in the page. 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).