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]);