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 <lburgazz...@gmail.com> Authored: Mon Apr 24 16:39:57 2017 +0200 Committer: lburgazzoli <lburgazz...@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();