Package org.apache.cocoon.mail

Source Code of org.apache.cocoon.mail.MailContentHandlerDelegate$FolderXMLizer

/*

============================================================================
                   The Apache Software License, Version 1.1
============================================================================

Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved.

Redistribution and use in source and binary forms, with or without modifica-
tion, are permitted provided that the following conditions are met:

1. Redistributions of  source code must  retain the above copyright  notice,
    this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.

3. The end-user documentation included with the redistribution, if any, must
    include  the following  acknowledgment:  "This product includes  software
    developed  by the  Apache Software Foundation  (http://www.apache.org/)."
    Alternately, this  acknowledgment may  appear in the software itself,  if
    and wherever such third-party acknowledgments normally appear.

4. The names "Apache Cocoon" and  "Apache Software Foundation" must  not  be
    used to  endorse or promote  products derived from  this software without
    prior written permission. For written permission, please contact
    apache@apache.org.

5. Products  derived from this software may not  be called "Apache", nor may
    "Apache" appear  in their name,  without prior written permission  of the
    Apache Software Foundation.

THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE
APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS
OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON
ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT
(INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

This software  consists of voluntary contributions made  by many individuals
on  behalf of the Apache Software  Foundation and was  originally created by
Stefano Mazzocchi  <stefano@apache.org>. For more  information on the Apache
Software Foundation, please see <http://www.apache.org/>.

*/
package org.apache.cocoon.mail;

import java.io.IOException;
//import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;
import javax.mail.Address;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Header;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.internet.ContentType;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimePart;
import javax.mail.internet.ParameterList;
import javax.mail.internet.ParseException;
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.excalibur.xml.sax.XMLizable;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;

/**
* Marshal javamail objects
* <p>
*   Having one or more javamail objects, like Message, Folder, et al. emit SAX events
* </p>
*
* @author Bernhard Huber
* @since 24. Oktober 2002
* @version CVS $Id: MailContentHandlerDelegate.java,v 1.5 2003/09/22 20:10:46 upayavira Exp $
*/

/*
*  Generated SAX events conforming to following folder sample xml:
*
*  <mail:mail xmlns:mail="http://apache.org/cocoon/mail/1.0">
*
*  <mail:folder name="INBOX" full-name="INBOX" url-name="imap://user-name@host-name/INBOX"
*  is-subscribed="yes"
*  is-direcory="no"
*  has-new-messages="no"
*  total-messages="3"
*  new-messages="0"
*  deleted-messages="-1"
*  unread-messages="0"
*  >
*  </mail:mail>
*
*  Generated SAX events conforming to following message sample xml:
*
*  <mail:mail xmlns:mail="http://apache.org/cocoon/mail/1.0">
*
*  <mail:message-envelope>
*  <mail:from email-address="name@a1.net">name@xxx.net</mail:from>
*  <mail:to email-address="test@xxx.net">test@xxx.net</mail:to>
*  <mail:reply-to email-address="xxx@test.net">test@xxx.net</mail:reply-to>
*  <mail:subject>TEST</mail:subject>
*  <mail:sent-date>Thu Oct 10 14:40:43 CEST 2002</mail:sent-date>
*  <mail:received-date>Thu Oct 10 14:43:29 CEST 2002</mail:received-date>
*  <mail:size>4440</mail:size>
*  <mail:message-number>1</mail:message-number> <mail:flags seen="yes"/>
*  <mail:header name="Return-path" value="<test@a1.xxx>"/>
*  <mail:header name="Received" value="from x1"/>
*  <mail:header name="Received" value="from x2"/>
*  <mail:header name="Date" value="Thu, 10 Oct 2002 14:40:43 +0200 (CEST)"/>
*  <mail:header name="From" value="test@xxx.net"/>
*  <mail:header name="Subject" value="TEST"/>
*  <mail:header name="To" value="test@xxx.net"/>
*  <mail:header name="Message-id" value="<4630087.1034253643941.JavaMail.root@test>"/>
*  <mail:header name="MIME-version" value="1.0"/>
*  <mail:header name="Content-type" value="multipart/mixed;&#10; boundary="18119425.1034253643876.JavaMail.root@test""/>
*  </mail:message-envelope>
*
*  <mail:part content-type="multipart/MIXED; &#10; boundary="18119425.1034253643876.JavaMail.root@test"">
*  <mail:content>
*  <mail:part content-type="TEXT/PLAIN; charset=us-ascii">
*  <mail:content>TEST CONTENT MESSSAGE TEST.</mail:content>
*  </mail:part>
*  <mail:part content-type="MESSAGE/RFC822">
*  <mail:content>
*  <mail:part content-type="multipart/MIXED; boundary=--1f735d241edf3a1">
*  <mail:content>
*  <mail:part content-type="TEXT/PLAIN; charset=us-ascii">
*  <mail:content>Test &#13;</mail:content>
*  </mail:part>
*  <mail:part content-type="TEXT/X-VCARD; name=xxx.vcf; charset=windows-1252" description="Card for <xxx@a1.xxx>" disposition="ATTACHMENT" file-name="xxx.vcf">
*  <mail:content>begin:vcard&#13; n:Name;Name&#13; title:Dr&#13; email;internet:xxx@xxx.net&#13; url:www.xxx.net&#13; fn:xXxXx&#13; end:vcard&#13; &#13; </mail:content>
*  </mail:part>
*  </mail:content>
*  </mail:part>
*  </mail:content>
*  </mail:part>
*  </mail:content>
*  </mail:part>
*
*  </mail:mail>
*
*/
public class MailContentHandlerDelegate extends AbstractLogEnabled {

