Author: krasserm Date: Tue Nov 3 10:23:06 2009 New Revision: 832376 URL: http://svn.apache.org/viewvc?rev=832376&view=rev Log: CAMEL-2127: DefaultComponent.resolveAndRemoveReferenceParameter as alternative to DefaultComponent.getAndRemoveParameter for looking up reference parameters in the registry.
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultComponent.java camel/trunk/camel-core/src/main/java/org/apache/camel/util/EndpointHelper.java camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultComponentTest.java Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultComponent.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultComponent.java?rev=832376&r1=832375&r2=832376&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultComponent.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultComponent.java Tue Nov 3 10:23:06 2009 @@ -296,25 +296,29 @@ } /** - * Gets the parameter and remove it from the parameter map. + * Gets the parameter and remove it from the parameter map. This method doesn't resolve + * reference parameters in the registry. * * @param parameters the parameters * @param key the key * @param type the requested type to convert the value from the parameter * @return the converted value parameter, <tt>null</tt> if parameter does not exists. + * @see #resolveAndRemoveReferenceParameter(Map, String, Class) */ public <T> T getAndRemoveParameter(Map parameters, String key, Class<T> type) { return getAndRemoveParameter(parameters, key, type, null); } /** - * Gets the parameter and remove it from the parameter map. + * Gets the parameter and remove it from the parameter map. This method doesn't resolve + * reference parameters in the registry. * * @param parameters the parameters * @param key the key * @param type the requested type to convert the value from the parameter * @param defaultValue use this default value if the parameter does not contain the key * @return the converted value parameter + * @see #resolveAndRemoveReferenceParameter(Map, String, Class, Object) */ public <T> T getAndRemoveParameter(Map parameters, String key, Class<T> type, T defaultValue) { Object value = parameters.remove(key); @@ -329,6 +333,43 @@ } /** + * Resolves a reference parameter in the registry and removes it from the map. + * + * @param <T> type of object to lookup in th registry. + * @param parameters parameter map. + * @param key parameter map key. + * @param type type of object to lookup in th registry. + * @return the referenced object or <code>null</code>. + */ + public <T> T resolveAndRemoveReferenceParameter(Map parameters, String key, Class<T> type) { + return resolveAndRemoveReferenceParameter(parameters, key, type, null); + } + + /** + * Resolves a reference parameter in the registry and removes it from the map. + * + * @param <T> type of object to lookup in th registry. + * @param parameters parameter map. + * @param key parameter map key. + * @param type type of object to lookup in th registry. + * @param defaultValue default value to use if neither the parameter map contains + * the key nor the registry contains an object of requested + * type. + * @return the referenced object, the default value or <code>null</code>. + */ + public <T> T resolveAndRemoveReferenceParameter(Map parameters, String key, Class<T> type, T defaultValue) { + String value = getAndRemoveParameter(parameters, key, String.class); + if (EndpointHelper.isReferenceParameter(value)) { + T result = EndpointHelper.resolveReferenceParameter(getCamelContext(), value.toString(), type); + return result == null ? defaultValue : result; + } else if (value == null) { + return defaultValue; + } else { + throw new IllegalArgumentException("Parameter value " + value + " is not a valid reference"); + } + } + + /** * Returns the reminder of the text if it starts with the prefix. * <p/> * Is useable for string parameters that contains commands. Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/util/EndpointHelper.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/util/EndpointHelper.java?rev=832376&r1=832375&r2=832376&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/util/EndpointHelper.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/util/EndpointHelper.java Tue Nov 3 10:23:06 2009 @@ -172,7 +172,7 @@ Object v = entry.getValue(); String value = v != null ? v.toString() : null; if (value != null && isReferenceParameter(value)) { - Object ref = context.getRegistry().lookup(value.substring(1)); + Object ref = resolveReferenceParameter(context, value, Object.class); String name = key.toString(); if (ref != null) { boolean hit = IntrospectionSupport.setProperty(context.getTypeConverter(), bean, name, ref); @@ -197,4 +197,19 @@ public static boolean isReferenceParameter(String parameter) { return parameter != null && parameter.startsWith("#"); } + + /** + * Resolves a reference parameter by making a lookup in the registry. + * + * @param <T> type of object to lookup. + * @param context Camel content to use for lookup. + * @param value reference parameter value. + * @param type type of object to lookup. + * @return lookup result or <code>null</code>. + */ + public static <T> T resolveReferenceParameter(CamelContext context, String value, Class<T> type) { + assert isReferenceParameter(value); + return context.getRegistry().lookup(value.substring(1), type); + } + } Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultComponentTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultComponentTest.java?rev=832376&r1=832375&r2=832376&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultComponentTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultComponentTest.java Tue Nov 3 10:23:06 2009 @@ -16,6 +16,7 @@ */ package org.apache.camel.impl; +import java.util.Date; import java.util.HashMap; import java.util.Map; @@ -77,6 +78,58 @@ assertEquals(value.intValue(), 4); } + public void testResolveAndRemoveReferenceParameter() { + Map parameters = new HashMap(); + parameters.put("date", "#beginning"); + MyComponent my = new MyComponent(this.context); + Date value = my.resolveAndRemoveReferenceParameter(parameters, "date", Date.class); + assertEquals(new Date(0), value); + } + + public void testResolveAndRemoveReferenceParameterNotInRegistryDefault() { + Map parameters = new HashMap(); + parameters.put("date", "#somewhen"); + MyComponent my = new MyComponent(this.context); + Date value = my.resolveAndRemoveReferenceParameter(parameters, "date", Date.class, new Date(1)); + assertEquals(new Date(1), value); + } + + public void testResolveAndRemoveReferenceParameterNotInRegistryNull() { + Map parameters = new HashMap(); + parameters.put("date", "#somewhen"); + MyComponent my = new MyComponent(this.context); + Date value = my.resolveAndRemoveReferenceParameter(parameters, "date", Date.class); + assertNull(value); + } + + public void testResolveAndRemoveReferenceParameterNotInMapDefault() { + Map parameters = new HashMap(); + parameters.put("date", "#beginning"); + MyComponent my = new MyComponent(this.context); + Date value = my.resolveAndRemoveReferenceParameter(parameters, "wrong", Date.class, new Date(1)); + assertEquals(new Date(1), value); + } + + public void testResolveAndRemoveReferenceParameterNotInMapNull() { + Map parameters = new HashMap(); + parameters.put("date", "#beginning"); + MyComponent my = new MyComponent(this.context); + Date value = my.resolveAndRemoveReferenceParameter(parameters, "wrong", Date.class); + assertNull(value); + } + + public void testResolveAndRemoveInvalidReferenceParameter() { + Map parameters = new HashMap(); + parameters.put("date", "beginning"); + MyComponent my = new MyComponent(this.context); + try { + my.resolveAndRemoveReferenceParameter(parameters, "date", Date.class); + fail("usage of invalid reference"); + } catch (IllegalArgumentException e) { + // test passed + } + } + public void testContextShouldBeSet() throws Exception { MyComponent my = new MyComponent(null); try { @@ -87,4 +140,10 @@ } } + protected JndiRegistry createRegistry() throws Exception { + JndiRegistry jndiRegistry = super.createRegistry(); + jndiRegistry.bind("beginning", new Date(0)); + return jndiRegistry; + } + }