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);