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 2017/02/15 17:08:25 UTC
cxf git commit: Better support for the value contexts such as
Application or Sse
Repository: cxf
Updated Branches:
refs/heads/master 7dbce543a -> a93cbfd99
Better support for the value contexts such as Application or Sse
Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/a93cbfd9
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/a93cbfd9
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/a93cbfd9
Branch: refs/heads/master
Commit: a93cbfd994c34000f27911c5aab6638b60d61ff7
Parents: 7dbce54
Author: Sergey Beryozkin <sb...@gmail.com>
Authored: Wed Feb 15 17:08:00 2017 +0000
Committer: Sergey Beryozkin <sb...@gmail.com>
Committed: Wed Feb 15 17:08:00 2017 +0000
----------------------------------------------------------------------
.../cxf/jaxrs/JAXRSServerFactoryBean.java | 9 +--
.../cxf/jaxrs/model/AbstractResourceInfo.java | 38 ++----------
.../cxf/jaxrs/model/ClassResourceInfo.java | 2 +-
.../cxf/jaxrs/provider/ProviderFactory.java | 2 +-
.../apache/cxf/jaxrs/utils/InjectionUtils.java | 63 +++++++++++++++++---
.../apache/cxf/jaxrs/utils/ResourceUtils.java | 2 +-
6 files changed, 70 insertions(+), 46 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cxf/blob/a93cbfd9/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServerFactoryBean.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServerFactoryBean.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServerFactoryBean.java
index 8a424bf..8c753f0 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServerFactoryBean.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServerFactoryBean.java
@@ -180,6 +180,7 @@ public class JAXRSServerFactoryBean extends AbstractJAXRSFactoryBean {
}
ServerProviderFactory factory = setupFactory(ep);
+ injectContexts(factory);
ep.put(Application.class.getName(), appProvider);
factory.setRequestPreprocessor(
new RequestPreprocessor(languageMappings, extensionMappings));
@@ -407,18 +408,19 @@ public class JAXRSServerFactoryBean extends AbstractJAXRSFactoryBean {
this.start = start;
}
- protected void injectContexts() {
+ protected void injectContexts(ServerProviderFactory factory) {
Application application = appProvider == null ? null : appProvider.getProvider();
for (ClassResourceInfo cri : serviceFactory.getClassResourceInfo()) {
if (cri.isSingleton()) {
InjectionUtils.injectContextProxiesAndApplication(cri,
cri.getResourceProvider().getInstance(null),
- application);
+ application,
+ factory);
}
}
if (application != null) {
InjectionUtils.injectContextProxiesAndApplication(appProvider,
- application, null);
+ application, null, null);
}
}
@@ -435,7 +437,6 @@ public class JAXRSServerFactoryBean extends AbstractJAXRSFactoryBean {
setDefaultResourceProvider(cri);
}
}
- injectContexts();
}
protected void setDefaultResourceProvider(ClassResourceInfo cri) {
http://git-wip-us.apache.org/repos/asf/cxf/blob/a93cbfd9/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/AbstractResourceInfo.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/AbstractResourceInfo.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/AbstractResourceInfo.java
index 4df11b8..67fbb3f 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/AbstractResourceInfo.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/AbstractResourceInfo.java
@@ -25,21 +25,13 @@ import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.List;
import java.util.Map;
-import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Logger;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Context;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.Request;
-import javax.ws.rs.core.SecurityContext;
-import javax.ws.rs.core.UriInfo;
-import javax.ws.rs.ext.ContextResolver;
-import javax.ws.rs.ext.Providers;
import org.apache.cxf.Bus;
import org.apache.cxf.BusFactory;
@@ -53,25 +45,6 @@ public abstract class AbstractResourceInfo {
private static final String FIELD_PROXY_MAP = "jaxrs-field-proxy-map";
private static final String SETTER_PROXY_MAP = "jaxrs-setter-proxy-map";
- private static final Set<String> STANDARD_CONTEXT_CLASSES = new HashSet<>();
- static {
- // JAX-RS 1.0-1.1
- STANDARD_CONTEXT_CLASSES.add(Application.class.getName());
- STANDARD_CONTEXT_CLASSES.add(UriInfo.class.getName());
- STANDARD_CONTEXT_CLASSES.add(HttpHeaders.class.getName());
- STANDARD_CONTEXT_CLASSES.add(Request.class.getName());
- STANDARD_CONTEXT_CLASSES.add(SecurityContext.class.getName());
- STANDARD_CONTEXT_CLASSES.add(Providers.class.getName());
- STANDARD_CONTEXT_CLASSES.add(ContextResolver.class.getName());
- STANDARD_CONTEXT_CLASSES.add("javax.servlet.http.HttpServletRequest");
- STANDARD_CONTEXT_CLASSES.add("javax.servlet.http.HttpServletResponse");
- STANDARD_CONTEXT_CLASSES.add("javax.servlet.ServletContext");
- // JAX-RS 2.0
- STANDARD_CONTEXT_CLASSES.add("javax.ws.rs.container.ResourceContext");
- STANDARD_CONTEXT_CLASSES.add("javax.ws.rs.container.ResourceInfo");
- STANDARD_CONTEXT_CLASSES.add("javax.ws.rs.core.Configuration");
- }
-
protected boolean root;
protected Class<?> resourceClass;
protected Class<?> serviceClass;
@@ -148,10 +121,11 @@ public abstract class AbstractResourceInfo {
}
for (Field f : cls.getDeclaredFields()) {
for (Annotation a : f.getAnnotations()) {
- if (a.annotationType() == Context.class) {
+ if (a.annotationType() == Context.class
+ && (f.getType().isInterface() || f.getType() == Application.class)) {
contextFields = addContextField(contextFields, f);
- if (f.getType().isInterface()) {
- checkContextClass(f.getType());
+ checkContextClass(f.getType());
+ if (!InjectionUtils.VALUE_CONTEXTS.contains(f.getType().getName())) {
addToMap(getFieldProxyMap(true), f, getFieldThreadLocalProxy(f, provider));
}
}
@@ -277,7 +251,7 @@ public abstract class AbstractResourceInfo {
}
}
private void checkContextClass(Class<?> type) {
- if (!STANDARD_CONTEXT_CLASSES.contains(type.getName())) {
+ if (!InjectionUtils.STANDARD_CONTEXT_CLASSES.contains(type.getName())) {
LOG.fine("Injecting a custom context " + type.getName()
+ ", ContextProvider is required for this type");
}
@@ -295,7 +269,7 @@ public abstract class AbstractResourceInfo {
contextMethods = new HashMap<Class<?>, Map<Class<?>, Method>>();
}
addToMap(contextMethods, contextClass, m);
- if (m.getParameterTypes()[0] != Application.class) {
+ if (!InjectionUtils.VALUE_CONTEXTS.contains(m.getParameterTypes()[0].getName())) {
addToMap(getSetterProxyMap(true), m, getMethodThreadLocalProxy(m, provider));
}
}
http://git-wip-us.apache.org/repos/asf/cxf/blob/a93cbfd9/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ClassResourceInfo.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ClassResourceInfo.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ClassResourceInfo.java
index e2b458e..cfda684 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ClassResourceInfo.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ClassResourceInfo.java
@@ -176,7 +176,7 @@ public class ClassResourceInfo extends BeanResourceInfo {
app = (Application)appProvider.getProvider();
}
}
- InjectionUtils.injectContextProxiesAndApplication(cri, instance, app);
+ InjectionUtils.injectContextProxiesAndApplication(cri, instance, app, null);
injectedSubInstances.add(instance.toString());
}
}
http://git-wip-us.apache.org/repos/asf/cxf/blob/a93cbfd9/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
index 30bbea6..dc129b9 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
@@ -647,7 +647,7 @@ public abstract class ProviderFactory {
void injectContextProxiesIntoProvider(ProviderInfo<?> pi, Application app) {
if (pi.contextsAvailable()) {
- InjectionUtils.injectContextProxiesAndApplication(pi, pi.getProvider(), app);
+ InjectionUtils.injectContextProxiesAndApplication(pi, pi.getProvider(), app, this);
injectedProviders.add(pi);
}
}
http://git-wip-us.apache.org/repos/asf/cxf/blob/a93cbfd9/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
index a990c22..a3d918b 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
@@ -75,6 +75,7 @@ import org.apache.cxf.common.util.ProxyClassLoader;
import org.apache.cxf.common.util.ReflectionUtil;
import org.apache.cxf.common.util.StringUtils;
import org.apache.cxf.helpers.CastUtils;
+import org.apache.cxf.jaxrs.ext.ContextProvider;
import org.apache.cxf.jaxrs.ext.MessageContext;
import org.apache.cxf.jaxrs.ext.ProtocolHeaders;
import org.apache.cxf.jaxrs.impl.MetadataMap;
@@ -92,12 +93,38 @@ import org.apache.cxf.jaxrs.impl.tl.ThreadLocalUriInfo;
import org.apache.cxf.jaxrs.model.AbstractResourceInfo;
import org.apache.cxf.jaxrs.model.Parameter;
import org.apache.cxf.jaxrs.model.ParameterType;
+import org.apache.cxf.jaxrs.provider.ProviderFactory;
import org.apache.cxf.jaxrs.provider.ServerProviderFactory;
import org.apache.cxf.message.Exchange;
import org.apache.cxf.message.Message;
import org.apache.cxf.message.MessageUtils;
public final class InjectionUtils {
+ public static final Set<String> STANDARD_CONTEXT_CLASSES = new HashSet<>();
+ public static final Set<String> VALUE_CONTEXTS = new HashSet<>();
+ static {
+ // JAX-RS 1.0-1.1
+ STANDARD_CONTEXT_CLASSES.add(Application.class.getName());
+ STANDARD_CONTEXT_CLASSES.add(UriInfo.class.getName());
+ STANDARD_CONTEXT_CLASSES.add(HttpHeaders.class.getName());
+ STANDARD_CONTEXT_CLASSES.add(Request.class.getName());
+ STANDARD_CONTEXT_CLASSES.add(SecurityContext.class.getName());
+ STANDARD_CONTEXT_CLASSES.add(Providers.class.getName());
+ STANDARD_CONTEXT_CLASSES.add(ContextResolver.class.getName());
+ STANDARD_CONTEXT_CLASSES.add("javax.servlet.http.HttpServletRequest");
+ STANDARD_CONTEXT_CLASSES.add("javax.servlet.http.HttpServletResponse");
+ STANDARD_CONTEXT_CLASSES.add("javax.servlet.ServletContext");
+ // JAX-RS 2.0
+ STANDARD_CONTEXT_CLASSES.add("javax.ws.rs.container.ResourceContext");
+ STANDARD_CONTEXT_CLASSES.add("javax.ws.rs.container.ResourceInfo");
+ STANDARD_CONTEXT_CLASSES.add("javax.ws.rs.core.Configuration");
+ // JAX-RS 2.1
+ STANDARD_CONTEXT_CLASSES.add("javax.ws.rs.sse.Sse");
+ STANDARD_CONTEXT_CLASSES.add("javax.ws.rs.sse.SseEventSink");
+
+ VALUE_CONTEXTS.add(Application.class.getName());
+ VALUE_CONTEXTS.add("javax.ws.rs.sse.Sse");
+ }
private static final Logger LOG = LogUtils.getL7dLogger(InjectionUtils.class);
private static final ResourceBundle BUNDLE = BundleUtils.getBundle(InjectionUtils.class);
@@ -1081,15 +1108,26 @@ public final class InjectionUtils {
public static void injectContextProxiesAndApplication(AbstractResourceInfo cri,
Object instance,
- Application app) {
+ Application app,
+ ProviderFactory factory) {
if (!cri.contextsAvailable() || !cri.isSingleton()) {
return;
}
synchronized (instance) {
for (Map.Entry<Class<?>, Method> entry : cri.getContextMethods().entrySet()) {
Method method = entry.getValue();
- Object value = method.getParameterTypes()[0] == Application.class
- ? app : cri.getContextSetterProxy(method);
+ Object value = null;
+ Class<?> cls = method.getParameterTypes()[0];
+ if (cls == Application.class) {
+ value = app;
+ } else if (VALUE_CONTEXTS.contains(cls.getName()) && factory != null) {
+ ContextProvider<?> p = factory.createContextProvider(cls, null);
+ if (p != null) {
+ value = p.createContext(null);
+ }
+ } else {
+ value = cri.getContextSetterProxy(method);
+ }
try {
if (value == InjectionUtils.extractFromMethod(instance,
getGetterFromSetter(method),
@@ -1104,7 +1142,18 @@ public final class InjectionUtils {
}
for (Field f : cri.getContextFields()) {
- Object value = f.getType() == Application.class ? app : cri.getContextFieldProxy(f);
+ Object value = null;
+ Class<?> cls = f.getType();
+ if (cls == Application.class) {
+ value = app;
+ } else if (VALUE_CONTEXTS.contains(cls.getName()) && factory != null) {
+ ContextProvider<?> p = factory.createContextProvider(cls, null);
+ if (p != null) {
+ value = p.createContext(null);
+ }
+ } else {
+ value = cri.getContextFieldProxy(f);
+ }
try {
if (value == InjectionUtils.extractFieldValue(f, instance)) {
continue;
@@ -1118,7 +1167,7 @@ public final class InjectionUtils {
}
public static void injectContextProxies(AbstractResourceInfo cri, Object instance) {
- injectContextProxiesAndApplication(cri, instance, null);
+ injectContextProxiesAndApplication(cri, instance, null, null);
}
@SuppressWarnings("unchecked")
@@ -1151,7 +1200,7 @@ public final class InjectionUtils {
for (Map.Entry<Class<?>, Method> entry : cri.getContextMethods().entrySet()) {
Method method = entry.getValue();
- if (method.getParameterTypes()[0] == Application.class && cri.isSingleton()) {
+ if (VALUE_CONTEXTS.contains(method.getParameterTypes()[0].getName()) && cri.isSingleton()) {
continue;
}
Object o = JAXRSUtils.createContextValue(message,
@@ -1178,7 +1227,7 @@ public final class InjectionUtils {
Message m) {
for (Field f : cri.getContextFields()) {
- if (f.getType() == Application.class && cri.isSingleton()) {
+ if (VALUE_CONTEXTS.contains(f.getType().getName()) && cri.isSingleton()) {
continue;
}
Object value = JAXRSUtils.createContextValue(m, f.getGenericType(), f.getType());
http://git-wip-us.apache.org/repos/asf/cxf/blob/a93cbfd9/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java
index f41e721..6fffea3 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java
@@ -790,7 +790,7 @@ public final class ResourceUtils {
if (AnnotationUtils.getAnnotation(anns[i], Context.class) != null) {
Object contextValue = contextValues != null ? contextValues.get(params[i]) : null;
if (contextValue == null) {
- if (perRequest) {
+ if (perRequest || InjectionUtils.VALUE_CONTEXTS.contains(params[i].getName())) {
values[i] = JAXRSUtils.createContextValue(m, genericTypes[i], params[i]);
} else {
values[i] = InjectionUtils.createThreadLocalProxy(params[i]);