Uploaded image for project: 'Tuscany'
  1. Tuscany
  2. TUSCANY-2919

Implement JAX-RS Support in Tuscany 1.4

    XMLWordPrintableJSON

Details

    • New Feature
    • Status: Open
    • Major
    • Resolution: Unresolved
    • None
    • Java-SCA-1.x
    • 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.

      Attachments

        1. SamplesAndDoc.zip
          40 kB
          Prateek Temkar
        2. jersey-server.zip
          1.03 MB
          Prateek Temkar
        3. tuscanyModules.zip
          198 kB
          Prateek Temkar

        Activity

          People

            Unassigned Unassigned
            prateektemkar Prateek Temkar
            Votes:
            1 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:

              Time Tracking

                Estimated:
                Original Estimate - 336h
                336h
                Remaining:
                Remaining Estimate - 336h
                336h
                Logged:
                Time Spent - Not Specified
                Not Specified