You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by kr...@apache.org on 2009/12/01 15:28:19 UTC

svn commit: r885767 - in /camel/trunk/camel-core/src: main/java/org/apache/camel/impl/DefaultComponent.java main/java/org/apache/camel/util/EndpointHelper.java test/java/org/apache/camel/impl/DefaultComponentTest.java

Author: krasserm
Date: Tue Dec  1 14:28:18 2009
New Revision: 885767

URL: http://svn.apache.org/viewvc?rev=885767&view=rev
Log:
CAMEL-2244

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=885767&r1=885766&r2=885767&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 Dec  1 14:28:18 2009
@@ -17,6 +17,8 @@
 package org.apache.camel.impl;
 
 import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.ScheduledExecutorService;
@@ -363,13 +365,13 @@
     /**
      * Resolves a reference parameter in the registry and removes it from the map. 
      * 
-     * @param <T>           type of object to lookup in th registry.
+     * @param <T>           type of object to lookup in the 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.
+     * @param type          type of object to lookup in the registry.
+     * @param defaultValue  default value to use if either the parameter map doesn't 
+     *                      contain the key or the registry doesn't contain an object
+     *                      of requested type.
      * @return the referenced object, the default value or <code>null</code>.
      */
     public <T> T resolveAndRemoveReferenceParameter(Map<String, Object> parameters, String key, Class<T> type, T defaultValue) {
@@ -385,6 +387,54 @@
     }
     
     /**
+     * Resolves a reference list parameter in the registry and removes it from
+     * the map.
+     * 
+     * @param parameters
+     *            parameter map.
+     * @param key
+     *            parameter map key.
+     * @param elementType
+     *            result list element type.
+     * @return the list of referenced objects or an empty list, never
+     *         <code>null</code>.
+     * @see EndpointHelper#resolveReferenceListParameter(CamelContext, String, Class)
+     */
+    public <T> List<T> resolveAndRemoveReferenceListParameter(Map<String, Object> parameters, String key, Class<T> elementType) {
+        return resolveAndRemoveReferenceListParameter(parameters, key, elementType, new ArrayList<T>(0));
+    }
+
+    /**
+     * Resolves a reference list parameter in the registry and removes it from
+     * the map.
+     * 
+     * @param parameters
+     *            parameter map.
+     * @param key
+     *            parameter map key.
+     * @param elementType
+     *            result list element type.
+     * @param defaultValue
+     *            default value to use if either the parameter map doesn't
+     *            contain the key or the lookup for none of the references
+     *            was successful.
+     * @return the list of referenced objects, the default value or an empty list, never
+     *         <code>null</code>.
+     * @see EndpointHelper#resolveReferenceListParameter(CamelContext, String, Class)
+     */
+    public <T> List<T> resolveAndRemoveReferenceListParameter(Map<String, Object> parameters, String key, Class<T> elementType, List<T>  defaultValue) {
+        String value = getAndRemoveParameter(parameters, key, String.class);
+        if (EndpointHelper.isReferenceParameter(value)) {
+            List<T> result = EndpointHelper.resolveReferenceListParameter(getCamelContext(), value.toString(), elementType);
+            return result.isEmpty() ? defaultValue : result;
+        } else if (value == null) {
+            return defaultValue;
+        } else {
+            throw new IllegalArgumentException("Parameter value " + value + " is not a valid reference (list)");
+        }
+    }
+    
+    /**
      * 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=885767&r1=885766&r2=885767&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 Dec  1 14:28:18 2009
@@ -16,7 +16,11 @@
  */
 package org.apache.camel.util;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.regex.PatternSyntaxException;
 
@@ -163,7 +167,6 @@
      * @param parameters parameters
      * @throws Exception is thrown if setting property fails
      */
