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;