    /**
     *  URI of the generated XML elements
     */
    public final static String URI = "http://apache.org/cocoon/mail/1.0";

    /**
     *  PREFIX of the generated XML elements
     */
    public final static String PREFIX = "mail";

    /**
     * Destination content handler receiving SAX events generated by
     * this class
     */
    private ContentHandler contentHandler;

    /**
     *  use this attributes for startElement attributes invocation, reusing
     *  attributes object for all elements
     */
    private AttributesImpl attributes = null;

    private SimpleDateFormat sdf;

    private ContentTypePreference alternativeMailCtPref = new MailCtPref();


    /**
     *  Constructor for the MailContentHandler object
     *
     *@param  contentHandler  Description of Parameter
     */
    public MailContentHandlerDelegate(ContentHandler contentHandler) {
        this.contentHandler = contentHandler;
    }


    /**
     *  Sets the simpleDateFormatter attribute of the MailContentHandlerDelegate object
     *
     *@param  sdf  The new simpleDateFormat value
     */
    public void setSimpleDateFormat(SimpleDateFormat sdf) {
        this.sdf = sdf;
    }


    /**
     *  Gets the simpleDateFormat attribute of the MailContentHandlerDelegate object
     *
     *@return    The simpleDateFormat value
     */
    public SimpleDateFormat getSimpleDateFormat() {
        return sdf;
    }


    /**
     *  Emit starting SAX events sequence, including SAX startDocument event
     *
     *@exception  SAXException  thrown iff generating SAX events fails
     */
    public void startDocument() throws SAXException {
        startDocumentInternal(true);
    }


    /**
     *  Emit starting SAX events sequence, excluding SAX startDocument event
     *
     *@exception  SAXException  thrown iff generating SAX events fails
     */
    public void startDocumentXMLizer() throws SAXException {
        startDocumentInternal(false);
    }


    /**
     *  Emit starting SAX events sequence, including SAX endDocument event
     *
     *@exception  SAXException  thrown iff generating SAX events fails
     */
    public void endDocument() throws SAXException {
        endDocumentInternal(true);
    }


    /**
     *  Emit starting SAX events sequence, excluding SAX endDocument event
     *
     *@exception  SAXException  thrown iff generating SAX events fails
     */
    public void endDocumentXMLizer() throws SAXException {
        endDocumentInternal(false);
    }


