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.