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/04 16:16:12 UTC

svn commit: r1547820 - in /cxf/trunk: core/src/main/java/org/apache/cxf/interceptor/ core/src/main/java/org/apache/cxf/message/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/ rt/f...

Author: sergeyb
Date: Wed Dec  4 15:16:11 2013
New Revision: 1547820

URL: http://svn.apache.org/r1547820
Log:
Some updates to do with the request state clean-up on the JAX-RS path

Modified:
    cxf/trunk/core/src/main/java/org/apache/cxf/interceptor/ServiceInvokerInterceptor.java
    cxf/trunk/core/src/main/java/org/apache/cxf/message/Message.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSDefaultFaultOutInterceptor.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java

Modified: cxf/trunk/core/src/main/java/org/apache/cxf/interceptor/ServiceInvokerInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/core/src/main/java/org/apache/cxf/interceptor/ServiceInvokerInterceptor.java?rev=1547820&r1=1547819&r2=1547820&view=diff
==============================================================================
--- cxf/trunk/core/src/main/java/org/apache/cxf/interceptor/ServiceInvokerInterceptor.java (original)
+++ cxf/trunk/core/src/main/java/org/apache/cxf/interceptor/ServiceInvokerInterceptor.java Wed Dec  4 15:16:11 2013
@@ -110,13 +110,18 @@ public class ServiceInvokerInterceptor e
                     super.done();
                     if (contextSwitched.get()) {
                         PhaseInterceptorChain.setCurrentMessage(chain, null);
+                        message.remove(Message.THREAD_CONTEXT_SWITCHED);
                     }
                     chain.releaseChain();
                 }
                 
                 @Override
                 public void run() {
-                    contextSwitched.getAndSet(PhaseInterceptorChain.setCurrentMessage(chain, message));
+                    if (PhaseInterceptorChain.setCurrentMessage(chain, message)) {
+                        contextSwitched.set(true);
+                        message.put(Message.THREAD_CONTEXT_SWITCHED, true);
+                    }
+                    
                     synchronized (chain) {
                         super.run();
                     }

Modified: cxf/trunk/core/src/main/java/org/apache/cxf/message/Message.java
URL: http://svn.apache.org/viewvc/cxf/trunk/core/src/main/java/org/apache/cxf/message/Message.java?rev=1547820&r1=1547819&r2=1547820&view=diff
==============================================================================
--- cxf/trunk/core/src/main/java/org/apache/cxf/message/Message.java (original)
+++ cxf/trunk/core/src/main/java/org/apache/cxf/message/Message.java Wed Dec  4 15:16:11 2013
@@ -87,9 +87,11 @@ public interface Message extends StringM
     String PROCESS_ONEWAY_RESPONSE = "org.apache.cxf.transport.processOneWayResponse";
     
     /**
-     * @deprecated use PROCESS_ONEWAY_RESPONSE
+     * Boolean property specifying if the thread which runs a request is 
+     * different to the thread which created this Message.
      */
-    String PROCESS_ONEWAY_REPONSE = PROCESS_ONEWAY_RESPONSE;
+    String THREAD_CONTEXT_SWITCHED = "thread.context.switched";
+    
     
     String ROBUST_ONEWAY = "org.apache.cxf.oneway.robust";
     

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java?rev=1547820&r1=1547819&r2=1547820&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java Wed Dec  4 15:16:11 2013
@@ -91,6 +91,7 @@ public class JAXRSInvoker extends Abstra
         
         ResourceProvider provider = getResourceProvider(exchange);
         Object rootInstance = null;
+        Message inMessage = exchange.getInMessage();
         try {
             rootInstance = getServiceObject(exchange);
             Object serviceObject = getActualServiceObject(exchange, rootInstance);
@@ -101,16 +102,17 @@ public class JAXRSInvoker extends Abstra
             if (responseList != null) {
                 return responseList; 
             }
-            return handleFault(ex, exchange.getInMessage());
+            return handleFault(ex, inMessage);
         } finally {
             boolean suspended = isSuspended(exchange);
-            if (exchange.isOneWay() || suspended) {
-                ServerProviderFactory.getInstance(exchange.getInMessage()).clearThreadLocalProxies();
-            }
-            if (!suspended && !isServiceObjectRequestScope(exchange.getInMessage())) {
-                provider.releaseInstance(exchange.getInMessage(), rootInstance);
-            } else {
+            if (suspended || exchange.isOneWay() || inMessage.get(Message.THREAD_CONTEXT_SWITCHED) != null) {
+                ServerProviderFactory.clearThreadLocalProxies(inMessage);
+            } 
+            if (suspended || isServiceObjectRequestScope(inMessage)) {
                 persistRoots(exchange, rootInstance, provider);
+            } else {
+                provider.releaseInstance(inMessage, rootInstance);
+                exchange.remove(JAXRSUtils.ROOT_INSTANCE);
             }
         }
     }
@@ -333,12 +335,6 @@ public class JAXRSInvoker extends Abstra
         }
         Response excResponse = JAXRSUtils.convertFaultToResponse(ex.getCause(), inMessage);
         if (excResponse == null) {
-            ServerProviderFactory.getInstance(inMessage).clearThreadLocalProxies();
-            ClassResourceInfo criRoot =
-                (ClassResourceInfo)inMessage.getExchange().get(JAXRSUtils.ROOT_RESOURCE_CLASS);
-            if (criRoot != null) {
-                criRoot.clearThreadLocalProxies();
-            }
             inMessage.getExchange().put(Message.PROPOGATE_EXCEPTION, 
                                         JAXRSUtils.propogateException(inMessage));
             throw ex;

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSDefaultFaultOutInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSDefaultFaultOutInterceptor.java?rev=1547820&r1=1547819&r2=1547820&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSDefaultFaultOutInterceptor.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSDefaultFaultOutInterceptor.java Wed Dec  4 15:16:11 2013
@@ -33,6 +33,7 @@ import org.apache.cxf.helpers.NSStack;
 import org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor;
 import org.apache.cxf.interceptor.Fault;
 import org.apache.cxf.interceptor.StaxOutInterceptor;
+import org.apache.cxf.jaxrs.provider.ServerProviderFactory;
 import org.apache.cxf.jaxrs.utils.JAXRSUtils;
 import org.apache.cxf.message.Message;
 import org.apache.cxf.message.MessageContentsList;
@@ -61,6 +62,7 @@ public class JAXRSDefaultFaultOutInterce
             return;
         }
         