    /**
     *  Emit a folder  as a sequence of SAX events
     *
     *@param  folder  emit this folder
     */
    public void marshalFolderToSAX(Folder folder) {
        try {
            folderToSAX(this.contentHandler, folder);
        } catch (Exception e) {
            getLogger().error("Cannot generate SAX events from folder", e);
        }
    }


    /**
     *  Emit folders as a sequence of SAX events
     *
     *@param  folders  emit these folders
     */
    public void marshalFolderToSAX(Folder[] folders) {
        try {
            for (int i = 0; i < folders.length; i++) {
                folderToSAX(this.contentHandler, folders[i]);
            }
        } catch (Exception e) {
            getLogger().error("Cannot generate SAX events from folders", e);
        }
    }


    /**
     *  Emit a message envelope as a sequence of SAX events
     *
     *@param  message  emit envelope of this message
     */
    public void marshalMessageEnvelopeToSAX(Message message) {
        try {
            messageEnvelopeToSAX(this.contentHandler, message);
        } catch (Exception e) {
            getLogger().error("Cannot generate SAX events from message envelope ", e);
        }
    }


    /**
     *  Emit a message envelope, and message content as a sequence of SAX events
     *
     *@param  message  emit envelope, and content of this message
     */
    public void marshalMessageToSAX(Message message) {
        try {
            messageEnvelopeToSAX(this.contentHandler, message);
            partToSAX(this.contentHandler, message, 0);
        } catch (Exception e) {
            getLogger().error("Cannot generate SAX events from message ", e);
        }
    }


    /**
     *  Emit a message content as a sequence of SAX events
     *
     *@param  part  Description of the Parameter
     */
    public void marshalPartToSAX(Part part) {
        try {
            partToSAX(this.contentHandler, part, 0);
        } catch (Exception e) {
            getLogger().error("Cannot generate SAX events part", e);
        }
    }


    /**
     *  Emit start document sequence
     *
     *@param  emitStartDocument  flag controlling invocation of SAX startDocument
     *@exception  SAXException   thrown iff generating SAX events fails
     */
    protected void startDocumentInternal(boolean emitStartDocument) throws SAXException {
        if (emitStartDocument) {
            this.contentHandler.startDocument();
        }
        this.contentHandler.startPrefixMapping(PREFIX, URI);

        attributes = new AttributesImpl();
        attributes.clear();
        attributes.addAttribute("", PREFIX, "xmlns:" + PREFIX, "CDATA", URI);
        startElement("mail", attributes);
    }


    /**
     *  Emit end document sequence
     *
     *@param  emitEndDocument   flag controlling invocation of SAX endDocument
     *@exception  SAXException  thrown iff generating SAX events fails
     */
    protected void endDocumentInternal(boolean emitEndDocument) throws SAXException {
        endElement("mail");

        this.contentHandler.endPrefixMapping(PREFIX);
        if (emitEndDocument) {
            this.contentHandler.endDocument();
        }
    }


    /**
     *  Emit folder as sequence of SAX events
     *
     *@param  folder                  emit this folder
     *@param  contentHandler          specifies sink of SAX events
     *@exception  MessagingException  thrown iff accessing javamail data fails
     *@exception  SAXException        thrown iff generating SAX events fails
     */
    protected void folderToSAX(ContentHandler contentHandler, Folder folder) throws MessagingException, SAXException {
        attributes.clear();
        addAttribute("name", folder.getName());
        addAttribute("full-name", folder.getFullName());
        addAttribute("url-name", folder.getURLName().toString());
        addAttribute("is-subscribed", folder.isSubscribed() ? "yes" : "no");
        addAttribute("is-directory", (folder.getType() & Folder.HOLDS_FOLDERS) != 0 ? "yes" : "no");

        if ((folder.getType() & Folder.HOLDS_MESSAGES) != 0) {
            addAttribute("holds-messages", "yes");
            addAttribute("has-new-messages", folder.hasNewMessages() ? "yes" : "no");
            addAttribute("total-messages", String.valueOf(folder.getMessageCount()));
            addAttribute("new-messages", String.valueOf(folder.getNewMessageCount()));
            addAttribute("deleted-messages", String.valueOf(folder.getDeletedMessageCount()));
            addAttribute("unread-messages", String.valueOf(folder.getUnreadMessageCount()));
        }

        startElement("folder", attributes);
        endElement("folder");
    }


