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 2018/10/19 16:57:39 UTC
[cxf] 01/02: Issue 7868: Ensure providers registered via MP Config
are honored
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 <j....@gmail.com>
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;