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 2013/12/17 18:37:01 UTC

svn commit: r1551639 - in /cxf/branches/2.6.x-fixes: ./ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java

Author: sergeyb
Date: Tue Dec 17 17:37:01 2013
New Revision: 1551639

URL: http://svn.apache.org/r1551639
Log:
Merged revisions 1551632 via svnmerge from 
https://svn.apache.org/repos/asf/cxf/branches/2.7.x-fixes

................
  r1551632 | sergeyb | 2013-12-17 17:08:29 +0000 (Tue, 17 Dec 2013) | 9 lines
  
  Merged revisions 1551612 via svnmerge from 
  https://svn.apache.org/repos/asf/cxf/trunk
  
  ........
    r1551612 | sergeyb | 2013-12-17 16:41:06 +0000 (Tue, 17 Dec 2013) | 1 line
    
    [CXF-5423] Setting correct bus and loader before the client invocation
  ........
................

Modified:
    cxf/branches/2.6.x-fixes/   (props changed)
    cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java
    cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java

Propchange: cxf/branches/2.6.x-fixes/
------------------------------------------------------------------------------
  Merged /cxf/branches/2.7.x-fixes:r1551632
  Merged /cxf/trunk:r1551612

Propchange: cxf/branches/2.6.x-fixes/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.

Modified: cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java?rev=1551639&r1=1551638&r2=1551639&view=diff
==============================================================================
--- cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java (original)
+++ cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java Tue Dec 17 17:37:01 2013
@@ -44,6 +44,10 @@ import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriBuilder;
 import javax.xml.stream.XMLStreamWriter;
 
+import org.apache.cxf.Bus;
+import org.apache.cxf.BusFactory;
+import org.apache.cxf.common.classloader.ClassLoaderUtils;
+import org.apache.cxf.common.classloader.ClassLoaderUtils.ClassLoaderHolder;
 import org.apache.cxf.common.i18n.BundleUtils;
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.endpoint.Endpoint;
@@ -504,49 +508,63 @@ public class ClientProxyImpl extends Abs
                                        int bodyIndex,
                                        Exchange exchange,
                                        Map<String, Object> invocationContext) throws Throwable {
-        
-        Message outMessage = createMessage(body, ori.getHttpMethod(), headers, uri, 
-                                           exchange, invocationContext, true);
-        
-        outMessage.getExchange().setOneWay(ori.isOneway());
-        outMessage.setContent(OperationResourceInfo.class, ori);
-        setPlainOperationNameProperty(outMessage, ori.getMethodToInvoke().getName());
-        outMessage.getExchange().put(Method.class, ori.getMethodToInvoke());
-        
-        if (body != null) {
-            outMessage.put("BODY_INDEX", bodyIndex);
-            outMessage.getInterceptorChain().add(new BodyWriter());
-        }
-
-        Map<String, Object> reqContext = getRequestContext(outMessage);
-        reqContext.put(OperationResourceInfo.class.getName(), ori);
-        reqContext.put("BODY_INDEX", bodyIndex);
-        
-        // execute chain    
-        try {
-            outMessage.getInterceptorChain().doIntercept(outMessage);
-        } catch (Exception ex) {
-            outMessage.setContent(Exception.class, ex);
-        }
-        
-        Object[] results = preProcessResult(outMessage);
-        if (results != null && results.length == 1) {
-            // this can happen if a connection exception has occurred and
-            // failover feature used this client to invoke on a different address  
-            return results[0];
-        }
-        
-        Object response = null;
+        Bus configuredBus = getConfiguration().getBus();
+        Bus origBus = BusFactory.getAndSetThreadDefaultBus(configuredBus);
+        ClassLoaderHolder origLoader = null;
         try {
-            response = handleResponse(outMessage, ori.getClassResourceInfo().getServiceClass());
-            return response;
-        } catch (Exception ex) {
-            response = ex;
-            throw ex;
+            ClassLoader loader = configuredBus.getExtension(ClassLoader.class);
+            if (loader != null) {
+                origLoader = ClassLoaderUtils.setThreadContextClassloader(loader);
+            }
+            Message outMessage = createMessage(body, ori.getHttpMethod(), headers, uri, 
+                                               exchange, invocationContext, true);
+            
+            outMessage.getExchange().setOneWay(ori.isOneway());
+            outMessage.setContent(OperationResourceInfo.class, ori);
+            setPlainOperationNameProperty(outMessage, ori.getMethodToInvoke().getName());
+            outMessage.getExchange().put(Method.class, ori.getMethodToInvoke());
+            
+            if (body != null) {
+                outMessage.put("BODY_INDEX", bodyIndex);
+                outMessage.getInterceptorChain().add(new BodyWriter());
+            }
+    
+            Map<String, Object> reqContext = getRequestContext(outMessage);
+            reqContext.put(OperationResourceInfo.class.getName(), ori);
+            reqContext.put("BODY_INDEX", bodyIndex);
+            
+            // execute chain    
+            try {
+                outMessage.getInterceptorChain().doIntercept(outMessage);
+            } catch (Exception ex) {
+                outMessage.setContent(Exception.class, ex);
+            }
+            
+            Object[] results = preProcessResult(outMessage);
+            if (results != null && results.length == 1) {
+                // this can happen if a connection exception has occurred and
+                // failover feature used this client to invoke on a different address  
+                return results[0];
+            }
+            
+            Object response = null;
+            try {
+                response = handleResponse(outMessage, ori.getClassResourceInfo().getServiceClass());
+                return response;
+            } catch (Exception ex) {
+                response = ex;
+                throw ex;
+            } finally {
+                completeExchange(response, outMessage.getExchange(), true);
+            }
         } finally {
-            completeExchange(response, outMessage.getExchange(), true);
+            if (origLoader != null) {
+                origLoader.reset();
+            }
+            if (origBus != configuredBus) {
+                BusFactory.setThreadDefaultBus(origBus);
+            }
         }
-        
     }
     
     @Override