    /**
     *  Emit message envelope as sequence of SAX events
     *
     *@param  message                 emit envelope of this message
     *@param  contentHandler          specifies sink of SAX events
     *@exception  MessagingException  thrown iff accessing javamail data fails
     *@exception  SAXException        thrown iff generating SAX events fails
     */
    protected void messageEnvelopeToSAX(ContentHandler contentHandler, Message message) throws MessagingException, SAXException {
        attributes.clear();
        startElement("message-envelope", attributes);

        Address[] a;
        // FROM
        if ((a = message.getFrom()) != null) {
            for (int j = 0; j < a.length; j++) {
                emitAddress("from", a[j]);
            }
        }

        // TO
        if ((a = message.getRecipients(Message.RecipientType.TO)) != null) {
            for (int j = 0; j < a.length; j++) {
                emitAddress("to", a[j]);
            }
        }

        // CC
        if ((a = message.getRecipients(Message.RecipientType.CC)) != null) {
            for (int j = 0; j < a.length; j++) {
                emitAddress("cc", a[j]);
            }
        }
        // BCC
        if ((a = message.getRecipients(Message.RecipientType.BCC)) != null) {
            for (int j = 0; j < a.length; j++) {
                emitAddress("bcc", a[j]);
            }
        }

        // REPLY-TO
        if ((a = message.getReplyTo()) != null) {
            for (int j = 0; j < a.length; j++) {
                emitAddress("reply-to", a[j]);
            }
        }

        // SUBJECT
        attributes.clear();
        startElement("subject", attributes);
        characters(message.getSubject());
        endElement("subject");

        // SENT-DATE
        Date d;
        d = message.getSentDate();
        emitDate("sent-date", d);

        // RECEIVED-DATE
        d = message.getReceivedDate();
        emitDate("received-date", d);

        // SIZE
        attributes.clear();
        startElement("size", attributes);
        characters(String.valueOf(message.getSize()));
        endElement("size");

        // MESSAGE NUMBER
        attributes.clear();
        startElement("message-number", attributes);
        characters(String.valueOf(message.getMessageNumber()));
        endElement("message-number");

        // FLAGS:
        Flags flags = message.getFlags();
        Flags.Flag[] sf = flags.getSystemFlags();
        // get the system flags

        attributes.clear();
        for (int i = 0; i < sf.length; i++) {
            Flags.Flag flag = sf[i];
            if (flag == Flags.Flag.ANSWERED) {
                addAttribute("answered", "yes");
            } else if (flag == Flags.Flag.DELETED) {
                addAttribute("deleted", "yes");
            } else if (flag == Flags.Flag.DRAFT) {
                addAttribute("draft", "yes");
            } else if (flag == Flags.Flag.FLAGGED) {
                addAttribute("flagged", "yes");
            } else if (flag == Flags.Flag.RECENT) {
                addAttribute("recent", "yes");
            } else if (flag == Flags.Flag.SEEN) {
                addAttribute("seen", "yes");
            }
        }
        startElement("flags", attributes);
        endElement("flags");

        String[] uf = flags.getUserFlags();
        // get the user flag strings
        for (int i = 0; i < uf.length; i++) {
            attributes.clear();
            startElement("user-flags", attributes);
            characters(uf[i]);
            endElement("user-flags");
        }

        // X-MAILER
        //String[] hdrs = message.getHeader("X-Mailer");
        //logger.info("X-Mailer " + (hdrs != null ? hdrs[0] : "NOT available"));

        Enumeration allHeaders = message.getAllHeaders();
        if (allHeaders != null) {
            while (allHeaders.hasMoreElements()) {
                Header header = (Header) allHeaders.nextElement();
                attributes.clear();
                addAttribute("name", header.getName());
                addAttribute("value", header.getValue());
                startElement("header", attributes);

                endElement("header");
            }
        }

        endElement("message-envelope");
    }


