CAMEL-11862: Convert to requested type values retrieved from the repository


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

Branch: refs/heads/master
Commit: 7b459d7f1247c078f06aa60caf1d3eb450d7704b
Parents: c1390a4
Author: Ion Savin <co...@gmx.net>
Authored: Thu Sep 28 13:02:13 2017 +0300
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Thu Sep 28 13:45:44 2017 +0200

----------------------------------------------------------------------
 .../apache/camel/util/CamelContextHelper.java   | 28 ++++++++++++++++++++
 .../org/apache/camel/util/EndpointHelper.java   |  4 +--
 .../apache/camel/impl/DefaultComponentTest.java | 24 +++++++++++++++++
 .../apache/camel/util/EndpointHelperTest.java   | 23 ++++++++++++++++
 4 files changed, 77 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/7b459d7f/camel-core/src/main/java/org/apache/camel/util/CamelContextHelper.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/util/CamelContextHelper.java 
b/camel-core/src/main/java/org/apache/camel/util/CamelContextHelper.java
index e2c8faa..1ffb9d9 100644
--- a/camel-core/src/main/java/org/apache/camel/util/CamelContextHelper.java
+++ b/camel-core/src/main/java/org/apache/camel/util/CamelContextHelper.java
@@ -103,6 +103,14 @@ public final class CamelContextHelper {
     }
 
     /**
+     * Tried to convert the given value to the requested type
+     */
+    public static <T> T tryConvertTo(CamelContext context, Class<T> type, 
Object value) {
+        notNull(context, "camelContext");
+        return context.getTypeConverter().tryConvertTo(type, value);
+    }
+
+    /**
      * Converts the given value to the specified type throwing an {@link 
IllegalArgumentException}
      * if the value could not be converted to a non null value
      */
@@ -139,6 +147,14 @@ public final class CamelContextHelper {
     }
 
     /**
+     * Look up the given named bean in the {@link 
org.apache.camel.spi.Registry} on the
+     * {@link CamelContext} and try to convert it to the given type.
+     */
+    public static <T> T lookupAndConvert(CamelContext context, String name, 
Class<T> beanType) {
+        return tryConvertTo(context, beanType, lookup(context, name));
+    }
+
+    /**
      * Look up a bean of the give type in the {@link 
org.apache.camel.spi.Registry} on the
      * {@link CamelContext} returning an instance if only one bean is present,
      */