-    @SuppressWarnings("unchecked")
     public static void setReferenceProperties(CamelContext context, Object bean, Map<String, Object> parameters) throws Exception {
         Iterator<Map.Entry<String, Object>> it = parameters.entrySet().iterator();
         while (it.hasNext()) {
@@ -194,7 +197,7 @@
      * @return <tt>true</tt> if its a reference parameter
      */
     public static boolean isReferenceParameter(String parameter) {
-        return parameter != null && parameter.startsWith("#");
+        return parameter != null && parameter.trim().startsWith("#");
     }
     
     /**
@@ -209,6 +212,56 @@
     public static <T> T resolveReferenceParameter(CamelContext context, String value, Class<T> type) {
         assert isReferenceParameter(value);
         return context.getRegistry().lookup(value.substring(1), type);
+        
+    }
+
+    /**
+     * Resolves a reference list parameter by making lookups in the registry.
+     * The parameter value must be one of the following:
+     * <ul>
+     * <li>a comma-separated list of references to beans of type T</li>
+     * <li>a single reference to a bean type T</li>
+     * <li>a single reference to a bean of type java.util.List</li>
+     * </ul>
+     * Only bean lookup results that are not <code>null</code> are added to the
+     * result list.
+     * 
+     * @param context
+     *            Camel content to use for lookup.
+     * @param value
+     *            reference parameter value.
+     * @param elementType
+     *            result list element type.
+     * @return list of non-null lookup results or an empty list, never
+     *         <code>null</code>.
+     */
+    @SuppressWarnings("unchecked")
+    public static <T> List<T> resolveReferenceListParameter(CamelContext context, String value, Class<T> elementType) {
+        if (value == null) {
+            return Collections.emptyList();
+        }
+        List<String> elements = Arrays.asList(value.split(","));
+        if (elements.size() == 1) {
+            Object bean = resolveReferenceParameter(context, elements.get(0).trim(), Object.class);
+            if (bean instanceof List) {
+                // The bean is a list
+                return (List)bean;
+            } else if (elementType.isInstance(bean)) {
+                // The bean is a list element
+                return (List<T>)Arrays.asList(bean);
+            } else {
+                return Collections.emptyList();
+            }
+        } else { // more than one list element
+            ArrayList<T> result = new ArrayList<T>(elements.size());
+            for (String element : elements) {
+                T bean = resolveReferenceParameter(context, element.trim(), elementType);
+                if (bean != null) {
+                    result.add(bean);
+                }
+            }
+            return result;
+        }
     }
     
 }

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=885767&r1=885766&r2=885767&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 Dec  1 14:28:18 2009
@@ -16,8 +16,10 @@
  */
 package org.apache.camel.impl;
 
+import java.util.Arrays;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.camel.CamelContext;
@@ -130,6 +132,54 @@
         }
     }
 
+    public void testResolveAndRemoveReferenceListParameterElement() {
+        Map<String, Object> parameters = new HashMap<String, Object>();
+        parameters.put("dates", "#bean1");
+        MyComponent my = new MyComponent(this.context);
+        List<Date> values = my.resolveAndRemoveReferenceListParameter(parameters, "dates", Date.class);
+        assertEquals(1, values.size());
+        assertEquals(new Date(10), values.get(0));
+    }
+    
+    public void testResolveAndRemoveReferenceListParameterListComma() {
+        Map<String, Object> parameters = new HashMap<String, Object>();
+        parameters.put("dates", "#bean1,#bean2");
+        MyComponent my = new MyComponent(this.context);
+        List<Date> values = my.resolveAndRemoveReferenceListParameter(parameters, "dates", Date.class);
+        assertEquals(2, values.size());
+        assertEquals(new Date(10), values.get(0));
+        assertEquals(new Date(11), values.get(1));
+    }
+
+    public void testResolveAndRemoveReferenceListParameterListCommaTrim() {
+        Map<String, Object> parameters = new HashMap<String, Object>();
+        parameters.put("dates", " #bean1 , #bean2 ");
+        MyComponent my = new MyComponent(this.context);
+        List<Date> values = my.resolveAndRemoveReferenceListParameter(parameters, "dates", Date.class);
+        assertEquals(2, values.size());
+        assertEquals(new Date(10), values.get(0));
+        assertEquals(new Date(11), values.get(1));
+    }
+
+    public void testResolveAndRemoveReferenceListParameterListBean() {
+        Map<String, Object> parameters = new HashMap<String, Object>();
+        parameters.put("dates", "#listBean");
+        MyComponent my = new MyComponent(this.context);
+        List<Date> values = my.resolveAndRemoveReferenceListParameter(parameters, "dates", Date.class);
+        assertEquals(2, values.size());
+        assertEquals(new Date(10), values.get(0));
+        assertEquals(new Date(11), values.get(1));
+    }
+
+    public void testResolveAndRemoveReferenceListParameterInvalidBean() {
+        Map<String, Object> parameters = new HashMap<String, Object>();
+        parameters.put("dates", "#bean1,#bean3");
+        MyComponent my = new MyComponent(this.context);
+        List<Date> values = my.resolveAndRemoveReferenceListParameter(parameters, "dates", Date.class);
+        assertEquals(1, values.size());
+        assertEquals(new Date(10), values.get(0));
+    }
+
     public void testContextShouldBeSet() throws Exception {
         MyComponent my = new MyComponent(null);
         try {
@@ -141,8 +191,13 @@
     }
 
     protected JndiRegistry createRegistry() throws Exception {
+        Date bean1 = new Date(10);
+        Date bean2 = new Date(11);
         JndiRegistry jndiRegistry = super.createRegistry();
         jndiRegistry.bind("beginning", new Date(0));
+        jndiRegistry.bind("bean1", bean1);
+        jndiRegistry.bind("bean2", bean2);
+        jndiRegistry.bind("listBean", Arrays.asList(bean1, bean2));
         return jndiRegistry;
     }