You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ba...@apache.org on 2006/03/01 10:09:50 UTC
svn commit: r381959 - in /james/server/trunk/src:
java/org/apache/james/transport/mailets/AddFooter.java
test/org/apache/james/transport/mailets/AddFooterTest.java
Author: bago
Date: Wed Mar 1 01:09:49 2006
New Revision: 381959
URL: http://svn.apache.org/viewcvs?rev=381959&view=rev
Log:
Fixed AddFooter encoding issues: now it should work fine with any system default encoding (JAMES-443)
Added:
james/server/trunk/src/test/org/apache/james/transport/mailets/AddFooterTest.java
Modified:
james/server/trunk/src/java/org/apache/james/transport/mailets/AddFooter.java
Modified: james/server/trunk/src/java/org/apache/james/transport/mailets/AddFooter.java
URL: http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/transport/mailets/AddFooter.java?rev=381959&r1=381958&r2=381959&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/transport/mailets/AddFooter.java (original)
+++ james/server/trunk/src/java/org/apache/james/transport/mailets/AddFooter.java Wed Mar 1 01:09:49 2006
@@ -19,6 +19,7 @@
import org.apache.mailet.GenericMailet;
import org.apache.mailet.Mail;
+import org.apache.mailet.RFC2822Headers;
import javax.mail.MessagingException;
import javax.mail.internet.MimeBodyPart;
@@ -39,7 +40,7 @@
* This is the plain text version of the footer we are going to add
*/
String text = "";
-
+
/**
* Initialize the mailet
*/
@@ -152,12 +153,16 @@
*/
protected void addToText(MimePart part) throws MessagingException, IOException {
// log("Trying to add footer to " + part.getContent().toString());
- String content = part.getContent().toString();
+ String contentType = part.getContentType();
+ String content = (String) part.getContent();
+
if (!content.endsWith("\n")) {
content += "\r\n";
}
content += getFooterText();
- part.setText(content);
+
+ part.setContent(content,contentType);
+ part.setHeader(RFC2822Headers.CONTENT_TYPE,contentType);
// log("After adding footer: " + part.getContent().toString());
}
@@ -171,7 +176,8 @@
*/
protected void addToHTML(MimePart part) throws MessagingException, IOException {
// log("Trying to add footer to " + part.getContent().toString());
- String content = part.getContent().toString();
+ String contentType = part.getContentType();
+ String content = (String) part.getContent();
/* This HTML part may have a closing <BODY> tag. If so, we
* want to insert out footer immediately prior to that tag.
@@ -180,8 +186,9 @@
if (index == -1) index = content.lastIndexOf("</BODY>");
String insert = "<br>" + getFooterHTML();
content = index == -1 ? content + insert : content.substring(0, index) + insert + content.substring(index);
-
- part.setContent(content, part.getContentType());
+
+ part.setContent(content,contentType);
+ part.setHeader(RFC2822Headers.CONTENT_TYPE,contentType);
// log("After adding footer: " + part.getContent().toString());
}
@@ -196,10 +203,10 @@
*/
protected boolean attachFooter(MimePart part) throws MessagingException, IOException {
// log("Content type is " + part.getContentType());
- if (part.isMimeType("text/plain")) {
+ if (part.isMimeType("text/plain") && part.getContent() instanceof String) {
addToText(part);
return true;
- } else if (part.isMimeType("text/html")) {
+ } else if (part.isMimeType("text/html") && part.getContent() instanceof String) {
addToHTML(part);
return true;
} else if (part.isMimeType("multipart/mixed")) {
@@ -207,7 +214,8 @@
MimeMultipart multipart = (MimeMultipart)part.getContent();
MimeBodyPart firstPart = (MimeBodyPart)multipart.getBodyPart(0);
boolean isFooterAttached = attachFooter(firstPart);
- //We have to do this because of a bug in JavaMail (ref id 4404733)
+ //We have to do this because of a bug in JavaMail (ref id 4403733)
+ //http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4403733
part.setContent(multipart);
return isFooterAttached;
} else if (part.isMimeType("multipart/alternative")) {
@@ -220,7 +228,8 @@
MimeBodyPart mimeBodyPart = (MimeBodyPart)multipart.getBodyPart(index);
isFooterAttached |= attachFooter(mimeBodyPart);
}
- //We have to do this because of a bug in JavaMail (ref id 4404733)
+ //We have to do this because of a bug in JavaMail (ref id 4403733)
+ //http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4403733
part.setContent(multipart);
return isFooterAttached;
} else {
@@ -228,4 +237,5 @@
return false;
}
}
+
}
Added: james/server/trunk/src/test/org/apache/james/transport/mailets/AddFooterTest.java
URL: http://svn.apache.org/viewcvs/james/server/trunk/src/test/org/apache/james/transport/mailets/AddFooterTest.java?rev=381959&view=auto
==============================================================================
--- james/server/trunk/src/test/org/apache/james/transport/mailets/AddFooterTest.java (added)
+++ james/server/trunk/src/test/org/apache/james/transport/mailets/AddFooterTest.java Wed Mar 1 01:09:49 2006
@@ -0,0 +1,220 @@
+/***********************************************************************
+ * Copyright (c) 1999-2006 The Apache Software Foundation. *
+ * All rights reserved. *
+ * ------------------------------------------------------------------- *
+ * Licensed 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.james.transport.mailets;
+
+import org.apache.james.core.MailImpl;
+import org.apache.james.core.MailetConfigImpl;
+import org.apache.james.test.mock.mailet.MockMailContext;
+import org.apache.mailet.Mail;
+import org.apache.mailet.Mailet;
+
+import javax.mail.MessagingException;
+import javax.mail.Session;
+import javax.mail.internet.MimeMessage;
+import javax.mail.internet.MimeUtility;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.util.Properties;
+
+import junit.framework.TestCase;
+
+/**
+ * Test encoding issues
+ *
+ * This test should also be run with the following JVM options to be sure it tests:
+ * "-Dfile.encoding=ASCII -Dmail.mime.charset=ANSI_X3.4-1968"
+ */
+public class AddFooterTest extends TestCase {
+
+ public AddFooterTest(String arg0) throws UnsupportedEncodingException {
+ super(arg0);
+
+ /*
+
+ String encoding = (new InputStreamReader(System.in)).getEncoding();
+ System.out.println("System Encoding: "+encoding);
+ System.out.println("Default Java Charset:"+MimeUtility.getDefaultJavaCharset());
+ System.out.println("---------");
+ String a = "\u20AC\u00E0"; // euro char followed by an italian a with an accent System.out.println(debugString(a,"UTF-8"));
+ System.out.println(debugString(a,"UTF8"));
+ System.out.println(debugString(a,"UTF-16"));
+ System.out.println(debugString(a,"UNICODE"));
+ System.out.println(debugString(a,"ISO-8859-15"));
+ System.out.println(debugString(a,"ISO-8859-1"));
+ System.out.println(debugString(a,"CP1252"));
+ System.out.println(debugString(a,"ANSI_X3.4-1968"));
+
+ */
+ }
+
+ private final static char[] hexchars = { '0', '1', '2', '3', '4', '5', '6',
+ '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
+
+ public String debugString(String a, String charset)
+ throws UnsupportedEncodingException {
+ byte[] bytes = a.getBytes(charset);
+ StringBuffer res = new StringBuffer();
+ for (int i = 0; i < bytes.length; i++) {
+ if (i > 0)
+ res.append("-");
+ res.append(hexchars[((bytes[i] + 256) % 256) / 16]);
+ res.append(hexchars[((bytes[i] + 256) % 256) % 16]);
+ }
+ res.append(" (");
+ res.append(MimeUtility.mimeCharset(charset));
+ res.append(" / ");
+ res.append(MimeUtility.javaCharset(charset));
+ res.append(")");
+ return res.toString();
+ }
+
+ /*
+ * Class under test for String getSubject()
+ */
+ public void testAddFooterTextPlain() throws MessagingException, IOException {
+
+ // quoted printable mimemessage text/plain
+ String asciisource = "Subject: test\r\nContent-Type: text/plain; charset=ISO-8859-15\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: quoted-printable\r\n\r\nTest=E0 and one\r\n";
+
+ String iso885915qpheader = "------ my footer =E0/=A4 ------";
+ String footer = "------ my footer \u00E0/\u20AC ------";
+
+ String res = processAddFooter(asciisource, footer);
+
+ assertEquals(asciisource + iso885915qpheader, res);
+
+ }
+
+ /*
+ * Class under test for String getSubject()
+ */
+ public void testAddFooterTextPlainCP1252toISO8859() throws MessagingException, IOException {
+
+ // quoted printable mimemessage text/plain
+ String asciisource = "Subject: test\r\nContent-Type: text/plain; charset=CP1252\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: quoted-printable\r\n\r\nTest=E0 and one =80\r\n";
+
+ String iso885915qpheader = "------ my footer =E0/=80 ------";
+ String footer = "------ my footer \u00E0/\u20AC ------";
+
+ String res = processAddFooter(asciisource, footer);
+
+ assertEquals(asciisource + iso885915qpheader, res);
+
+ }
+
+ /*
+ * Class under test for String getSubject()
+ */
+ public void testAddFooterMultipartAlternative() throws MessagingException,
+ IOException {
+
+ String sep = "--==--";
+ String head = "Subject: test\r\nContent-Type: multipart/alternative;\r\n boundary=\""
+ + sep
+ + "\"\r\nMIME-Version: 1.0\r\n";
+ String content1 = "Content-Type: text/plain;\r\n charset=\"ISO-8859-15\"\r\nContent-Transfer-Encoding: quoted-printable\r\n\r\nTest=E0 and @=80";
+ String c2h = "Content-Type: text/html;\r\n charset=\"CP1252\"\r\nContent-Transfer-Encoding: quoted-printable\r\n\r\n";
+ String c2pre = "<html><body>test =80 ss";
+ String c2post = "</body></html>";
+
+ StringBuffer asciisource = new StringBuffer();
+ asciisource.append(head);
+ asciisource.append("\r\n--");
+ asciisource.append(sep);
+ asciisource.append("\r\n");
+ asciisource.append(content1);
+ asciisource.append("\r\n--");
+ asciisource.append(sep);
+ asciisource.append("\r\n");
+ asciisource.append(c2h);
+ asciisource.append(c2pre);
+ asciisource.append(c2post);
+ asciisource.append("\r\n--");
+ asciisource.append(sep);
+ asciisource.append("--\r\n");
+
+ String iso885915qpheader = "------ my footer =E0/=A4 ------";
+ String cp1252qpfooter = "------ my footer =E0/=80 ------";
+ String footer = "------ my footer \u00E0/\u20AC ------";
+
+ StringBuffer expected = new StringBuffer();
+ expected.append(head);
+ expected.append("\r\n--");
+ expected.append(sep);
+ expected.append("\r\n");
+ expected.append(content1);
+ expected.append("\r\n");
+ expected.append(iso885915qpheader);
+ expected.append("\r\n--");
+ expected.append(sep);
+ expected.append("\r\n");
+ expected.append(c2h);
+ expected.append(c2pre);
+ expected.append("<br>");
+ expected.append(cp1252qpfooter);
+ expected.append(c2post);
+ expected.append("\r\n--");
+ expected.append(sep);
+ expected.append("--\r\n");
+
+ String res = processAddFooter(asciisource.toString(), footer);
+
+ assertEquals(expected.toString(), res);
+
+ }
+
+ private String processAddFooter(String asciisource, String footer)
+ throws MessagingException, IOException {
+ Mailet mailet = new AddFooter() {
+ private String footer;
+
+ public String getInitParameter(String name) {
+ if ("text".equals(name)) {
+ return footer;
+ }
+ return null;
+ }
+
+ public Mailet setFooter(String string) {
+ this.footer = string;
+ return this;
+ };
+ }.setFooter(footer);
+
+ MailetConfigImpl mci = new MailetConfigImpl();
+ mci.setMailetContext(new MockMailContext());
+
+ mailet.init(mci);
+
+ Mail mail = new MailImpl(new MimeMessage(Session
+ .getDefaultInstance(new Properties()),
+ new ByteArrayInputStream(asciisource.getBytes())));
+
+ mailet.service(mail);
+
+ ByteArrayOutputStream rawMessage = new ByteArrayOutputStream();
+ mail.getMessage().writeTo(
+ rawMessage,
+ new String[] { "Bcc", "Content-Length", "Message-ID" });
+ String res = rawMessage.toString();
+ return res;
+ }
+
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org