Author: davsclaus
Date: Mon Aug  2 13:33:00 2010
New Revision: 981506

URL: http://svn.apache.org/viewvc?rev=981506&view=rev
Log:
CAMEL-3019: Preparing for blob support in camel-jms. Thanks to Norman Mauer for 
patch.

Modified:
    
camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsBinding.java
    
camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConfiguration.java
    
camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessageType.java

Modified: 
camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsBinding.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsBinding.java?rev=981506&r1=981505&r2=981506&view=diff
==============================================================================
--- 
camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsBinding.java
 (original)
+++ 
camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsBinding.java
 Mon Aug  2 13:33:00 2010
@@ -450,17 +450,7 @@ public class JmsBinding {
             // force a specific type from the endpoint configuration
             type = endpoint.getConfiguration().getJmsMessageType();
         } else {
-            // let body determine the type
-            if (body instanceof Node || body instanceof String) {
-                type = Text;
-            } else if (body instanceof byte[] || body instanceof GenericFile 
|| body instanceof File || body instanceof Reader
-                    || body instanceof InputStream || body instanceof 
ByteBuffer || body instanceof StreamCache) {
-                type = Bytes;
-            } else if (body instanceof Map) {
-                type = Map;
-            } else if (body instanceof Serializable) {
-                type = Object;
-            }
+            type = getJMSMessageTypeForBody(exchange, body, headers, session, 
context);
         }
 
         // create the JmsMessage based on the type
@@ -468,40 +458,7 @@ public class JmsBinding {
             if (LOG.isTraceEnabled()) {
                 LOG.trace("Using JmsMessageType: " + type);
             }
-
-            switch (type) {
-            case Text: {
-                TextMessage message = session.createTextMessage();
-                String payload = 
context.getTypeConverter().convertTo(String.class, exchange, body);
-                message.setText(payload);
-                return message;
-            }
-            case Bytes: {
-                BytesMessage message = session.createBytesMessage();
-                byte[] payload = 
context.getTypeConverter().convertTo(byte[].class, exchange, body);
-                message.writeBytes(payload);
-                return message;
-            }
-            case Map: {
-                MapMessage message = session.createMapMessage();
-                Map payload = context.getTypeConverter().convertTo(Map.class, 
exchange, body);
-                populateMapMessage(message, payload, context);
-                return message;
-            }
-            case Object:
-                Serializable payload;
-                try {
-                    payload = 
context.getTypeConverter().mandatoryConvertTo(Serializable.class, exchange, 
body);
-                } catch (NoTypeConversionAvailableException e) {
-                    // cannot convert to serializable then thrown an exception 
to avoid sending a null message
-                    JMSException cause = new 
MessageFormatException(e.getMessage());
-                    cause.initCause(e);
-                    throw cause;
-                }
-                return session.createObjectMessage(payload);
-            default:
-                break;
-            }
+            return createJmsMessageForType(exchange, body, headers, session, 
context, type);
         }
 
         // warn if the body could not be mapped
@@ -518,6 +475,70 @@ public class JmsBinding {
     }
 
     /**
+     * Return the {...@link JmsMessageType} 
+     * 
+     * @return type or null if no mapping was possible
+     */
+    protected JmsMessageType getJMSMessageTypeForBody(Exchange exchange, 
Object body, Map<String, Object> headers, Session session, CamelContext 
context) {
+        JmsMessageType type = null;
+
+        // let body determine the type
+        if (body instanceof Node || body instanceof String) {
+            type = Text;
+        } else if (body instanceof byte[] || body instanceof GenericFile || 
body instanceof File || body instanceof Reader
+                || body instanceof InputStream || body instanceof ByteBuffer 
|| body instanceof StreamCache) {
+            type = Bytes;
+        } else if (body instanceof Map) {
+            type = Map;
+        } else if (body instanceof Serializable) {
+            type = Object;
+        }
+        return type;
+    }
+    
+    /**
+     * 
+     * Create the {...@link Message} 
+     * 
+     * @return jmsMessage or null if the mapping was not successfully
+     */
+    protected Message createJmsMessageForType(Exchange exchange, Object body, 
Map<String, Object> headers, Session session, CamelContext context, 
JmsMessageType type) throws JMSException {
+        switch (type) {
+        case Text: {
+            TextMessage message = session.createTextMessage();
+            String payload = 
context.getTypeConverter().convertTo(String.class, exchange, body);
+            message.setText(payload);
+            return message;
+        }
+        case Bytes: {
+            BytesMessage message = session.createBytesMessage();
+            byte[] payload = 
context.getTypeConverter().convertTo(byte[].class, exchange, body);
+            message.writeBytes(payload);
+            return message;
+        }
+        case Map: {
+            MapMessage message = session.createMapMessage();
+            Map payload = context.getTypeConverter().convertTo(Map.class, 
exchange, body);
+            populateMapMessage(message, payload, context);
+            return message;
+        }
+        case Object:
+            Serializable payload;
+            try {
+                payload = 
context.getTypeConverter().mandatoryConvertTo(Serializable.class, exchange, 
body);
+            } catch (NoTypeConversionAvailableException e) {
+                // cannot convert to serializable then thrown an exception to 
avoid sending a null message
+                JMSException cause = new 
MessageFormatException(e.getMessage());
+                cause.initCause(e);
+                throw cause;
+            }
+            return session.createObjectMessage(payload);
+        default:
+            break;
+        }
+        return null;
+    }
+    /**
      * Populates a {...@link MapMessage} from a {...@link Map} instance.
      */
     protected void populateMapMessage(MapMessage message, Map<?, ?> map, 
CamelContext context)

Modified: 
camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConfiguration.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConfiguration.java?rev=981506&r1=981505&r2=981506&view=diff
==============================================================================
--- 
camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConfiguration.java
 (original)
+++ 
camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConfiguration.java
 Mon Aug  2 13:33:00 2010
@@ -1090,9 +1090,21 @@ public class JmsConfiguration implements
     }
 
     public void setJmsMessageType(JmsMessageType jmsMessageType) {
+        if (jmsMessageType == JmsMessageType.Blob && !supportBlobMessage()) {
+            throw new IllegalArgumentException("BlobMessage is not supported 
by this implementation");
+        }
         this.jmsMessageType = jmsMessageType;
     }
 
+    /**
+     * Should get overridden by implementations which support BlobMessages
+     *
+     * @return false
+     */
+    protected boolean supportBlobMessage() {
+        return false;
+    }
+
     public JmsKeyFormatStrategy getJmsKeyFormatStrategy() {
         if (jmsKeyFormatStrategy == null) {
             jmsKeyFormatStrategy = new DefaultJmsKeyFormatStrategy();

Modified: 
camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessageType.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessageType.java?rev=981506&r1=981505&r2=981506&view=diff
==============================================================================
--- 
camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessageType.java
 (original)
+++ 
camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessageType.java
 Mon Aug  2 13:33:00 2010
@@ -23,6 +23,15 @@ package org.apache.camel.component.jms;
  */
 public enum JmsMessageType {
 
-    Bytes, Map, Object, Stream, Text
+    Bytes, 
+    Map, 
+    Object, 
+    Stream, 
+    Text,
+    
+    /**
+     * BlobMessage which is not supported by all JMS implementations
+     */
+    Blob
 
 }


Reply via email to