You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by am...@apache.org on 2020/01/16 19:46:48 UTC

[cxf] 02/03: CXF-8188: Code review comments

This is an automated email from the ASF dual-hosted git repository.

amccright pushed a commit to branch 3.3.x-fixes
in repository https://gitbox.apache.org/repos/asf/cxf.git

commit c35124bdfb4950c217f40663650e995abe6aeafe
Author: Andy McCright <j....@gmail.com>
AuthorDate: Mon Jan 13 16:58:22 2020 -0600

    CXF-8188: Code review comments
    
    - Caches BeanManager on the bus
    - Centralizes CDI-accessing mechanism in CDIUtils/CDIFacade
    
    Signed-off-by: Andy McCright <j....@gmail.com>
---
 .../cxf/microprofile/client/cdi/CDIFacade.java     | 48 ++++++++++++++++++++--
 .../client/cdi/CDIInterceptorWrapper.java          | 10 +----
 .../cxf/microprofile/client/cdi/CDIUtils.java      | 29 +++++++++++--
 .../client/proxy/MicroProfileClientProxyImpl.java  | 28 ++++++-------
 4 files changed, 86 insertions(+), 29 deletions(-)

diff --git a/rt/rs/microprofile-client/src/main/java/org/apache/cxf/microprofile/client/cdi/CDIFacade.java b/rt/rs/microprofile-client/src/main/java/org/apache/cxf/microprofile/client/cdi/CDIFacade.java
index c06aaa6..dfa3cbb 100644
--- a/rt/rs/microprofile-client/src/main/java/org/apache/cxf/microprofile/client/cdi/CDIFacade.java
+++ b/rt/rs/microprofile-client/src/main/java/org/apache/cxf/microprofile/client/cdi/CDIFacade.java
@@ -20,18 +20,60 @@
 package org.apache.cxf.microprofile.client.cdi;
 
 import java.util.Optional;
