This is an automated email from the ASF dual-hosted git repository. amccright pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/cxf.git
commit 5610170d93c5a9b7ae267cc78e6c22d34d4537c7 Author: Andy McCright <[email protected]> AuthorDate: Wed Oct 10 17:01:02 2018 -0500 Issue 7868: Ensure providers registered via MP Config are honored --- .../microprofile/client/cdi/RestClientBean.java | 50 +++++++++++++++++++++- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/rt/rs/microprofile-client/src/main/java/org/apache/cxf/microprofile/client/cdi/RestClientBean.java b/rt/rs/microprofile-client/src/main/java/org/apache/cxf/microprofile/client/cdi/RestClientBean.java index d9f47e9..9386930 100644 --- a/rt/rs/microprofile-client/src/main/java/org/apache/cxf/microprofile/client/cdi/RestClientBean.java +++ b/rt/rs/microprofile-client/src/main/java/org/apache/cxf/microprofile/client/cdi/RestClientBean.java @@ -24,10 +24,14 @@ import java.net.URI; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.NoSuchElementException; import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; import javax.enterprise.context.Dependent; import javax.enterprise.context.spi.CreationalContext; @@ -37,16 +41,22 @@ import javax.enterprise.inject.spi.BeanManager; import javax.enterprise.inject.spi.InjectionPoint; import javax.enterprise.inject.spi.PassivationCapable; import javax.enterprise.util.AnnotationLiteral; +import javax.ws.rs.Priorities; import org.apache.cxf.common.classloader.ClassLoaderUtils; +import org.apache.cxf.common.logging.LogUtils; import org.apache.cxf.microprofile.client.CxfTypeSafeClientBuilder; import org.apache.cxf.microprofile.client.config.ConfigFacade; +import org.eclipse.microprofile.rest.client.RestClientBuilder; import org.eclipse.microprofile.rest.client.inject.RestClient; public class RestClientBean implements Bean<Object>, PassivationCapable { + private static final Logger LOG = LogUtils.getL7dLogger(RestClientBean.class); public static final String REST_URL_FORMAT = "%s/mp-rest/url"; public static final String REST_URI_FORMAT = "%s/mp-rest/uri"; public static final String REST_SCOPE_FORMAT = "%s/mp-rest/scope"; + public static final String REST_PROVIDERS_FORMAT = "%s/mp-rest/providers"; + public static final String REST_PROVIDERS_PRIORITY_FORMAT = "%s/mp-rest/providers/%s/priority"; private static final Default DEFAULT_LITERAL = new DefaultLiteral(); private final Class<?> clientInterface; private final Class<? extends Annotation> scope; @@ -79,9 +89,16 @@ public class RestClientBean implements Bean<Object>, PassivationCapable { @Override public Object create(CreationalContext<Object> creationalContext) { - CxfTypeSafeClientBuilder builder = new CxfTypeSafeClientBuilder(); + RestClientBuilder builder = new CxfTypeSafeClientBuilder(); String baseUri = getBaseUri(); - return builder.baseUri(URI.create(baseUri)).build(clientInterface); + builder = builder.baseUri(URI.create(baseUri)); + List<Class<?>> providers = getConfiguredProviders(); + Map<Class<?>,Integer> providerPriorities = getConfiguredProviderPriorities(providers); + for (Class<?> providerClass : providers){ + builder = builder.register(providerClass, + providerPriorities.getOrDefault(providerClass, Priorities.USER)); + } + return builder.build(clientInterface); } @Override @@ -168,6 +185,35 @@ public class RestClientBean implements Bean<Object>, PassivationCapable { } } + private List<Class<?>> getConfiguredProviders() { + String property = String.format(REST_PROVIDERS_FORMAT, clientInterface.getName()); + String providersList = ConfigFacade.getOptionalValue(property, String.class).orElse(""); + String[] providerClassNames = providersList.split(","); + List<Class<?>> providers = new ArrayList<>(); + for (int i=0; i<providerClassNames.length; i++) { + try { + providers.add(ClassLoaderUtils.loadClass(providerClassNames[i], RestClientBean.class)); + } catch (ClassNotFoundException e) { + LOG.log(Level.WARNING, + "Could not load provider, {0}, configured for Rest Client interface, {1} ", + new Object[]{providerClassNames[i], clientInterface.getName()}); + } + } + return providers; + } + + private Map<Class<?>, Integer> getConfiguredProviderPriorities(List<Class<?>> providers) { + Map<Class<?>, Integer> map = new HashMap<>(); + for (Class<?> providerClass : providers) { + String property = String.format(REST_PROVIDERS_PRIORITY_FORMAT, + clientInterface.getName(), + providerClass.getName()); + Integer priority = ConfigFacade.getOptionalValue(property, Integer.class).orElse(Priorities.USER); + map.put(providerClass, priority); + } + return map; + } + private static final class DefaultLiteral extends AnnotationLiteral<Default> implements Default { private static final long serialVersionUID = 1L;
