Details
-
New Feature
-
Status: Open
-
Major
-
Resolution: Unresolved
-
None
-
None
-
None
-
Windows/Linux; Tomcat/Jetty
Description
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
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/dev@tuscany.apache.org/msg05857.html but
nevertheless thought we'd share our experience.