    /**
     *  Emit part as sequence of SAX events
     *
     *@param  part                    Description of the Parameter
     *@param  contentHandler          specifies sink of SAX events
     *@param  i                       Description of the Parameter
     *@exception  MessagingException  thrown iff accessing javamail data fails
     *@exception  IOException         thrown iff accessing content fails
     *@exception  SAXException        thrown iff generating SAX events fails
     */
    protected void partToSAX(ContentHandler contentHandler, Part part, int i) throws MessagingException, IOException, SAXException {
        attributes.clear();
        String v;
        if ((v = part.getContentType()) != null) {
            // content type as-is
            addAttribute("content-type", v);
            try {
                ContentType ct = new ContentType(v);
                String s;

                // primary part only
                s = ct.getPrimaryType();
                if (s != null) {
                    addAttribute("primary-type", s.toLowerCase());
                }

                // secondary part only
                s = ct.getSubType();
                if (s != null) {
                    addAttribute("secondary-type", s.toLowerCase());
                }

                // primary part '/' secondary part
                s = ct.getBaseType();
                if (s != null) {
                    addAttribute("base-type", s.toLowerCase());
                }

                // list of parameters : parameter-name parameter-value
                ParameterList pl = ct.getParameterList();
                Enumeration names = pl.getNames();
                while (names.hasMoreElements()) {
                    String key = (String) names.nextElement();
                    String value = pl.get(key);
                    addAttribute(key, value);
                }
            } catch (ParseException pe) {
                String message = "Cannot parse content-type " + String.valueOf(v);
                getLogger().error(message, pe);
            }
        }

        if (i > 0) {
            addAttribute("part-num", String.valueOf(i));

            if (part.getDescription() != null) {
                addAttribute("description", part.getDescription());
            }
            if (part.getDisposition() != null) {
                addAttribute("disposition", part.getDisposition());
                addAttribute("disposition-inline", String.valueOf(part.getDisposition().equals(Part.INLINE)));
            }
            if (part.getFileName() != null) {
                addAttribute("file-name", part.getFileName());
            }
        } else {
            boolean hasAttachments = false;
            if (part.isMimeType("multipart/*")) {
                Multipart mp = (Multipart) part.getContent();
                if (mp.getCount() > 1) {
                    hasAttachments = true;
                    addAttribute("num-parts", String.valueOf(mp.getCount()));
                }
            }
            addAttribute("has-attachments", String.valueOf(hasAttachments));
        }

        startElement("part", attributes);
        contentToSAX(contentHandler, part);
        endElement("part");
    }


    /**
     *  Emit content of message part as sequence of SAX events
     *
     *@param  contentHandler          specifies sink of SAX events
     *@param  part                    emit this part as sequence of SAX events
     *@exception  SAXException        thrown iff generating SAX events fails
     *@exception  MessagingException  thrown iff accessing javamail data fails
     *@exception  IOException         thrown iff accessing content fails
     */
    protected void contentToSAX(ContentHandler contentHandler, Part part) throws MessagingException, IOException, SAXException {
        attributes.clear();
        startElement("content", attributes);

        /*
         *  Using isMimeType to determine the content type avoids
         *  fetching the actual content data until we need it.
         *
         *  todo: recheck this code for all circumstances.........
         */
        if (part.getContent() instanceof String && (part.isMimeType("text/plain"))) {
            characters((String) part.getContent());
        } else if (part.isMimeType("multipart/alternative")) {
            MimeMultipart mp = (MimeMultipart) part.getContent();
            MimePart bestPart = null;
            int ctMax = 0;
            for (int i = 0; i < mp.getCount(); i++) {
                MimePart p = (MimePart) mp.getBodyPart(i);
                int ctPrefN = alternativeMailCtPref.preference(p);
                if (ctPrefN > ctMax) {
                    ctMax = ctPrefN;
                    bestPart = p;
                }
            }
            if (bestPart != null) {
                partToSAX(contentHandler, bestPart, 0);
            }
        } else if (part.isMimeType("multipart/*")) {
            Multipart mp = (Multipart) part.getContent();

            int count = mp.getCount();
            for (int i = 0; i < count; i++) {
                partToSAX(contentHandler, mp.getBodyPart(i), i);
            }
        } else if (part.isMimeType("message/rfc822")) {
            partToSAX(contentHandler, (Part) part.getContent(), 0);
        } else {
            /*
             *  If we actually want to see the data, and it's not a
             *  MIME type we know, fetch it and check its Java type.
            Object o = part.getContent();
            if (o instanceof String) {
                characters((String) o);
            } else if (o instanceof InputStream) {
                encodeInputStreamForXML((InputStream) o);
            } else {
                // unknown type
                InputStream is = part.getInputStream();
                encodeInputStreamForXML(is);
            }
            */
        }
        endElement("content");
    }


