Package org.apache.cocoon.mail

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

/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements.  See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.cocoon.mail;

import java.io.IOException;
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.excalibur.xml.sax.XMLizable;

import org.apache.cocoon.util.AbstractLogEnabled;

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>
*
* @since 24 October 2002
* @version $Id: MailContentHandlerDelegate.java 587761 2007-10-24 03:08:05Z vgritsenko $
*/

/*
*  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.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.
     *
     */
    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.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.
     */
    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.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.
     */
    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.setSimpleDateFormat(sdf);
            mailContentHandlerDelegate.startDocumentXMLizer();
            mailContentHandlerDelegate.marshalMessageToSAX(message);
            mailContentHandlerDelegate.endDocumentXMLizer();
        }
    }
}
TOP

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

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.