I'm looking to do something about TUSCANY-3855 [1] and the associated
conversation [2]. Looking through the extensive posts I draw these
conclusions.

The current situation
================

An attempt to describe what context is available to various parts of
the infrastructure. Accessible context is noted in CAPITALS.

Service Binding
  Binding Wire
     Binding Interceptor
         SERVICE MESSAGE (headers and binding context)
  Operation Wire
     Operation Interceptor
         SERVICE MESSAGE (headers and binding context)
Component Service
Component Implementation
     @Context RequestContext
          REQUEST CONTEXT (security + service info from service message)
Component Reference
  JDKInvocationHandler
  Operation Wire
      Operation Interceptor
          REFERENCE MESSAGE (headers and binding context)
  Binding Wire
       Binding Interceptor
          REFERENCE MESSAGE (headers and binding context)
Reference Binding

Context is passed on the thread using ThreadMessageContext which takes
a Message object. It's set to the incoming message in the following
places

NonBlockingInterceptor
RuntimeInvoker
JDIInvocationHandler

There are two main drawbacks of the current solution

1/ There is no way that the application can access (selected) context
information from the incoming request, e.g. information that a policy,
or other, interceptor wishes the implementation to have access to.
Other than that information that is prescribed by the RequestContext.
2/ The service message context is not available in the reference
chain. The headers are copied from the service message context to the
reference message context but any other context is not available
downstream.

An aggregation of the proposed improvements
===================================
1/ Application context
-----------------------------

>From the various conversations [2] it seems that it would be useful to
present context in two categories:

A/ Context that the application should have access to
B/ Context that the infrastructure should have access to

Where A is a subset of B.

B itself is a mixture of information.

i)  information that is/should be part of the protocol message
ii)  information pertinent to the configuration/operation of the
interceptor chain

All context is currently carried by the Tuscany message structure.
Beside the body itself we store context in two places in the Message
structure

    Map<String, Object> getHeaders();  // Stores Bi + possibly a bit of Bii
    <T> T getBindingContext(); // Stores Bii

We could massage this so that

Headers - is just Bi)
Context - is just Bii) and supports  interceptor specific context objects
ApplicationContext - is just A

Infrastructure would then add objects to Context or ApplicationContext
depending on whether the application should be able to see it or not.
My concern here is how to define the interface so there isn't a huge
amount of searching and casting going on.

We could then add some extensibility to allow @Context to be
associated with arbitrary types that the interceptor chain has added
to ApplicationContext..

2/ Passing context through component
----------------------------------------------------

Haven't looked at the details here still but the suggestion is to move
the context switch to later in the chain. My initial thought is that
I'm tempted to suggest adding a Context item that points to the
reference message instead as the switch seems to be somewhat either/or

[1] https://issues.apache.org/jira/browse/TUSCANY-3855
[2] http://www.mail-archive.com/dev@tuscany.apache.org/msg15581.html

Simon

-- 
Apache Tuscany committer: tuscany.apache.org
Co-author of a book about Tuscany and SCA: tuscanyinaction.com

Reply via email to