    /**
     *  Helper method emitting SAX events representing an internet address
     *
     *@param  nodeName          emitted element node name
     *@param  address           emitted address data
     *@exception  SAXException  thrown iff generating SAX events fails
     */
    protected void emitAddress(String nodeName, Address address) throws SAXException {

        attributes.clear();

        if (address instanceof InternetAddress) {
            InternetAddress internetAddress = (InternetAddress) address;
            String personal = internetAddress.getPersonal();
            if (personal != null) {
                addAttribute("personal", personal);
            }
            String emailAddress = internetAddress.getAddress();
            if (emailAddress != null) {
                addAttribute("email-address", emailAddress);
            }
        }

        startElement(nodeName, attributes);
        String addressAsString = address.toString();
        characters(addressAsString);
        endElement(nodeName);
    }


    /**
     *  Helper method emitting SAX events representing a date
     *
     *@param  nodeName          emitted element node name
     *@param  d                 Description of the Parameter
     *@exception  SAXException  thrown iff generating SAX events fails
     */
    protected void emitDate(String nodeName, Date d) throws SAXException {
        attributes.clear();
        startElement(nodeName, attributes);
        if (d != null) {
            if (sdf != null) {
                String formattedDate = sdf.format(d);
                characters(formattedDate);
            } else {
                characters(d.toString());
            }
        }
        endElement(nodeName);
    }


    /**
     *  Helper method emitting SAX startElement event
     *
     *@param  nodeName          Description of the Parameter
     *@param  attributes        Description of the Parameter
     *@exception  SAXException  thrown iff generating SAX events fails
     */
    private void startElement(String nodeName, Attributes attributes) throws SAXException {
        this.contentHandler.startElement(URI, nodeName, PREFIX + ":" + nodeName, attributes);
    }


    /**
     *  Helper method emitting SAX characters event
     *
     *@param  s                 Description of the Parameter
     *@exception  SAXException  thrown iff generating SAX events fails
     */
    private void characters(String s) throws SAXException {
        if (s != null) {
            // replace 0d0a by 0a
            // any better idea ?
            StringBuffer sb = new StringBuffer();
            char[] stringCharacters = s.toCharArray();
            for (int i = 0; i < stringCharacters.length; i++) {
                if (stringCharacters[i] != 0x0d) {
                    sb.append(stringCharacters[i]);
                }
            }
            stringCharacters = sb.toString().toCharArray();

            this.contentHandler.characters(stringCharacters, 0, stringCharacters.length);
        }
    }


    /**
     *  Helper method emitting SAX endElement event
     *
     *@param  nodeName          Description of the Parameter
     *@exception  SAXException  thrown iff generating SAX events fails
     */
    private void endElement(String nodeName) throws SAXException {
        this.contentHandler.endElement(URI, nodeName, PREFIX + ":" + nodeName);
    }


