You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ni...@apache.org on 2010/03/19 07:45:34 UTC

svn commit: r925103 - in /camel/trunk/components/camel-mail/src: main/java/org/apache/camel/component/mail/MailBinding.java test/java/org/apache/camel/component/mail/MimeMultipartAlternativeWithContentTypeTest.java

Author: ningjiang
Date: Fri Mar 19 06:45:34 2010
New Revision: 925103

URL: http://svn.apache.org/viewvc?rev=925103&view=rev
Log:
CAMEL-2545 applied patch with thanks to slad

Added:
    camel/trunk/components/camel-mail/src/test/java/org/apache/camel/component/mail/MimeMultipartAlternativeWithContentTypeTest.java   (with props)
Modified:
    camel/trunk/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailBinding.java

Modified: camel/trunk/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailBinding.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailBinding.java?rev=925103&r1=925102&r2=925103&view=diff
==============================================================================
--- camel/trunk/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailBinding.java (original)
+++ camel/trunk/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailBinding.java Fri Mar 19 06:45:34 2010
@@ -127,23 +127,12 @@ public class MailBinding {
         // fix content type to include a space after semi colon if missing
         if (contentType != null && contentType.contains(";")) {
             String before = ObjectHelper.before(contentType, ";");
-            String after = ObjectHelper.after(contentType, ";");
-
-            // after is the charset lets see if its given and a valid charset
-            if (after != null) {
-                String charset = ObjectHelper.after(after, "=");
-                charset = determineCharSet(configuration, charset);
-                if (charset != null) {
-                    after = "charset=" + charset;
-                } else {
-                    after = null;
-                }
-            }
+            String charset = determineCharSet(configuration, exchange);
 
-            if (before != null && after == null) {
+            if (before != null && charset == null) {
                 contentType = before.trim();
-            } else if (before != null && after != null) {
-                contentType = before.trim() + "; " + after;
+            } else if (before != null && charset != null) {
+                contentType = before.trim() + "; charset=" + charset;
             }
         }
 
@@ -154,26 +143,42 @@ public class MailBinding {
         return contentType;
     }
 
-    protected String determineCharSet(MailConfiguration configuration, String charset) {
-        if (charset == null) {
-            return null;
-        }
+    protected String determineCharSet(MailConfiguration configuration, Exchange exchange) {
 
-        boolean supported;
-        try {
-            supported = Charset.isSupported(charset);
-        } catch (IllegalCharsetNameException e) {
-            supported = false;
+         // see if we got any content type set
+        String contentType = configuration.getContentType();
+        if (exchange.getIn().getHeader("contentType") != null) {
+            contentType = exchange.getIn().getHeader("contentType", String.class);
+        } else if (exchange.getIn().getHeader(Exchange.CONTENT_TYPE) != null) {
+            contentType = exchange.getIn().getHeader(Exchange.CONTENT_TYPE, String.class);
         }
 
-        if (supported) {
-            return charset;
-        } else if (configuration.isIgnoreUnsupportedCharset()) {
-            LOG.warn("Charset: " + charset + " is not supported, will fallback to use platform default instead.");
-            return null;
-        }
+        // fix content type to include a space after semi colon if missing
+        if (contentType != null && contentType.contains(";")) {
+            String after = ObjectHelper.after(contentType, ";");
 
-        return charset;
+            // after is the charset lets see if its given and a valid charset
+            if (after != null) {
+                String charset = ObjectHelper.after(after, "=");
+                if (charset != null) {
+                    boolean supported;
+                    try {
+                        supported = Charset.isSupported(charset);
+                    } catch (IllegalCharsetNameException e) {
+                        supported = false;
+                    }
+                    if (supported) {
+                        return charset;
+                    } else if (!configuration.isIgnoreUnsupportedCharset()) {
+                        return charset;
+                    } else if (configuration.isIgnoreUnsupportedCharset()) {
+                        LOG.warn("Charset: " + charset + " is not supported, will fallback to use platform default instead.");
+                        return null;
+                    }
+                }
+            }
+        }
+        return null;
     }
 
     protected String populateContentOnMimeMessage(MimeMessage part, MailConfiguration configuration, Exchange exchange)
@@ -469,8 +474,8 @@ public class MailBinding {
         MimeMultipart multipartAlternative = new MimeMultipart("alternative");
         mimeMessage.setContent(multipartAlternative);
 
-        BodyPart plainText = new MimeBodyPart();
-        plainText.setText(getAlternativeBody(configuration, exchange));
+        MimeBodyPart plainText = new MimeBodyPart();
+        plainText.setText(getAlternativeBody(configuration, exchange), determineCharSet(configuration, exchange));
         // remove the header with the alternative mail now that we got it
         // otherwise it might end up twice in the mail reader
         exchange.getIn().removeHeader(configuration.getAlternativeBodyHeader());

Added: camel/trunk/components/camel-mail/src/test/java/org/apache/camel/component/mail/MimeMultipartAlternativeWithContentTypeTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-mail/src/test/java/org/apache/camel/component/mail/MimeMultipartAlternativeWithContentTypeTest.java?rev=925103&view=auto
==============================================================================
--- camel/trunk/components/camel-mail/src/test/java/org/apache/camel/component/mail/MimeMultipartAlternativeWithContentTypeTest.java (added)
+++ camel/trunk/components/camel-mail/src/test/java/org/apache/camel/component/mail/MimeMultipartAlternativeWithContentTypeTest.java Fri Mar 19 06:45:34 2010
@@ -0,0 +1,92 @@
+/**
+ * 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.mail;
+
+import java.io.ByteArrayOutputStream;
+
+import javax.mail.internet.MimeMultipart;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+import org.jvnet.mock_javamail.Mailbox;
+
+import static org.apache.camel.component.mail.MailConstants.MAIL_ALTERNATIVE_BODY;
+
+public class MimeMultipartAlternativeWithContentTypeTest extends CamelTestSupport {
+    private String alternativeBody = "hello world! (plain text)";
+    private String htmlBody = "<html><body><h1>Hello</h1>World</body></html>";
+
+    private void sendMultipartEmail() throws Exception {
+        Mailbox.clearAll();
+
+        // create an exchange with a normal body and attachment to be produced as email
+        MailEndpoint endpoint = context.getEndpoint("smtp://sachin@mymailserver.com?password=secret&contentType=text/html; charset=UTF-8", MailEndpoint.class);
+        endpoint.getConfiguration().setAlternativeBodyHeader(MailConstants.MAIL_ALTERNATIVE_BODY);
+
+        // create the exchange with the mail message that is multipart with a file and a Hello World text/plain message.
+        Exchange exchange = endpoint.createExchange();
+        Message in = exchange.getIn();
+        in.setBody(htmlBody);
+        in.setHeader(MAIL_ALTERNATIVE_BODY, alternativeBody);
+        
+        // create a producer that can produce the exchange (= send the mail)
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedMessageCount(1);
+        mock.message(0).header(MailConstants.MAIL_ALTERNATIVE_BODY).isNull();
+
+        context.createProducerTemplate().send(endpoint, exchange);
+    }
+
+    private void verifyTheRecivedEmail(String expectString) throws Exception {
+
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.assertIsSatisfied();
+
+        Exchange out = mock.assertExchangeReceived(0);
+        ByteArrayOutputStream baos = new ByteArrayOutputStream(((MailMessage)out.getIn()).getMessage().getSize());
+        ((MailMessage)out.getIn()).getMessage().writeTo(baos);
+        String dumpedMessage = baos.toString();
+        assertTrue("There should have the " + expectString, dumpedMessage.indexOf(expectString) > 0);
+        if (log.isTraceEnabled()) {
+            log.trace("multipart alternative: \n" + dumpedMessage);
+        }
+
+        // plain text
+        assertEquals(alternativeBody, out.getIn().getBody(String.class));
+
+        assertEquals("multipart body should have 2 parts", 2, out.getIn().getBody(MimeMultipart.class).getCount());
+    }
+
+    @Test
+    public void testMultipartEmailContentType() throws Exception {
+        sendMultipartEmail();
+        verifyTheRecivedEmail("Content-Type: text/plain; charset=UTF-8");
+        verifyTheRecivedEmail("Content-Type: text/html; charset=UTF-8");
+    }
+
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() throws Exception {
+                from("pop3://sachin@mymailserver.com?password=secret&consumer.delay=1000&contentType=text/html; charset=UTF-8").to("mock:result");
+            }
+        };
+    }
+}
\ No newline at end of file

Propchange: camel/trunk/components/camel-mail/src/test/java/org/apache/camel/component/mail/MimeMultipartAlternativeWithContentTypeTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/components/camel-mail/src/test/java/org/apache/camel/component/mail/MimeMultipartAlternativeWithContentTypeTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date