Author: norman Date: Mon Jun 12 03:19:59 2006 New Revision: 413624 URL: http://svn.apache.org/viewvc?rev=413624&view=rev Log: Add an abstract class for adding a Footer. Change AddFooter and CommandListservFooter to extend this class
Added: james/server/trunk/src/java/org/apache/james/transport/mailets/AbstractAddFooter.java Modified: james/server/trunk/src/java/org/apache/james/transport/mailets/AddFooter.java james/server/trunk/src/java/org/apache/james/transport/mailets/CommandListservFooter.java Added: james/server/trunk/src/java/org/apache/james/transport/mailets/AbstractAddFooter.java URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/transport/mailets/AbstractAddFooter.java?rev=413624&view=auto ============================================================================== --- james/server/trunk/src/java/org/apache/james/transport/mailets/AbstractAddFooter.java (added) +++ james/server/trunk/src/java/org/apache/james/transport/mailets/AbstractAddFooter.java Mon Jun 12 03:19:59 2006 @@ -0,0 +1,189 @@ +/*********************************************************************** + * Copyright (c) 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.mailet.GenericMailet; +import org.apache.mailet.Mail; +import org.apache.mailet.RFC2822Headers; + +import javax.mail.MessagingException; +import javax.mail.internet.MimeBodyPart; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeMultipart; +import javax.mail.internet.MimePart; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; + +/** + * An abstract implementation of a mailet that add a Footer to an email + */ +public abstract class AbstractAddFooter extends GenericMailet { + + /** + * Takes the message and attaches a footer message to it. Right now, it only + * supports simple messages. Needs to have additions to make it support + * messages with alternate content types or with attachments. + * + * @param mail the mail being processed + * + * @throws MessagingException if an error arises during message processing + */ + public void service(Mail mail) throws MessagingException { + try { + MimeMessage message = mail.getMessage(); + + if (attachFooter(message)) { + message.saveChanges(); + } else { + log("Unable to add footer to mail " + mail.getName()); + } + } catch (UnsupportedEncodingException e) { + log("UnsupportedEncoding Unable to add footer to mail " + + mail.getName()); + } catch (IOException ioe) { + throw new MessagingException("Could not read message", ioe); + } + } + + /** + * Prepends the content of the MimePart as text to the existing footer + * + * @param part the MimePart to attach + * + * @throws MessagingException + * @throws IOException + */ + protected void addToText(MimePart part) throws MessagingException, + IOException { + // log("Trying to add footer to " + part.getContent().toString()); + String contentType = part.getContentType(); + String content = (String) part.getContent(); + + if (!content.endsWith("\n")) { + content += "\r\n"; + } + content += getFooterText(); + + part.setContent(content, contentType); + part.setHeader(RFC2822Headers.CONTENT_TYPE, contentType); + // log("After adding footer: " + part.getContent().toString()); + } + + /** + * Prepends the content of the MimePart as HTML to the existing footer + * + * @param part the MimePart to attach + * + * @throws MessagingException + * @throws IOException + */ + protected void addToHTML(MimePart part) throws MessagingException, + IOException { + // log("Trying to add footer to " + 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. + */ + int index = content.lastIndexOf("</body>"); + 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, contentType); + part.setHeader(RFC2822Headers.CONTENT_TYPE, contentType); + // log("After adding footer: " + part.getContent().toString()); + } + + /** + * Attach a footer a MimePart + * + * @param part the MimePart to which the footer is to be attached + * + * @return whether a footer was successfully attached + * @throws MessagingException + * @throws IOException + */ + protected boolean attachFooter(MimePart part) throws MessagingException, + IOException { + // log("Content type is " + part.getContentType()); + if (part.isMimeType("text/plain") + && part.getContent() instanceof String) { + addToText(part); + return true; + } else if (part.isMimeType("text/html") + && part.getContent() instanceof String) { + addToHTML(part); + return true; + } else if (part.isMimeType("multipart/mixed") + || part.isMimeType("multipart/related")) { + //Find the first body part, and determine what to do then. + MimeMultipart multipart = (MimeMultipart) part.getContent(); + MimeBodyPart firstPart = (MimeBodyPart) multipart.getBodyPart(0); + boolean isFooterAttached = attachFooter(firstPart); + if (isFooterAttached) { + //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")) { + MimeMultipart multipart = (MimeMultipart) part.getContent(); + int count = multipart.getCount(); + // log("number of alternatives = " + count); + boolean isFooterAttached = false; + for (int index = 0; index < count; index++) { + // log("processing alternative #" + index); + MimeBodyPart mimeBodyPart = (MimeBodyPart) multipart + .getBodyPart(index); + isFooterAttached |= attachFooter(mimeBodyPart); + } + if (isFooterAttached) { + //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 { + //Give up... we won't attach the footer to this MimePart + return false; + } + } + + /** + * This is exposed as a method for easy subclassing to provide alternate ways + * to get the footer text. + * + * @return the footer text + */ + protected abstract String getFooterText(); + + /** + * This is exposed as a method for easy subclassing to provide alternate ways + * to get the footer text. By default, this will take the footer text, + * converting the linefeeds to <br> tags. + * + * @return the HTML version of the footer text + */ + protected abstract String getFooterHTML(); + +} Modified: james/server/trunk/src/java/org/apache/james/transport/mailets/AddFooter.java URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/transport/mailets/AddFooter.java?rev=413624&r1=413623&r2=413624&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 Mon Jun 12 03:19:59 2006 @@ -17,25 +17,14 @@ package org.apache.james.transport.mailets; -import org.apache.mailet.GenericMailet; -import org.apache.mailet.Mail; -import org.apache.mailet.RFC2822Headers; - import javax.mail.MessagingException; -import javax.mail.internet.MimeBodyPart; -import javax.mail.internet.MimeMessage; -import javax.mail.internet.MimeMultipart; -import javax.mail.internet.MimePart; - -import java.io.IOException; -import java.io.UnsupportedEncodingException; import java.util.StringTokenizer; /** * This mailet will attach text to the end of the message (like a footer). Right * now it only supports simple messages without multiple parts. */ -public class AddFooter extends GenericMailet { +public class AddFooter extends AbstractAddFooter { /** * This is the plain text version of the footer we are going to add @@ -50,59 +39,6 @@ } /** - * Takes the message and attaches a footer message to it. Right now, it only - * supports simple messages. Needs to have additions to make it support - * messages with alternate content types or with attachments. - * - * @param mail the mail being processed - * - * @throws MessagingException if an error arises during message processing - */ - public void service(Mail mail) throws MessagingException { - try { - MimeMessage message = mail.getMessage(); -// log("Trying to add footer to mail " + mail.getName()); - if (attachFooter(message)) { - message.saveChanges(); -// log("Message after saving: " + message.getContent().toString()); - /* - java.io.ByteArrayOutputStream bodyOs = new java.io.ByteArrayOutputStream(512); - java.io.OutputStream bos; - java.io.InputStream bis; - try { - bis = message.getRawInputStream(); - bos = bodyOs; - log("Using getRawInputStream()"); - } catch(javax.mail.MessagingException me) { - bos = javax.mail.internet.MimeUtility.encode(bodyOs, message.getEncoding()); - bis = message.getInputStream(); - log("Using getInputStream()"); - } - - try { - byte[] block = new byte[1024]; - int read = 0; - while ((read = bis.read(block)) > -1) { - bos.write(block, 0, read); - } - bos.flush(); - } - finally { - org.apache.avalon.excalibur.io.IOUtil.shutdownStream(bis); - } - log("Message from stream: " + bodyOs.toString()); - */ - } else { - log("Unable to add footer to mail " + mail.getName()); - } - } catch (UnsupportedEncodingException e) { - log("UnsupportedEncoding Unable to add footer to mail " + mail.getName()); - } catch (IOException ioe) { - throw new MessagingException("Could not read message", ioe); - } - } - - /** * This is exposed as a method for easy subclassing to provide alternate ways * to get the footer text. * @@ -144,105 +80,5 @@ */ public String getMailetInfo() { return "AddFooter Mailet"; - } - - /** - * Prepends the content of the MimePart as text to the existing footer - * - * @param part the MimePart to attach - * - * @throws MessagingException - * @throws IOException - */ - protected void addToText(MimePart part) throws MessagingException, IOException { -// log("Trying to add footer to " + part.getContent().toString()); - String contentType = part.getContentType(); - String content = (String) part.getContent(); - - if (!content.endsWith("\n")) { - content += "\r\n"; - } - content += getFooterText(); - - part.setContent(content,contentType); - part.setHeader(RFC2822Headers.CONTENT_TYPE,contentType); -// log("After adding footer: " + part.getContent().toString()); - } - - /** - * Prepends the content of the MimePart as HTML to the existing footer - * - * @param part the MimePart to attach - * - * @throws MessagingException - * @throws IOException - */ - protected void addToHTML(MimePart part) throws MessagingException, IOException { -// log("Trying to add footer to " + 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. - */ - int index = content.lastIndexOf("</body>"); - 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,contentType); - part.setHeader(RFC2822Headers.CONTENT_TYPE,contentType); -// log("After adding footer: " + part.getContent().toString()); - } - - /** - * Attach a footer a MimePart - * - * @param part the MimePart to which the footer is to be attached - * - * @return whether a footer was successfully attached - * @throws MessagingException - * @throws IOException - */ - protected boolean attachFooter(MimePart part) throws MessagingException, IOException { -// log("Content type is " + part.getContentType()); - if (part.isMimeType("text/plain") && part.getContent() instanceof String) { - addToText(part); - return true; - } else if (part.isMimeType("text/html") && part.getContent() instanceof String) { - addToHTML(part); - return true; - } else if (part.isMimeType("multipart/mixed") || part.isMimeType("multipart/related")) { - //Find the first body part, and determine what to do then. - MimeMultipart multipart = (MimeMultipart)part.getContent(); - MimeBodyPart firstPart = (MimeBodyPart)multipart.getBodyPart(0); - boolean isFooterAttached = attachFooter(firstPart); - if (isFooterAttached) { - //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")) { - MimeMultipart multipart = (MimeMultipart)part.getContent(); - int count = multipart.getCount(); -// log("number of alternatives = " + count); - boolean isFooterAttached = false; - for (int index = 0; index < count; index++) { -// log("processing alternative #" + index); - MimeBodyPart mimeBodyPart = (MimeBodyPart)multipart.getBodyPart(index); - isFooterAttached |= attachFooter(mimeBodyPart); - } - if (isFooterAttached) { - //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 { - //Give up... we won't attach the footer to this MimePart - return false; - } - } - + } } Modified: james/server/trunk/src/java/org/apache/james/transport/mailets/CommandListservFooter.java URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/transport/mailets/CommandListservFooter.java?rev=413624&r1=413623&r2=413624&view=diff ============================================================================== --- james/server/trunk/src/java/org/apache/james/transport/mailets/CommandListservFooter.java (original) +++ james/server/trunk/src/java/org/apache/james/transport/mailets/CommandListservFooter.java Mon Jun 12 03:19:59 2006 @@ -19,8 +19,6 @@ import org.apache.avalon.framework.configuration.ConfigurationException; import org.apache.james.util.XMLResources; -import org.apache.mailet.GenericMailet; -import org.apache.mailet.Mail; import org.apache.oro.text.regex.MalformedPatternException; import org.apache.oro.text.regex.Pattern; import org.apache.oro.text.regex.Perl5Compiler; @@ -29,12 +27,6 @@ import org.apache.oro.text.regex.Util; import javax.mail.MessagingException; -import javax.mail.internet.MimeBodyPart; -import javax.mail.internet.MimeMessage; -import javax.mail.internet.MimeMultipart; -import javax.mail.internet.MimePart; - -import java.io.IOException; /** @@ -48,7 +40,7 @@ * @since 2.2.0 * @see XMLResources */ -public class CommandListservFooter extends GenericMailet { +public class CommandListservFooter extends AbstractAddFooter { protected String footerText; protected String footerHtml; @@ -103,53 +95,6 @@ /** - * Identify what type of mimeMessage it is, and attach the footer - * @param mail - * @throws MessagingException - */ - public void service(Mail mail) throws MessagingException { - try { - MimeMessage message = mail.getMessage(); -// log("Trying to add footer to mail " + mail.getName()); - if (attachFooter(message)) { - message.saveChanges(); -// log("Message after saving: " + message.getContent().toString()); - /* - java.io.ByteArrayOutputStream bodyOs = new java.io.ByteArrayOutputStream(512); - java.io.OutputStream bos; - java.io.InputStream bis; - try { - bis = message.getRawInputStream(); - bos = bodyOs; - log("Using getRawInputStream()"); - } catch(javax.mail.MessagingException me) { - bos = javax.mail.internet.MimeUtility.encode(bodyOs, message.getEncoding()); - bis = message.getInputStream(); - log("Using getInputStream()"); - } - - try { - byte[] block = new byte[1024]; - int read = 0; - while ((read = bis.read(block)) > -1) { - bos.write(block, 0, read); - } - bos.flush(); - } - finally { - org.apache.avalon.excalibur.io.IOUtil.shutdownStream(bis); - } - log("Message from stream: " + bodyOs.toString()); - */ - } else { - log("Unable to add footer to mail " + mail.getName()); - } - } catch (IOException ioe) { - throw new MessagingException("Could not read message", ioe); - } - } - - /** * Get and cache the footer text * * @return the footer text @@ -178,89 +123,6 @@ Util.SUBSTITUTE_ALL); } return footerHtml; - } - - /** - * Prepends the content of the MimePart as HTML to the existing footer. - * We use the regular expression to inject the footer inside of the body tag appropriately. - * - * @param part the MimePart to attach - * - * @throws MessagingException - * @throws java.io.IOException - */ - protected void addToHTML(MimePart part) throws MessagingException, IOException { -// log("Trying to add footer to " + part.getContent().toString()); - String content = part.getContent().toString(); - /* This HTML part may have a closing <BODY> tag. If so, we - * want to insert out footer immediately prior to that tag. - */ - StringSubstitution stringSubstitution = new StringSubstitution("<br />" + getFooterHTML() + "</body></html>"); - String result = Util.substitute(new Perl5Matcher(), insertPattern, stringSubstitution, content, 1); - part.setContent(result, part.getContentType()); -// log("After adding footer: " + part.getContent().toString()); - } - - /** - * Prepends the content of the MimePart as text to the existing footer - * - * @param part the MimePart to attach - * - * @throws MessagingException - * @throws IOException - */ - protected void addToText(MimePart part) throws MessagingException, IOException { -// log("Trying to add footer to " + part.getContent().toString()); - String content = part.getContent().toString(); - if (!content.endsWith("\n")) { - content += "\r\n"; - } - content += getFooterText(); - part.setText(content); -// log("After adding footer: " + part.getContent().toString()); - } - - /** - * Attaches a MimePart as an appropriate footer - * - * @param part the MimePart to attach - * - * @throws MessagingException - * @throws IOException - */ - protected boolean attachFooter(MimePart part) throws MessagingException, IOException { -// log("Content type is " + part.getContentType()); - if (part.isMimeType("text/plain")) { - addToText(part); - return true; - } else if (part.isMimeType("text/html")) { - addToHTML(part); - return true; - } else if (part.isMimeType("multipart/mixed")) { - //Find the first body part, and determine what to do then. - 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) - part.setContent(multipart); - return isFooterAttached; - } else if (part.isMimeType("multipart/alternative")) { - MimeMultipart multipart = (MimeMultipart)part.getContent(); - int count = multipart.getCount(); -// log("number of alternatives = " + count); - boolean isFooterAttached = false; - for (int index = 0; index < count; index++) { -// log("processing alternative #" + index); - MimeBodyPart mimeBodyPart = (MimeBodyPart)multipart.getBodyPart(index); - isFooterAttached |= attachFooter(mimeBodyPart); - } - //We have to do this because of a bug in JavaMail (ref id 4404733) - part.setContent(multipart); - return isFooterAttached; - } else { - //Give up... we won't attach the footer to this MimePart - return false; - } } /** --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]