@@ -176,6 +192,18 @@ public final class CamelContextHelper {
     }
 
     /**
+     * Look up the given named bean in the {@link 
org.apache.camel.spi.Registry} on the
+     * {@link CamelContext} and convert it to the given type or throws 
NoSuchBeanException if not found.
+     */
+    public static <T> T mandatoryLookupAndConvert(CamelContext context, String 
name, Class<T> beanType) {
+        Object value = lookup(context, name);
+        if (value == null) {
+            throw new NoSuchBeanException(name, beanType.getName());
+        }
+        return convertTo(context, beanType, value);
+    }
+
+    /**
      * Evaluates the @EndpointInject annotation using the given context
      */
     public static Endpoint getEndpointInjection(CamelContext camelContext, 
String uri, String ref, String injectionPointName, boolean mandatory) {

http://git-wip-us.apache.org/repos/asf/camel/blob/7b459d7f/camel-core/src/main/java/org/apache/camel/util/EndpointHelper.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/util/EndpointHelper.java 
b/camel-core/src/main/java/org/apache/camel/util/EndpointHelper.java
index 1d68cf4..d0b19f7 100644
--- a/camel-core/src/main/java/org/apache/camel/util/EndpointHelper.java
+++ b/camel-core/src/main/java/org/apache/camel/util/EndpointHelper.java
@@ -321,9 +321,9 @@ public final class EndpointHelper {
     public static <T> T resolveReferenceParameter(CamelContext context, String 
value, Class<T> type, boolean mandatory) {
         String valueNoHash = StringHelper.replaceAll(value, "#", "");
         if (mandatory) {
-            return CamelContextHelper.mandatoryLookup(context, valueNoHash, 
type);
+            return CamelContextHelper.mandatoryLookupAndConvert(context, 
valueNoHash, type);
         } else {
-            return CamelContextHelper.lookup(context, valueNoHash, type);
+            return CamelContextHelper.lookupAndConvert(context, valueNoHash, 
type);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/7b459d7f/camel-core/src/test/java/org/apache/camel/impl/DefaultComponentTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/impl/DefaultComponentTest.java 
b/camel-core/src/test/java/org/apache/camel/impl/DefaultComponentTest.java
index 508c4e2..0be63bb 100644
--- a/camel-core/src/test/java/org/apache/camel/impl/DefaultComponentTest.java
+++ b/camel-core/src/test/java/org/apache/camel/impl/DefaultComponentTest.java
@@ -26,6 +26,7 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Endpoint;
 import org.apache.camel.NoSuchBeanException;
+import org.apache.camel.TypeConversionException;
 
 /**
  * Unit test for helper methods on the DefaultComponent.
@@ -93,6 +94,27 @@ public class DefaultComponentTest extends ContextTestSupport 
{
         assertEquals(new Date(0), value);
     }
 
+    public void testResolveAndRemoveReferenceParameterWithConversion() {
+        Map<String, Object> parameters = new HashMap<String, Object>();
+        parameters.put("number", "#numeric");
+        MyComponent my = new MyComponent(this.context);
+        Integer value = my.resolveAndRemoveReferenceParameter(parameters, 
"number", Integer.class);
+        assertEquals(12345, value.intValue());
+    }
+
+    public void testResolveAndRemoveReferenceParameterWithFailedConversion() {
+        Map<String, Object> parameters = new HashMap<String, Object>();
+        parameters.put("number", "#non-numeric");
+        MyComponent my = new MyComponent(this.context);
+        try {
+            my.resolveAndRemoveReferenceParameter(parameters, "number", 
Integer.class);
+        } catch (TypeConversionException ex) {
+            assertEquals("Error during type conversion from type: 
java.lang.String " +
+                    "to the required type: java.lang.Integer " +
+                    "with value abc due For input string: \"abc\"", 
ex.getMessage());
+        }
+    }
+
     public void testResolveAndRemoveReferenceParameterNotInRegistry() {
         Map<String, Object> parameters = new HashMap<String, Object>();
         parameters.put("date", "#somewhen");
@@ -229,6 +251,8 @@ public class DefaultComponentTest extends 
ContextTestSupport {
         jndiRegistry.bind("bean1", bean1);
         jndiRegistry.bind("bean2", bean2);
         jndiRegistry.bind("listBean", Arrays.asList(bean1, bean2));
+        jndiRegistry.bind("numeric", "12345");
+        jndiRegistry.bind("non-numeric", "abc");
         return jndiRegistry;
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/7b459d7f/camel-core/src/test/java/org/apache/camel/util/EndpointHelperTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/util/EndpointHelperTest.java 
b/camel-core/src/test/java/org/apache/camel/util/EndpointHelperTest.java
index 967a326..cae7037 100644
--- a/camel-core/src/test/java/org/apache/camel/util/EndpointHelperTest.java
+++ b/camel-core/src/test/java/org/apache/camel/util/EndpointHelperTest.java
@@ -23,6 +23,7 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
+import org.apache.camel.NoSuchBeanException;
 import org.apache.camel.Processor;
 import org.apache.camel.impl.DefaultCamelContext;
 import org.apache.camel.impl.SimpleRegistry;
@@ -77,6 +78,7 @@ public class EndpointHelperTest extends ContextTestSupport {
         bar = context.getEndpoint("mock:bar");
         reg.put("foo", foo);
         reg.put("coolbar", bar);
+        reg.put("numbar", "12345");
 
         return context;
     }
@@ -102,6 +104,27 @@ public class EndpointHelperTest extends ContextTestSupport 
{
         assertSame(bar, endpoint);
     }
 
+    public void testResolveAndConvertReferenceParameter() throws Exception {
+        // The registry value is a java.lang.String
+        Integer number = EndpointHelper.resolveReferenceParameter(context, 
"numbar", Integer.class);
+        assertNotNull(number);
+        assertEquals(12345, (int) number);
+    }
+
+    public void testResolveAndConvertMissingReferenceParameter() throws 
Exception {
+        Integer number = EndpointHelper.resolveReferenceParameter(context, 
"misbar", Integer.class, false);
+        assertNull(number);
+    }
+
+    public void testMandatoryResolveAndConvertMissingReferenceParameter() 
throws Exception {
+        try {
+            EndpointHelper.resolveReferenceParameter(context, "misbar", 
Integer.class, true);
+            fail();
+        } catch (NoSuchBeanException ex) {
+            assertEquals("No bean could be found in the registry for: misbar 
of type: java.lang.Integer", ex.getMessage());
+        }
+    }
+
     public void testResolveParameter() throws Exception {
         Endpoint endpoint = EndpointHelper.resolveParameter(context, 
"#coolbar", Endpoint.class);
         assertNotNull(endpoint);

Reply via email to