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 CEDE210AA8 for ; Wed, 5 Feb 2014 17:22:25 +0000 (UTC) Received: (qmail 33233 invoked by uid 500); 5 Feb 2014 17:22:24 -0000 Delivered-To: apmail-cxf-commits-archive@cxf.apache.org Received: (qmail 33140 invoked by uid 500); 5 Feb 2014 17:22:23 -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 33133 invoked by uid 99); 5 Feb 2014 17:22:23 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 05 Feb 2014 17:22:23 +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, 05 Feb 2014 17:22:17 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id C83AE23888FE; Wed, 5 Feb 2014 17:21:57 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1564840 - in /cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs: model/AbstractResourceInfo.java utils/InjectionUtils.java Date: Wed, 05 Feb 2014 17:21:57 -0000 To: commits@cxf.apache.org From: sergeyb@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20140205172157.C83AE23888FE@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: sergeyb Date: Wed Feb 5 17:21:57 2014 New Revision: 1564840 URL: http://svn.apache.org/r1564840 Log: [CXF-5542] Injecting TL contexts immediately, with the optimizations to follow Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/AbstractResourceInfo.java cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/AbstractResourceInfo.java URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/AbstractResourceInfo.java?rev=1564840&r1=1564839&r2=1564840&view=diff ============================================================================== --- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/AbstractResourceInfo.java (original) +++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/AbstractResourceInfo.java Wed Feb 5 17:21:57 2014 @@ -80,7 +80,7 @@ public abstract class AbstractResourceIn private void findContexts(Class cls, Object provider, Map, ThreadLocalProxy> constructorProxies) { findContextFields(cls, provider); - findContextSetterMethods(cls); + findContextSetterMethods(cls, provider); if (constructorProxies != null) { Map, Map, ThreadLocalProxy>> proxies = getConstructorProxyMap(true); proxies.put(serviceClass, constructorProxies); @@ -130,19 +130,46 @@ public abstract class AbstractResourceIn } private static ThreadLocalProxy getFieldThreadLocalProxy(Field f, Object provider) { + ThreadLocalProxy defaultValue = InjectionUtils.createThreadLocalProxy(f.getType()); if (provider != null) { + Object proxy = null; synchronized (provider) { try { - Object proxy = InjectionUtils.extractFieldValue(f, provider); - if (proxy instanceof ThreadLocalProxy) { - return (ThreadLocalProxy)proxy; - } + proxy = InjectionUtils.extractFieldValue(f, provider); } catch (Throwable t) { // continue } + if (!(proxy instanceof ThreadLocalProxy)) { + proxy = defaultValue; + InjectionUtils.injectFieldValue(f, provider, proxy); + } } + return (ThreadLocalProxy)proxy; + } else { + return defaultValue; + } + } + + private static ThreadLocalProxy getMethodThreadLocalProxy(Method m, Object provider) { + ThreadLocalProxy defaultValue = InjectionUtils.createThreadLocalProxy(m.getParameterTypes()[0]); + if (provider != null) { + Object proxy = null; + synchronized (provider) { + try { + Method getter = m.getClass().getMethod("get" + m.getName().substring(3), new Class[]{}); + proxy = InjectionUtils.extractFromMethod(provider, getter); + } catch (Throwable t) { + // continue + } + if (!(proxy instanceof ThreadLocalProxy)) { + proxy = defaultValue; + InjectionUtils.injectThroughMethod(provider, m, proxy); + } + } + return (ThreadLocalProxy)proxy; + } else { + return defaultValue; } - return InjectionUtils.createThreadLocalProxy(f.getType()); } @SuppressWarnings("unchecked") @@ -185,7 +212,7 @@ public abstract class AbstractResourceIn return getProxyMap(Method.class, SETTER_PROXY_MAP, create); } - private void findContextSetterMethods(Class cls) { + private void findContextSetterMethods(Class cls, Object provider) { for (Method m : cls.getMethods()) { @@ -194,25 +221,25 @@ public abstract class AbstractResourceIn } for (Annotation a : m.getAnnotations()) { if (a.annotationType() == Context.class) { - checkContextMethod(m); + checkContextMethod(m, provider); break; } } } Class[] interfaces = cls.getInterfaces(); for (Class i : interfaces) { - findContextSetterMethods(i); + findContextSetterMethods(i, provider); } Class superCls = cls.getSuperclass(); if (superCls != null && superCls != Object.class) { - findContextSetterMethods(superCls); + findContextSetterMethods(superCls, provider); } } - private void checkContextMethod(Method m) { + private void checkContextMethod(Method m, Object provider) { Class type = m.getParameterTypes()[0]; if (m.getName().equals("set" + type.getSimpleName())) { - addContextMethod(type, m); + addContextMethod(type, m, provider); } } @@ -223,14 +250,13 @@ public abstract class AbstractResourceIn : Collections.unmodifiableMap(methods); } - private void addContextMethod(Class contextClass, Method m) { + private void addContextMethod(Class contextClass, Method m, Object provider) { if (contextMethods == null) { contextMethods = new HashMap, Map, Method>>(); } addToMap(contextMethods, contextClass, m); if (m.getParameterTypes()[0] != Application.class) { - addToMap(getSetterProxyMap(true), m, - InjectionUtils.createThreadLocalProxy(m.getParameterTypes()[0])); + addToMap(getSetterProxyMap(true), m, getMethodThreadLocalProxy(m, provider)); } } Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java?rev=1564840&r1=1564839&r2=1564840&view=diff ============================================================================== --- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java (original) +++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java Wed Feb 5 17:21:57 2014 @@ -982,6 +982,15 @@ public final class InjectionUtils { Method method = entry.getValue(); Object value = method.getParameterTypes()[0] == Application.class ? app : cri.getContextSetterProxy(method); + try { + synchronized (instance) { + if (value == InjectionUtils.extractFromMethod(instance, method)) { + continue; + } + } + } catch (Throwable t) { + // continue + } InjectionUtils.injectThroughMethod(instance, method, value); }