    /**
     *  Helper method adding an attribute name-value pair
     *
     *@param  nodeName   The feature to be added to the Attribute attribute
     *@param  nodeValue  The feature to be added to the Attribute attribute
     */
    private void addAttribute(String nodeName, String nodeValue) {
        attributes.addAttribute("", nodeName, nodeName, "CDATA", nodeValue);
    }


    /*
     *  Description of the Method
     *
     *@param  is                Description of Parameter
     *@exception  IOException   Description of Exception
     *@exception  SAXException  thrown iff generating SAX events fails
     */
    /* FIXME (SM) This method doesn't appear to be used
     private void encodeInputStreamForXML(InputStream is) throws IOException, SAXException {
        int contentLength = is.available();
        if (contentLength < 16) {
            contentLength = 2048;
        }
        attributes.clear();
        addAttribute("type", "hex");
        startElement("encoding", attributes);
        byte content[] = new byte[contentLength];
        int readLength;
        while ((readLength = is.read(content, 0, content.length)) != -1) {
            String strContent = encodeBytes(content, 0, readLength);
            characters(strContent);
        }
        endElement("encoding");
    } */


    /*
     *  A simple byte as hex encodeing
     *
     *@param  bytes   Description of Parameter
     *@param  offset  Description of Parameter
     *@param  length  Description of Parameter
     *@return         Description of the Returned Value
     */
    /* FIXME (SM) This method doesn't appear to be used
    private String encodeBytes(final byte[] bytes, final int offset, final int length) {
        StringBuffer sb = new StringBuffer();
        final String ENCODE_TABLE[] = {
                "0", "1", "2", "3", "4", "5", "6", "7", "8",
                "9", "a", "b", "c", "d", "e", "f"};
        final int l = offset + length;
        for (int i = offset; i < l; i++) {
            byte b = bytes[i];
            int upperNibble = ((b >> 4) & 0x0f);
            int lowerNibble = (b & 0x0f);

            sb.append(ENCODE_TABLE[upperNibble]);
            sb.append(ENCODE_TABLE[lowerNibble]);
            sb.append(" ");
        }
        return sb.toString();
    } */


    /**
     *  XMLizable Wrapper for one or more folders, saxing folders.
     *
     *@author     Bernhard Huber
     *@created    30. Dezember 2002
     *@version    CVS Version: $Id: MailContentHandlerDelegate.java,v 1.5 2003/09/22 20:10:46 upayavira Exp $
     */
    static class FolderXMLizer extends AbstractLogEnabled
             implements XMLizable {
        //private Folder folder;
        private Folder[] folders;


        /**
         *Constructor for the FolderSAX object
         *
         *@param  folder  Description of the Parameter
         */
        FolderXMLizer(Folder folder) {
            this.folders = new Folder[]{folder};
        }


        /**
         *Constructor for the FolderXMLizer object
         *
         *@param  folders  Description of the Parameter
         */
        FolderXMLizer(Folder[] folders) {
            this.folders = folders;
        }


        /**
         *  Generate SAX events from one or more folders
         *
         *@param  handler           Description of the Parameter
         *@exception  SAXException  thrown iff generating SAX events fails
         */
        public void toSAX(ContentHandler handler) throws SAXException {
            MailContentHandlerDelegate mailContentHandlerDelegate = new MailContentHandlerDelegate(handler);
            mailContentHandlerDelegate.enableLogging(getLogger());
            mailContentHandlerDelegate.startDocumentXMLizer();
            for (int i = 0; i < folders.length; i++) {
                mailContentHandlerDelegate.marshalFolderToSAX(folders[i]);
            }
            mailContentHandlerDelegate.endDocumentXMLizer();
        }
    }


