Hello All, We have been working on a REST binding in Tuscany and have been able to implement one. It lets the Tuscany components expose RESTful services in addition to other services they can already expose. We have used Jersey, the JAX-RS Reference implementation developed by Sun.
I came across http://www.mail-archive.com/[email protected]/msg05857.html where Tuscany devs have expressed interest in implementing JAX-RS support and figured that I'd share what we have done. (Unfortunately, I could not reply to that thread and had to start a new one as I had not subscribed to the dev mailer) At a high level, what we do is, after Tuscany identifies that the binding involved is the REST-binding, we transfer the request to Jersey's ServletContainer. Jersey facilitates the addition of runtime annotations to Java programming language class files to define resources and the actions that can be performed on those resources. Plain Jersey would identify the method (and the arguments )to be invoked on a root resource class instance given the URI; Instead, we invoke a method in our binding (Tuscany), details below, and return the result to Jersey which forms and returns the Http response. Here is what we have done in detail: - Tuscany ships with the JSON RPC binding. We replicated the JSONRPC binding and made the ServiceServlet forward all REST-requests to Jersey's servlet engine. -We have modified Jersey source code. When Jersey is done mapping the URI to the resource and interpreting all the annotations in the resource, it transfers control to Tuscany (rest-runtime-binding) by invoking a method in our binding. Jersey has the following information: - The resource instance on which the method is to be invoked, - The Method object corresponding to the method to be invoked, - The arguments to the method. - We pass the Method object and the arguments to Tuscany by invoking a method. We don't pass the instance right away but save it in a static map with the thread id as the key (it is a single thread of execution). This method creates an instance of Operation using the method information and calls wire.invoke() with the Operation and the method arguments. - Inside the ReflectiveInstanceFactory, in the newInstance() method, we get the instance that Jersey has stored in its map (using the thread id) and let Tuscany's Injectors operate on it.The result is returned by the same chain back to Jersey which eventually returns the http response. We are aware that there are better ways to officially extend Tuscany like how Raymond mentioned at http://www.mail-archive.com/[email protected]/msg05857.html but nevertheless thought we'd share our experience. We would be more than happy to discuss contributing our code back to Tuscany if there is enough interest. thnx, - Prateek Temkar
