You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2009/03/18 19:17:34 UTC
svn commit: r755684 - in /cxf/branches/2.1.x-fixes: ./
distribution/bundle/jaxrs/
rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/
rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ rt/fro...
Author: sergeyb
Date: Wed Mar 18 18:17:33 2009
New Revision: 755684
URL: http://svn.apache.org/viewvc?rev=755684&view=rev
Log:
Merged revisions 746947 via svnmerge from
https://svn.apache.org/repos/asf/cxf/trunk
........
r746947 | sergeyb | 2009-02-23 10:15:34 +0000 (Mon, 23 Feb 2009) | 1 line
JAXRS: client api support for bus configuration and outbound chains, more updates to follow shortly
........
Added:
cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java
- copied unchanged from r746947, cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/AbstractJAXRSFactoryBean.java
cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBean.java
- copied unchanged from r746947, cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBean.java
cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/security/BookHttpsServer.java
- copied unchanged from r746947, cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/security/BookHttpsServer.java
cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/security/JAXRSHttpsBookTest.java
- copied unchanged from r746947, cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/security/JAXRSHttpsBookTest.java
cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/security/jaxrs-https.xml
- copied unchanged from r746947, cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/security/jaxrs-https.xml
Modified:
cxf/branches/2.1.x-fixes/ (props changed)
cxf/branches/2.1.x-fixes/distribution/bundle/jaxrs/pom.xml
cxf/branches/2.1.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/WrapperHelperCompiler.java (props changed)
cxf/branches/2.1.x-fixes/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBWrapperHelperTest.java (props changed)
cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServerFactoryBean.java
cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServiceFactoryBean.java
cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServiceImpl.java
cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java
cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/JAXRSClientFactory.java
cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java
cxf/branches/2.1.x-fixes/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java
cxf/branches/2.1.x-fixes/rt/transports/http/src/test/java/org/apache/cxf/transport/http/HTTPConduitURLEasyMockTest.java
cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreJaxrsJaxws.java
cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java
cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java
Propchange: cxf/branches/2.1.x-fixes/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Mar 18 18:17:33 2009
@@ -1 +1 @@
-/cxf/trunk:686333-686363,686764,686820,687096,687194,687363,687387,687463,687543,687722,687798,687814,687817,687891,687910,687914,688086,688102,688133,688596,688735,688870,689572,689596,689855,689924,690067,690289,691246,691271,691295,691338,691355,691488,691602,691646,691706,691728,692116,692157,692310,692466,692499,693653,693819,694179,694263,694417,694716,694744,694747,694795,694869,694981,694987,694993,695041,695096,695396,695484,695537,695552,695561,695619,695684,695835,695840,695868,695935,695977,696016,696094,696433,696720,697085,697868,698128,699289,700261,700507,700602,700981,701316,701783,701830,701862,702187,702205-702248,702267,702547,702561,702580,702602,702609,702616,702653,702656,702957,703191,703239,703309,703501,703513,703548,704584,704937,704997,705150,705235,705274,705340,705446,705548,705614,705692,705708,706482,706631,706675,706900,706909,707034,707089,707100,707902,708035,708044,708074,708410,708417,708550,708554,709353-709354,709425,710076,710150,71015
4,711193,711388,711410,711490,711635,711949,711975,712194,712198,712238,712272,712299,712312,712670,712893,713082,713095-713096,713099,713584,713597,713737,713804,713899,714167-714168,714245,714255,717937-717961,718281-718448,718565,718620,718640,718665,718970,719017,719210,719215-719218,719222-719273,719305,719327-719680,720053,720119-720218,720238,720293-720316,720497,721221,721241,721501,722117,722129,722412,722988,723024,723338,723378,723716-723791,724333-724372,724433-724438,724449,724481,724485,724668,724780,724782,724785,724793,724795,724940,725071,725316,725332,725335,725348,725364,725418,725425-725426,725455,725506,725554,725562,725651,725671,725688,725754,725773,725799,725839,726342,726524,726631,726634,726637,726639,726692,726724,726769,726992,727096,727445,727521,727568,727692,727754,727781,727792,728070,728087,728696,728897,729051,729430,729449,729460,729863,730082,730139,730889,730891,731598,731604,731615,731631,731635,732036,732050,732320,732363,732411,732450,
732710,732773,732827,732829,733512,733582,733901,734367,734462,734666,734762,734772,734812,734836,734965,735113,735252,735722-735723,735729,735734,735751,735782,735787,735987,736332,736343,736352,736358-736362,736408,736423,736448,736491,736621,736726,736736,736738-736739,736766,736825,736852,737032,737046,737061,737069,737124,737237,737246,737299,737356,737494,737498,737761,737817,737849,737855,737994,738166,738178,738201,738210,738242,738244,738265,738516,738583,738863,738937,738983,739366-739367,739451-739452,739799-739800,739867,739876-739877,739922,739937,739990,740045,740108,740154,740186,740197,740255,740706,740730,740810,740844,740886,740902,740923,740994,741058,741124,741152,741188,741521,741529,741879,742914,743087,743439,743441,743459,743469,743825,743965,743967,744104-744138,744175,744195,744237,744756,745214,745243,745472,745474,745560,745578,745586,745592,745638,745950,746012,746019-746020,746256,746266,746306,746357,746373-746374,747217,747386,747406,747454,74
7649,747766,747986,748159,748192,748223,748305,748313,748603-748604,748768,749420,749449,749454-749456,749505,749511,749513,749584,749767,749771,749799,749890,750059-750060,750302,750591,750689,750935,751067-751110,751233,751527,751567,751576,751607,751732,751740,751787,751828,751840,751972-751974,752122,752132,752136,752558,752613,752680,752728,752753,752849,752880-752881,752883,752961,752992,753205,753293,753335,753338,753388,755153,755514
+/cxf/trunk:686333-686363,686764,686820,687096,687194,687363,687387,687463,687543,687722,687798,687814,687817,687891,687910,687914,688086,688102,688133,688596,688735,688870,689572,689596,689855,689924,690067,690289,691246,691271,691295,691338,691355,691488,691602,691646,691706,691728,692116,692157,692310,692466,692499,693653,693819,694179,694263,694417,694716,694744,694747,694795,694869,694981,694987,694993,695041,695096,695396,695484,695537,695552,695561,695619,695684,695835,695840,695868,695935,695977,696016,696094,696433,696720,697085,697868,698128,699289,700261,700507,700602,700981,701316,701783,701830,701862,702187,702205-702248,702267,702547,702561,702580,702602,702609,702616,702653,702656,702957,703191,703239,703309,703501,703513,703548,704584,704937,704997,705150,705235,705274,705340,705446,705548,705614,705692,705708,706482,706631,706675,706900,706909,707034,707089,707100,707902,708035,708044,708074,708410,708417,708550,708554,709353-709354,709425,710076,710150,71015
4,711193,711388,711410,711490,711635,711949,711975,712194,712198,712238,712272,712299,712312,712670,712893,713082,713095-713096,713099,713584,713597,713737,713804,713899,714167-714168,714245,714255,717937-717961,718281-718448,718565,718620,718640,718665,718970,719017,719210,719215-719218,719222-719273,719305,719327-719680,720053,720119-720218,720238,720293-720316,720497,721221,721241,721501,722117,722129,722412,722988,723024,723338,723378,723716-723791,724333-724372,724433-724438,724449,724481,724485,724668,724780,724782,724785,724793,724795,724940,725071,725316,725332,725335,725348,725364,725418,725425-725426,725455,725506,725554,725562,725651,725671,725688,725754,725773,725799,725839,726342,726524,726631,726634,726637,726639,726692,726724,726769,726992,727096,727445,727521,727568,727692,727754,727781,727792,728070,728087,728696,728897,729051,729430,729449,729460,729863,730082,730139,730889,730891,731598,731604,731615,731631,731635,732036,732050,732320,732363,732411,732450,
732710,732773,732827,732829,733512,733582,733901,734367,734462,734666,734762,734772,734812,734836,734965,735113,735252,735722-735723,735729,735734,735751,735782,735787,735987,736332,736343,736352,736358-736362,736408,736423,736448,736491,736621,736726,736736,736738-736739,736766,736825,736852,737032,737046,737061,737069,737124,737237,737246,737299,737356,737494,737498,737761,737817,737849,737855,737994,738166,738178,738201,738210,738242,738244,738265,738516,738583,738863,738937,738983,739366-739367,739451-739452,739799-739800,739867,739876-739877,739922,739937,739990,740045,740108,740154,740186,740197,740255,740706,740730,740810,740844,740886,740902,740923,740994,741058,741124,741152,741188,741521,741529,741879,742914,743087,743439,743441,743459,743469,743825,743965,743967,744104-744138,744175,744195,744237,744756,745214,745243,745472,745474,745560,745578,745586,745592,745638,745950,746012,746019-746020,746256,746266,746306,746357,746373-746374,746947,747217,747386,747406,74
7454,747649,747766,747986,748159,748192,748223,748305,748313,748603-748604,748768,749420,749449,749454-749456,749505,749511,749513,749584,749767,749771,749799,749890,750059-750060,750302,750591,750689,750935,751067-751110,751233,751527,751567,751576,751607,751732,751740,751787,751828,751840,751972-751974,752122,752132,752136,752558,752613,752680,752728,752753,752849,752880-752881,752883,752961,752992,753205,753293,753335,753338,753388,755153,755514
Propchange: cxf/branches/2.1.x-fixes/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.
Modified: cxf/branches/2.1.x-fixes/distribution/bundle/jaxrs/pom.xml
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/distribution/bundle/jaxrs/pom.xml?rev=755684&r1=755683&r2=755684&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/distribution/bundle/jaxrs/pom.xml (original)
+++ cxf/branches/2.1.x-fixes/distribution/bundle/jaxrs/pom.xml Wed Mar 18 18:17:33 2009
@@ -116,11 +116,9 @@
antlr*;resolution:=optional,
com.ibm*;resolution:=optional,
com.sun*;resolution:=optional,
- javax.jms*;resolution:=optional,
- javax.ws.rs*;resolution:=optional,
+ javax.ws.rs*,
repackage;resolution:=optional,
javax.resource*;resolution:=optional,
- javax.xml.soap,
junit.framework*;resolution:=optional,
org.apache.abdera*;resolution:=optional,
org.apache.commons.lang*;resolution:=optional,
@@ -128,7 +126,6 @@
org.apache.log4j*;resolution:=optional,
org.apache.velocity*;resolution:=optional,
org.apache.xmlbeans*;resolution:=optional,
- org.apache.ws.security*;resolution:=optional,
org.codehaus.jra*;resolution:=optional,
org.codehaus.jettison*;resolution:=optional,
org.jaxen*;resolution:=optional,
Propchange: cxf/branches/2.1.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/WrapperHelperCompiler.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Mar 18 18:17:33 2009
@@ -1 +1 @@
-/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/WrapperHelperCompiler.java:743825,744104-744138,745472,745474,755514
+/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/WrapperHelperCompiler.java:743825,744104-744138,745472,745474,746947,755514
Propchange: cxf/branches/2.1.x-fixes/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBWrapperHelperTest.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Mar 18 18:17:33 2009
@@ -1 +1 @@
-/cxf/trunk/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBWrapperHelperTest.java:743825,744104-744138,745472,745474,755514
+/cxf/trunk/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBWrapperHelperTest.java:743825,744104-744138,745472,745474,746947,755514
Modified: cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServerFactoryBean.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServerFactoryBean.java?rev=755684&r1=755683&r2=755684&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServerFactoryBean.java (original)
+++ cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServerFactoryBean.java Wed Mar 18 18:17:33 2009
@@ -20,34 +20,28 @@
import java.io.IOException;
import java.util.Arrays;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.logging.Logger;
import org.apache.cxf.BusException;
-import org.apache.cxf.binding.BindingConfiguration;
-import org.apache.cxf.binding.BindingFactory;
-import org.apache.cxf.binding.BindingFactoryManager;
import org.apache.cxf.common.i18n.BundleUtils;
import org.apache.cxf.common.logging.LogUtils;
-import org.apache.cxf.endpoint.AbstractEndpointFactory;
import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.endpoint.EndpointException;
-import org.apache.cxf.endpoint.EndpointImpl;
import org.apache.cxf.endpoint.Server;
import org.apache.cxf.endpoint.ServerImpl;
import org.apache.cxf.feature.AbstractFeature;
import org.apache.cxf.jaxrs.impl.RequestPreprocessor;
+import org.apache.cxf.jaxrs.lifecycle.PerRequestResourceProvider;
import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
+import org.apache.cxf.jaxrs.model.ClassResourceInfo;
import org.apache.cxf.jaxrs.provider.ProviderFactory;
-import org.apache.cxf.service.Service;
+import org.apache.cxf.jaxrs.utils.InjectionUtils;
import org.apache.cxf.service.factory.ServiceConstructionException;
import org.apache.cxf.service.invoker.Invoker;
-import org.apache.cxf.service.model.BindingInfo;
-import org.apache.cxf.service.model.EndpointInfo;
-import org.apache.cxf.transport.DestinationFactory;
-import org.apache.cxf.transport.DestinationFactoryManager;
/**
@@ -61,16 +55,16 @@
* </pre>
* This will start a server for you and register it with the ServerManager.
*/
-public class JAXRSServerFactoryBean extends AbstractEndpointFactory {
+public class JAXRSServerFactoryBean extends AbstractJAXRSFactoryBean {
private static final Logger LOG = LogUtils.getL7dLogger(JAXRSServerFactoryBean.class);
private static final ResourceBundle BUNDLE = BundleUtils.getBundle(JAXRSServerFactoryBean.class);
- protected boolean doInit;
+ protected Map<Class, ResourceProvider> resourceProviders = new HashMap<Class, ResourceProvider>();
+
private Server server;
private Invoker invoker;
private boolean start = true;
- private JAXRSServiceFactoryBean serviceFactory;
private List<Object> serviceBeans;
private List<?> entityProviders;
private Map<Object, Object> languageMappings;
@@ -82,9 +76,7 @@
}
public JAXRSServerFactoryBean(JAXRSServiceFactoryBean sf) {
- this.serviceFactory = sf;
- doInit = true;
- setBindingId(JAXRSBindingFactory.JAXRS_BINDING_ID);
+ super(sf);
}
public void setSchemaLocations(List<String> schemas) {
@@ -104,6 +96,11 @@
LOG.severe(msg.toString());
throw new EndpointException(msg);
}
+ if (serviceFactory.getService() == null) {
+ serviceFactory.create();
+ updateClassResourceProviders();
+ }
+
Endpoint ep = createEndpoint();
server = new ServerImpl(getBus(),
ep,
@@ -155,99 +152,6 @@
}
}
- protected Endpoint createEndpoint() throws BusException, EndpointException {
- Service service = serviceFactory.getService();
-
- if (service == null) {
- service = serviceFactory.create();
- }
-
- EndpointInfo ei = createEndpointInfo();
- Endpoint ep = new EndpointImpl(getBus(), getServiceFactory().getService(), ei);
-
- if (properties != null) {
- ep.putAll(properties);
- }
-
- if (getInInterceptors() != null) {
- ep.getInInterceptors().addAll(getInInterceptors());
- }
- if (getOutInterceptors() != null) {
- ep.getOutInterceptors().addAll(getOutInterceptors());
- }
- if (getInFaultInterceptors() != null) {
- ep.getInFaultInterceptors().addAll(getInFaultInterceptors());
- }
- if (getOutFaultInterceptors() != null) {
- ep.getOutFaultInterceptors().addAll(getOutFaultInterceptors());
- }
- return ep;
- }
-
- /*
- * EndpointInfo contains information form WSDL's physical part such as
- * endpoint address, binding, transport etc. For JAX-RS based EndpointInfo,
- * as there is no WSDL, these information are set manually, eg, default
- * transport is http, binding is JAX-RS binding, endpoint address is from
- * server mainline.
- */
- protected EndpointInfo createEndpointInfo() throws BusException {
- String transportId = getTransportId();
- if (transportId == null && getAddress() != null) {
- DestinationFactory df = getDestinationFactory();
- if (df == null) {
- DestinationFactoryManager dfm = getBus().getExtension(DestinationFactoryManager.class);
- df = dfm.getDestinationFactoryForUri(getAddress());
- }
-
- if (df != null) {
- transportId = df.getTransportIds().get(0);
- }
- }
-
- //default to http transport
- if (transportId == null) {
- transportId = "http://schemas.xmlsoap.org/wsdl/soap/http";
- }
-
- setTransportId(transportId);
-
- EndpointInfo ei = new EndpointInfo();
- ei.setTransportId(transportId);
- ei.setName(serviceFactory.getService().getName());
- ei.setAddress(getAddress());
-
- BindingInfo bindingInfo = createBindingInfo();
- ei.setBinding(bindingInfo);
-
- return ei;
- }
-
- protected BindingInfo createBindingInfo() {
- BindingFactoryManager mgr = getBus().getExtension(BindingFactoryManager.class);
- String binding = getBindingId();
- BindingConfiguration bindingConfig = getBindingConfig();
-
- if (binding == null && bindingConfig != null) {
- binding = bindingConfig.getBindingId();
- }
-
- if (binding == null) {
- binding = JAXRSBindingFactory.JAXRS_BINDING_ID;
- }
-
- try {
- BindingFactory bindingFactory = mgr.getBindingFactory(binding);
- setBindingFactory(bindingFactory);
- return bindingFactory.createBindingInfo(serviceFactory.getService(),
- binding, bindingConfig);
- } catch (BusException ex) {
- ex.printStackTrace();
- //do nothing
- }
- return null;
- }
-
public void setLanguageMappings(Map<Object, Object> lMaps) {
languageMappings = lMaps;
}
@@ -292,7 +196,7 @@
}
public void setResourceProvider(Class c, ResourceProvider rp) {
- serviceFactory.setResourceProvider(c, rp);
+ resourceProviders.put(c, rp);
}
/**
@@ -317,4 +221,30 @@
this.start = start;
}
+ private void injectContexts() {
+ for (ClassResourceInfo cri : serviceFactory.getClassResourceInfo()) {
+ if (cri.isSingleton()) {
+ InjectionUtils.injectContextProxies(cri,
+ cri.getResourceProvider().getInstance());
+ }
+ }
+ }
+
+ private void updateClassResourceProviders() {
+ for (ClassResourceInfo cri : serviceFactory.getClassResourceInfo()) {
+ if (cri.getResourceProvider() != null) {
+ continue;
+ }
+
+ ResourceProvider rp = resourceProviders.get(cri.getResourceClass());
+ if (rp != null) {
+ cri.setResourceProvider(rp);
+ } else {
+ //default lifecycle is per-request
+ rp = new PerRequestResourceProvider(cri.getResourceClass());
+ cri.setResourceProvider(rp);
+ }
+ }
+ injectContexts();
+ }
}
Modified: cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServiceFactoryBean.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServiceFactoryBean.java?rev=755684&r1=755683&r2=755684&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServiceFactoryBean.java (original)
+++ cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServiceFactoryBean.java Wed Mar 18 18:17:33 2009
@@ -22,17 +22,16 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executor;
+import javax.ws.rs.Path;
+
import org.apache.cxf.common.util.ClassHelper;
-import org.apache.cxf.jaxrs.lifecycle.PerRequestResourceProvider;
-import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
import org.apache.cxf.jaxrs.model.ClassResourceInfo;
-import org.apache.cxf.jaxrs.utils.InjectionUtils;
+import org.apache.cxf.jaxrs.utils.AnnotationUtils;
import org.apache.cxf.jaxrs.utils.ResourceUtils;
import org.apache.cxf.service.Service;
import org.apache.cxf.service.factory.AbstractServiceFactoryBean;
@@ -46,7 +45,6 @@
protected List<ClassResourceInfo> classResourceInfos =
new ArrayList<ClassResourceInfo>();
- protected Map<Class, ResourceProvider> resourceProviders = new HashMap<Class, ResourceProvider>();
private Invoker invoker;
private Executor executor;
@@ -115,15 +113,32 @@
return Collections.unmodifiableList(classResourceInfos);
}
+ public void setResourceClass(Class cls) {
+ classResourceInfos.clear();
+ boolean isRoot = AnnotationUtils.getClassAnnotation(cls, Path.class) != null;
+ createResourceInfo(cls, isRoot);
+ }
+
+ public void setResourceClassFromBean(Object o) {
+ classResourceInfos.clear();
+ Class<?> realClass = ClassHelper.getRealClass(o);
+ boolean isRoot = AnnotationUtils.getClassAnnotation(realClass, Path.class) != null;
+ createResourceInfo(realClass, isRoot);
+ }
+
public void setResourceClasses(List<Class> classes) {
for (Class resourceClass : classes) {
- ClassResourceInfo classResourceInfo =
- ResourceUtils.createClassResourceInfo(resourceClass, resourceClass, true, enableStatic);
- if (classResourceInfo != null) {
- classResourceInfos.add(classResourceInfo);
- }
+ createResourceInfo(resourceClass, true);
+ }
+ }
+
+ protected ClassResourceInfo createResourceInfo(Class cls, boolean isRoot) {
+ ClassResourceInfo classResourceInfo =
+ ResourceUtils.createClassResourceInfo(cls, cls, isRoot, enableStatic);
+ if (classResourceInfo != null) {
+ classResourceInfos.add(classResourceInfo);
}
- injectContexts();
+ return classResourceInfo;
}
public void setResourceClasses(Class... classes) {
@@ -146,23 +161,8 @@
}
}
- private void injectContexts() {
- for (ClassResourceInfo cri : classResourceInfos) {
- if (cri.isSingleton()) {
- InjectionUtils.injectContextProxies(cri,
- cri.getResourceProvider().getInstance());
- }
- }
- }
-
- public void setResourceProvider(Class c, ResourceProvider rp) {
- resourceProviders.put(c, rp);
- }
-
protected void initializeServiceModel() {
- updateClassResourceProviders();
-
JAXRSServiceImpl service = new JAXRSServiceImpl(classResourceInfos);
setService(service);
@@ -172,29 +172,11 @@
}
}
- private void updateClassResourceProviders() {
- for (ClassResourceInfo cri : classResourceInfos) {
- if (cri.getResourceProvider() != null) {
- continue;
- }
-
- ResourceProvider rp = resourceProviders.get(cri.getResourceClass());
- if (rp != null) {
- cri.setResourceProvider(rp);
- } else {
- //default lifecycle is per-request
- rp = new PerRequestResourceProvider(cri.getResourceClass());
- cri.setResourceProvider(rp);
- }
- }
- injectContexts();
- }
-
-
-
-
protected Invoker createInvoker() {
return new JAXRSInvoker();
}
+ public void setService(Service service) {
+ super.setService(service);
+ }
}
Modified: cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServiceImpl.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServiceImpl.java?rev=755684&r1=755683&r2=755684&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServiceImpl.java (original)
+++ cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServiceImpl.java Wed Mar 18 18:17:33 2009
@@ -19,6 +19,7 @@
package org.apache.cxf.jaxrs;
+import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -26,6 +27,7 @@
import javax.xml.namespace.QName;
+import org.apache.cxf.common.util.PackageUtils;
import org.apache.cxf.configuration.Configurable;
import org.apache.cxf.databinding.DataBinding;
import org.apache.cxf.endpoint.Endpoint;
@@ -43,9 +45,14 @@
private Executor executor;
private Invoker invoker;
private Map<QName, Endpoint> endpoints = new HashMap<QName, Endpoint>();
+ private String address;
public JAXRSServiceImpl() {
}
+
+ public JAXRSServiceImpl(String address) {
+ this.address = address;
+ }
public JAXRSServiceImpl(List<ClassResourceInfo> cri) {
this.classResourceInfos = cri;
@@ -56,9 +63,14 @@
return getName().toString();
}
- public QName getName() {
- Class primaryClass = classResourceInfos.get(0).getServiceClass();
- return new QName("jaxrs", primaryClass.getSimpleName());
+ public QName getName() {
+ if (address == null) {
+ Class primaryClass = classResourceInfos.get(0).getServiceClass();
+ String ns = PackageUtils.getNamespace(PackageUtils.getPackageName(primaryClass));
+ return new QName(ns + "/jaxrs", primaryClass.getSimpleName());
+ } else {
+ return new QName(address, "WebResource");
+ }
}
public List<ClassResourceInfo> getClassResourceInfos() {
@@ -66,8 +78,7 @@
}
public List<ServiceInfo> getServiceInfos() {
- //NOT APPLICABLE
- return null;
+ return Collections.emptyList();
}
public EndpointInfo getEndpointInfo(QName endpoint) {
Modified: cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java?rev=755684&r1=755683&r2=755684&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java (original)
+++ cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java Wed Mar 18 18:17:33 2009
@@ -44,23 +44,37 @@
import javax.ws.rs.ext.MessageBodyReader;
import javax.ws.rs.ext.MessageBodyWriter;
+import org.apache.cxf.Bus;
+import org.apache.cxf.endpoint.ConduitSelector;
+import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.helpers.IOUtils;
+import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.jaxrs.impl.MetadataMap;
import org.apache.cxf.jaxrs.impl.UriBuilderImpl;
import org.apache.cxf.jaxrs.provider.ProviderFactory;
import org.apache.cxf.jaxrs.utils.HttpUtils;
+import org.apache.cxf.message.Exchange;
+import org.apache.cxf.message.ExchangeImpl;
+import org.apache.cxf.message.Message;
import org.apache.cxf.message.MessageImpl;
+import org.apache.cxf.phase.PhaseChainCache;
+import org.apache.cxf.phase.PhaseInterceptorChain;
+import org.apache.cxf.phase.PhaseManager;
+import org.apache.cxf.transport.MessageObserver;
public class AbstractClient implements Client {
-
+
protected static final MediaType WILDCARD = MediaType.valueOf("*/*");
+
+ protected ConduitSelector conduitSelector;
+ protected Bus bus;
private MultivaluedMap<String, String> requestHeaders = new MetadataMap<String, String>();
private ResponseBuilder responseBuilder;
private URI baseURI;
private UriBuilder currentBuilder;
-
+
protected AbstractClient(URI baseURI, URI currentURI) {
this.baseURI = baseURI;
this.currentBuilder = new UriBuilderImpl(currentURI);
@@ -157,29 +171,12 @@
return this;
}
- protected List<MediaType> getAccept() {
- List<String> headers = requestHeaders.get(HttpHeaders.ACCEPT);
- if (headers == null || headers.size() == 0) {
- return null;
- }
- List<MediaType> types = new ArrayList<MediaType>();
- for (String s : headers) {
- types.add(MediaType.valueOf(s));
- }
- return types;
- }
-
public MultivaluedMap<String, String> getHeaders() {
MultivaluedMap<String, String> map = new MetadataMap<String, String>();
map.putAll(requestHeaders);
return map;
}
- protected MediaType getType() {
- String type = requestHeaders.getFirst(HttpHeaders.CONTENT_TYPE);
- return type == null ? null : MediaType.valueOf(type);
- }
-
public URI getBaseURI() {
return baseURI;
}
@@ -188,10 +185,6 @@
return getCurrentBuilder().clone().build();
}
- protected UriBuilder getCurrentBuilder() {
- return currentBuilder;
- }
-
public Response getResponse() {
if (responseBuilder == null) {
throw new IllegalStateException();
@@ -207,6 +200,81 @@
return this;
}
+ public void setConduitSelector(ConduitSelector cs) {
+ this.conduitSelector = cs;
+ }
+
+ public void setBus(Bus bus) {
+ this.bus = bus;
+ }
+
+ protected void prepareConduitSelector(Message message) {
+ conduitSelector.prepare(message);
+ message.getExchange().put(ConduitSelector.class, conduitSelector);
+ }
+
+ protected PhaseInterceptorChain setupInterceptorChain(Endpoint endpoint) {
+ PhaseManager pm = bus.getExtension(PhaseManager.class);
+ List<Interceptor> i1 = bus.getOutInterceptors();
+ // TODO : make sure we don't forget the out interceptors of this client
+ List<Interceptor> i2 = endpoint.getOutInterceptors();
+ return new PhaseChainCache().get(pm.getOutPhases(), i1, i2);
+ }
+
+ protected Message createMessage(String httpMethod,
+ MultivaluedMap<String, String> headers,
+ String address,
+ MessageObserver observer) {
+ Message m = conduitSelector.getEndpoint().getBinding().createMessage();
+ m.put(Message.REQUESTOR_ROLE, Boolean.TRUE);
+ m.put(Message.INBOUND_MESSAGE, Boolean.FALSE);
+
+ m.put(Message.HTTP_REQUEST_METHOD, httpMethod);
+ m.put(Message.PROTOCOL_HEADERS, headers);
+ m.put(Message.ENDPOINT_ADDRESS, address);
+ m.put(Message.CONTENT_TYPE, headers.getFirst(HttpHeaders.CONTENT_TYPE));
+
+
+ Exchange exchange = new ExchangeImpl();
+ exchange.setSynchronous(true);
+ exchange.setOutMessage(m);
+ exchange.put(Bus.class, bus);
+ exchange.put(MessageObserver.class, observer);
+ exchange.setOneWay(false);
+ m.setExchange(exchange);
+
+ PhaseInterceptorChain chain = setupInterceptorChain(conduitSelector.getEndpoint());
+ m.setInterceptorChain(chain);
+
+ //setup conduit selector
+ prepareConduitSelector(m);
+
+ return m;
+ }
+
+ protected List<MediaType> getAccept() {
+ List<String> headers = requestHeaders.get(HttpHeaders.ACCEPT);
+ if (headers == null || headers.size() == 0) {
+ return null;
+ }
+ List<MediaType> types = new ArrayList<MediaType>();
+ for (String s : headers) {
+ types.add(MediaType.valueOf(s));
+ }
+ return types;
+ }
+
+
+ protected MediaType getType() {
+ String type = requestHeaders.getFirst(HttpHeaders.CONTENT_TYPE);
+ return type == null ? null : MediaType.valueOf(type);
+ }
+
+ protected UriBuilder getCurrentBuilder() {
+ return currentBuilder;
+ }
+
+
protected void resetResponse() {
responseBuilder = null;
}
@@ -220,7 +288,12 @@
currentBuilder = new UriBuilderImpl(uri);
}
- protected ResponseBuilder setResponseBuilder(HttpURLConnection conn) throws IOException {
+ protected ResponseBuilder setResponseBuilder(HttpURLConnection conn) throws Throwable {
+
+ if (conn == null) {
+ throw new WebApplicationException();
+ }
+
int status = conn.getResponseCode();
responseBuilder = Response.status(status);
for (Map.Entry<String, List<String>> entry : conn.getHeaderFields().entrySet()) {
Modified: cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java?rev=755684&r1=755683&r2=755684&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java (original)
+++ cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java Wed Mar 18 18:17:33 2009
@@ -18,6 +18,7 @@
*/
package org.apache.cxf.jaxrs.client;
+import java.io.OutputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
@@ -40,6 +41,8 @@
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriBuilder;
+import org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor;
+import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.jaxrs.impl.MetadataMap;
import org.apache.cxf.jaxrs.model.ClassResourceInfo;
import org.apache.cxf.jaxrs.model.OperationResourceInfo;
@@ -48,11 +51,16 @@
import org.apache.cxf.jaxrs.utils.InjectionUtils;
import org.apache.cxf.jaxrs.utils.JAXRSUtils;
import org.apache.cxf.jaxrs.utils.ParameterType;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.message.MessageContentsList;
+import org.apache.cxf.phase.Phase;
+import org.apache.cxf.transport.MessageObserver;
+import org.apache.cxf.transport.http.HTTPConduit;
-public class ClientProxyImpl extends AbstractClient implements InvocationHandler {
+public class ClientProxyImpl extends AbstractClient implements InvocationHandler, MessageObserver {
private ClassResourceInfo cri;
- private boolean inheritHeaders;
+ private boolean inheritHeaders;
public ClientProxyImpl(URI baseURI, URI currentURI, ClassResourceInfo cri, boolean inheritHeaders) {
super(baseURI, currentURI);
@@ -97,8 +105,15 @@
handleCookies(paramHeaders, types, params);
if (ori.isSubResourceLocator()) {
- Object proxy =
- JAXRSClientFactory.create(getBaseURI(), uri, m.getReturnType(), false, inheritHeaders);
+ ClassResourceInfo subCri = cri.getSubResource(m.getReturnType(), m.getReturnType());
+ if (subCri == null) {
+ throw new WebApplicationException();
+ }
+ ClientProxyImpl proxyImpl = new ClientProxyImpl(getBaseURI(), uri, subCri, inheritHeaders);
+ proxyImpl.setBus(bus);
+ proxyImpl.setConduitSelector(conduitSelector);
+
+ Object proxy = JAXRSClientFactory.create(m.getReturnType(), proxyImpl);
if (inheritHeaders) {
WebClient.client(proxy).headers(headers);
}
@@ -107,31 +122,14 @@
}
headers.putAll(paramHeaders);
-
- HttpURLConnection connect = createHttpConnection(uri, ori.getHttpMethod());
- setRequestHeaders(connect, headers, ori, types.containsKey(ParameterType.FORM),
+ setRequestHeaders(headers, ori, types.containsKey(ParameterType.FORM),
bodyIndex == -1 ? null : params[bodyIndex].getClass(), m.getReturnType());
- if (bodyIndex != -1 || types.containsKey(ParameterType.FORM)) {
- if (bodyIndex != -1) {
- writeBody(params[bodyIndex], params[bodyIndex].getClass(),
- m.getGenericParameterTypes()[bodyIndex],
- m.getParameterAnnotations()[bodyIndex], headers, connect.getOutputStream());
- } else {
- MultivaluedMap<String, String> form = handleForm(types, params);
- writeBody(form, form.getClass(), form.getClass(), m.getDeclaredAnnotations(),
- headers, connect.getOutputStream());
- }
- }
- Response r = setResponseBuilder(connect).clone().build();
-
- checkResponse(m, r);
- if (m.getReturnType() == Void.class) {
- return null;
+ if (conduitSelector == null) {
+ return doDirectInvocation(uri, headers, ori, params, bodyIndex, types);
+ } else {
+ return doChainedInvocation(uri, headers, ori, params, bodyIndex, types);
}
-
- return readBody(r, connect, m.getReturnType(),
- m.getGenericReturnType(), m.getDeclaredAnnotations());
}
private static MultivaluedMap<ParameterType, Parameter> getParametersInfo(OperationResourceInfo ori,
@@ -187,42 +185,37 @@
}
- private MultivaluedMap<String, String> setRequestHeaders(HttpURLConnection conn,
- MultivaluedMap<String, String> headers,
+ private MultivaluedMap<String, String> setRequestHeaders(MultivaluedMap<String, String> headers,
OperationResourceInfo ori,
boolean formParams,
Class<?> bodyClass,
Class<?> responseClass) {
- try {
- if (headers.getFirst(HttpHeaders.CONTENT_TYPE) == null) {
- if (formParams || bodyClass != null && MultivaluedMap.class.isAssignableFrom(bodyClass)) {
- headers.putSingle(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED);
- } else {
- String cType =
- bodyClass != null && InjectionUtils.isPrimitive(bodyClass)
- ? MediaType.TEXT_PLAIN : ori.getConsumeTypes().isEmpty()
- || ori.getConsumeTypes().get(0).equals(WILDCARD)
- ? MediaType.APPLICATION_XML : ori.getConsumeTypes().get(0).toString();
- headers.putSingle(HttpHeaders.CONTENT_TYPE, cType);
- }
- }
-
- List<MediaType> accepts = getAccept();
- if (accepts == null) {
- accepts = InjectionUtils.isPrimitive(responseClass)
- ? Collections.singletonList(MediaType.TEXT_PLAIN_TYPE)
- : ori.getProduceTypes().size() == 0
+ if (headers.getFirst(HttpHeaders.CONTENT_TYPE) == null) {
+ if (formParams || bodyClass != null && MultivaluedMap.class.isAssignableFrom(bodyClass)) {
+ headers.putSingle(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED);
+ } else {
+ String cType =
+ bodyClass != null && InjectionUtils.isPrimitive(bodyClass)
+ ? MediaType.TEXT_PLAIN : ori.getConsumeTypes().isEmpty()
|| ori.getConsumeTypes().get(0).equals(WILDCARD)
- ? Collections.singletonList(MediaType.APPLICATION_XML_TYPE) : ori.getProduceTypes();
- for (MediaType mt : accepts) {
- headers.add(HttpHeaders.ACCEPT, mt.toString());
- }
+ ? MediaType.APPLICATION_XML : ori.getConsumeTypes().get(0).toString();
+ headers.putSingle(HttpHeaders.CONTENT_TYPE, cType);
}
- setAllHeaders(headers, conn);
+ }
- } catch (Exception ex) {
- throw new WebApplicationException();
+
+ List<MediaType> accepts = getAccept();
+ if (accepts == null) {
+ accepts = InjectionUtils.isPrimitive(responseClass)
+ ? Collections.singletonList(MediaType.TEXT_PLAIN_TYPE)
+ : ori.getProduceTypes().size() == 0
+ || ori.getConsumeTypes().get(0).equals(WILDCARD)
+ ? Collections.singletonList(MediaType.APPLICATION_XML_TYPE) : ori.getProduceTypes();
+ for (MediaType mt : accepts) {
+ headers.add(HttpHeaders.ACCEPT, mt.toString());
+ }
}
+
return headers;
}
@@ -340,6 +333,71 @@
}
+ protected Object doDirectInvocation(URI uri, MultivaluedMap<String, String> headers,
+ OperationResourceInfo ori, Object[] params, int bodyIndex,
+ MultivaluedMap<ParameterType, Parameter> types) throws Throwable {
+
+ // TODO : we need to refactor bits of HTTPConduit such that it can be reused
+
+ HttpURLConnection connect = createHttpConnection(uri, ori.getHttpMethod());
+ setAllHeaders(headers, connect);
+ Method m = ori.getMethodToInvoke();
+ if (bodyIndex != -1 || types.containsKey(ParameterType.FORM)) {
+ if (bodyIndex != -1) {
+ writeBody(params[bodyIndex], params[bodyIndex].getClass(),
+ m.getGenericParameterTypes()[bodyIndex],
+ m.getParameterAnnotations()[bodyIndex], headers, connect.getOutputStream());
+ } else {
+ MultivaluedMap<String, String> form = handleForm(types, params);
+ writeBody(form, form.getClass(), form.getClass(), m.getDeclaredAnnotations(),
+ headers, connect.getOutputStream());
+ }
+ }
+
+ return handleResponse(connect, ori);
+
+ }
+
+ private Object doChainedInvocation(URI uri, MultivaluedMap<String, String> headers,
+ OperationResourceInfo ori, Object[] params, int bodyIndex,
+ MultivaluedMap<ParameterType, Parameter> types) throws Throwable {
+ Message m = createMessage(ori.getHttpMethod(), headers, uri.toString(), this);
+
+ if (bodyIndex != -1 || types.containsKey(ParameterType.FORM)) {
+ m.setContent(OperationResourceInfo.class, ori);
+ m.put("BODY_INDEX", bodyIndex);
+ Object body = bodyIndex != -1 ? params[bodyIndex] : handleForm(types, params);
+ MessageContentsList contents = new MessageContentsList(new Object[]{body});
+ m.setContent(List.class, contents);
+ m.getInterceptorChain().add(new BodyWriter());
+ }
+
+ // execute chain
+ try {
+ m.getInterceptorChain().doIntercept(m);
+ } catch (Throwable ex) {
+ // we'd like a user to get the whole Response anyway if needed
+ }
+
+ // TODO : this needs to be done in an inbound chain instead
+ HttpURLConnection connect = (HttpURLConnection)m.get(HTTPConduit.KEY_HTTP_CONNECTION);
+
+ return handleResponse(connect, ori);
+
+ }
+
+ protected Object handleResponse(HttpURLConnection connect, OperationResourceInfo ori)
+ throws Throwable {
+ Response r = setResponseBuilder(connect).clone().build();
+ Method method = ori.getMethodToInvoke();
+ checkResponse(method, r);
+ if (method.getReturnType() == Void.class) {
+ return null;
+ }
+
+ return readBody(r, connect, method.getReturnType(),
+ method.getGenericReturnType(), method.getDeclaredAnnotations());
+ }
private static class Parameter {
private ParameterType type;
@@ -370,4 +428,53 @@
return isEncoded;
}
}
+
+ public void onMessage(Message message) {
+ // just do nothing for now
+ }
+
+ // TODO : what we really need to do is to refactor JAXRSOutInterceptor so that
+ // it can handle both client requests and server responses - it may need to be split into
+ // several interceptors - in fact we need to do the same for JAXRSInInterceptor so that we can do
+ // on onMessage() properly
+
+ private class BodyWriter extends AbstractOutDatabindingInterceptor {
+
+ public BodyWriter() {
+ super(Phase.WRITE);
+ }
+
+ @SuppressWarnings("unchecked")
+ public void handleMessage(Message m) throws Fault {
+
+ OperationResourceInfo ori = m.getContent(OperationResourceInfo.class);
+ OutputStream os = m.getContent(OutputStream.class);
+ if (os == null || ori == null) {
+ return;
+ }
+ MessageContentsList objs = MessageContentsList.getContentsList(m);
+ if (objs == null || objs.size() == 0) {
+ return;
+ }
+ MultivaluedMap<String, String> headers = (MultivaluedMap)m.get(Message.PROTOCOL_HEADERS);
+ Method method = ori.getMethodToInvoke();
+ int bodyIndex = (Integer)m.get("BODY_INDEX");
+ Object body = objs.get(0);
+ try {
+ if (bodyIndex != -1) {
+ writeBody(body, body.getClass(),
+ method.getGenericParameterTypes()[bodyIndex],
+ method.getParameterAnnotations()[bodyIndex], headers, os);
+ } else {
+ writeBody(body, body.getClass(), body.getClass(), method.getDeclaredAnnotations(),
+ headers, os);
+ }
+ os.flush();
+ } catch (Exception ex) {
+ throw new Fault(ex);
+ }
+
+ }
+
+ }
}
Modified: cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/JAXRSClientFactory.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/JAXRSClientFactory.java?rev=755684&r1=755683&r2=755684&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/JAXRSClientFactory.java (original)
+++ cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/JAXRSClientFactory.java Wed Mar 18 18:17:33 2009
@@ -18,6 +18,7 @@
*/
package org.apache.cxf.jaxrs.client;
+import java.lang.reflect.InvocationHandler;
import java.net.URI;
import javax.ws.rs.Path;
@@ -39,13 +40,47 @@
}
public static <T> T create(URI baseURI, Class<T> cls) {
- return create(baseURI, baseURI, cls, true, false);
+ return create(baseURI, cls, false);
}
public static <T> T create(URI baseURI, Class<T> cls, boolean inheritHeaders) {
- return create(baseURI, baseURI, cls, true, inheritHeaders);
+
+ return create(baseURI, cls, inheritHeaders, false);
+ }
+
+ /**
+ * Creates a proxy
+ * @param baseURI baseURI
+ * @param cls proxy class, if not interface then a CGLIB proxy will be created
+ * @param direct if true then no bus and chains will be created
+ * @return typed proxy
+ */
+ public static <T> T create(URI baseURI, Class<T> cls, boolean inheritHeaders, boolean direct) {
+
+ if (!direct) {
+ JAXRSClientFactoryBean bean = new JAXRSClientFactoryBean();
+ bean.setAddress(baseURI.toString());
+ bean.setResourceClass(cls);
+ bean.setInheritHeaders(inheritHeaders);
+ return bean.create(cls);
+ } else {
+ boolean isRoot = AnnotationUtils.getClassAnnotation(cls, Path.class) != null;
+ ClassResourceInfo cri = ResourceUtils.createClassResourceInfo(cls, cls, isRoot, true);
+
+ return cls.cast(ProxyHelper.getProxy(cls.getClassLoader(),
+ new Class[]{cls, Client.class},
+ new ClientProxyImpl(baseURI, baseURI, cri, inheritHeaders)));
+ }
}
+ /**
+ * Creates a proxy
+ * @param baseAddress baseAddress
+ * @param cls proxy class, if not interface then a CGLIB proxy will be created
+ * @param contentType JAXRS MediaType representing HTTP Content-Type header, can be null
+ * @param acceptTypes JAXRS MediaTypes representing HTTP Accept header, can be null
+ * @return typed proxy
+ */
public static <T> T create(String baseAddress, Class<T> cls, MediaType contentType,
MediaType... acceptTypes) {
T proxy = create(baseAddress, cls);
@@ -54,26 +89,36 @@
}
public static <T> T fromClient(Client client, Class<T> cls) {
+ if (cls.isAssignableFrom(client.getClass())) {
+ return cls.cast(client);
+ }
return fromClient(client, cls, false);
}
public static <T> T fromClient(Client client, Class<T> cls, boolean inheritHeaders) {
- if (client.getClass().isAssignableFrom(cls)) {
- return cls.cast(client);
- }
- T proxy = create(client.getCurrentURI(), client.getCurrentURI(), cls,
- AnnotationUtils.getClassAnnotation(cls, Path.class) != null, inheritHeaders);
+ return fromClient(client, cls, inheritHeaders, false);
+ }
+
+ /**
+ * Creates a proxy, baseURI will be set to Client currentURI
+ * @param client Client instance
+ * @param cls proxy class, if not interface then a CGLIB proxy will be created
+ * @param inheritHeaders if existing Client headers can be inherited by new proxy
+ * and subresource proxies if any
+ * @return typed proxy
+ */
+ public static <T> T fromClient(Client client, Class<T> cls, boolean inheritHeaders, boolean direct) {
+
+ T proxy = create(client.getCurrentURI(), cls, inheritHeaders, direct);
if (inheritHeaders) {
WebClient.client(proxy).headers(client.getHeaders());
}
return proxy;
}
- static <T> T create(URI baseURI, URI currentURI, Class<T> cls, boolean root, boolean inheritHeaders) {
- ClassResourceInfo classResourceInfo = ResourceUtils.createClassResourceInfo(cls, cls, root, true);
+ static <T> T create(Class<T> cls, InvocationHandler handler) {
return cls.cast(ProxyHelper.getProxy(cls.getClassLoader(),
- new Class[]{cls, Client.class},
- new ClientProxyImpl(baseURI, currentURI, classResourceInfo, inheritHeaders)));
+ new Class[]{cls, Client.class}, handler));
}
}
Modified: cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java?rev=755684&r1=755683&r2=755684&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java (original)
+++ cxf/branches/2.1.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java Wed Mar 18 18:17:33 2009
@@ -20,6 +20,7 @@
import java.io.IOException;
import java.io.InputStream;
+import java.io.OutputStream;
import java.lang.annotation.Annotation;
import java.net.HttpURLConnection;
import java.net.URI;
@@ -37,13 +38,20 @@
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
+import org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor;
+import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.jaxrs.ext.form.Form;
import org.apache.cxf.jaxrs.utils.HttpUtils;
import org.apache.cxf.jaxrs.utils.JAXRSUtils;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.message.MessageContentsList;
+import org.apache.cxf.phase.Phase;
+import org.apache.cxf.transport.MessageObserver;
+import org.apache.cxf.transport.http.HTTPConduit;
-public class WebClient extends AbstractClient {
+public class WebClient extends AbstractClient implements MessageObserver {
public WebClient(String baseAddress) {
this(URI.create(baseAddress));
@@ -65,42 +73,6 @@
return doInvoke(httpMethod, body, InputStream.class);
}
- private Response doInvoke(String httpMethod, Object body, Class<?> responseClass) {
- HttpURLConnection conn = getConnection(httpMethod);
-
- MultivaluedMap<String, String> headers = getHeaders();
- if (body != null) {
- if (headers.getFirst(HttpHeaders.CONTENT_TYPE) == null) {
- headers.putSingle(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_XML_TYPE.toString());
- }
- } else {
- headers.putSingle(HttpHeaders.CONTENT_TYPE, MediaType.MEDIA_TYPE_WILDCARD);
- }
- if (responseClass != null && headers.getFirst(HttpHeaders.ACCEPT) == null) {
- headers.putSingle(HttpHeaders.ACCEPT, MediaType.APPLICATION_XML_TYPE.toString());
- }
- setAllHeaders(headers, conn);
- if (body != null) {
- try {
- writeBody(body, body.getClass(), body.getClass(),
- new Annotation[]{}, headers, conn.getOutputStream());
- } catch (IOException ex) {
- throw new WebApplicationException(ex);
- }
- }
- try {
- ResponseBuilder rb = setResponseBuilder(conn).clone();
- Response currentResponse = rb.clone().build();
- Object entity = readBody(currentResponse, conn, responseClass, responseClass,
- new Annotation[]{});
- rb.entity(entity);
-
- return rb.build();
- } catch (IOException ex) {
- throw new WebApplicationException(ex);
- }
- }
-
public Response post(Object o) {
return invoke("POST", o);
}
@@ -202,6 +174,13 @@
return this;
}
+ public static WebClient createClient(String baseAddress) {
+ JAXRSClientFactoryBean bean = new JAXRSClientFactoryBean();
+ bean.setAddress(baseAddress);
+ return bean.createWebClient();
+ }
+
+
@Override
public WebClient type(MediaType ct) {
return (WebClient)super.type(ct);
@@ -272,6 +251,74 @@
return (WebClient)super.reset();
}
+ private Response doInvoke(String httpMethod, Object body, Class<?> responseClass) {
+
+ MultivaluedMap<String, String> headers = getHeaders();
+ if (body != null && headers.getFirst(HttpHeaders.CONTENT_TYPE) == null) {
+ headers.putSingle(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_XML_TYPE.toString());
+ }
+ if (responseClass != null && headers.getFirst(HttpHeaders.ACCEPT) == null) {
+ headers.putSingle(HttpHeaders.ACCEPT, MediaType.APPLICATION_XML_TYPE.toString());
+ }
+ if (conduitSelector == null) {
+ return doDirectInvocation(httpMethod, headers, body, responseClass);
+ } else {
+ return doChainedInvocation(httpMethod, headers, body, responseClass);
+ }
+ }
+
+ protected Response doDirectInvocation(String httpMethod,
+ MultivaluedMap<String, String> headers, Object body, Class<?> responseClass) {
+
+ HttpURLConnection conn = getConnection(httpMethod);
+
+ setAllHeaders(headers, conn);
+ if (body != null) {
+ try {
+ writeBody(body, body.getClass(), body.getClass(),
+ new Annotation[]{}, headers, conn.getOutputStream());
+ } catch (IOException ex) {
+ throw new WebApplicationException(ex);
+ }
+ }
+ return handleResponse(conn, responseClass);
+ }
+
+ protected Response doChainedInvocation(String httpMethod,
+ MultivaluedMap<String, String> headers, Object body, Class<?> responseClass) {
+
+ Message m = createMessage(httpMethod, headers, getCurrentURI().toString(), this);
+
+ if (body != null) {
+ MessageContentsList contents = new MessageContentsList(body);
+ m.setContent(List.class, contents);
+ m.getInterceptorChain().add(new BodyWriter());
+ }
+
+ try {
+ m.getInterceptorChain().doIntercept(m);
+ } catch (Throwable ex) {
+ // we'd like a user to get the whole Response anyway if needed
+ }
+
+ // TODO : this needs to be done in an inbound chain instead
+ HttpURLConnection connect = (HttpURLConnection)m.get(HTTPConduit.KEY_HTTP_CONNECTION);
+ return handleResponse(connect, responseClass);
+ }
+
+ protected Response handleResponse(HttpURLConnection conn, Class<?> responseClass) {
+ try {
+ ResponseBuilder rb = setResponseBuilder(conn).clone();
+ Response currentResponse = rb.clone().build();
+ Object entity = readBody(currentResponse, conn, responseClass, responseClass,
+ new Annotation[]{});
+ rb.entity(entity);
+
+ return rb.build();
+ } catch (Throwable ex) {
+ throw new WebApplicationException(ex);
+ }
+ }
protected HttpURLConnection getConnection(String methodName) {
return createHttpConnection(getCurrentBuilder().clone().build(), methodName);
@@ -281,4 +328,37 @@
return (Client)proxy;
}
+ private class BodyWriter extends AbstractOutDatabindingInterceptor {
+
+ public BodyWriter() {
+ super(Phase.WRITE);
+ }
+
+ @SuppressWarnings("unchecked")
+ public void handleMessage(Message m) throws Fault {
+
+ OutputStream os = m.getContent(OutputStream.class);
+ if (os == null) {
+ return;
+ }
+ MessageContentsList objs = MessageContentsList.getContentsList(m);
+ if (objs == null || objs.size() == 0) {
+ return;
+ }
+ MultivaluedMap<String, String> headers = (MultivaluedMap)m.get(Message.PROTOCOL_HEADERS);
+ Object body = objs.get(0);
+ try {
+ writeBody(body, body.getClass(), body.getClass(), new Annotation[]{}, headers, os);
+ os.flush();
+ } catch (Exception ex) {
+ throw new Fault(ex);
+ }
+
+ }
+
+ }
+
+ public void onMessage(Message message) {
+ // do nothing for now
+ }
}
Modified: cxf/branches/2.1.x-fixes/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java?rev=755684&r1=755683&r2=755684&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java (original)
+++ cxf/branches/2.1.x-fixes/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java Wed Mar 18 18:17:33 2009
@@ -33,6 +33,7 @@
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -76,7 +77,6 @@
import org.apache.cxf.ws.policy.PolicyEngine;
import org.apache.cxf.wsdl.EndpointReferenceUtils;
-
import static org.apache.cxf.message.Message.DECOUPLED_CHANNEL_MESSAGE;
@@ -801,7 +801,7 @@
Map<String, List<String>> headers =
CastUtils.cast((Map<?, ?>)message.get(Message.PROTOCOL_HEADERS));
if (null == headers) {
- headers = new HashMap<String, List<String>>();
+ headers = new LinkedHashMap<String, List<String>>();
message.put(Message.PROTOCOL_HEADERS, headers);
}
return headers;
@@ -813,16 +813,20 @@
* from the PROTOCOL_HEADERS in the message.
*/
private void transferProtocolHeadersToURLConnection(
- Message message,
+ Message message,
URLConnection connection
) {
- Map<String, List<String>> headers =
- getSetProtocolHeaders(message);
+ Map<String, List<String>> headers = getSetProtocolHeaders(message);
for (String header : headers.keySet()) {
List<String> headerList = headers.get(header);
- for (String value : headerList) {
- connection.addRequestProperty(header, value);
+ StringBuilder b = new StringBuilder();
+ for (int i = 0; i < headerList.size(); i++) {
+ b.append(headerList.get(i));
+ if (i + 1 < headerList.size()) {
+ b.append(',');
+ }
}
+ connection.setRequestProperty(header, b.toString());
}
if (!connection.getRequestProperties().containsKey("User-Agent")) {
connection.addRequestProperty("User-Agent", Version.getCompleteVersionString());
@@ -834,14 +838,13 @@
* Message at the specified logging level.
*
* @param level The Logging Level.
- * @param message The Message.
+ * @param headers The Message protocol headers.
*/
private void logProtocolHeaders(
Level level,
Message message
) {
- Map<String, List<String>> headers =
- getSetProtocolHeaders(message);
+ Map<String, List<String>> headers = getSetProtocolHeaders(message);
for (String header : headers.keySet()) {
List<String> headerList = headers.get(header);
for (String value : headerList) {
@@ -1182,7 +1185,7 @@
if (policy.isSetAccept()) {
headers.put("Accept",
createMutableList(policy.getAccept()));
- } else {
+ } else if (!headers.containsKey("Accept")) {
headers.put("Accept", createMutableList("*/*"));
}
if (policy.isSetAcceptEncoding()) {
@@ -1860,7 +1863,7 @@
// Trust is okay, set up for writing the request.
// If this is a GET method we must not touch the output
- // stream as this automagically turns the reqest into a POST.
+ // stream as this automagically turns the request into a POST.
if ("GET".equals(connection.getRequestMethod())) {
return;
}
@@ -2094,9 +2097,8 @@
: connection.getErrorStream()
: in;
- if (in == null) {
- LOG.log(Level.WARNING, "Input Stream is null!");
- }
+ // if (in == null) : it's perfectly ok for non-soap http services
+ // have no response body : those interceptors which do need it will check anyway
inMessage.setContent(InputStream.class, in);
Modified: cxf/branches/2.1.x-fixes/rt/transports/http/src/test/java/org/apache/cxf/transport/http/HTTPConduitURLEasyMockTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/transports/http/src/test/java/org/apache/cxf/transport/http/HTTPConduitURLEasyMockTest.java?rev=755684&r1=755683&r2=755684&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/rt/transports/http/src/test/java/org/apache/cxf/transport/http/HTTPConduitURLEasyMockTest.java (original)
+++ cxf/branches/2.1.x-fixes/rt/transports/http/src/test/java/org/apache/cxf/transport/http/HTTPConduitURLEasyMockTest.java Wed Mar 18 18:17:33 2009
@@ -317,9 +317,14 @@
private void setUpHeaders(Message message) {
Map<String, List<String>> headers = new HashMap<String, List<String>>();
List<String> contentTypes = new ArrayList<String>();
- contentTypes.add("text/xml");
- contentTypes.add("charset=utf8");
+ contentTypes.add("text/xml;charset=utf8");
headers.put("content-type", contentTypes);
+
+ List<String> acceptTypes = new ArrayList<String>();
+ acceptTypes.add("text/xml;charset=utf8");
+ acceptTypes.add("text/plain");
+ headers.put("Accept", acceptTypes);
+
message.put(Message.PROTOCOL_HEADERS, headers);
AuthorizationPolicy authPolicy = new AuthorizationPolicy();
@@ -556,14 +561,14 @@
message.put(HTTPConduit.KEY_HTTP_CONNECTION, connection);
if (expectHeaders) {
- connection.addRequestProperty(EasyMock.eq("Authorization"),
+ connection.setRequestProperty(EasyMock.eq("Authorization"),
EasyMock.eq("Basic Qko6dmFsdWU="));
EasyMock.expectLastCall();
- connection.addRequestProperty(EasyMock.eq("content-type"),
- EasyMock.eq("text/xml"));
+ connection.setRequestProperty(EasyMock.eq("content-type"),
+ EasyMock.eq("text/xml;charset=utf8"));
EasyMock.expectLastCall();
- connection.addRequestProperty(EasyMock.eq("content-type"),
- EasyMock.eq("charset=utf8"));
+ connection.setRequestProperty(EasyMock.eq("Accept"),
+ EasyMock.eq("text/xml;charset=utf8,text/plain"));
EasyMock.expectLastCall();
}
connection.getRequestProperties();
Modified: cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreJaxrsJaxws.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreJaxrsJaxws.java?rev=755684&r1=755683&r2=755684&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreJaxrsJaxws.java (original)
+++ cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreJaxrsJaxws.java Wed Mar 18 18:17:33 2009
@@ -38,6 +38,7 @@
@WebMethod
@GET
@Path("/{id}")
+ @ConsumeMime("*/*")
Book getBook(@PathParam("id") @WebParam(name = "id") Long id) throws BookNotFoundFault;
@WebMethod
Modified: cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java?rev=755684&r1=755683&r2=755684&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java (original)
+++ cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java Wed Mar 18 18:17:33 2009
@@ -45,7 +45,7 @@
@BeforeClass
public static void startServers() throws Exception {
assertTrue("server did not launch correctly",
- launchServer(BookServer.class, true));
+ launchServer(BookServer.class));
}
@Test
Modified: cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java?rev=755684&r1=755683&r2=755684&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java (original)
+++ cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java Wed Mar 18 18:17:33 2009
@@ -100,6 +100,16 @@
}
@Test
+ public void testGetBook123WebClientBean() throws Exception {
+ String baseAddress = "http://localhost:9092/test/services/rest";
+ WebClient client = WebClient.createClient(baseAddress);
+ client.path("/bookstore/123").accept(MediaType.APPLICATION_XML_TYPE);
+ Book b = client.get(Book.class);
+ assertEquals(123, b.getId());
+ assertEquals("CXF in Action", b.getName());
+ }
+
+ @Test
public void testNoBookWebClient() throws Exception {
String baseAddress = "http://localhost:9092/test/services/rest";
WebClient client = new WebClient(baseAddress);
@@ -158,11 +168,30 @@
}
@Test
- public void testGetBookSubresourceWebClientProxy() throws Exception {
+ public void testGetBookSubresourceWebClientProxyDirect() throws Exception {
WebClient client = new WebClient("http://localhost:9092/test/services/rest");
- client.type(MediaType.TEXT_PLAIN_TYPE).accept(MediaType.APPLICATION_XML_TYPE);
- BookStoreJaxrsJaxws proxy = JAXRSClientFactory.fromClient(client, BookStoreJaxrsJaxws.class, true);
+ client.type(MediaType.TEXT_PLAIN_TYPE)
+ .accept(MediaType.APPLICATION_XML_TYPE, MediaType.TEXT_XML_TYPE);
+ BookStoreJaxrsJaxws proxy =
+ JAXRSClientFactory.fromClient(client, BookStoreJaxrsJaxws.class, true, true);
+
+ doTestSubresource(proxy);
+
+ BookStoreJaxrsJaxws proxy2 = JAXRSClientFactory.fromClient(
+ WebClient.client(proxy), BookStoreJaxrsJaxws.class);
+ doTestSubresource(proxy2);
+
+ }
+
+ @Test
+ public void testGetBookSubresourceWebClientProxyBean() throws Exception {
+
+ WebClient client = new WebClient("http://localhost:9092/test/services/rest");
+ client.type(MediaType.TEXT_PLAIN_TYPE)
+ .accept(MediaType.APPLICATION_XML_TYPE, MediaType.TEXT_XML_TYPE);
+ BookStoreJaxrsJaxws proxy =
+ JAXRSClientFactory.fromClient(client, BookStoreJaxrsJaxws.class, true);
doTestSubresource(proxy);