Agreed - would have thought something like using
Class.isAssignableFrom() (which I always tend to get the wrong way
around first time I use it :)

2008/8/21 Claus Ibsen <[EMAIL PROTECTED]>:
> Hi
>
> Hadrian. Nice patch, lovely that we got a type convert with the Exchange now.
>
> I looked at the patch as I was wondering how you had implemented this and how 
> to use it as its something I need also - especially for encoding.
>
> However I was wondering if the == Exchange.class is in order? We wont get in 
> trouble if it's a FileExchange or something?
>
>
> +    protected boolean isValidConverterMethod(Method method) {
> +       Class<?>[] parameterTypes = method.getParameterTypes();
> +        return (parameterTypes != null) &&
> +           (parameterTypes.length == 1 || (parameterTypes.length == 2 && 
> parameterTypes[1] == Exchange.class));
> +    }
>
> Med venlig hilsen
>
> Claus Ibsen
> ......................................
> Silverbullet
> Skovsgårdsvænget 21
> 8362 Hørning
> Tlf. +45 2962 7576
> Web: www.silverbullet.dk
>
> -----Original Message-----
> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]
> Sent: 21. august 2008 02:13
> To: [EMAIL PROTECTED]
> Subject: svn commit: r687515 - in /activemq/camel/trunk: 
> camel-core/src/main/java/org/apache/camel/ 
> camel-core/src/main/java/org/apache/camel/builder/ 
> camel-core/src/main/java/org/apache/camel/impl/ 
> camel-core/src/main/java/org/apache/camel/impl/converter/ came...
>
> Author: hadrian
> Date: Wed Aug 20 17:13:01 2008
> New Revision: 687515
>
> URL: http://svn.apache.org/viewvc?rev=687515&view=rev
> Log:
> CAMEL-115.
>
> Added:
>    
> activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/InstanceMethodWithExchangeTestConverter.java
>    
> activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/MyBean.java
>    
> activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/StaticMethodWithExchangeTestConverter.java
> Modified:
>    
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/TypeConverter.java
>    
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java
>    
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java
>    
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultMessage.java
>    
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/MessageSupport.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/ArrayTypeConverter.java
>    
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/AsyncProcessorTypeConverter.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/EnumTypeConverter.java
>    
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/InstanceMethodTypeConverter.java
>    
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/PropertyEditorTypeConverter.java
>    
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/StaticMethodTypeConverter.java
>    
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/ToStringTypeConverter.java
>    
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ExchangeHelper.java
>    
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ExpressionHelper.java
>    
> activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/ConverterTest.java
>    
> activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/JaxpTest.java
>    
> activemq/camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/dataformat/hl7/HL7Converter.java
>    
> activemq/camel/trunk/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/FallbackTypeConverter.java
>    
> activemq/camel/trunk/components/camel-jaxb/src/test/java/org/apache/camel/example/JAXBConvertTest.java
>    
> activemq/camel/trunk/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrProducer.java
>    
> activemq/camel/trunk/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailBinding.java
>
> 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=687515&r1=687514&r2=687515&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
>  Wed Aug 20 17:13:01 2008
> @@ -33,4 +33,17 @@
>      * @return the converted value or null if it can not be converted
>      */
>     <T> T convertTo(Class<T> type, Object value);
> +
> +    /**
> +     * Converts the value to the specified type in the context of an exchange
> +     *
> +     * @param type the requested type
> +     * @param current exchange
> +     * @param value the value to be converted
> +     * @return the converted value or null if it can not be converted
> +     *
> +     * Used when conversion requires extra information from the current
> +     * exchange (such as encoding).
> +     */
> +    <T> T convertTo(Class<T> type, Exchange exchange, Object value);
>  }
>
> Modified: 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java
> URL: 
> http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java?rev=687515&r1=687514&r2=687515&view=diff
> ==============================================================================
> --- 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java
>  (original)
> +++ 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java
>  Wed Aug 20 17:13:01 2008
> @@ -384,7 +384,7 @@
>         return new Expression<E>() {
>             public Object evaluate(E exchange) {
>                 Object value = expression.evaluate(exchange);
> -                return 
> exchange.getContext().getTypeConverter().convertTo(type, value);
> +                return 
> exchange.getContext().getTypeConverter().convertTo(type, exchange, value);
>             }
>
>             @Override
> @@ -520,7 +520,7 @@
>      */
>     public static <E extends Exchange> String 
> evaluateStringExpression(Expression<E> expression, E exchange) {
>         Object value = expression.evaluate(exchange);
> -        return 
> exchange.getContext().getTypeConverter().convertTo(String.class, value);
> +        return 
> exchange.getContext().getTypeConverter().convertTo(String.class, exchange, 
> value);
>     }
>
>     /**
>
> Modified: 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java
> URL: 
> http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java?rev=687515&r1=687514&r2=687515&view=diff
> ==============================================================================
> --- 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java
>  (original)
> +++ 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java
>  Wed Aug 20 17:13:01 2008
> @@ -144,7 +144,7 @@
>             validateExchangePropertyIsExpectedType(property, type, value);
>         }
>
> -        return getContext().getTypeConverter().convertTo(type, value);
> +        return getContext().getTypeConverter().convertTo(type, this, value);
>     }
>
>     public void setProperty(String name, Object value) {
>
> Modified: 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultMessage.java
> URL: 
> http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultMessage.java?rev=687515&r1=687514&r2=687515&view=diff
> ==============================================================================
> --- 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultMessage.java
>  (original)
> +++ 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultMessage.java
>  Wed Aug 20 17:13:01 2008
> @@ -22,6 +22,7 @@
>
>  import javax.activation.DataHandler;
>
> +import org.apache.camel.Exchange;
>  import org.apache.camel.Message;
>
>  /**
> @@ -44,7 +45,8 @@
>
>     public <T> T getHeader(String name, Class<T> type) {
>         Object value = getHeader(name);
> -        return getExchange().getContext().getTypeConverter().convertTo(type, 
> value);
> +        Exchange e = getExchange();
> +        return e.getContext().getTypeConverter().convertTo(type, e, value);
>     }
>
>     public void setHeader(String name, Object value) {
>
> Modified: 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/MessageSupport.java
> URL: 
> http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/MessageSupport.java?rev=687515&r1=687514&r2=687515&view=diff
> ==============================================================================
> --- 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/MessageSupport.java
>  (original)
> +++ 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/MessageSupport.java
>  Wed Aug 20 17:13:01 2008
> @@ -56,7 +56,7 @@
>             CamelContext camelContext = e.getContext();
>             if (camelContext != null) {
>                 TypeConverter converter = camelContext.getTypeConverter();
> -                T answer = converter.convertTo(type, body);
> +                T answer = converter.convertTo(type, e, body);
>                 if (answer == null) {
>                     // lets first try converting the message itself first
>                     // as for some types like InputStream v Reader its more 
> efficient to do the transformation
> @@ -77,7 +77,7 @@
>     public <T> void setBody(Object value, Class<T> type) {
>         Exchange e = getExchange();
>         if (e != null) {
> -            T v = e.getContext().getTypeConverter().convertTo(type, value);
> +            T v = e.getContext().getTypeConverter().convertTo(type, e, 
> value);
>             if (v != null) {
>                 value = v;
>             }
>
> 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=687515&r1=687514&r2=687515&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
>  Wed Aug 20 17:13:01 2008
> @@ -16,7 +16,6 @@
>  */
>  package org.apache.camel.impl.converter;
>
> -
>  import java.io.BufferedReader;
>  import java.io.IOException;
>  import java.io.InputStreamReader;
> @@ -33,6 +32,7 @@
>  import static java.lang.reflect.Modifier.isStatic;
>
>  import org.apache.camel.Converter;
> +import org.apache.camel.Exchange;
>  import org.apache.camel.TypeConverter;
>  import org.apache.camel.util.ObjectHelper;
>  import org.apache.camel.util.ResolverUtil;
> @@ -40,7 +40,6 @@
>  import org.apache.commons.logging.Log;
>  import org.apache.commons.logging.LogFactory;
>
> -
>  /**
>  * A class which will auto-discover converter objects and methods to pre-load
>  * the registry of converters on startup
> @@ -141,25 +140,21 @@
>             for (Method method : methods) {
>                 Converter annotation = method.getAnnotation(Converter.class);
>                 if (annotation != null) {
> -                    Class<?>[] parameterTypes = method.getParameterTypes();
> -                    if (parameterTypes == null || parameterTypes.length != 
> 1) {
> -                        LOG.warn("Ignoring bad converter on type: " + 
> type.getName() + " method: " + method
> -                                + " as a converter method should have one 
> parameter");
> -                    } else {
> +                    if (isValidConverterMethod(method)) {
>                         int modifiers = method.getModifiers();
>                         if (isAbstract(modifiers) || !isPublic(modifiers)) {
>                             LOG.warn("Ignoring bad converter on type: " + 
> type.getName() + " method: " + method
>                                     + " as a converter method is not a public 
> and concrete method");
>                         } else {
> -                            Class toType = method.getReturnType();
> +                            Class<?> toType = method.getReturnType();
>                             if (toType.equals(Void.class)) {
>                                 LOG.warn("Ignoring bad converter on type: " + 
> type.getName() + " method: "
>                                         + method + " as a converter method 
> returns a void method");
>                             } else {
> -                                Class fromType = parameterTypes[0];
> +                                Class<?> fromType = 
> method.getParameterTypes()[0];
>                                 if (isStatic(modifiers)) {
>                                     registerTypeConverter(registry, method, 
> toType, fromType,
> -                                                          new 
> StaticMethodTypeConverter(method));
> +                                            new 
> StaticMethodTypeConverter(method));
>                                 } else {
>                                     if (injector == null) {
>                                         injector = new 
> CachingInjector(registry, type);
> @@ -169,9 +164,13 @@
>                                 }
>                             }
>                         }
> +                    } else {
> +                        LOG.warn("Ignoring bad converter on type: " + 
> type.getName() + " method: " + method
> +                                + " as a converter method should have one 
> parameter");
>                     }
>                 }
>             }
> +
>             Class superclass = type.getSuperclass();
>             if (superclass != null && !superclass.equals(Object.class)) {
>                 loadConverterMethods(registry, superclass);
> @@ -181,9 +180,15 @@
>         }
>     }
>
> -    protected void registerTypeConverter(TypeConverterRegistry registry, 
> Method method,
> -                                         Class toType, Class fromType, 
> TypeConverter typeConverter) {
> +    protected void registerTypeConverter(TypeConverterRegistry registry,
> +               Method method, Class toType, Class fromType, TypeConverter 
> typeConverter) {
>
>         registry.addTypeConverter(toType, fromType, typeConverter);
>     }
> +
> +    protected boolean isValidConverterMethod(Method method) {
> +       Class<?>[] parameterTypes = method.getParameterTypes();
> +        return (parameterTypes != null) &&
> +           (parameterTypes.length == 1 || (parameterTypes.length == 2 && 
> parameterTypes[1] == Exchange.class));
> +    }
>  }
>
> Modified: 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/ArrayTypeConverter.java
> URL: 
> http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/ArrayTypeConverter.java?rev=687515&r1=687514&r2=687515&view=diff
> ==============================================================================
> --- 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/ArrayTypeConverter.java
>  (original)
> +++ 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/ArrayTypeConverter.java
>  Wed Aug 20 17:13:01 2008
> @@ -22,6 +22,7 @@
>  import java.util.Collection;
>  import java.util.List;
>
> +import org.apache.camel.Exchange;
>  import org.apache.camel.TypeConverter;
>
>  /**
> @@ -71,4 +72,8 @@
>         }
>         return null;
>     }
> +
> +    public <T> T convertTo(Class<T> type, Exchange exchange, Object value) {
> +       return convertTo(type, value);
> +    }
>  }
>
> Modified: 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/AsyncProcessorTypeConverter.java
> URL: 
> http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/AsyncProcessorTypeConverter.java?rev=687515&r1=687514&r2=687515&view=diff
> ==============================================================================
> --- 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/AsyncProcessorTypeConverter.java
>  (original)
> +++ 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/AsyncProcessorTypeConverter.java
>  Wed Aug 20 17:13:01 2008
> @@ -65,6 +65,10 @@
>         return null;
>     }
>
> +    public <T> T convertTo(Class<T> toType, Exchange exchange, Object value) 
> {
> +       return convertTo(toType, value);
> +    }
> +
>     public static AsyncProcessor convert(Processor value) {
>         if (value instanceof AsyncProcessor) {
>             return (AsyncProcessor)value;
>
> 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=687515&r1=687514&r2=687515&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
>  Wed Aug 20 17:13:01 2008
> @@ -18,11 +18,12 @@
>
>  import java.io.IOException;
>  import java.util.ArrayList;
> -import java.util.HashMap;
>  import java.util.List;
>  import java.util.Map;
>  import java.util.Set;
> +import java.util.concurrent.ConcurrentHashMap;
>
> +import org.apache.camel.Exchange;
>  import org.apache.camel.RuntimeCamelException;
>  import org.apache.camel.TypeConverter;
>  import org.apache.camel.spi.Injector;
> @@ -41,7 +42,7 @@
>  */
>  public class DefaultTypeConverter implements TypeConverter, 
> TypeConverterRegistry {
>     private static final transient Log LOG = 
> LogFactory.getLog(DefaultTypeConverter.class);
> -    private final Map<TypeMapping, TypeConverter> typeMappings = new 
> HashMap<TypeMapping, TypeConverter>();
> +    private final Map<TypeMapping, TypeConverter> typeMappings = new 
> ConcurrentHashMap<TypeMapping, TypeConverter>();
>     private Injector injector;
>     private List<TypeConverterLoader> typeConverterLoaders = new 
> ArrayList<TypeConverterLoader>();
>     private List<TypeConverter> fallbackConverters = new 
> ArrayList<TypeConverter>();
> @@ -57,31 +58,36 @@
>         addFallbackConverter(new EnumTypeConverter());
>     }
>
> -    public <T> T convertTo(Class<T> toType, Object value) {
> -        if (toType.isInstance(value)) {
> -            return toType.cast(value);
> +    public <T> T convertTo(Class<T> type, Object value) {
> +        return convertTo(type, null, value);
> +    }
> +
> +       @SuppressWarnings("unchecked")
> +       public <T> T convertTo(Class<T> type, Exchange exchange, Object 
> value) {
> +        if (type.isInstance(value)) {
> +            return type.cast(value);
>         }
>         checkLoaded();
> -        TypeConverter converter = getOrFindTypeConverter(toType, value);
> +        TypeConverter converter = getOrFindTypeConverter(type, value);
>         if (converter != null) {
> -            return converter.convertTo(toType, value);
> +            return converter.convertTo(type, exchange, value);
>         }
>
>         for (TypeConverter fallback : fallbackConverters) {
> -            T rc = fallback.convertTo(toType, value);
> +            T rc = fallback.convertTo(type, exchange, value);
>             if (rc != null) {
>                 return rc;
>             }
>         }
>
>         // lets avoid NullPointerException when converting to boolean for 
> null values
> -        if (boolean.class.isAssignableFrom(toType)) {
> +        if (boolean.class.isAssignableFrom(type)) {
>             return (T) Boolean.FALSE;
>         }
> -        if (toType.isPrimitive()) {
> -            Class primitiveType = 
> ObjectHelper.convertPrimitiveTypeToWrapperType(toType);
> -            if (primitiveType != toType) {
> -                return (T) convertTo(primitiveType, value);
> +        if (type.isPrimitive()) {
> +            Class primitiveType = 
> ObjectHelper.convertPrimitiveTypeToWrapperType(type);
> +            if (primitiveType != type) {
> +                return (T) convertTo(primitiveType, exchange, value);
>             }
>         }
>         return null;
> @@ -108,9 +114,7 @@
>
>     public TypeConverter getTypeConverter(Class toType, Class fromType) {
>         TypeMapping key = new TypeMapping(toType, fromType);
> -        synchronized (typeMappings) {
> -            return typeMappings.get(key);
> -        }
> +        return typeMappings.get(key);
>     }
>
>     public Injector getInjector() {
>
> Modified: 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/EnumTypeConverter.java
> URL: 
> http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/EnumTypeConverter.java?rev=687515&r1=687514&r2=687515&view=diff
> ==============================================================================
> --- 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/EnumTypeConverter.java
>  (original)
> +++ 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/EnumTypeConverter.java
>  Wed Aug 20 17:13:01 2008
> @@ -18,6 +18,7 @@
>
>  import java.lang.reflect.Method;
>
> +import org.apache.camel.Exchange;
>  import org.apache.camel.RuntimeCamelException;
>  import org.apache.camel.TypeConverter;
>  import org.apache.camel.util.ObjectHelper;
> @@ -44,4 +45,9 @@
>         }
>         return null;
>     }
> +
> +       public <T> T convertTo(Class<T> type, Exchange exchange, Object 
> value) {
> +               // ignore exchange
> +               return convertTo(type, value);
> +       }
>  }
> \ No newline at end of file
>
> Modified: 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/InstanceMethodTypeConverter.java
> URL: 
> http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/InstanceMethodTypeConverter.java?rev=687515&r1=687514&r2=687515&view=diff
> ==============================================================================
> --- 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/InstanceMethodTypeConverter.java
>  (original)
> +++ 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/InstanceMethodTypeConverter.java
>  Wed Aug 20 17:13:01 2008
> @@ -18,6 +18,7 @@
>
>  import java.lang.reflect.Method;
>
> +import org.apache.camel.Exchange;
>  import org.apache.camel.RuntimeCamelException;
>  import org.apache.camel.TypeConverter;
>  import org.apache.camel.util.ObjectHelper;
> @@ -31,10 +32,12 @@
>  public class InstanceMethodTypeConverter implements TypeConverter {
>     private final CachingInjector injector;
>     private final Method method;
> +    private final boolean useExchange;
>
>     public InstanceMethodTypeConverter(CachingInjector injector, Method 
> method) {
>         this.injector = injector;
>         this.method = method;
> +        this.useExchange = method.getParameterTypes().length == 2;
>     }
>
>     @Override
> @@ -43,10 +46,16 @@
>     }
>
>     public <T> T convertTo(Class<T> type, Object value) {
> +        return convertTo(type, null, value);
> +    }
> +
> +       public <T> T convertTo(Class<T> type, Exchange exchange, Object 
> value) {
>         Object instance = injector.newInstance();
>         if (instance == null) {
>             throw new RuntimeCamelException("Could not instantiate an 
> instance of: " + type.getName());
>         }
> -        return (T) ObjectHelper.invokeMethod(method, instance, value);
> -    }
> +        return useExchange ?
> +            (T) ObjectHelper.invokeMethod(method, instance, value, exchange) 
> :
> +            (T) ObjectHelper.invokeMethod(method, instance, value);
> +       }
>  }
>
> Modified: 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/PropertyEditorTypeConverter.java
> URL: 
> http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/PropertyEditorTypeConverter.java?rev=687515&r1=687514&r2=687515&view=diff
> ==============================================================================
> --- 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/PropertyEditorTypeConverter.java
>  (original)
> +++ 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/PropertyEditorTypeConverter.java
>  Wed Aug 20 17:13:01 2008
> @@ -19,6 +19,7 @@
>  import java.beans.PropertyEditor;
>  import java.beans.PropertyEditorManager;
>
> +import org.apache.camel.Exchange;
>  import org.apache.camel.TypeConverter;
>  import org.apache.camel.util.ObjectHelper;
>
> @@ -59,4 +60,7 @@
>         return null;
>     }
>
> +    public <T> T convertTo(Class<T> type, Exchange exchange, Object value) {
> +       return convertTo(type, value);
> +    }
>  }
>
> Modified: 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/StaticMethodTypeConverter.java
> URL: 
> http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/StaticMethodTypeConverter.java?rev=687515&r1=687514&r2=687515&view=diff
> ==============================================================================
> --- 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/StaticMethodTypeConverter.java
>  (original)
> +++ 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/StaticMethodTypeConverter.java
>  Wed Aug 20 17:13:01 2008
> @@ -18,6 +18,7 @@
>
>  import java.lang.reflect.Method;
>
> +import org.apache.camel.Exchange;
>  import org.apache.camel.TypeConverter;
>  import org.apache.camel.util.ObjectHelper;
>
> @@ -28,9 +29,11 @@
>  */
>  public class StaticMethodTypeConverter implements TypeConverter {
>     private final Method method;
> +    private final boolean useExchange;
>
>     public StaticMethodTypeConverter(Method method) {
>         this.method = method;
> +        this.useExchange = method.getParameterTypes().length == 2;
>     }
>
>     @Override
> @@ -39,6 +42,12 @@
>     }
>
>     public <T> T convertTo(Class<T> type, Object value) {
> -        return (T) ObjectHelper.invokeMethod(method, null, value);
> +        return convertTo(type, null, value);
>     }
> +
> +       public <T> T convertTo(Class<T> type, Exchange exchange, Object 
> value) {
> +        return useExchange ?
> +            (T) ObjectHelper.invokeMethod(method, null, value, exchange) :
> +            (T) ObjectHelper.invokeMethod(method, null, value);
> +       }
>  }
>
> Modified: 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/ToStringTypeConverter.java
> URL: 
> http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/ToStringTypeConverter.java?rev=687515&r1=687514&r2=687515&view=diff
> ==============================================================================
> --- 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/ToStringTypeConverter.java
>  (original)
> +++ 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/ToStringTypeConverter.java
>  Wed Aug 20 17:13:01 2008
> @@ -16,6 +16,7 @@
>  */
>  package org.apache.camel.impl.converter;
>
> +import org.apache.camel.Exchange;
>  import org.apache.camel.TypeConverter;
>
>  /**
> @@ -35,4 +36,7 @@
>         return null;
>     }
>
> +    public <T> T convertTo(Class<T> type, Exchange exchange, Object value) {
> +       return convertTo(type, value);
> +    }
>  }
>
> Modified: 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ExchangeHelper.java
> URL: 
> http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ExchangeHelper.java?rev=687515&r1=687514&r2=687515&view=diff
> ==============================================================================
> --- 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ExchangeHelper.java
>  (original)
> +++ 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ExchangeHelper.java
>  Wed Aug 20 17:13:01 2008
> @@ -172,7 +172,7 @@
>      * not be converted
>      */
>     public static <T> T convertToType(Exchange exchange, Class<T> type, 
> Object value) {
> -        return exchange.getContext().getTypeConverter().convertTo(type, 
> value);
> +        return exchange.getContext().getTypeConverter().convertTo(type, 
> exchange, value);
>     }
>
>     /**
>
> Modified: 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ExpressionHelper.java
> URL: 
> http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ExpressionHelper.java?rev=687515&r1=687514&r2=687515&view=diff
> ==============================================================================
> --- 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ExpressionHelper.java
>  (original)
> +++ 
> activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ExpressionHelper.java
>  Wed Aug 20 17:13:01 2008
> @@ -55,6 +55,6 @@
>     public static <T, E extends Exchange> T evaluateAsType(Expression<E> 
> expression, E exchange,
>                                                            Class<T> 
> resultType) {
>         Object value = expression.evaluate(exchange);
> -        return 
> exchange.getContext().getTypeConverter().convertTo(resultType, value);
> +        return 
> exchange.getContext().getTypeConverter().convertTo(resultType, exchange, 
> value);
>     }
>  }
>
> Modified: 
> activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/ConverterTest.java
> URL: 
> http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/ConverterTest.java?rev=687515&r1=687514&r2=687515&view=diff
> ==============================================================================
> --- 
> activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/ConverterTest.java
>  (original)
> +++ 
> activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/ConverterTest.java
>  Wed Aug 20 17:13:01 2008
> @@ -27,7 +27,12 @@
>  import java.util.Set;
>
>  import junit.framework.TestCase;
> +
> +import org.apache.camel.CamelContext;
> +import org.apache.camel.Exchange;
>  import org.apache.camel.TypeConverter;
> +import org.apache.camel.impl.DefaultCamelContext;
> +import org.apache.camel.impl.DefaultExchange;
>  import org.apache.camel.impl.converter.DefaultTypeConverter;
>  import org.apache.camel.util.IntrospectionSupport;
>  import org.apache.camel.util.ReflectionInjector;
> @@ -53,6 +58,11 @@
>         }
>     }
>
> +    @Override
> +    protected void setUp() throws Exception {
> +        PropertyEditorManager.registerEditor(Integer.class, 
> IntegerPropertyEditor.class);
> +    }
> +
>     public void testIntegerPropertyEditorConversion() throws Exception {
>         Integer value = converter.convertTo(Integer.class, "1000");
>         assertNotNull(value);
> @@ -181,22 +191,24 @@
>         value = converter.convertTo(Boolean.class, null);
>         assertEquals("converted boolean value", null, value);
>     }
> -
> -    public static class MyBean {
> -        private int foo;
> -
> -        public int getFoo() {
> -            return foo;
> -        }
> -
> -        public void setFoo(int foo) {
> -            this.foo = foo;
> -        }
> -    }
> -
> -    @Override
> -    protected void setUp() throws Exception {
> -        PropertyEditorManager.registerEditor(Integer.class, 
> IntegerPropertyEditor.class);
> +
> +    public void testStaticMethodConversionWithExchange() throws Exception {
> +       CamelContext camel = new DefaultCamelContext();
> +       Exchange e = new DefaultExchange(camel);
> +       e.setProperty("prefix", "foo-");
> +       MyBean bean = converter.convertTo(MyBean.class, e, "5:bar");
> +        assertEquals("converted using exchange", 5, bean.getFoo(), 5);
> +        assertEquals("converted using exchange", "foo-bar", bean.getBar());
> +    }
> +
> +    public void testInstanceMethodConversionWithExchange() throws Exception {
> +        String[] values = new String[]{"5", "bar"};
> +
> +       CamelContext camel = new DefaultCamelContext();
> +       Exchange e = new DefaultExchange(camel);
> +       e.setProperty("prefix", "foo-");
> +       MyBean bean = converter.convertTo(MyBean.class, e, values);
> +        assertEquals("converted using exchange", 5, bean.getFoo(), 5);
> +        assertEquals("converted using exchange", "foo-bar", bean.getBar());
>     }
> -
>  }
>
> Added: 
> activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/InstanceMethodWithExchangeTestConverter.java
> URL: 
> http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/InstanceMethodWithExchangeTestConverter.java?rev=687515&view=auto
> ==============================================================================
> --- 
> activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/InstanceMethodWithExchangeTestConverter.java
>  (added)
> +++ 
> activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/InstanceMethodWithExchangeTestConverter.java
>  Wed Aug 20 17:13:01 2008
> @@ -0,0 +1,30 @@
> +/**
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements.  See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You under the Apache License, Version 2.0
> + * (the "License"); you may not use this file except in compliance with
> + * the License.  You may obtain a copy of the License at
> + *
> + *      http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +package org.apache.camel.converter;
> +
> +import org.apache.camel.Converter;
> +import org.apache.camel.Exchange;
> +
> [EMAIL PROTECTED]
> +public class InstanceMethodWithExchangeTestConverter {
> +
> +    @Converter
> +    public MyBean fromArray(String[] values, Exchange exchange) {
> +        return new MyBean(Integer.parseInt(values[0]),
> +            exchange.getProperty("prefix", String.class) + values[1]);
> +    }
> +}
>
> Modified: 
> activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/JaxpTest.java
> URL: 
> http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/JaxpTest.java?rev=687515&r1=687514&r2=687515&view=diff
> ==============================================================================
> --- 
> activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/JaxpTest.java
>  (original)
> +++ 
> activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/JaxpTest.java
>  Wed Aug 20 17:13:01 2008
> @@ -57,8 +57,7 @@
>     }
>
>     public void testConvertToSource() throws Exception {
> -        Source source = converter
> -                .convertTo(Source.class, "<hello>world!</hello>");
> +        Source source = converter.convertTo(Source.class, 
> "<hello>world!</hello>");
>         assertNotNull(source);
>
>         LOG.debug("Found document: " + source);
>
> Added: 
> activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/MyBean.java
> URL: 
> http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/MyBean.java?rev=687515&view=auto
> ==============================================================================
> --- 
> activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/MyBean.java
>  (added)
> +++ 
> activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/MyBean.java
>  Wed Aug 20 17:13:01 2008
> @@ -0,0 +1,47 @@
> +/**
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements.  See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You under the Apache License, Version 2.0
> + * (the "License"); you may not use this file except in compliance with
> + * the License.  You may obtain a copy of the License at
> + *
> + *      http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +package org.apache.camel.converter;
> +
> +public class MyBean {
> +    private int foo;
> +    private String bar;
> +
> +    public MyBean() {
> +       this(0, "");
> +    }
> +
> +    public MyBean(int foo, String bar) {
> +       this.foo = foo;
> +       this.bar = bar;
> +    }
> +
> +    public int getFoo() {
> +        return foo;
> +    }
> +
> +    public void setFoo(int foo) {
> +        this.foo = foo;
> +    }
> +
> +    public String getBar() {
> +       return bar;
> +    }
> +
> +    public void setBar(String bar) {
> +       this.bar = bar;
> +    }
> +}
>
> Added: 
> activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/StaticMethodWithExchangeTestConverter.java
> URL: 
> http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/StaticMethodWithExchangeTestConverter.java?rev=687515&view=auto
> ==============================================================================
> --- 
> activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/StaticMethodWithExchangeTestConverter.java
>  (added)
> +++ 
> activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/StaticMethodWithExchangeTestConverter.java
>  Wed Aug 20 17:13:01 2008
> @@ -0,0 +1,31 @@
> +/**
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements.  See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You under the Apache License, Version 2.0
> + * (the "License"); you may not use this file except in compliance with
> + * the License.  You may obtain a copy of the License at
> + *
> + *      http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +package org.apache.camel.converter;
> +
> +import org.apache.camel.Converter;
> +import org.apache.camel.Exchange;
> +import org.apache.camel.util.ObjectHelper;
> +
> [EMAIL PROTECTED]
> +public final class StaticMethodWithExchangeTestConverter {
> +
> +    @Converter
> +    public static MyBean fromString(String text, Exchange exchange) {
> +        String[] values = ObjectHelper.splitOnCharacter(text, ":", 2);
> +        return new MyBean(Integer.parseInt(values[0]), 
> exchange.getProperty("prefix", String.class) + values[1]);
> +    }
> +}
>
> Modified: 
> activemq/camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/dataformat/hl7/HL7Converter.java
> URL: 
> http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/dataformat/hl7/HL7Converter.java?rev=687515&r1=687514&r2=687515&view=diff
> ==============================================================================
> --- 
> activemq/camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/dataformat/hl7/HL7Converter.java
>  (original)
> +++ 
> activemq/camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/dataformat/hl7/HL7Converter.java
>  Wed Aug 20 17:13:01 2008
> @@ -42,7 +42,7 @@
>
>     @Converter
>     public static Message toMessage(String body) throws HL7Exception {
> -        // replace \n with \r as HL7 uses 0x0d = \r as segment termninators
> +        // replace \n with \r as HL7 uses 0x0d = \r as segment terminators
>         body = body.replace('\n', '\r');
>
>         Parser parser = new PipeParser();
>
> Modified: 
> activemq/camel/trunk/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/FallbackTypeConverter.java
> URL: 
> http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/FallbackTypeConverter.java?rev=687515&r1=687514&r2=687515&view=diff
> ==============================================================================
> --- 
> activemq/camel/trunk/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/FallbackTypeConverter.java
>  (original)
> +++ 
> activemq/camel/trunk/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/FallbackTypeConverter.java
>  Wed Aug 20 17:13:01 2008
> @@ -29,6 +29,7 @@
>  import javax.xml.bind.util.JAXBSource;
>  import javax.xml.transform.Source;
>
> +import org.apache.camel.Exchange;
>  import org.apache.camel.RuntimeCamelException;
>  import org.apache.camel.TypeConverter;
>  import org.apache.camel.spi.TypeConverterAware;
> @@ -71,6 +72,10 @@
>         }
>     }
>
> +    public <T> T convertTo(Class<T> type, Exchange exchange, Object value) {
> +       return convertTo(type, value);
> +    }
> +
>     protected <T> boolean isJaxbType(Class<T> type) {
>         XmlRootElement element = type.getAnnotation(XmlRootElement.class);
>         boolean jaxbType = element != null;
>
> Modified: 
> activemq/camel/trunk/components/camel-jaxb/src/test/java/org/apache/camel/example/JAXBConvertTest.java
> URL: 
> http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-jaxb/src/test/java/org/apache/camel/example/JAXBConvertTest.java?rev=687515&r1=687514&r2=687515&view=diff
> ==============================================================================
> --- 
> activemq/camel/trunk/components/camel-jaxb/src/test/java/org/apache/camel/example/JAXBConvertTest.java
>  (original)
> +++ 
> activemq/camel/trunk/components/camel-jaxb/src/test/java/org/apache/camel/example/JAXBConvertTest.java
>  Wed Aug 20 17:13:01 2008
> @@ -30,7 +30,8 @@
>     protected TypeConverter converter = context.getTypeConverter();
>
>     public void testConverter() throws Exception {
> -        PurchaseOrder purchaseOrder = 
> converter.convertTo(PurchaseOrder.class, "<purchaseOrder name='foo' 
> amount='123.45' price='2.22'/>");
> +        PurchaseOrder purchaseOrder = 
> converter.convertTo(PurchaseOrder.class,
> +            "<purchaseOrder name='foo' amount='123.45' price='2.22'/>");
>
>         assertNotNull("Purchase order should not be null!", purchaseOrder);
>         assertEquals("name", "foo", purchaseOrder.getName());
>
> Modified: 
> activemq/camel/trunk/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrProducer.java
> URL: 
> http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrProducer.java?rev=687515&r1=687514&r2=687515&view=diff
> ==============================================================================
> --- 
> activemq/camel/trunk/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrProducer.java
>  (original)
> +++ 
> activemq/camel/trunk/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrProducer.java
>  Wed Aug 20 17:13:01 2008
> @@ -41,8 +41,8 @@
>             Node node = base.addNode(getNodeName(exchange));
>             TypeConverter converter = 
> exchange.getContext().getTypeConverter();
>             for (String key : exchange.getProperties().keySet()) {
> -                Value value = converter.convertTo(Value.class, exchange
> -                        .getProperty(key));
> +                Value value = converter.convertTo(Value.class,
> +                    exchange, exchange.getProperty(key));
>                 node.setProperty(key, value);
>             }
>             node.addMixin("mix:referenceable");
>
> Modified: 
> activemq/camel/trunk/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailBinding.java
> URL: 
> http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailBinding.java?rev=687515&r1=687514&r2=687515&view=diff
> ==============================================================================
> --- 
> activemq/camel/trunk/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailBinding.java
>  (original)
> +++ 
> activemq/camel/trunk/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailBinding.java
>  Wed Aug 20 17:13:01 2008
> @@ -314,7 +314,7 @@
>     }
>
>     private static String asString(Exchange exchange, Object value) {
> -        return 
> exchange.getContext().getTypeConverter().convertTo(String.class, value);
> +        return 
> exchange.getContext().getTypeConverter().convertTo(String.class, exchange, 
> value);
>     }
>
>  }
>
>
>



-- 
James
-------
http://macstrac.blogspot.com/

Open Source Integration
http://open.iona.com

Reply via email to