You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2017/12/21 16:32:38 UTC

[camel] branch camel-2.20.x updated: CAMEL-12086: Service call definition - Simple language expresion in uri is not being evaluated

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch camel-2.20.x
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/camel-2.20.x by this push:
     new 31de691  CAMEL-12086: Service call definition - Simple language expresion in uri is not being evaluated
31de691 is described below

commit 31de69121db535e3b7e9e7e70b33f7942928fa6d
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Thu Dec 21 16:59:19 2017 +0100

    CAMEL-12086: Service call definition - Simple language expresion in uri is not being evaluated
---
 .../impl/cloud/DefaultServiceCallExpression.java   |  4 ++
 .../impl/cloud/DefaultServiceCallProcessor.java    | 29 ++++++++++++--
 .../impl/cloud/ServiceCallConfigurationTest.java   | 44 ++++++++++++++++++++++
 3 files changed, 73 insertions(+), 4 deletions(-)

diff --git a/camel-core/src/main/java/org/apache/camel/impl/cloud/DefaultServiceCallExpression.java b/camel-core/src/main/java/org/apache/camel/impl/cloud/DefaultServiceCallExpression.java
index ebebd24..8bf3b4a 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/cloud/DefaultServiceCallExpression.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/cloud/DefaultServiceCallExpression.java
@@ -63,6 +63,10 @@ public class DefaultServiceCallExpression extends ServiceCallExpressionSupport {
             if (answer.contains(name) && port == null) {
                 answer = answer.replaceFirst(name, host);
             }
+            // include scheme if not provided
+            if (!answer.startsWith(scheme)) {
+                answer = scheme + ":" + answer;
+            }
         }
 
         LOGGER.debug("Camel endpoint uri: {} for calling service: {} on server {}:{}", answer, name, host, port);
diff --git a/camel-core/src/main/java/org/apache/camel/impl/cloud/DefaultServiceCallProcessor.java b/camel-core/src/main/java/org/apache/camel/impl/cloud/DefaultServiceCallProcessor.java
index 76094c1..78a900e 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/cloud/DefaultServiceCallProcessor.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/cloud/DefaultServiceCallProcessor.java
@@ -25,6 +25,7 @@ import org.apache.camel.Expression;
 import org.apache.camel.Message;
 import org.apache.camel.cloud.ServiceDefinition;
 import org.apache.camel.cloud.ServiceLoadBalancer;
+import org.apache.camel.language.simple.SimpleLanguage;
 import org.apache.camel.processor.SendDynamicProcessor;
 import org.apache.camel.support.ServiceSupport;
 import org.apache.camel.util.AsyncProcessorHelper;
@@ -154,11 +155,31 @@ public class DefaultServiceCallProcessor extends ServiceSupport implements Async
     @Override
     public boolean process(final Exchange exchange, final AsyncCallback callback) {
         Message message = exchange.getIn();
-        message.setHeader(ServiceCallConstants.SERVICE_CALL_URI, uri);
-        message.setHeader(ServiceCallConstants.SERVICE_CALL_CONTEXT_PATH, contextPath);
-        message.setHeader(ServiceCallConstants.SERVICE_CALL_SCHEME, scheme);
 
-        String serviceName = message.getHeader(ServiceCallConstants.SERVICE_NAME, name, String.class);
+        // the values can be dynamic using simple language so compute those
+        String val = uri;
+        if (SimpleLanguage.hasSimpleFunction(val)) {
+            val = SimpleLanguage.simple(val).evaluate(exchange, String.class);
+        }
+        message.setHeader(ServiceCallConstants.SERVICE_CALL_URI, val);
+
+        val = contextPath;
+        if (SimpleLanguage.hasSimpleFunction(val)) {
+            val = SimpleLanguage.simple(val).evaluate(exchange, String.class);
+        }
+        message.setHeader(ServiceCallConstants.SERVICE_CALL_CONTEXT_PATH, val);
+
+        val = scheme;
+        if (SimpleLanguage.hasSimpleFunction(val)) {
+            val = SimpleLanguage.simple(val).evaluate(exchange, String.class);
+        }
+        message.setHeader(ServiceCallConstants.SERVICE_CALL_SCHEME, val);
+
+        String serviceName = name;
+        if (SimpleLanguage.hasSimpleFunction(serviceName)) {
+            serviceName = SimpleLanguage.simple(serviceName).evaluate(exchange, String.class);
+        }
+        message.setHeader(ServiceCallConstants.SERVICE_NAME, serviceName);
 
         try {
             return loadBalancer.process(serviceName, server -> execute(server, exchange, callback));
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 96ba820..94763fe 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
@@ -24,6 +24,7 @@ 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.component.mock.MockEndpoint;
 import org.apache.camel.impl.DefaultCamelContext;
 import org.apache.camel.impl.SimpleRegistry;
 import org.apache.camel.model.cloud.ServiceCallConfigurationDefinition;
@@ -40,6 +41,49 @@ public class ServiceCallConfigurationTest {
     // ****************************************
 
     @Test
+    public void testDynamicUri() throws Exception {
+        StaticServiceDiscovery sd = new StaticServiceDiscovery();
+        sd.addServer("scall","127.0.0.1", 8080);
+        sd.addServer("scall","127.0.0.1", 8081);
+
+        ServiceCallConfigurationDefinition conf = new ServiceCallConfigurationDefinition();
+        conf.setServiceDiscovery(sd);
+        conf.setComponent("mock");
+
+        CamelContext context = new DefaultCamelContext();
+        context.setServiceCallConfiguration(conf);
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                    .routeId("default")
+                    .serviceCall("scall", "scall/api/${header.customerId}");
+            }
+        });
+
+        context.start();
+
+        MockEndpoint mock = context.getEndpoint("mock:127.0.0.1:8080/api/123", MockEndpoint.class);
+        mock.expectedMessageCount(1);
+
+        DefaultServiceCallProcessor proc = findServiceCallProcessor(context.getRoute("default"));
+
+        Assert.assertNotNull(proc);
+        Assert.assertTrue(proc.getLoadBalancer() instanceof DefaultServiceLoadBalancer);
+
+        DefaultServiceLoadBalancer loadBalancer = (DefaultServiceLoadBalancer)proc.getLoadBalancer();
+        Assert.assertEquals(sd, loadBalancer.getServiceDiscovery());
+
+        // call the route
+        context.createFluentProducerTemplate().to("direct:start").withHeader("customerId", "123").send();
+
+        // the service should call the mock
+        mock.assertIsSatisfied();
+
+        context.stop();
+    }
+
+    @Test
     public void testDefaultConfigurationFromCamelContext() throws Exception {
         StaticServiceDiscovery sd = new StaticServiceDiscovery();
         sd.addServer("127.0.0.1:8080");

-- 
To stop receiving notification emails like this one, please contact
['"commits@camel.apache.org" <co...@camel.apache.org>'].