+        ServerProviderFactory.releaseRequestState(message);
         if (mustPropogateException(message)) {
             throw f;
         }

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java?rev=1547820&r1=1547819&r2=1547820&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java Wed Dec  4 15:16:11 2013
@@ -70,21 +70,22 @@ public class JAXRSInInterceptor extends 
     }
 
     public void handleMessage(Message message) {
+        final Exchange exchange = message.getExchange(); 
         
-        if (message.getExchange().get(OperationResourceInfo.class) != null) {
-            // it's a suspended invocation;
-            return;
-        }
-        message.getExchange().put(Message.REST_MESSAGE, Boolean.TRUE);
+        exchange.put(Message.REST_MESSAGE, Boolean.TRUE);
         
         try {
             processRequest(message);
+            if (exchange.isOneWay()) {
+                ServerProviderFactory.getInstance(message).clearThreadLocalProxies();
+            }
         } catch (Fault ex) {
             convertExceptionToResponseIfPossible(ex.getCause(), message);
         } catch (RuntimeException ex) {
             convertExceptionToResponseIfPossible(ex, message);
         }
-        Response r = message.getExchange().get(Response.class);
+        
+        Response r = exchange.get(Response.class);
         if (r != null) {
             createOutMessage(message, r);
             message.getInterceptorChain().doInterceptStartingAt(message,

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java?rev=1547820&r1=1547819&r2=1547820&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java Wed Dec  4 15:16:11 2013
@@ -51,8 +51,6 @@ import org.apache.cxf.interceptor.Abstra
 import org.apache.cxf.io.CachedOutputStream;
 import org.apache.cxf.jaxrs.impl.ResponseImpl;
 import org.apache.cxf.jaxrs.impl.WriterInterceptorMBW;
-import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
-import org.apache.cxf.jaxrs.model.ClassResourceInfo;
 import org.apache.cxf.jaxrs.model.OperationResourceInfo;
 import org.apache.cxf.jaxrs.provider.AbstractConfigurableProvider;
 import org.apache.cxf.jaxrs.provider.ServerProviderFactory;
@@ -81,23 +79,7 @@ public class JAXRSOutInterceptor extends
         try {
             processResponse(providerFactory, message);
         } finally {
-            Object rootInstance = message.getExchange().remove(JAXRSUtils.ROOT_INSTANCE);
-            Object rootProvider = message.getExchange().remove(JAXRSUtils.ROOT_PROVIDER);
-            if (rootInstance != null && rootProvider != null) {
-                try {
-                    ((ResourceProvider)rootProvider).releaseInstance(message, rootInstance);
-                } catch (Throwable tex) {
-                    LOG.warning("Exception occurred during releasing the service instance, "
-                                + tex.getMessage());
-                }
-            }
-            providerFactory.clearThreadLocalProxies();
-            ClassResourceInfo cri =
-                (ClassResourceInfo)message.getExchange().get(JAXRSUtils.ROOT_RESOURCE_CLASS);
-            if (cri != null) {
-                cri.clearThreadLocalProxies();
-            }
-            
+            ServerProviderFactory.releaseRequestState(providerFactory, message);
         }
             
 

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java?rev=1547820&r1=1547819&r2=1547820&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java Wed Dec  4 15:16:11 2013
@@ -51,6 +51,7 @@ import org.apache.cxf.jaxrs.impl.Configu
 import org.apache.cxf.jaxrs.impl.RequestPreprocessor;
 import org.apache.cxf.jaxrs.impl.ResourceInfoImpl;
 import org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper;
+import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
 import org.apache.cxf.jaxrs.model.BeanParamInfo;
 import org.apache.cxf.jaxrs.model.ClassResourceInfo;
 import org.apache.cxf.jaxrs.model.FilterProviderInfo;
@@ -58,6 +59,7 @@ import org.apache.cxf.jaxrs.model.Operat
 import org.apache.cxf.jaxrs.model.ProviderInfo;
 import org.apache.cxf.jaxrs.utils.AnnotationUtils;
 import org.apache.cxf.jaxrs.utils.InjectionUtils;
+import org.apache.cxf.jaxrs.utils.JAXRSUtils;
 import org.apache.cxf.message.Message;
 
 public final class ServerProviderFactory extends ProviderFactory {
@@ -462,4 +464,37 @@ public final class ServerProviderFactory
         
     }
     
+    public static void clearThreadLocalProxies(Message message) {
+        clearThreadLocalProxies(ServerProviderFactory.getInstance(message), message);
+    }
+    public static void clearThreadLocalProxies(ServerProviderFactory factory, Message message) {
+        factory.clearThreadLocalProxies();
+        ClassResourceInfo cri =
+            (ClassResourceInfo)message.getExchange().get(JAXRSUtils.ROOT_RESOURCE_CLASS);
+        if (cri != null) {
+            cri.clearThreadLocalProxies();
+        }    
+    }
+    public static void releaseRequestState(Message message) {
+        releaseRequestState(ServerProviderFactory.getInstance(message), message);
+    }
+    public static void releaseRequestState(ServerProviderFactory factory, Message message) {
+        Object rootInstance = message.getExchange().remove(JAXRSUtils.ROOT_INSTANCE);
+        if (rootInstance != null) {
+            Object rootProvider = message.getExchange().remove(JAXRSUtils.ROOT_PROVIDER);
+            if (rootProvider != null) {
+                try {
+                    ((ResourceProvider)rootProvider).releaseInstance(message, rootInstance);
+                } catch (Throwable tex) {
+                    // ignore
+                }
+            }
+        }
+        
+        clearThreadLocalProxies(factory, message);
+    }
+    
+    
+    
+    
 }