14fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy/****************************************************************
24fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * Licensed to the Apache Software Foundation (ASF) under one   *
34fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * or more contributor license agreements.  See the NOTICE file *
44fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * distributed with this work for additional information        *
54fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * regarding copyright ownership.  The ASF licenses this file   *
64fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * to you under the Apache License, Version 2.0 (the            *
74fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * "License"); you may not use this file except in compliance   *
84fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * with the License.  You may obtain a copy of the License at   *
94fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy *                                                              *
104fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy *   http://www.apache.org/licenses/LICENSE-2.0                 *
114fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy *                                                              *
124fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * Unless required by applicable law or agreed to in writing,   *
134fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * software distributed under the License is distributed on an  *
144fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
154fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * KIND, either express or implied.  See the License for the    *
164fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * specific language governing permissions and limitations      *
174fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * under the License.                                           *
184fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy ****************************************************************/
194fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
204fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedypackage org.apache.james.mime4j.message;
214fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
224fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedyimport java.io.IOException;
234fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedyimport java.io.InputStream;
244fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedyimport java.io.OutputStream;
254fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedyimport java.util.Stack;
264fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
274fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedyimport org.apache.james.mime4j.BodyDescriptor;
284fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedyimport org.apache.james.mime4j.ContentHandler;
294fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedyimport org.apache.james.mime4j.MimeStreamParser;
304fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedyimport org.apache.james.mime4j.decoder.Base64InputStream;
314fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedyimport org.apache.james.mime4j.decoder.QuotedPrintableInputStream;
324fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedyimport org.apache.james.mime4j.field.Field;
334fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedyimport org.apache.james.mime4j.field.UnstructuredField;
344fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
354fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
364fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy/**
374fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * Represents a MIME message. The following code parses a stream into a
384fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * <code>Message</code> object.
394fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy *
404fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * <pre>
414fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy *      Message msg = new Message(new BufferedInputStream(
424fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy *                                      new FileInputStream("mime.msg")));
434fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * </pre>
444fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy *
454fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy *
464fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy *
474fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * @version $Id: Message.java,v 1.3 2004/10/02 12:41:11 ntherning Exp $
484fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy */
494fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedypublic class Message extends Entity implements Body {
504fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
514fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    /**
524fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * Creates a new empty <code>Message</code>.
534fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     */
544fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public Message() {
554fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
564fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
574fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    /**
584fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * Parses the specified MIME message stream into a <code>Message</code>
594fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * instance.
604fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     *
614fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param is the stream to parse.
624fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @throws IOException on I/O errors.
634fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     */
644fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public Message(InputStream is) throws IOException {
654fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        MimeStreamParser parser = new MimeStreamParser();
664fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        parser.setContentHandler(new MessageBuilder());
674fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        parser.parse(is);
684fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
694fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
704fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
714fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    /**
724fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * Gets the <code>Subject</code> field.
734fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     *
744fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @return the <code>Subject</code> field or <code>null</code> if it
754fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     *         doesn't exist.
764fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     */
774fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public UnstructuredField getSubject() {
784fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        return (UnstructuredField) getHeader().getField(Field.SUBJECT);
794fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
804fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
814fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    /**
824fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     *
834fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @see org.apache.james.mime4j.message.Entity#writeTo(java.io.OutputStream)
844fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     */
854fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    @Override
864fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public void writeTo(OutputStream out) throws IOException {
874fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        getHeader().writeTo(out);
884fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
894fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        Body body = getBody();
904fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        if (body instanceof Multipart) {
914fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            Multipart mp = (Multipart) body;
924fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            mp.writeTo(out);
934fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        } else {
944fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            body.writeTo(out);
954fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        }
964fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
974fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
984fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
994fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    private class MessageBuilder implements ContentHandler {
1004fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        private Stack<Object> stack = new Stack<Object>();
1014fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
1024fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        public MessageBuilder() {
1034fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        }
1044fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
1054fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        private void expect(Class c) {
1064fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            if (!c.isInstance(stack.peek())) {
1074fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy                throw new IllegalStateException("Internal stack error: "
1084fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy                        + "Expected '" + c.getName() + "' found '"
1094fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy                        + stack.peek().getClass().getName() + "'");
1104fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            }
1114fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        }
1124fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
1134fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        /**
1144fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy         * @see org.apache.james.mime4j.ContentHandler#startMessage()
1154fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy         */
1164fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        public void startMessage() {
1174fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            if (stack.isEmpty()) {
1184fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy                stack.push(Message.this);
1194fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            } else {
1204fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy                expect(Entity.class);
1214fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy                Message m = new Message();
1224fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy                ((Entity) stack.peek()).setBody(m);
1234fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy                stack.push(m);
1244fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            }
1254fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        }
1264fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
1274fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        /**
1284fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy         * @see org.apache.james.mime4j.ContentHandler#endMessage()
1294fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy         */
1304fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        public void endMessage() {
1314fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            expect(Message.class);
1324fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            stack.pop();
1334fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        }
1344fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
1354fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        /**
1364fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy         * @see org.apache.james.mime4j.ContentHandler#startHeader()
1374fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy         */
1384fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        public void startHeader() {
1394fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            stack.push(new Header());
1404fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        }
1414fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
1424fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        /**
1434fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy         * @see org.apache.james.mime4j.ContentHandler#field(java.lang.String)
1444fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy         */
1454fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        public void field(String fieldData) {
1464fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            expect(Header.class);
1474fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ((Header) stack.peek()).addField(Field.parse(fieldData));
1484fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        }
1494fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
1504fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        /**
1514fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy         * @see org.apache.james.mime4j.ContentHandler#endHeader()
1524fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy         */
1534fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        public void endHeader() {
1544fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            expect(Header.class);
1554fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            Header h = (Header) stack.pop();
1564fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            expect(Entity.class);
1574fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ((Entity) stack.peek()).setHeader(h);
1584fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        }
1594fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
1604fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        /**
1614fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy         * @see org.apache.james.mime4j.ContentHandler#startMultipart(org.apache.james.mime4j.BodyDescriptor)
1624fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy         */
1634fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        public void startMultipart(BodyDescriptor bd) {
1644fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            expect(Entity.class);
1654fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
1664fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            Entity e = (Entity) stack.peek();
1674fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            Multipart multiPart = new Multipart();
1684fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            e.setBody(multiPart);
1694fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            stack.push(multiPart);
1704fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        }
1714fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
1724fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        /**
1734fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy         * @see org.apache.james.mime4j.ContentHandler#body(org.apache.james.mime4j.BodyDescriptor, java.io.InputStream)
1744fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy         */
1754fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        public void body(BodyDescriptor bd, InputStream is) throws IOException {
1764fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            expect(Entity.class);
1774fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
1784fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            String enc = bd.getTransferEncoding();
1794fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            if ("base64".equals(enc)) {
1804fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy                is = new Base64InputStream(is);
1814fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            } else if ("quoted-printable".equals(enc)) {
1824fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy                is = new QuotedPrintableInputStream(is);
1834fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            }
1844fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
1854fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            Body body = null;
1864fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            if (bd.getMimeType().startsWith("text/")) {
1874fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy                body = new MemoryTextBody(is, bd.getCharset());
1884fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            } else {
1894fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy                body = new MemoryBinaryBody(is);
1904fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            }
1914fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
1924fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ((Entity) stack.peek()).setBody(body);
1934fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        }
1944fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
1954fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        /**
1964fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy         * @see org.apache.james.mime4j.ContentHandler#endMultipart()
1974fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy         */
1984fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        public void endMultipart() {
1994fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            stack.pop();
2004fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        }
2014fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
2024fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        /**
2034fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy         * @see org.apache.james.mime4j.ContentHandler#startBodyPart()
2044fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy         */
2054fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        public void startBodyPart() {
2064fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            expect(Multipart.class);
2074fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
2084fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            BodyPart bodyPart = new BodyPart();
2094fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ((Multipart) stack.peek()).addBodyPart(bodyPart);
2104fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            stack.push(bodyPart);
2114fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        }
2124fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
2134fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        /**
2144fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy         * @see org.apache.james.mime4j.ContentHandler#endBodyPart()
2154fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy         */
2164fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        public void endBodyPart() {
2174fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            expect(BodyPart.class);
2184fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            stack.pop();
2194fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        }
2204fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
2214fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        /**
2224fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy         * @see org.apache.james.mime4j.ContentHandler#epilogue(java.io.InputStream)
2234fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy         */
2244fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        public void epilogue(InputStream is) throws IOException {
2254fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            expect(Multipart.class);
2264fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            StringBuffer sb = new StringBuffer();
2274fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            int b;
2284fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            while ((b = is.read()) != -1) {
2294fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy                sb.append((char) b);
2304fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            }
2314fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ((Multipart) stack.peek()).setEpilogue(sb.toString());
2324fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        }
2334fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
2344fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        /**
2354fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy         * @see org.apache.james.mime4j.ContentHandler#preamble(java.io.InputStream)
2364fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy         */
2374fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        public void preamble(InputStream is) throws IOException {
2384fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            expect(Multipart.class);
2394fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            StringBuffer sb = new StringBuffer();
2404fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            int b;
2414fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            while ((b = is.read()) != -1) {
2424fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy                sb.append((char) b);
2434fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            }
2444fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ((Multipart) stack.peek()).setPreamble(sb.toString());
2454fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        }
2464fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
2474fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        /**
2484fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy         * TODO: Implement me
2494fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy         *
2504fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy         * @see org.apache.james.mime4j.ContentHandler#raw(java.io.InputStream)
2514fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy         */
2524fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        public void raw(InputStream is) throws IOException {
2534fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            throw new UnsupportedOperationException("Not supported");
2544fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        }
2554fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
2564fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
2574fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy}
258