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 Norman Maurer <nm...@byteaction.de> on 2006/06/12 14:44:02 UTC
Re: svn commit: r413624 - in
/james/server/trunk/src/java/org/apache/james/transport/mailets:
AbstractAddFooter.java AddFooter.java CommandListservFooter.java
I whould like to put it in 2.3 branch also cause we have fixed some bugs
in the AddFooter mailet (which i used as template for the abstract
class) before which never was fixed ( as i know) in
CommandListservFooter. Anyone see problems with this code ?
bye
Norman
Am Montag, den 12.06.2006, 10:20 +0000 schrieb norman@apache.org:
> 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: server-dev-unsubscribe@james.apache.org
> For additional commands, e-mail: server-dev-help@james.apache.org
>
> !EXCUBATOR:1,448d41f137021481112643!
RE: svn commit: r413624 - in/james/server/trunk/src/java/org/apache/james/transport/mailets:AbstractAddFooter.java AddFooter.java CommandListservFooter.java
Posted by "Noel J. Bergman" <no...@devtech.com>.
I reviewed the recent changes and your proposed change. I use
CommandListservFooter in my deployment, so I'll be able to give it a
workout, and should notice any issues. I'm OK for you to copy it to the
branch.
--- Noel
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org