+import java.util.concurrent.Callable;
+
+import org.apache.cxf.Bus;
+
 
 public final class CDIFacade {
 
+    private static final boolean CDI_AVAILABLE;
+
     private CDIFacade() {
     }
 
+    static {
+        boolean b;
+        try {
+            Class.forName("javax.enterprise.inject.spi.BeanManager");
+            b = true;
+        } catch (Throwable t) {
+            b = false;
+        }
+        CDI_AVAILABLE = b;
+    }
+
+    public static Optional<Object> getBeanManager(Bus b) {
+        return nullableOptional(() -> CDIUtils.getCurrentBeanManager(b));
+    }
+
+    public static Optional<Object> getBeanManager() {
+        try {
+            return nullableOptional(() -> CDIUtils.getCurrentBeanManager());
+        } catch (Throwable t) {
+            t.printStackTrace();
+            return Optional.ofNullable(null);
+        }
+    }
+
+    public static <T> Optional<T> getInstanceFromCDI(Class<T> clazz, Bus b) {
+        return nullableOptional(() -> CDIUtils.getInstanceFromCDI(clazz, b));
+    }
+
     public static <T> Optional<T> getInstanceFromCDI(Class<T> clazz) {
+        return nullableOptional(() -> CDIUtils.getInstanceFromCDI(clazz));
+    }
+
+    private static <T> Optional<T> nullableOptional(Callable<T> callable) {
+        if (!CDI_AVAILABLE) {
+            return Optional.ofNullable(null);
+        }
+
         T t;
         try {
-            t = CDIUtils.getInstanceFromCDI(clazz);
-        } catch (ExceptionInInitializerError | NoClassDefFoundError | IllegalStateException ex) {
-            // expected if no MP Config implementation is available
+            t = callable.call();
+        } catch (Throwable ex) {
+            // expected if no CDI implementation is available
             t = null;
         }
         return Optional.ofNullable(t);
diff --git a/rt/rs/microprofile-client/src/main/java/org/apache/cxf/microprofile/client/cdi/CDIInterceptorWrapper.java b/rt/rs/microprofile-client/src/main/java/org/apache/cxf/microprofile/client/cdi/CDIInterceptorWrapper.java
index 320f36b..ae25409 100644
--- a/rt/rs/microprofile-client/src/main/java/org/apache/cxf/microprofile/client/cdi/CDIInterceptorWrapper.java
+++ b/rt/rs/microprofile-client/src/main/java/org/apache/cxf/microprofile/client/cdi/CDIInterceptorWrapper.java
@@ -47,14 +47,8 @@ public interface CDIInterceptorWrapper {
     static CDIInterceptorWrapper createWrapper(Class<?> restClient) {
         try {
             return AccessController.doPrivileged((PrivilegedExceptionAction<CDIInterceptorWrapper>) () -> {
-                Class<?> cdiClass = Class.forName("javax.enterprise.inject.spi.CDI", false,
-                                                  restClient.getClassLoader());
-                Method currentMethod = cdiClass.getMethod("current");
-                Object cdiCurrent = currentMethod.invoke(null);
-
-                Method getBeanMgrMethod = cdiClass.getMethod("getBeanManager");
-
-                return new CDIInterceptorWrapperImpl(restClient, getBeanMgrMethod.invoke(cdiCurrent));
+                Object beanManager = CDIFacade.getBeanManager().orElseThrow(() -> new Exception("CDI not available"));
+                return new CDIInterceptorWrapperImpl(restClient, beanManager);
             });
         } catch (PrivilegedActionException pae) {
             // expected for environments where CDI is not supported
diff --git a/rt/rs/microprofile-client/src/main/java/org/apache/cxf/microprofile/client/cdi/CDIUtils.java b/rt/rs/microprofile-client/src/main/java/org/apache/cxf/microprofile/client/cdi/CDIUtils.java
index 325d01e..733bc83 100644
--- a/rt/rs/microprofile-client/src/main/java/org/apache/cxf/microprofile/client/cdi/CDIUtils.java
+++ b/rt/rs/microprofile-client/src/main/java/org/apache/cxf/microprofile/client/cdi/CDIUtils.java
@@ -26,15 +26,36 @@ import javax.enterprise.inject.spi.Bean;
 import javax.enterprise.inject.spi.BeanManager;
 import javax.enterprise.inject.spi.CDI;
 
+import org.apache.cxf.Bus;
+
+
 public final class CDIUtils {
 
     private CDIUtils() {
     }
 
-    public static <T> T getInstanceFromCDI(Class<T> clazz) {
+    static BeanManager getCurrentBeanManager(Bus bus) {
+        BeanManager bm = bus.getExtension(BeanManager.class);
+        if (bm == null) {
+            bm = getCurrentBeanManager();
+            bus.setExtension(bm, BeanManager.class);
+        }
+        return bm;
+    }
+
+    static BeanManager getCurrentBeanManager() {
+        return CDI.current().getBeanManager();
+    }
+
+
+    static <T> T getInstanceFromCDI(Class<T> clazz) {
+        return getInstanceFromCDI(clazz, null);
+    }
+    
+    static <T> T getInstanceFromCDI(Class<T> clazz, Bus bus) {
         T t;
         try {
-            t = findBean(clazz);
+            t = findBean(clazz, bus);
         } catch (ExceptionInInitializerError | NoClassDefFoundError | IllegalStateException ex) {
             // expected if no CDI implementation is available
             t = null;
@@ -46,8 +67,8 @@ public final class CDIUtils {
     }
 
     @SuppressWarnings("unchecked")
-    private static <T> T findBean(Class<T> clazz) {
-        BeanManager beanManager = CDI.current().getBeanManager();
+    private static <T> T findBean(Class<T> clazz, Bus bus) {
+        BeanManager beanManager = bus == null ? getCurrentBeanManager() : getCurrentBeanManager(bus);
         Bean<?> bean = beanManager.getBeans(clazz).iterator().next();
         CreationalContext<?> ctx = beanManager.createCreationalContext(bean);
         T instance = (T) beanManager.getReference(bean, clazz, ctx);
diff --git a/rt/rs/microprofile-client/src/main/java/org/apache/cxf/microprofile/client/proxy/MicroProfileClientProxyImpl.java b/rt/rs/microprofile-client/src/main/java/org/apache/cxf/microprofile/client/proxy/MicroProfileClientProxyImpl.java
index d8dd35c..b53e34d 100644
--- a/rt/rs/microprofile-client/src/main/java/org/apache/cxf/microprofile/client/proxy/MicroProfileClientProxyImpl.java
+++ b/rt/rs/microprofile-client/src/main/java/org/apache/cxf/microprofile/client/proxy/MicroProfileClientProxyImpl.java
@@ -428,23 +428,23 @@ public class MicroProfileClientProxyImpl extends ClientProxyImpl {
     private void mergeHeaders(Class<ClientHeadersFactory> factoryCls, MultivaluedMap<String, String> existingHeaders) {
 
         try {
-            ClientHeadersFactory factory = CDIFacade.getInstanceFromCDI(factoryCls).orElse(factoryCls.newInstance());
-
-            MultivaluedMap<String, String> jaxrsHeaders;
-            if (JAXRS_UTILS_GET_CURRENT_MESSAGE_METHOD != null) {
-                Message m = (Message) JAXRS_UTILS_GET_CURRENT_MESSAGE_METHOD.invoke(null);
-                if (m != null) {
-                    ProviderInfo<ClientHeadersFactory> pi = clientHeaderFactories.computeIfAbsent(factoryCls, k -> {
-                        return new ProviderInfo<ClientHeadersFactory>(factory, m.getExchange().getBus(), true);
-                    });
-                    InjectionUtils.injectContexts(factory, pi, m);
-                }
-                jaxrsHeaders = getJaxrsHeaders(m);
+            ClientHeadersFactory factory;
+
+            Message m = JAXRS_UTILS_GET_CURRENT_MESSAGE_METHOD == null ? null
+                : (Message) JAXRS_UTILS_GET_CURRENT_MESSAGE_METHOD.invoke(null);
+
+            if (m != null) {
+                factory = CDIFacade.getInstanceFromCDI(factoryCls, m.getExchange().getBus())
+                        .orElse(factoryCls.newInstance());
+                ProviderInfo<ClientHeadersFactory> pi = clientHeaderFactories.computeIfAbsent(factoryCls, k -> {
+                    return new ProviderInfo<ClientHeadersFactory>(factory, m.getExchange().getBus(), true);
+                });
+                InjectionUtils.injectContexts(factory, pi, m);
             } else {
-                jaxrsHeaders = new MultivaluedHashMap<>();
+                factory = CDIFacade.getInstanceFromCDI(factoryCls).orElse(factoryCls.newInstance());
             }
 
-            MultivaluedMap<String, String> updatedHeaders = factory.update(jaxrsHeaders, existingHeaders);
+            MultivaluedMap<String, String> updatedHeaders = factory.update(getJaxrsHeaders(m), existingHeaders);
             existingHeaders.putAll(updatedHeaders);
         } catch (Throwable t) {
             // expected if not running in a JAX-RS server environment.