You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2008/11/14 09:33:40 UTC

svn commit: r713950 - in /activemq/camel/trunk/camel-core/src: main/java/org/apache/camel/ main/java/org/apache/camel/impl/ main/java/org/apache/camel/impl/converter/ main/java/org/apache/camel/model/ main/java/org/apache/camel/spi/ test/java/org/apach...

Author: davsclaus
Date: Fri Nov 14 00:33:39 2008
New Revision: 713950

URL: http://svn.apache.org/viewvc?rev=713950&view=rev
Log:
CAMEL-1042: TypeConverterRegistry is now exposed in the spi package. Also end users can get access to this registry from CamelContext.

Added:
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/spi/TypeConverterRegistry.java   (contents, props changed)
      - copied, changed from r713793, activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/TypeConverterRegistry.java
    activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/impl/TypeConverterRegistryTest.java   (contents, props changed)
      - copied, changed from r713793, activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextTest.java
Removed:
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/TypeConverterRegistry.java
Modified:
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/TypeConverter.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/ReportingTypeConverterLoader.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/ReportingTypeConverterRegistry.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/AnnotationTypeConverterLoader.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/CachingInjector.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/TypeConverterLoader.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorType.java

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java?rev=713950&r1=713949&r2=713950&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java Fri Nov 14 00:33:39 2008
@@ -30,6 +30,7 @@
 import org.apache.camel.spi.Language;
 import org.apache.camel.spi.LifecycleStrategy;
 import org.apache.camel.spi.Registry;
+import org.apache.camel.spi.TypeConverterRegistry;
 
 /**
  * Interface used to represent the context used to configure routes and the
@@ -222,6 +223,13 @@
     TypeConverter getTypeConverter();
 
     /**
+     * Returns the type converter registry where type converters can be added or looked up
+     *
+     * @return the type converter registry
+     */
+    TypeConverterRegistry getTypeConverterRegistry();
+
+    /**
      * Returns the registry used to lookup components by name and type such as the Spring ApplicationContext,
      * JNDI or the OSGi Service Registry
      *

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/TypeConverter.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/TypeConverter.java?rev=713950&r1=713949&r2=713950&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/TypeConverter.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/TypeConverter.java Fri Nov 14 00:33:39 2008
@@ -33,7 +33,7 @@
      * @param type the requested type
      * @param value the value to be converted
      * @return the converted value
-     * @throws {@link NoTypeConversionAvailableException} if conversion not possible
+     * @throws NoTypeConversionAvailableException if conversion not possible
      */
     <T> T convertTo(Class<T> type, Object value);
 
@@ -47,7 +47,7 @@
      * @param exchange the current exchange
      * @param value the value to be converted
      * @return the converted value
-     * @throws {@link NoTypeConversionAvailableException} if conversion not possible
+     * @throws NoTypeConversionAvailableException} if conversion not possible
      */
     <T> T convertTo(Class<T> type, Exchange exchange, Object value);
 }

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java?rev=713950&r1=713949&r2=713950&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java Fri Nov 14 00:33:39 2008
@@ -55,6 +55,7 @@
 import org.apache.camel.spi.LanguageResolver;
 import org.apache.camel.spi.LifecycleStrategy;
 import org.apache.camel.spi.Registry;
+import org.apache.camel.spi.TypeConverterRegistry;
 import org.apache.camel.util.CamelContextHelper;
 import org.apache.camel.util.FactoryFinder;
 import org.apache.camel.util.NoFactoryAvailableException;
@@ -84,6 +85,7 @@
     private List<Route> routes;
     private List<Service> servicesToClose = new ArrayList<Service>();
     private TypeConverter typeConverter;
+    private TypeConverterRegistry typeConverterRegistry;
     private ExchangeConverter exchangeConverter;
     private Injector injector;
     private ComponentResolver componentResolver;
@@ -454,6 +456,24 @@
         this.typeConverter = typeConverter;
     }
 