Modified: cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java?rev=1551639&r1=1551638&r2=1551639&view=diff
==============================================================================
--- cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java (original)
+++ cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java Tue Dec 17 17:37:01 2013
@@ -42,7 +42,10 @@ import javax.ws.rs.core.UriBuilder;
 import javax.xml.stream.XMLStreamWriter;
 
 import org.apache.cxf.Bus;
+import org.apache.cxf.BusFactory;
 import org.apache.cxf.bus.spring.SpringBusFactory;
+import org.apache.cxf.common.classloader.ClassLoaderUtils;
+import org.apache.cxf.common.classloader.ClassLoaderUtils.ClassLoaderHolder;
 import org.apache.cxf.feature.AbstractFeature;
 import org.apache.cxf.helpers.CastUtils;
 import org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor;
@@ -820,53 +823,69 @@ public class WebClient extends AbstractC
                                            Exchange exchange,
                                            Map<String, Object> invContext) {
     //CHECKSTYLE:ON    
-        URI uri = getCurrentURI();
-        Message m = createMessage(body, httpMethod, headers, uri, exchange, 
-                invContext, false);
-        
-        Map<String, Object> reqContext = getRequestContext(m);
-        reqContext.put(Message.HTTP_REQUEST_METHOD, httpMethod);
-        reqContext.put(REQUEST_CLASS, requestClass);
-        reqContext.put(REQUEST_TYPE, inGenericType);
-        reqContext.put(RESPONSE_CLASS, responseClass);
-        reqContext.put(RESPONSE_TYPE, outGenericType);
-        
-        if (body != null) {
-            m.getInterceptorChain().add(new BodyWriter());
-        }
-        setPlainOperationNameProperty(m, httpMethod + ":" + uri.toString());
-        
-        try {
-            m.getInterceptorChain().doIntercept(m);
-        } catch (Exception ex) {
-            m.setContent(Exception.class, ex);
-        }
-        try {
-            Object[] results = preProcessResult(m);
-            if (results != null && results.length == 1) {
-                // this can happen if a connection exception has occurred and
-                // failover feature used this client to invoke on a different address  
-                return (Response)results[0];
-            }
-        } catch (Exception ex) {
-            throw ex instanceof ServerWebApplicationException 
-                ? (ServerWebApplicationException)ex 
-                : ex instanceof ClientWebApplicationException 
-                ? new ClientWebApplicationException(ex) : new RuntimeException(ex); 
-        }
-        
-        Response response = null;
-        Object entity = null;
+        Bus configuredBus = getConfiguration().getBus();
+        Bus origBus = BusFactory.getAndSetThreadDefaultBus(configuredBus);
+        ClassLoaderHolder origLoader = null;
         try {
-            response = handleResponse(m, responseClass, outGenericType);
-            entity = response.getEntity();
-            return response;
-        } catch (RuntimeException ex) {
-            entity = ex;
-            throw ex;
+            ClassLoader loader = configuredBus.getExtension(ClassLoader.class);
+            if (loader != null) {
+                origLoader = ClassLoaderUtils.setThreadContextClassloader(loader);
+            }
+            URI uri = getCurrentURI();
+            Message m = createMessage(body, httpMethod, headers, uri, exchange, 
+                    invContext, false);
+            
+            Map<String, Object> reqContext = getRequestContext(m);
+            reqContext.put(Message.HTTP_REQUEST_METHOD, httpMethod);
+            reqContext.put(REQUEST_CLASS, requestClass);
+            reqContext.put(REQUEST_TYPE, inGenericType);
+            reqContext.put(RESPONSE_CLASS, responseClass);
+            reqContext.put(RESPONSE_TYPE, outGenericType);
+            
+            if (body != null) {
+                m.getInterceptorChain().add(new BodyWriter());
+            }
+            setPlainOperationNameProperty(m, httpMethod + ":" + uri.toString());
+            
+            try {
+                m.getInterceptorChain().doIntercept(m);
+            } catch (Exception ex) {
+                m.setContent(Exception.class, ex);
+            }
+            try {
+                Object[] results = preProcessResult(m);
+                if (results != null && results.length == 1) {
+                    // this can happen if a connection exception has occurred and
+                    // failover feature used this client to invoke on a different address  
+                    return (Response)results[0];
+                }
+            } catch (Exception ex) {
+                throw ex instanceof ServerWebApplicationException 
+                    ? (ServerWebApplicationException)ex 
+                    : ex instanceof ClientWebApplicationException 
+                    ? new ClientWebApplicationException(ex) : new RuntimeException(ex); 
+            }
+            
+            Response response = null;
+            Object entity = null;
+            try {
+                response = handleResponse(m, responseClass, outGenericType);
+                entity = response.getEntity();
+                return response;
+            } catch (RuntimeException ex) {
+                entity = ex;
+                throw ex;
+            } finally {
+                completeExchange(entity, m.getExchange(), false);
+            }
         } finally {
-            completeExchange(entity, m.getExchange(), false);
-        }
+            if (origLoader != null) {
+                origLoader.reset();
+            }
+            if (origBus != configuredBus) {
+                BusFactory.setThreadDefaultBus(origBus);
+            }
+        }    
     }
     
     protected Response handleResponse(Message outMessage, Class<?> responseClass, Type genericType) {