Repository: camel
Updated Branches:
  refs/heads/master 2c78e2f30 -> 2b4b9df67


CAMEL-9583: camel-jackson - Allow the FallbackTypeConverter to convert to/from 
string types


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/7009d640
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/7009d640
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/7009d640

Branch: refs/heads/master
Commit: 7009d64091876c3b1f9e36e074f8cc7484cfb434
Parents: 2c78e2f
Author: Claus Ibsen <davscl...@apache.org>
Authored: Wed Feb 10 08:16:35 2016 +0100
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Wed Feb 10 08:16:35 2016 +0100

----------------------------------------------------------------------
 .../component/jackson/JacksonConstants.java     |  1 +
 .../converter/JacksonTypeConverters.java        | 36 ++++++++++++++++----
 2 files changed, 30 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/7009d640/components/camel-jackson/src/main/java/org/apache/camel/component/jackson/JacksonConstants.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jackson/src/main/java/org/apache/camel/component/jackson/JacksonConstants.java
 
b/components/camel-jackson/src/main/java/org/apache/camel/component/jackson/JacksonConstants.java
index 1429dc0..d4f5c26 100644
--- 
a/components/camel-jackson/src/main/java/org/apache/camel/component/jackson/JacksonConstants.java
+++ 
b/components/camel-jackson/src/main/java/org/apache/camel/component/jackson/JacksonConstants.java
@@ -19,6 +19,7 @@ package org.apache.camel.component.jackson;
 public final class JacksonConstants {
 
     public static final String ENABLE_TYPE_CONVERTER = 
"CamelJacksonEnableTypeConverter";
+    public static final String TYPE_CONVERTER_POJO_ONLY = 
"CamelJacksonTypeConverterPojoOnly";
 
     public static final String UNMARSHAL_TYPE = "CamelJacksonUnmarshalType";
 

http://git-wip-us.apache.org/repos/asf/camel/blob/7009d640/components/camel-jackson/src/main/java/org/apache/camel/component/jackson/converter/JacksonTypeConverters.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jackson/src/main/java/org/apache/camel/component/jackson/converter/JacksonTypeConverters.java
 
b/components/camel-jackson/src/main/java/org/apache/camel/component/jackson/converter/JacksonTypeConverters.java
index 5cb2451..110b6ce 100644
--- 
a/components/camel-jackson/src/main/java/org/apache/camel/component/jackson/converter/JacksonTypeConverters.java
+++ 
b/components/camel-jackson/src/main/java/org/apache/camel/component/jackson/converter/JacksonTypeConverters.java
@@ -16,10 +16,10 @@
  */
 package org.apache.camel.component.jackson.converter;
 
-import java.util.Map;
 import java.util.Set;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule;
 import org.apache.camel.Exchange;
 import org.apache.camel.FallbackConverter;
 import org.apache.camel.component.jackson.JacksonConstants;
@@ -28,21 +28,33 @@ import org.apache.camel.spi.TypeConverterRegistry;
 
 public final class JacksonTypeConverters {
 
-    private final ObjectMapper defaultMapper = new ObjectMapper();
+    private final ObjectMapper defaultMapper;
     private boolean init;
     private Boolean enabled;
+    private boolean pojoOnly = true;
 
     public JacksonTypeConverters() {
+        defaultMapper = new ObjectMapper();
+        // Enables JAXB processing
+        JaxbAnnotationModule module = new JaxbAnnotationModule();
+        defaultMapper.registerModule(module);
     }
 
     @FallbackConverter
-    public <T> T convertTo(Class<T> type, Exchange exchange, Object value, 
TypeConverterRegistry registry) {
+    public <T> T convertTo(Class<T> type, Exchange exchange, Object value, 
TypeConverterRegistry registry) throws Exception {
 
         // only do this if enabled
         if (!init && exchange != null) {
             // init to see if this is enabled
             String text = 
exchange.getContext().getProperties().get(JacksonConstants.ENABLE_TYPE_CONVERTER);
             enabled = "true".equalsIgnoreCase(text);
+
+            // pojo only by default
+            text = 
exchange.getContext().getProperties().get(JacksonConstants.TYPE_CONVERTER_POJO_ONLY);
+            if (text != null) {
+                pojoOnly = "true".equalsIgnoreCase(text);
+            }
+
             init = true;
         }
 
@@ -50,14 +62,24 @@ public final class JacksonTypeConverters {
             return null;
         }
 
-
-        if (isNotPojoType(type)) {
+        if (pojoOnly && isNotPojoType(type)) {
             return null;
         }
 
-        if (exchange != null && value instanceof Map) {
+        if (exchange != null) {
             ObjectMapper mapper = 
resolveObjectMapper(exchange.getContext().getRegistry());
-            if (mapper.canSerialize(type)) {
+            if (String.class.isAssignableFrom(type)) {
+                String out = mapper.writeValueAsString(value);
+                return type.cast(out);
+            } else if (byte[].class.isAssignableFrom(type)) {
+                byte[] out = mapper.writeValueAsBytes(value);
+                return type.cast(out);
+            } else if (mapper.canSerialize(type)) {
+                // TODO: favor using mapper readValue
+                // if the input is string or input stream
+                if (String.class.isAssignableFrom(value.getClass())) {
+                    return mapper.readValue((String) value, type);
+                }
                 return mapper.convertValue(value, type);
             }
         }

Reply via email to