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

svn commit: r693217 - in /activemq/camel/trunk: camel-core/src/main/java/org/apache/camel/converter/ components/camel-jms/src/main/java/org/apache/camel/component/jms/ components/camel-jms/src/test/java/org/apache/camel/component/jms/

Author: davsclaus
Date: Mon Sep  8 12:38:39 2008
New Revision: 693217

URL: http://svn.apache.org/viewvc?rev=693217&view=rev
Log:
CAMEL-299: camel-jms now converts File, Reader, InputStream and ByteBuffer to javax.jms.BytesMessage instead of ObjectMessage

Added:
    activemq/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/FileRouteToJmsTest.java   (contents, props changed)
      - copied, changed from r693180, activemq/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsRouteToFileTest.java
    activemq/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/PayloadByteArrayJmsTest.java   (with props)
Modified:
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/converter/IOConverter.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/converter/NIOConverter.java
    activemq/camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsBinding.java

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/converter/IOConverter.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/converter/IOConverter.java?rev=693217&r1=693216&r2=693217&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/converter/IOConverter.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/converter/IOConverter.java Mon Sep  8 12:38:39 2008
@@ -42,7 +42,6 @@
 import java.io.UnsupportedEncodingException;
 import java.io.Writer;
 import java.net.URL;
-import java.nio.charset.Charset;
 import java.util.Properties;
 
 import javax.xml.transform.OutputKeys;
@@ -117,7 +116,6 @@
 
     @Converter
     public static StringReader toReader(String text) {
-        // TODO could we automatically find this?
         return new StringReader(text);
     }
 
@@ -159,6 +157,20 @@
     }
 
     @Converter
+    public static byte[] toByteArray(File file) throws IOException {
+        return toBytes(toInputStream(file));
+    }
+
+    @Converter
+    public static byte[] toByteArray(Reader reader) throws IOException {
+        if (reader instanceof BufferedReader) {
+            return toByteArray((BufferedReader)reader);
+        } else {
+            return toByteArray(new BufferedReader(reader));
+        }
+    }
+
+    @Converter
     public static String toString(URL url) throws IOException {
         return toString(toInputStream(url));
     }
@@ -196,28 +208,38 @@
     }
 
     @Converter
+    public static byte[] toByteArray(BufferedReader reader) throws IOException {
+        if (reader == null) {
+            return null;
+        }
+
+        StringBuilder sb = new StringBuilder(1024);
+        char[] buf = new char[1024];
+        try {
+            int len = reader.read(buf);
+            if (len != -1) {
+                sb.append(buf, 0, len);
+            }
+        } finally {
+            try {
+                reader.close();
+            } catch (IOException e) {
+                LOG.warn("Failed to close stream: " + e, e);
+            }
+        }
+        return sb.toString().getBytes();
+    }
+
+    @Converter
     public static String toString(InputStream in) throws IOException {
         return toString(toReader(in));
     }
 
+    @Converter
     public static String toString(Source source) throws TransformerException, IOException {
         return toString(source, null);
     }
 
-    public static String toString(Source source, Properties props) throws TransformerException, IOException {
-        ByteArrayOutputStream bos = new ByteArrayOutputStream();
-        StreamResult sr = new StreamResult(bos);
-        Transformer trans = TransformerFactory.newInstance().newTransformer();
-        if (props == null) {
-            props = new Properties();
-            props.put(OutputKeys.OMIT_XML_DECLARATION, "yes");
-        }
-        trans.setOutputProperties(props);
-        trans.transform(source, sr);
-        bos.close();
-        return bos.toString();
-    }
-
     @Converter
     public static InputStream toInputStream(byte[] data) {
         return new ByteArrayInputStream(data);
@@ -257,4 +279,22 @@
         }
         bos.flush();
     }
