cxf-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Sergey Beryozkin <sergey.beryoz...@iona.com>
Subject Re: Whiteboard pattern for JAX-RS services
Date Thu, 25 Jun 2009 17:21:31 GMT

Hi

Please see my comments with prefixed with S.B. 

>>
>>>
>  I'm not sure how CXF keeps track of these providers now, but I assume
>> there's a registry of some kind.  Are the providers tied to specific
>> jax-rs
>> resources, or are they "global"?  If it's a global registry, it should be
>> trivial to add a service tracker that watches for new services that are
>> registered with the osgi container under the MessageBodyReader,
>> MessageBodyWriter, or ExceptionMapper interfaces.  The service tracker
>> would
>> add or remove the providers from the internal CXF provider registry.
>>  That's
>> what I did with the resteasy spi, but I am not as familiar with how CXF
>> keeps track of providers.
>>
>
> CXF JAX-RS has a global registry which provides providers supporting
> formats/features as requested by the spec (for ex JAXB support, etc).
> These
> providers are shared. In addition, every endpoint gets the opportunity to
> register per-endpoint unique providers. Some endpoints may or may not
> share
> the same instances but it's up to the app developer. So say the same JAXB
> provider may be configured to suit a particular endpoint's needs
>
> Thus, given that the endpoint or client is created by DOSGI, I was
> thinking
> about the user bundles providing a list of additional providers using a
> service property :
>
> Dictionary props = ...
> props.put("org.apache.cxf.rs.providers", new Object[]{provider1,
> provider2});
>
> and then publish or attempt to bind...
>
> and DOSGI will use them at the point of creating the endpoint/client
>
> I'm wondering, would this approach work for you ?
>
Yes, partially.  Since there are multiple scopes, I think there should be
multiple mechanisms for registering providers.  A developer should be able
to register a global provider by simply publishing it as an OSGi service,
and should be able to register per-endpoint providers in the manner you
describe above.

<S.B> Yeah, registering a global provider this way sounds like a good idea.
Not sure yet how to handle it
in DOSGi. According to the spec, custom providers should be chosen instead
of any matching default providers, for ex, if one registers a provider
capable of handling WebApplicationExceptions then it should be chosen
instead of the default one. If we add such 'overlapping' providers to the
global registry then it could be tricky to meet the specs requirements.

May be in CXF JAX-RS we need to introduce another ProviderFactory instance
for keeping the shared custom handlers. So first the endpoint-specific
providers will be checked, next shared custom providers will be checked and
finally the default ones will be checked. This new ProviderFactory instance
is kind of redundant in most other cases as without OSGI users can easily
inject the same instance into endpoint-specific factories, but in OSGi it
can be handy.

Perhaps for a start, a ServiceTracker launched in DOSGI can keep this shared
custom providers state locally and provide it to individual JAX-RS config
handlers.

Endpoint specific providers would be much simpler to deal with, they'll just
have to be passed to the endpoint factory code, but a providers property
will likely need to be excluded from the service properties available for
the publication....

</S.B>

If global provider registration is not a priority for others, I'd be happy
to work on a patch.  Just let me know when things settle down in this area,
so we don't wind up with a difficult-to-merge patch :)

S.B : Patch would be welcome :-) Give it  a try please whenever you get a
chance/some time. We will fix the merge issues if any...Thanks

Thanks,
Josh



-- 
View this message in context: http://www.nabble.com/Whiteboard-pattern-for-JAX-RS-services-tp23999480p24207585.html
Sent from the cxf-dev mailing list archive at Nabble.com.


Mime
View raw message