Author: krasserm
Date: Tue Nov 3 10:23:06 2009
New Revision: 832376
URL:
http://svn.apache.org/viewvc?rev=832376&view=revLog:
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;
+ }
+
}