+
+    protected static String toString(Source source, Properties props) throws TransformerException, IOException {
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        try {
+            StreamResult sr = new StreamResult(bos);
+            Transformer trans = TransformerFactory.newInstance().newTransformer();
+            if (props == null) {
+                props = new Properties();
+                props.put(OutputKeys.OMIT_XML_DECLARATION, "yes");
+            }
+            trans.setOutputProperties(props);
+            trans.transform(source, sr);
+        } finally {
+            bos.close();
+        }
+        return bos.toString();
+    }
+
 }

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/converter/NIOConverter.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/converter/NIOConverter.java?rev=693217&r1=693216&r2=693217&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/converter/NIOConverter.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/converter/NIOConverter.java Mon Sep  8 12:38:39 2008
@@ -23,7 +23,6 @@
 import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
 import java.nio.ByteBuffer;
-import java.nio.charset.Charset;
 
 import org.apache.camel.Converter;
 import org.apache.camel.Exchange;

Modified: activemq/camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsBinding.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsBinding.java?rev=693217&r1=693216&r2=693217&view=diff
==============================================================================
--- activemq/camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsBinding.java (original)
+++ activemq/camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsBinding.java Mon Sep  8 12:38:39 2008
@@ -17,6 +17,9 @@
 package org.apache.camel.component.jms;
 
 import java.io.Serializable;
+import java.io.File;
+import java.io.Reader;
+import java.io.InputStream;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.util.Date;
@@ -24,6 +27,7 @@
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
+import java.nio.ByteBuffer;
 
 import javax.jms.BytesMessage;
 import javax.jms.Destination;
@@ -319,13 +323,19 @@
                 populateMapMessage(result, map, context);
                 return result;
             } catch (JMSException e) {
-                // if MapMessage creation failed then fall back to Object
-                // Message
+                // if MapMessage creation failed then fall back to Object Message
+                LOG.warn("Can not populate MapMessage will fall back to ObjectMessage, cause by: " + e.getMessage());
             }
         }
         if (body instanceof String) {
             return session.createTextMessage((String)body);
         }
+        if (body instanceof File || body instanceof Reader || body instanceof InputStream || body instanceof ByteBuffer) {
+            BytesMessage result = session.createBytesMessage();
+            byte[] bytes = context.getTypeConverter().convertTo(byte[].class, body);
+            result.writeBytes(bytes);
+            return result;
+        }
         if (body instanceof Serializable) {
             return session.createObjectMessage((Serializable)body);
         }

Copied: activemq/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/FileRouteToJmsTest.java (from r693180, activemq/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsRouteToFileTest.java)
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/FileRouteToJmsTest.java?p2=activemq/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/FileRouteToJmsTest.java&p1=activemq/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsRouteToFileTest.java&r1=693180&r2=693217&rev=693217&view=diff
==============================================================================
--- activemq/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsRouteToFileTest.java (original)
+++ activemq/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/FileRouteToJmsTest.java Mon Sep  8 12:38:39 2008
@@ -16,40 +16,33 @@
  */
 package org.apache.camel.component.jms;
 
-import java.io.File;
-
-import javax.jms.ConnectionFactory;
-
 import org.apache.activemq.ActiveMQConnectionFactory;
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.converter.IOConverter;
-
+import org.apache.camel.component.file.FileComponent;
 import static org.apache.camel.component.jms.JmsComponent.jmsComponentClientAcknowledge;
+import org.apache.camel.component.mock.MockEndpoint;
+
+import javax.jms.ConnectionFactory;
 
 /**
- * Unit test that we can consume JMS message and store it as file (to avoid regression bug)
+ * Unit test that we can produce JMS message from files
  */
