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 2014/02/05 19:18:56 UTC
svn commit: r1564860 - in /cxf/branches/2.7.x-fixes: ./
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/AbstractResourceInfo.java
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
Author: sergeyb
Date: Wed Feb 5 18:18:55 2014
New Revision: 1564860
URL: http://svn.apache.org/r1564860
Log:
Merged revisions 1564840 via svnmerge from
https://svn.apache.org/repos/asf/cxf/trunk
........
r1564840 | sergeyb | 2014-02-05 17:21:57 +0000 (Wed, 05 Feb 2014) | 1 line
[CXF-5542] Injecting TL contexts immediately, with the optimizations to follow
........
Modified:
cxf/branches/2.7.x-fixes/ (props changed)
cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/AbstractResourceInfo.java
cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
Propchange: cxf/branches/2.7.x-fixes/
------------------------------------------------------------------------------
Merged /cxf/trunk:r1564840
Propchange: cxf/branches/2.7.x-fixes/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.
Modified: cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/AbstractResourceInfo.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/AbstractResourceInfo.java?rev=1564860&r1=1564859&r2=1564860&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/AbstractResourceInfo.java (original)
+++ cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/AbstractResourceInfo.java Wed Feb 5 18:18:55 2014
@@ -79,7 +79,7 @@ public abstract class AbstractResourceIn
}
private void findContexts(Class<?> cls, Object provider) {
findContextFields(cls, provider);
- findContextSetterMethods(cls);
+ findContextSetterMethods(cls, provider);
contextsAvailable = contextFields != null && !contextFields.isEmpty()
|| contextMethods != null && !contextMethods.isEmpty();
}
@@ -122,19 +122,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")
@@ -157,7 +184,7 @@ public abstract class AbstractResourceIn
return getProxyMap(Method.class, SETTER_PROXY_MAP);
}
- private void findContextSetterMethods(Class<?> cls) {
+ private void findContextSetterMethods(Class<?> cls, Object provider) {
for (Method m : cls.getMethods()) {
@@ -166,25 +193,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);
}
}
@@ -195,14 +222,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<Class<?>, Map<Class<?>, Method>>();
}
addToMap(contextMethods, contextClass, m);
if (m.getParameterTypes()[0] != Application.class) {
- addToMap(getSetterProxyMap(), m,
- InjectionUtils.createThreadLocalProxy(m.getParameterTypes()[0]));
+ addToMap(getSetterProxyMap(), m, getMethodThreadLocalProxy(m, provider));
}
}
Modified: cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java?rev=1564860&r1=1564859&r2=1564860&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java (original)
+++ cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java Wed Feb 5 18:18:55 2014
@@ -991,6 +991,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);
}