cxf-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Sergey Beryozkin" <sbery...@progress.com>
Subject Re: [CXF-2.2.5][Java1.5] Define namespace by configuration
Date Mon, 14 Dec 2009 12:16:34 GMT
Hi Gabo

You can probably try to have a single XSLT stylesheet transforming a WADL with some fixed
namespace into per-service specific WADL 
with the right namespace. The only thing this stylesheet will do is to capture say all http://yournamespace:*
elements and copy them 
to http://someservice:*, where "http://someservice" can be provided by configuring a transform
engine. You can have this stylesheet 
running in a ResponseHandler out filter, after the WADLGenerator has produced a WADL

So you might have

<jaxrs:server id="service1">
  <jaxrs:serviceBeans>
      <ref bean="myResourceClass"/>
  </jaxrs:serviceBeans>
  <jaxrs:providers>
      <ref bean="wadlPostProcessor1"/>
  </jaxrs:providers>
</jaxrs:server>

<jaxrs:server id="service2">
  <jaxrs:serviceBeans>
      <ref bean="myResourceClass"/>
  </jaxrs:serviceBeans>
  <jaxrs:providers>
      <ref bean="wadlPostProcessor2"/>
  </jaxrs:providers>
</jaxrs:server>

<bean id="wadlPostProcessor1" class="org.foo.bar.WadlPostProcessor">
   <property name="customNamespace" value="http://service1"/>
</bean>

<bean id="wadlPostProcessor1" class="org.foo.bar.WadlPostProcessor">
   <property name="customNamespace" value="http://service2"/>
</bean>

WadlPostProcessor is a generic custom ResponeHandler which can be written like this :

...
private String customNamespace;
private Templates customXsltTemplate;
@Context UriInfo uriInfo;


if (uriInfo.getQueryParameters().get("_wadl") != null) {
   String wadlXmlString = (String)Response.getEntity();

   // create transform engine, set a parameter called "custom namespace" on it and execute
customXsltTemplate
///
}


The result can be outputed into the CashedOutputStream and then copied back into a new Response
this filter will produce.
Given that WADL queries are not most oftne executed requests it should not affect the performance.
Alrternatively, you can have 
@Context HttpServletResponse injected and direct the transfrom engine to write directlly into
response.getOutputStream()...

hope it helps, Sergey

> Hi Sergey,
>
> Thanks for the update, but if I understood the class property correctly, this only allows
one to use the other but does not 
> necessary replace. Also, it does not seem to affect the wadl generated. I added the following:
>
> <bean class="org.apache.cxf.jaxrs.provider.JAXBElementProvider">
>    <property name="inTransformElements">
>        <map>
>            <entry key="http://custom.domain" value="http://class.registered.domain"
/>
>        </map>
>    </property>
>    <property name="outTransformElements">
>        <map>
>            <entry key="http://class.registered.domain" value="http://custom.domain"
/>
>        </map>
>    </property>
> </bean>
>
> The custom.domain is not mentioned anywhere in the wadl generated.
>
> Is something similar available to JAX-WS?
>
> It's just a nice to have. :)
>
> Gabo
>
> Sergey Beryozkin wrote:
>> Hi,
>>
>> Is it JAXRS or JAXWS ?
>> I think you can probably rely on the custom XMLStreamReaders/Writers to translate
between diff namespaces.
>> If it is JAXRS then you might also want to try to configure a JAXBElementProvider,
starting from 2.2.5, ex, say you need to have
>>
>> {http://bar}bar converted into {http://baz}bar both ways.
>> So you can configure JAXBElementProvider with outElementsMap and inElementsMap map
properties, containing
>> {http://bar}bar:{http://baz}bar
>> and
>> {http://baz}bar:{http://bar}bar
>>
>> pairs respectively.
>>
>> This approach is a bit limited at the moment in that no wildcards for local names
are supported, thus it would well for schemas 
>> with only the root element being explicitly qualified, and would be more cumbersome
in other cases as it would require users to 
>> list all the elements, but it would be easy to fix.
>> XSLTJaxbProvider wiull also work both ways
>>
>> cheers, Sergey
>>
>> ----- Original Message ----- From: "Gabo Manuel" <kmanuel@solegysystems.com>
>> To: <users@cxf.apache.org>
>> Sent: Thursday, December 10, 2009 4:01 AM
>> Subject: [CXF-2.2.5][Java1.5] Define namespace by configuration
>>
>>
>>> Hi All,
>>>
>>> To explain the scenario, we provide back-end support for service providers. The
end client therefore should have no knowledge we 
>>> exist. Is there a way to configure from a text file the namespace to be used
by the service classes and objects involved? This 
>>> way there would be no need to recompile the entire project for each client.
>>>
>>> Thanks in advance.
>>>
>>> Gabo
>>
>> 


Mime
View raw message