-public class JmsRouteToFileTest extends ContextTestSupport {
+public class FileRouteToJmsTest extends ContextTestSupport {
 
     protected String componentName = "activemq";
 
     public void testRouteToFile() throws Exception {
-        deleteDirectory("target/routetofile");
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedMessageCount(1);
+        mock.message(0).body().isInstanceOf(byte[].class);
+        mock.message(0).bodyAs(String.class).isEqualTo("Hello World");
 
-        template.sendBody("activemq:queue:hello", "Hello World");
+        deleteDirectory("target/routefromfile");
+        template.sendBodyAndHeader("file://target/routefromfile", "Hello World", FileComponent.HEADER_FILE_NAME, "hello.txt");
 
-        // pause to let file producer save the file
-        Thread.sleep(1500);
-
-        // do file assertions
-        File dir = new File("./target/routetofile");
-        assertTrue("Should be directory", dir.isDirectory());
-        File file = dir.listFiles()[0];
-        assertTrue("File should exists", file.exists());
-        String body = IOConverter.toString(file);
-        assertEquals("Hello World", body);
+        assertMockEndpointsSatisifed();
     }
 
     protected CamelContext createCamelContext() throws Exception {
@@ -64,8 +57,10 @@
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {
             public void configure() throws Exception {
-                from("activemq:queue:hello").to("file://target/routetofile");
+                from("file://target/routefromfile").to("activemq:queue:hello");
+
+                from("activemq:queue:hello").to("mock:result");
             }
         };
     }
-}
+}
\ No newline at end of file

Propchange: activemq/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/FileRouteToJmsTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: activemq/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/FileRouteToJmsTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Propchange: activemq/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/FileRouteToJmsTest.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Added: activemq/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/PayloadByteArrayJmsTest.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/PayloadByteArrayJmsTest.java?rev=693217&view=auto
==============================================================================
--- activemq/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/PayloadByteArrayJmsTest.java (added)
+++ activemq/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/PayloadByteArrayJmsTest.java Mon Sep  8 12:38:39 2008
@@ -0,0 +1,95 @@
+/**
+ * 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.component.jms;
+
+import javax.jms.ConnectionFactory;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.io.Reader;
+import java.io.StringReader;
+import java.nio.ByteBuffer;
+
+import org.apache.activemq.ActiveMQConnectionFactory;
+import org.apache.camel.CamelContext;
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import static org.apache.camel.component.jms.JmsComponent.jmsComponentClientAcknowledge;
+import org.apache.camel.component.mock.MockEndpoint;
+
+/**
+ * Unit test that we send payload as byte[] for certain types
+ */
+public class PayloadByteArrayJmsTest extends ContextTestSupport {
+
+    protected String componentName = "activemq";
+
+    public void testReaderShouldBeByteArray() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedMessageCount(1);
+        mock.message(0).body().isInstanceOf(byte[].class);
+        mock.message(0).bodyAs(String.class).isEqualTo("Hello World");
+
+        Reader body = new StringReader("Hello World");
+
+        template.sendBody("activemq:queue:hello", body);
+
+        assertMockEndpointsSatisifed();
+    }
+
+    public void testInputStreamShouldBeByteArray() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedMessageCount(1);
+        mock.message(0).body().isInstanceOf(byte[].class);
+        mock.message(0).bodyAs(String.class).isEqualTo("Hello World");
+
+        InputStream body = new ByteArrayInputStream("Hello World".getBytes());
+
+        template.sendBody("activemq:queue:hello", body);
+
+        assertMockEndpointsSatisifed();
+    }
+
+    public void testByteBufferShouldBeByteArray() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedMessageCount(1);
+        mock.message(0).body().isInstanceOf(byte[].class);
+        mock.message(0).bodyAs(String.class).isEqualTo("Hello World");
+
+        ByteBuffer body = ByteBuffer.wrap("Hello World".getBytes());
+
+        template.sendBody("activemq:queue:hello", body);
+
+        assertMockEndpointsSatisifed();
+    }
+
+    protected CamelContext createCamelContext() throws Exception {
+        CamelContext camelContext = super.createCamelContext();
+
+        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost?broker.persistent=false");
+        camelContext.addComponent(componentName, jmsComponentClientAcknowledge(connectionFactory));
+
+        return camelContext;
+    }
+
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() throws Exception {
+                from("activemq:queue:hello").to("mock:result");
+            }
+        };
+    }
+}
\ No newline at end of file

Propchange: activemq/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/PayloadByteArrayJmsTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: activemq/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/PayloadByteArrayJmsTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date