On Tue, Mar 17, 2009 at 3:08 PM, Prateek Temkar <[email protected]> wrote: > 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. >
Great, Jersey is licensed under CDDL and we would be able to use it based on Apache Third-Party Licensing Policy. [1] http://www.apache.org/legal/3party.html > 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. > This is really good, please raise a JIRA and provide the extension so we can provide any feedback and get it applied to Tuscany svn. > thnx, > > - Prateek Temkar > -- Luciano Resende Apache Tuscany, Apache PhotArk http://people.apache.org/~lresende http://lresende.blogspot.com/
