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);