Return-Path: X-Original-To: apmail-cxf-commits-archive@www.apache.org Delivered-To: apmail-cxf-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 1F9F1104C2 for ; Wed, 4 Dec 2013 15:16:45 +0000 (UTC) Received: (qmail 98276 invoked by uid 500); 4 Dec 2013 15:16:44 -0000 Delivered-To: apmail-cxf-commits-archive@cxf.apache.org Received: (qmail 98156 invoked by uid 500); 4 Dec 2013 15:16:39 -0000 Mailing-List: contact commits-help@cxf.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cxf.apache.org Delivered-To: mailing list commits@cxf.apache.org Received: (qmail 98149 invoked by uid 99); 4 Dec 2013 15:16:38 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 04 Dec 2013 15:16:38 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 04 Dec 2013 15:16:33 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 5BC2623889ED; Wed, 4 Dec 2013 15:16:12 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: 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... Date: Wed, 04 Dec 2013 15:16:12 -0000 To: commits@cxf.apache.org From: sergeyb@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20131204151612.5BC2623889ED@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org 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); + } + + + + }