    /**
     *  XMLizable Wrapper for one or more messages, saxing envelope only of messages.
     *
     *@author     Bernhard Huber
     *@created    30. Dezember 2002
     *@version    CVS Version: $Id: MailContentHandlerDelegate.java,v 1.5 2003/09/22 20:10:46 upayavira Exp $
     */
    static class MessageEnvelopeXMLizer extends AbstractLogEnabled
             implements XMLizable {
        private Message[] messages;

        private SimpleDateFormat sdf;


        /**
         *Constructor for the MessageEnvelopeXMLizer object
         *
         *@param  message  Description of the Parameter
         */
        public MessageEnvelopeXMLizer(Message message) {
            this.messages = new Message[1];
            this.messages[0] = message;
        }


        /**
         *Constructor for the MessageEnvelopeXMLize object
         *
         *@param  messages  Description of the Parameter
         */
        public MessageEnvelopeXMLizer(Message[] messages) {
            this.messages = messages;
        }


        /**
         *  Sets the simpleDateFormat attribute of the MessageEnvelopeXMLizer object
         *
         *@param  sdf  The new simpleDateFormat value
         */
        public void setSimpleDateFormat(SimpleDateFormat sdf) {
            this.sdf = sdf;
        }


        /**
         *  Gets the simpleDateFormat attribute of the MessageEnvelopeXMLizer object
         *
         *@param  sdf  Description of the Parameter
         */
        public void getSimpleDateFormat(SimpleDateFormat sdf) {
            this.sdf = sdf;
        }


        /**
         *  Generate SAX events from one or more messages
         *
         *@param  handler           Description of the Parameter
         *@exception  SAXException  thrown iff generating SAX events fails
         */
        public void toSAX(ContentHandler handler) throws SAXException {
            MailContentHandlerDelegate mailContentHandlerDelegate = new MailContentHandlerDelegate(handler);
            mailContentHandlerDelegate.enableLogging(getLogger());
            mailContentHandlerDelegate.setSimpleDateFormat(sdf);
            mailContentHandlerDelegate.startDocumentXMLizer();

            for (int i = 0; i < messages.length; i++) {
                mailContentHandlerDelegate.marshalMessageEnvelopeToSAX(messages[i]);
            }

            mailContentHandlerDelegate.endDocumentXMLizer();
        }
    }


    /**
     *  XMLizable Wrapper for a message, saxing a message envelope, plus content.
     *
     *@author     Bernhard Huber
     *@created    30. Dezember 2002
     *@version    CVS Version: $Id: MailContentHandlerDelegate.java,v 1.5 2003/09/22 20:10:46 upayavira Exp $
     */
    static class MessageXMLizer extends AbstractLogEnabled
             implements XMLizable {
        private Message message;

        private SimpleDateFormat sdf;


        /**
         *Constructor for the MessageXMLizer object
         *
         *@param  message  Description of the Parameter
         */
        public MessageXMLizer(Message message) {
            this.message = message;
        }


        /**
         *  Sets the simpleDateFormat attribute of the MessageXMLizer object
         *
         *@param  sdf  The new simpleDateFormat value
         */
        public void setSimpleDateFormat(SimpleDateFormat sdf) {
            this.sdf = sdf;
        }


        /**
         *  Gets the simpleDateFormat attribute of the MessageXMLizer object
         *
         *@param  sdf  Description of the Parameter
         */
        public void getSimpleDateFormat(SimpleDateFormat sdf) {
            this.sdf = sdf;
        }


        /**
         *  Generate SAX events from a message
         *
         *@param  handler           Description of the Parameter
         *@exception  SAXException  thrown iff generating SAX events fails
         */
        public void toSAX(ContentHandler handler) throws SAXException {
            MailContentHandlerDelegate mailContentHandlerDelegate = new MailContentHandlerDelegate(handler);
            mailContentHandlerDelegate.enableLogging(getLogger());
            mailContentHandlerDelegate.setSimpleDateFormat(sdf);
            mailContentHandlerDelegate.startDocumentXMLizer();
            mailContentHandlerDelegate.marshalMessageToSAX(message);
            mailContentHandlerDelegate.endDocumentXMLizer();
        }
    }
}
TOP

Related Classes of org.apache.cocoon.mail.MailContentHandlerDelegate$FolderXMLizer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.