You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by lb...@apache.org on 2017/04/24 16:59:57 UTC

[3/8] camel git commit: CAMEL-11190: Service Call - Allow to configure static server list from a property placholder

CAMEL-11190: Service Call - Allow to configure static server list from a property placholder


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/76481d98
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/76481d98
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/76481d98

Branch: refs/heads/master
Commit: 76481d98774959fae7db6741a67cc9e0fecd8eb9
Parents: bb563ea
Author: lburgazzoli <lb...@gmail.com>
Authored: Mon Apr 24 16:39:57 2017 +0200
Committer: lburgazzoli <lb...@gmail.com>
Committed: Mon Apr 24 16:49:47 2017 +0200

----------------------------------------------------------------------
 .../impl/cloud/BlacklistServiceFilter.java      |  5 +++
 ...stServiceCallServiceFilterConfiguration.java | 40 ++++++++++++++++++++
 .../ServiceCallConfigurationDefinition.java     |  7 ++++
 .../ServiceCallExpressionConfiguration.java     | 17 +++++++++
 .../ServiceCallServiceChooserConfiguration.java | 17 +++++++++
 ...erviceCallServiceDiscoveryConfiguration.java | 17 +++++++++
 .../ServiceCallServiceFilterConfiguration.java  | 17 +++++++++
 ...iceCallServiceLoadBalancerConfiguration.java | 17 +++++++++
 ...erviceCallServiceDiscoveryConfiguration.java | 40 ++++++++++++++++++++
 .../cloud/AggregatingServiceDiscoveryTest.java  | 15 ++++++++
 .../cloud/ServiceCallConfigurationTest.java     | 34 ++++++++++++++++-
 11 files changed, 224 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/76481d98/camel-core/src/main/java/org/apache/camel/impl/cloud/BlacklistServiceFilter.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/impl/cloud/BlacklistServiceFilter.java b/camel-core/src/main/java/org/apache/camel/impl/cloud/BlacklistServiceFilter.java
index 5a9a295..1df142c 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/cloud/BlacklistServiceFilter.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/cloud/BlacklistServiceFilter.java
@@ -18,6 +18,7 @@ package org.apache.camel.impl.cloud;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -108,6 +109,10 @@ public class BlacklistServiceFilter implements ServiceFilter {
         return services.stream().filter(s -> !this.services.contains(s)).collect(Collectors.toList());
     }
 
+    List<ServiceDefinition> getBlacklistedServices() {
+        return Collections.unmodifiableList(this.services);
+    }
+
     // *************************************************************************
     // Helpers
     // *************************************************************************

http://git-wip-us.apache.org/repos/asf/camel/blob/76481d98/camel-core/src/main/java/org/apache/camel/model/cloud/BlacklistServiceCallServiceFilterConfiguration.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/model/cloud/BlacklistServiceCallServiceFilterConfiguration.java b/camel-core/src/main/java/org/apache/camel/model/cloud/BlacklistServiceCallServiceFilterConfiguration.java
index 1d1a101..385b80b 100644
--- a/camel-core/src/main/java/org/apache/camel/model/cloud/BlacklistServiceCallServiceFilterConfiguration.java
+++ b/camel-core/src/main/java/org/apache/camel/model/cloud/BlacklistServiceCallServiceFilterConfiguration.java
@@ -16,13 +16,19 @@
  */
 package org.apache.camel.model.cloud;
 
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 
+import org.apache.camel.CamelContext;
 import org.apache.camel.spi.Metadata;
+import org.apache.camel.util.ObjectHelper;
 
 @Metadata(label = "routing,cloud,service-filter")
 @XmlRootElement(name = "blacklistServiceFilter")
@@ -65,4 +71,38 @@ public class BlacklistServiceCallServiceFilterConfiguration extends ServiceCallS
         setServers(servers);
         return this;
     }
