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 &lt;br&gt; 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