+    public TypeConverterRegistry getTypeConverterRegistry() {
+        if (typeConverterRegistry == null) {
+            // init type converter as its lazy
+            if (typeConverter == null) {
+                getTypeConverter();
+            }
+            // type converter is usually the default one that also is the registry
+            if (typeConverter instanceof DefaultTypeConverter) {
+                typeConverterRegistry = (DefaultTypeConverter) typeConverter;
+            } 
+        }
+        return typeConverterRegistry;
+    }
+
+    public void setTypeConverterRegistry(TypeConverterRegistry typeConverterRegistry) {
+        this.typeConverterRegistry = typeConverterRegistry;
+    }
+
     public Injector getInjector() {
         if (injector == null) {
             injector = createInjector();
@@ -684,7 +704,9 @@
      * Lazily create a default implementation
      */
     protected TypeConverter createTypeConverter() {
-        return new DefaultTypeConverter(getInjector());
+        DefaultTypeConverter answer = new DefaultTypeConverter(getInjector());
+        typeConverterRegistry = answer;
+        return answer;
     }
 
     /**

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/ReportingTypeConverterLoader.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/ReportingTypeConverterLoader.java?rev=713950&r1=713949&r2=713950&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/ReportingTypeConverterLoader.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/ReportingTypeConverterLoader.java Fri Nov 14 00:33:39 2008
@@ -23,8 +23,8 @@
 import java.util.List;
 
 import org.apache.camel.TypeConverter;
+import org.apache.camel.spi.TypeConverterRegistry;
 import org.apache.camel.impl.converter.AnnotationTypeConverterLoader;
-import org.apache.camel.impl.converter.TypeConverterRegistry;
 import org.apache.camel.util.ObjectHelper;
 
 /**

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/ReportingTypeConverterRegistry.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/ReportingTypeConverterRegistry.java?rev=713950&r1=713949&r2=713950&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/ReportingTypeConverterRegistry.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/ReportingTypeConverterRegistry.java Fri Nov 14 00:33:39 2008
@@ -20,7 +20,7 @@
 import java.util.List;
 
 import org.apache.camel.TypeConverter;
-import org.apache.camel.impl.converter.TypeConverterRegistry;
+import org.apache.camel.spi.TypeConverterRegistry;
 import org.apache.camel.spi.Injector;
 
 /**
@@ -41,6 +41,19 @@
         }
     }
 
+    public TypeConverter lookup(Class toType, Class fromType) {
+        if (errors.size() == 0) {
+            errors.add("Method should not be invoked.");
+        }
+        return null;
+    }
+
+    public void setInjector(Injector injector) {
+        if (errors.size() == 0) {
+            errors.add("Method should not be invoked.");
+        }
+    }
+
     public Injector getInjector() {
         return null;
     }

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/AnnotationTypeConverterLoader.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/AnnotationTypeConverterLoader.java?rev=713950&r1=713949&r2=713950&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/AnnotationTypeConverterLoader.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/AnnotationTypeConverterLoader.java Fri Nov 14 00:33:39 2008
@@ -20,7 +20,6 @@
 import java.io.IOException;
 import java.io.InputStreamReader;
 
-import java.lang.annotation.Annotation;
 import java.lang.reflect.Method;
 
 import java.net.URL;
@@ -35,6 +34,7 @@
 import org.apache.camel.Converter;
 import org.apache.camel.Exchange;
 import org.apache.camel.TypeConverter;
+import org.apache.camel.spi.TypeConverterRegistry;
 import org.apache.camel.util.ObjectHelper;
 import org.apache.camel.util.ResolverUtil;
 import org.apache.camel.util.WebSphereResolverUtil;

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/CachingInjector.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/CachingInjector.java?rev=713950&r1=713949&r2=713950&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/CachingInjector.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/CachingInjector.java Fri Nov 14 00:33:39 2008
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.impl.converter;
 
+import org.apache.camel.spi.TypeConverterRegistry;
+
 /**
  * A caching proxy
  *

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java?rev=713950&r1=713949&r2=713950&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java Fri Nov 14 00:33:39 2008
@@ -28,6 +28,7 @@
 import org.apache.camel.TypeConverter;
 import org.apache.camel.spi.Injector;
 import org.apache.camel.spi.TypeConverterAware;
+import org.apache.camel.spi.TypeConverterRegistry;
 import org.apache.camel.util.FactoryFinder;
 import org.apache.camel.util.NoFactoryAvailableException;
 import org.apache.camel.util.ObjectHelper;
@@ -159,7 +160,7 @@
         synchronized (typeMappings) {
             converter = typeMappings.get(key);
             if (converter == null) {
-                converter = findTypeConverter(toType, fromType, value);
+                converter = lookup(toType, fromType);
                 if (converter != null) {
                     typeMappings.put(key, converter);
                 }
@@ -168,10 +169,10 @@
         return converter;
     }
 
-    /**
-     * Tries to auto-discover any available type converters
-     */
-    protected TypeConverter findTypeConverter(Class toType, Class fromType, Object value) {
+    public TypeConverter lookup(Class toType, Class fromType) {
+        // make sure we have loaded the converters
+        checkLoaded();
+
         // lets try the super classes of the from type
         if (fromType != null) {
             Class fromSuperClass = fromType.getSuperclass();
@@ -179,7 +180,7 @@
 
                 TypeConverter converter = getTypeConverter(toType, fromSuperClass);
                 if (converter == null) {
-                    converter = findTypeConverter(toType, fromSuperClass, value);
+                    converter = lookup(toType, fromSuperClass);
                 }
                 if (converter != null) {
                     return converter;
@@ -200,7 +201,7 @@
 
                     TypeConverter converter = getTypeConverter(toType, fromSuperClass);
                     if (converter == null) {
-                        converter = findTypeConverter(toType, fromSuperClass, value);
+                        converter = lookup(toType, fromSuperClass);
                     }
                     if (converter != null) {
                         return converter;

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/TypeConverterLoader.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/TypeConverterLoader.java?rev=713950&r1=713949&r2=713950&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/TypeConverterLoader.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/TypeConverterLoader.java Fri Nov 14 00:33:39 2008
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.impl.converter;
 
+import org.apache.camel.spi.TypeConverterRegistry;
+
 /**
  * A pluggable strategy to load type converters into a registry from some kind of mechanism
  *

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorType.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorType.java?rev=713950&r1=713949&r2=713950&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorType.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorType.java Fri Nov 14 00:33:39 2008
@@ -922,10 +922,14 @@
 
     /**
      * Creates the <a
-     * href="http://activemq.apache.org/camel/delayer.html">Delayer</a> pattern
-     * where an expression is used to calculate the time which the message will
-     * be dispatched on
+     * href="http://activemq.apache.org/camel/throttler.html">Throtler</a> pattern
+     * for throttling messages to ensure that a specific endpoint does not get overloaded,
+     * or we don't exceed an agreed SLA with some external service?
+     * <p/>
+     * Will default use a time period of 1 second, so setting the maximumRequestCount to eg 10
+     * will default ensure at most 10 messages per second. 
      *
+     * @param maximumRequestCount the maximum messages 
      * @return the builder
      */
     public ThrottlerType throttler(long maximumRequestCount) {

Copied: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/spi/TypeConverterRegistry.java (from r713793, activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/TypeConverterRegistry.java)
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/spi/TypeConverterRegistry.java?p2=activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/spi/TypeConverterRegistry.java&p1=activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/TypeConverterRegistry.java&r1=713793&r2=713950&rev=713950&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/TypeConverterRegistry.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/spi/TypeConverterRegistry.java Fri Nov 14 00:33:39 2008
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.impl.converter;
+package org.apache.camel.spi;
 
 import org.apache.camel.TypeConverter;
 import org.apache.camel.spi.Injector;
@@ -27,7 +27,7 @@
 public interface TypeConverterRegistry {
 
     /**
-     * Allows a new type converter to be registered
+     * Registers a new type converter
      *
      * @param toType        the type to convert to
      * @param fromType      the type to convert from
@@ -35,5 +35,22 @@
      */
     void addTypeConverter(Class toType, Class fromType, TypeConverter typeConverter);
 
+    /**
+     * Performs a lookup for a given type converter.
+     *
+     * @param toType        the type to convert to
+     * @param fromType      the type to convert from
+     * @return the type converter or null if not found.
+     */
+    TypeConverter lookup(Class toType, Class fromType);
+
+    /**
+     * Sets the injector to be used for creating new instances during type convertions.
+     */
+    void setInjector(Injector injector);
+
+    /**
+     * Gets the injector
+     */
     Injector getInjector();
 }

Propchange: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/spi/TypeConverterRegistry.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/spi/TypeConverterRegistry.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Propchange: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/spi/TypeConverterRegistry.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/impl/TypeConverterRegistryTest.java (from r713793, activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextTest.java)
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/impl/TypeConverterRegistryTest.java?p2=activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/impl/TypeConverterRegistryTest.java&p1=activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextTest.java&r1=713793&r2=713950&rev=713950&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextTest.java (original)
+++ activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/impl/TypeConverterRegistryTest.java Fri Nov 14 00:33:39 2008
@@ -16,27 +16,72 @@
  */
 package org.apache.camel.impl;
 
+import java.io.File;
+import java.io.InputStream;
+
 import junit.framework.TestCase;
-import org.apache.camel.Component;
-import org.apache.camel.component.bean.BeanComponent;
+import org.apache.camel.Exchange;
+import org.apache.camel.TypeConverter;
 
 /**
  * @version $Revision$
  */
-public class DefaultCamelContextTest extends TestCase {
+public class TypeConverterRegistryTest extends TestCase {
 
-    public void testAutoCreateComponentsOn() {
+    public void testDefaultTypeConverterRegistry() {
         DefaultCamelContext ctx = new DefaultCamelContext();
-        Component component = ctx.getComponent("bean");
-        assertNotNull(component);
-        assertEquals(component.getClass(), BeanComponent.class);
+        assertNotNull(ctx.getTypeConverterRegistry());
+
+        // file to inputstream is a default converter in Camel 
+        TypeConverter tc = ctx.getTypeConverterRegistry().lookup(InputStream.class, File.class);
+        assertNotNull(tc);
     }
 
-    public void testAutoCreateComponentsOff() {
-        DefaultCamelContext ctx = new DefaultCamelContext();
-        ctx.setAutoCreateComponents(false);
-        Component component = ctx.getComponent("bean");
-        assertNull(component);
+    public void testAddTypeConverter() {
+        DefaultCamelContext context = new DefaultCamelContext();
+
+        // START SNIPPET: e1
+        // add our own type converter manually that converts from String -> MyOrder using MyOrderTypeConverter
+        context.getTypeConverterRegistry().addTypeConverter(MyOrder.class, String.class, new MyOrderTypeConverter());
+        // END SNIPPET: e1
+
+        // START SNIPPET: e3
+        MyOrder order = context.getTypeConverter().convertTo(MyOrder.class, "123");
+        // END SNIPPET: e3
+
+        assertNotNull(order);
+        assertEquals(123, order.getId());
+    }
+
+    private class MyOrder {
+        private int id;
+
+        public int getId() {
+            return id;
+        }
+
+        public void setId(int id) {
+            this.id = id;
+        }
+    }
+
+    // START SNIPPET: e2
+    private class MyOrderTypeConverter implements TypeConverter {
+
+        public <T> T convertTo(Class<T> type, Object value) {
+            // converter from value to the MyOrder bean
+            MyOrder order = new MyOrder();
+            order.setId(Integer.parseInt(value.toString()));
+            return (T) order;
+        }
+
+        public <T> T convertTo(Class<T> type, Exchange exchange, Object value) {
+            // this method with the Exchange parameter will be preferd by Camel to invoke
+            // this allows you to fetch information from the exchange during convertions
+            // such as an encoding parameter or the likes
+            return convertTo(type, value);
+        }
     }
+    // END SNIPPET: e2
 
 }

Propchange: activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/impl/TypeConverterRegistryTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/impl/TypeConverterRegistryTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Propchange: activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/impl/TypeConverterRegistryTest.java
------------------------------------------------------------------------------
    svn:mergeinfo =