+
+    /**
+     * Sets the server list;
+     */
+    public BlacklistServiceCallServiceFilterConfiguration servers(String servers) {
+        if (ObjectHelper.isNotEmpty(servers)) {
+            String[] parts = servers.split(",");
+
+            if (this.servers == null) {
+                this.servers = new ArrayList<>();
+            }
+
+            this.servers.addAll(Arrays.asList(parts));
+        }
+
+        return this;
+    }
+
+    // *************************************************************************
+    // Utilities
+    // *************************************************************************
+
+    protected void postProcessFactoryParameters(CamelContext camelContext, Map<String, Object> parameters) throws Exception  {
+        List<String> servers = List.class.cast(parameters.get("servers"));
+
+        if (ObjectHelper.isNotEmpty(servers)) {
+            final ListIterator<String> it = servers.listIterator();
+            while (it.hasNext()) {
+                it.set(camelContext.resolvePropertyPlaceholders(it.next()));
+            }
+
+            parameters.put("servers", servers);
+        }
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/76481d98/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallConfigurationDefinition.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallConfigurationDefinition.java b/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallConfigurationDefinition.java
index 2d8fc96..984bdd1 100644
--- a/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallConfigurationDefinition.java
+++ b/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallConfigurationDefinition.java
@@ -587,6 +587,13 @@ public class ServiceCallConfigurationDefinition extends IdentifiedType {
         return conf;
     }
 
+    public BlacklistServiceCallServiceFilterConfiguration blacklistFilet() {
+        BlacklistServiceCallServiceFilterConfiguration conf = new BlacklistServiceCallServiceFilterConfiguration();
+        setServiceFilterConfiguration(conf);
+
+        return conf;
+    }
+
     public ServiceCallConfigurationDefinition customFilter(String serviceFilter) {
         CustomServiceCallServiceFilterConfiguration conf = new CustomServiceCallServiceFilterConfiguration();
         conf.setServiceFilterRef(serviceFilter);

http://git-wip-us.apache.org/repos/asf/camel/blob/76481d98/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallExpressionConfiguration.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallExpressionConfiguration.java b/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallExpressionConfiguration.java
index 1565b1b..8118233 100644
--- a/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallExpressionConfiguration.java
+++ b/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallExpressionConfiguration.java
@@ -246,6 +246,23 @@ public class ServiceCallExpressionConfiguration extends IdentifiedType implement
                     Map<String, Object> parameters = new HashMap<>();
                     IntrospectionSupport.getProperties(this, parameters, null, false);
 
+                    parameters.replaceAll(
+                        (k, v) -> {
+                            if (v != null && v instanceof String) {
+                                try {
+                                    v = camelContext.resolvePropertyPlaceholders((String) v);
+                                } catch (Exception e) {
+                                    throw new IllegalArgumentException(
+                                        String.format("Exception while resolving %s (%s)", k, v.toString()),
+                                        e
+                                    );
+                                }
+                            }
+
+                            return v;
+                        }
+                    );
+
                     // Convert properties to Map<String, String>
                     parameters.put("properties", getPropertiesAsMap(camelContext));
 

http://git-wip-us.apache.org/repos/asf/camel/blob/76481d98/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceChooserConfiguration.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceChooserConfiguration.java b/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceChooserConfiguration.java
index 0228f72..e349409 100644
--- a/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceChooserConfiguration.java
+++ b/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceChooserConfiguration.java
@@ -162,6 +162,23 @@ public class ServiceCallServiceChooserConfiguration extends IdentifiedType imple
                 Map<String, Object> parameters = new HashMap<>();
                 IntrospectionSupport.getProperties(this, parameters, null, false);
 
+                parameters.replaceAll(
+                    (k, v) -> {
+                        if (v != null && v instanceof String) {
+                            try {
+                                v = camelContext.resolvePropertyPlaceholders((String) v);
+                            } catch (Exception e) {
+                                throw new IllegalArgumentException(
+                                    String.format("Exception while resolving %s (%s)", k, v.toString()),
+                                    e
+                                );
+                            }
+                        }
+
+                        return v;
+                    }
+                );
+
                 // Convert properties to Map<String, String>
                 parameters.put("properties", getPropertiesAsMap(camelContext));
 

http://git-wip-us.apache.org/repos/asf/camel/blob/76481d98/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceDiscoveryConfiguration.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceDiscoveryConfiguration.java b/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceDiscoveryConfiguration.java
index 49e6c84..6e3a685 100644
--- a/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceDiscoveryConfiguration.java
+++ b/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceDiscoveryConfiguration.java
@@ -169,6 +169,23 @@ public class ServiceCallServiceDiscoveryConfiguration extends IdentifiedType imp
                 Map<String, Object> parameters = new HashMap<>();
                 IntrospectionSupport.getProperties(this, parameters, null, false);
 
+                parameters.replaceAll(
+                    (k, v) -> {
+                        if (v != null && v instanceof String) {
+                            try {
+                                v = camelContext.resolvePropertyPlaceholders((String) v);
+                            } catch (Exception e) {
+                                throw new IllegalArgumentException(
+                                    String.format("Exception while resolving %s (%s)", k, v.toString()),
+                                    e
+                                );
+                            }
+                        }
+
+                        return v;
+                    }
+                );
+
                 // Convert properties to Map<String, String>
                 parameters.put("properties", getPropertiesAsMap(camelContext));
 

http://git-wip-us.apache.org/repos/asf/camel/blob/76481d98/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceFilterConfiguration.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceFilterConfiguration.java b/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceFilterConfiguration.java
index afb2e94..60b9938 100644
--- a/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceFilterConfiguration.java
+++ b/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceFilterConfiguration.java
@@ -162,6 +162,23 @@ public class ServiceCallServiceFilterConfiguration extends IdentifiedType implem
                 Map<String, Object> parameters = new HashMap<>();
                 IntrospectionSupport.getProperties(this, parameters, null, false);
 
+                parameters.replaceAll(
+                    (k, v) -> {
+                        if (v != null && v instanceof String) {
+                            try {
+                                v = camelContext.resolvePropertyPlaceholders((String) v);
+                            } catch (Exception e) {
+                                throw new IllegalArgumentException(
+                                    String.format("Exception while resolving %s (%s)", k, v.toString()),
+                                    e
+                                );
+                            }
+                        }
+
+                        return v;
+                    }
+                );
+
                 // Convert properties to Map<String, String>
                 parameters.put("properties", getPropertiesAsMap(camelContext));
 

http://git-wip-us.apache.org/repos/asf/camel/blob/76481d98/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceLoadBalancerConfiguration.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceLoadBalancerConfiguration.java b/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceLoadBalancerConfiguration.java
index a1057a4..094e2f5 100644
--- a/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceLoadBalancerConfiguration.java
+++ b/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceLoadBalancerConfiguration.java
@@ -162,6 +162,23 @@ public class ServiceCallServiceLoadBalancerConfiguration extends IdentifiedType
                 Map<String, Object> parameters = new HashMap<>();
                 IntrospectionSupport.getProperties(this, parameters, null, false);
 
+                parameters.replaceAll(
+                    (k, v) -> {
+                        if (v != null && v instanceof String) {
+                            try {
+                                v = camelContext.resolvePropertyPlaceholders((String) v);
+                            } catch (Exception e) {
+                                throw new IllegalArgumentException(
+                                    String.format("Exception while resolving %s (%s)", k, v.toString()),
+                                    e
+                                );
+                            }
+                        }
+
+                        return v;
+                    }
+                );
+
                 // Convert properties to Map<String, String>
                 parameters.put("properties", getPropertiesAsMap(camelContext));
 

http://git-wip-us.apache.org/repos/asf/camel/blob/76481d98/camel-core/src/main/java/org/apache/camel/model/cloud/StaticServiceCallServiceDiscoveryConfiguration.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/model/cloud/StaticServiceCallServiceDiscoveryConfiguration.java b/camel-core/src/main/java/org/apache/camel/model/cloud/StaticServiceCallServiceDiscoveryConfiguration.java
index 0c5dae1..d35a00c 100644
--- a/camel-core/src/main/java/org/apache/camel/model/cloud/StaticServiceCallServiceDiscoveryConfiguration.java
+++ b/camel-core/src/main/java/org/apache/camel/model/cloud/StaticServiceCallServiceDiscoveryConfiguration.java
@@ -17,13 +17,19 @@
 
 package org.apache.camel.model.cloud;
 
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 
+import org.apache.camel.CamelContext;
 import org.apache.camel.spi.Metadata;
+import org.apache.camel.util.ObjectHelper;
 
 @Metadata(label = "routing,cloud,service-discovery")
 @XmlRootElement(name = "staticServiceDiscovery")
@@ -66,4 +72,38 @@ public class StaticServiceCallServiceDiscoveryConfiguration extends ServiceCallS
         setServers(servers);
         return this;
     }
+
+    /**
+     * Sets the server list;
+     */
+    public StaticServiceCallServiceDiscoveryConfiguration servers(String servers) {
+        if (ObjectHelper.isNotEmpty(servers)) {
+            String[] parts = servers.split(",");
+
+            if (this.servers == null) {
+                this.servers = new ArrayList<>();
+            }
+
+            this.servers.addAll(Arrays.asList(parts));
+        }
+
+        return this;
+    }
+
+    // *************************************************************************
+    // Utilities
+    // *************************************************************************
+
+    protected void postProcessFactoryParameters(CamelContext camelContext, Map<String, Object> parameters) throws Exception  {
+        List<String> servers = List.class.cast(parameters.get("servers"));
+
+        if (ObjectHelper.isNotEmpty(servers)) {
+            final ListIterator<String> it = servers.listIterator();
+            while (it.hasNext()) {
+                it.set(camelContext.resolvePropertyPlaceholders(it.next()));
+            }
+
+            parameters.put("servers", servers);
+        }
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/76481d98/camel-core/src/test/java/org/apache/camel/impl/cloud/AggregatingServiceDiscoveryTest.java
----------------------------------------------------------------------
diff --git a/camel-core/src/test/java/org/apache/camel/impl/cloud/AggregatingServiceDiscoveryTest.java b/camel-core/src/test/java/org/apache/camel/impl/cloud/AggregatingServiceDiscoveryTest.java
index 76a5a59..8fe4249 100644
--- a/camel-core/src/test/java/org/apache/camel/impl/cloud/AggregatingServiceDiscoveryTest.java
+++ b/camel-core/src/test/java/org/apache/camel/impl/cloud/AggregatingServiceDiscoveryTest.java
@@ -68,4 +68,19 @@ public class AggregatingServiceDiscoveryTest extends ContextTestSupport {
         Assert.assertEquals(3, discovery.getServices("discovery1").size());
         Assert.assertEquals(1, discovery.getServices("discovery2").size());
     }
+
+    @Test
+    public void testMultiServiceDiscoveryConfigurationWithPlaceholders() throws Exception {
+        System.setProperty("svc-list-1", "discovery1@localhost:1111,discovery1@localhost:1112");
+        System.setProperty("svc-list-2", "discovery1@localhost:1113,discovery2@localhost:1114");
+
+        AggregatingServiceCallServiceDiscoveryConfiguration multiConf = new AggregatingServiceCallServiceDiscoveryConfiguration();
+        multiConf.staticServiceDiscovery().servers("{{svc-list-1}}");
+        multiConf.staticServiceDiscovery().servers("{{svc-list-2}}");
+
+        AggregatingServiceDiscovery discovery = (AggregatingServiceDiscovery)multiConf.newInstance(context);
+        Assert.assertEquals(2, discovery.getDelegates().size());
+        Assert.assertEquals(3, discovery.getServices("discovery1").size());
+        Assert.assertEquals(1, discovery.getServices("discovery2").size());
+    }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/76481d98/camel-core/src/test/java/org/apache/camel/impl/cloud/ServiceCallConfigurationTest.java
----------------------------------------------------------------------
diff --git a/camel-core/src/test/java/org/apache/camel/impl/cloud/ServiceCallConfigurationTest.java b/camel-core/src/test/java/org/apache/camel/impl/cloud/ServiceCallConfigurationTest.java
index 67c0105..dc60788 100644
--- a/camel-core/src/test/java/org/apache/camel/impl/cloud/ServiceCallConfigurationTest.java
+++ b/camel-core/src/test/java/org/apache/camel/impl/cloud/ServiceCallConfigurationTest.java
@@ -16,12 +16,14 @@
  */
 package org.apache.camel.impl.cloud;
 
+import java.util.List;
 import java.util.UUID;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Processor;
 import org.apache.camel.Route;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.cloud.ServiceDefinition;
 import org.apache.camel.impl.DefaultCamelContext;
 import org.apache.camel.impl.SimpleRegistry;
 import org.apache.camel.model.cloud.ServiceCallConfigurationDefinition;
@@ -282,8 +284,15 @@ public class ServiceCallConfigurationTest {
         try {
             System.setProperty("scall.name", "service-name");
             System.setProperty("scall.scheme", "file");
+            System.setProperty("scall.servers1", "hello-service@localhost:8081,hello-service@localhost:8082");
+            System.setProperty("scall.servers2", "hello-svc@localhost:8083,hello-svc@localhost:8084");
+            System.setProperty("scall.filter", "hello-svc@localhost:8083");
+
+            ServiceCallConfigurationDefinition global = new ServiceCallConfigurationDefinition();
+            global.blacklistFilet().servers("{{scall.filter}}");
 
             context = new DefaultCamelContext();
+            context.setServiceCallConfiguration(global);
             context.addRoutes(new RouteBuilder() {
                 @Override
                 public void configure() throws Exception {
@@ -293,7 +302,10 @@ public class ServiceCallConfigurationTest {
                             .name("{{scall.name}}")
                             .component("{{scall.scheme}}")
                             .uri("direct:{{scall.name}}")
-                            .serviceDiscovery(new StaticServiceDiscovery())
+                            .staticServiceDiscovery()
+                                .servers("{{scall.servers1}}")
+                                .servers("{{scall.servers2}}")
+                                .end()
                         .end();
                 }
             });
@@ -308,6 +320,21 @@ public class ServiceCallConfigurationTest {
             Assert.assertEquals("file", proc.getScheme());
             Assert.assertEquals("direct:service-name", proc.getUri());
 
+            DefaultServiceLoadBalancer lb = (DefaultServiceLoadBalancer)proc.getLoadBalancer();
+
+            Assert.assertTrue(lb.getServiceFilter() instanceof BlacklistServiceFilter);
+            BlacklistServiceFilter filter = (BlacklistServiceFilter)lb.getServiceFilter();
+            List<ServiceDefinition> blacklist = filter.getBlacklistedServices();
+            Assert.assertEquals(1, blacklist.size());
+
+            Assert.assertTrue(lb.getServiceDiscovery() instanceof StaticServiceDiscovery);
+
+            List<ServiceDefinition> services1 = lb.getServiceDiscovery().getServices("hello-service");
+            Assert.assertEquals(2,  filter.apply(services1).size());
+
+            List<ServiceDefinition> services2 = lb.getServiceDiscovery().getServices("hello-svc");
+            Assert.assertEquals(1, filter.apply(services2).size());
+
         } finally {
             if (context != null) {
                 context.stop();
@@ -315,7 +342,10 @@ public class ServiceCallConfigurationTest {
 
             // Cleanup system properties
             System.clearProperty("scall.name");
-            System.clearProperty("scall.component");
+            System.clearProperty("scall.scheme");
+            System.clearProperty("scall.servers1");
+            System.clearProperty("scall.servers2");
+            System.clearProperty("scall.filter");
         }
 
         context.stop();