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);
}
}