Modified: james/mime4j/trunk/src/main/java/org/apache/james/mime4j/StreamCursor.java URL: http://svn.apache.org/viewvc/james/mime4j/trunk/src/main/java/org/apache/james/mime4j/StreamCursor.java?rev=674206&r1=674205&r2=674206&view=diff ============================================================================== --- james/mime4j/trunk/src/main/java/org/apache/james/mime4j/StreamCursor.java (original) +++ james/mime4j/trunk/src/main/java/org/apache/james/mime4j/StreamCursor.java Sat Jul 5 08:31:17 2008 @@ -1,163 +0,0 @@ -/**************************************************************** - * 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.james.mime4j; - -import java.io.IOException; -import java.io.InputStream; - -import org.apache.james.mime4j.decoder.Base64InputStream; -import org.apache.james.mime4j.decoder.QuotedPrintableInputStream; - -/** - * Stream based cursor. - */ -public class StreamCursor implements Cursor { - - protected final InputBuffer buffer; - protected final BufferingInputStream bufferingInputStream; - protected final RootInputStream rootInputStream; - - protected MimeBoundaryInputStream mbis; - protected InputStream contentStream; - - /** - * Constructs a child cursor. - * @param parent <code>Cursor</code>, not null - */ - StreamCursor(StreamCursor parent) { - this.buffer = parent.buffer; - this.bufferingInputStream = parent.bufferingInputStream; - this.rootInputStream = parent.rootInputStream; - } - - /** - * Constructs a new cursor from the given root contents. - * @param stream <code>InputStream</code>, not null - */ - StreamCursor(InputStream stream) { - this.buffer = new InputBuffer(stream, 1024 * 4); - this.bufferingInputStream = new BufferingInputStream(this.buffer); - this.rootInputStream = new RootInputStream(this.bufferingInputStream); - this.contentStream = this.rootInputStream; - } - - /** - * Constructs a cursor from the previous cursor. - * @param previous <code>StreamCursor</code>, not null - * @param contentStream <code>InputStream</code>, not null - */ - StreamCursor(StreamCursor previous, InputStream contentStream) { - this.buffer = previous.buffer; - this.bufferingInputStream = previous.bufferingInputStream; - this.rootInputStream = previous.rootInputStream; - this.contentStream = contentStream; - } - - /** - * @see Cursor#stop() - */ - public void stop() { - rootInputStream.truncate(); - } - - /** - * @see Cursor#getLineNumber() - */ - public int getLineNumber() { - return rootInputStream.getLineNumber(); - } - - /** - * @see Cursor#decodeBase64() - */ - public Cursor decodeBase64() throws IOException { - return new StreamCursor(this, - new EOLConvertingInputStream(new Base64InputStream(mbis))); - } - - /** - * @see Cursor#decodeQuotedPrintable() - */ - public Cursor decodeQuotedPrintable() throws IOException { - return new StreamCursor(this, - new EOLConvertingInputStream(new QuotedPrintableInputStream(mbis))); - } - - /** - * @see Cursor#advanceToBoundary() - */ - public void advanceToBoundary() throws IOException { - byte[] tmp = new byte[2048]; - while (mbis.read(tmp)!= -1) { - } - } - - /** - * @see Cursor#isEnded() - */ - public boolean isEnded() throws IOException { - return mbis.eof(); - } - - /** - * @see Cursor#moreMimeParts() - */ - public boolean moreMimeParts() throws IOException { - return !mbis.isLastPart(); - } - - /** - * @see Cursor#boundary(String) - */ - public void boundary(String boundary) throws IOException { - mbis = new MimeBoundaryInputStream(buffer, boundary); - contentStream = new CloseShieldInputStream(mbis); - } - - /** - * @see Cursor#nextMimePartCursor() - */ - public Cursor nextMimePartCursor() { - return new StreamCursor(this, mbis); - } - - /** - * @see Cursor#nextSection() - */ - public InputStream nextSection() { - return contentStream; - } - - /** - * @see Cursor#advance() - */ - public byte advance() throws IOException { - return (byte) nextSection().read(); - } - - public InputStream rest() { - return contentStream; - } - - public InputStream root() { - return rootInputStream; - } - -}
Added: james/mime4j/trunk/src/test/java/org/apache/james/mime4j/MimeEntityTest.java URL: http://svn.apache.org/viewvc/james/mime4j/trunk/src/test/java/org/apache/james/mime4j/MimeEntityTest.java?rev=674206&view=auto ============================================================================== --- james/mime4j/trunk/src/test/java/org/apache/james/mime4j/MimeEntityTest.java (added) +++ james/mime4j/trunk/src/test/java/org/apache/james/mime4j/MimeEntityTest.java Sat Jul 5 08:31:17 2008 @@ -0,0 +1,332 @@ +/**************************************************************** + * 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.james.mime4j; + +import java.io.ByteArrayInputStream; + +import org.apache.commons.io.IOUtils; + +import junit.framework.TestCase; + +public class MimeEntityTest extends TestCase { + + public void testSimpleEntity() throws Exception { + String message = + "To: Road Runner <[EMAIL PROTECTED]>\r\n" + + "From: Wile E. Cayote <[EMAIL PROTECTED]>\r\n" + + "Date: Tue, 12 Feb 2008 17:34:09 +0000 (GMT)\r\n" + + "Subject: Mail\r\n" + + "Content-Type: text/plain\r\n" + + "\r\n" + + "a very important message"; + byte[] raw = message.getBytes("US-ASCII"); + ByteArrayInputStream instream = new ByteArrayInputStream(raw); + RootInputStream rootStream = new RootInputStream(instream); + InputBuffer inbuffer = new InputBuffer(rootStream, 12); + BufferingInputStream rawstream = new BufferingInputStream(inbuffer); + + MimeEntity entity = new MimeEntity( + rootStream, + rawstream, + inbuffer, + null, + EntityStates.T_START_MESSAGE, + EntityStates.T_END_MESSAGE); + + + assertEquals(EntityStates.T_START_MESSAGE, entity.getState()); + entity.advance(); + assertEquals(EntityStates.T_START_HEADER, entity.getState()); + entity.advance(); + assertEquals(EntityStates.T_FIELD, entity.getState()); + assertEquals("To", entity.getFieldName()); + assertEquals(" Road Runner <[EMAIL PROTECTED]>", entity.getFieldValue()); + entity.advance(); + assertEquals(EntityStates.T_FIELD, entity.getState()); + assertEquals("From", entity.getFieldName()); + assertEquals(" Wile E. Cayote <[EMAIL PROTECTED]>", entity.getFieldValue()); + entity.advance(); + assertEquals(EntityStates.T_FIELD, entity.getState()); + assertEquals("Date", entity.getFieldName()); + assertEquals(" Tue, 12 Feb 2008 17:34:09 +0000 (GMT)", entity.getFieldValue()); + entity.advance(); + assertEquals(EntityStates.T_FIELD, entity.getState()); + assertEquals("Subject", entity.getFieldName()); + assertEquals(" Mail", entity.getFieldValue()); + entity.advance(); + assertEquals(EntityStates.T_FIELD, entity.getState()); + assertEquals("Content-Type", entity.getFieldName()); + assertEquals(" text/plain", entity.getFieldValue()); + entity.advance(); + assertEquals(EntityStates.T_END_HEADER, entity.getState()); + try { + entity.getFieldName(); + fail("IllegalStateException should have been thrown"); + } catch (IllegalStateException expected) { + } + try { + entity.getFieldValue(); + fail("IllegalStateException should have been thrown"); + } catch (IllegalStateException expected) { + } + + entity.advance(); + assertEquals(EntityStates.T_BODY, entity.getState()); + assertEquals("a very important message", IOUtils.toString(entity.getContentStream())); + entity.advance(); + assertEquals(EntityStates.T_END_MESSAGE, entity.getState()); + try { + entity.getContentStream(); + fail("IllegalStateException should have been thrown"); + } catch (IllegalStateException expected) { + } + entity.advance(); + assertEquals(EntityStates.T_END_OF_STREAM, entity.getState()); + try { + entity.advance(); + fail("IllegalStateException should have been thrown"); + } catch (IllegalStateException expected) { + } + } + + public void testMultipartEntity() throws Exception { + String message = + "To: Road Runner <[EMAIL PROTECTED]>\r\n" + + "From: Wile E. Cayote <[EMAIL PROTECTED]>\r\n" + + "Date: Tue, 12 Feb 2008 17:34:09 +0000 (GMT)\r\n" + + "Subject: Mail\r\n" + + "Content-Type: multipart/mixed;boundary=1729\r\n" + + "\r\n" + + "Hello!\r\n" + + "--1729\r\n" + + "Content-Type: text/plain; charset=US-ASCII\r\n" + + "\r\n" + + "blah blah blah\r\n" + + "--1729\r\n" + + "Content-Type: text/plain; charset=US-ASCII\r\n" + + "\r\n" + + "yada yada yada\r\n" + + "--1729--\r\n" + + "Goodbye!"; + byte[] raw = message.getBytes("US-ASCII"); + ByteArrayInputStream instream = new ByteArrayInputStream(raw); + RootInputStream rootStream = new RootInputStream(instream); + InputBuffer inbuffer = new InputBuffer(rootStream, 24); + BufferingInputStream rawstream = new BufferingInputStream(inbuffer); + + MimeEntity entity = new MimeEntity( + rootStream, + rawstream, + inbuffer, + null, + EntityStates.T_START_MESSAGE, + EntityStates.T_END_MESSAGE); + + assertEquals(EntityStates.T_START_MESSAGE, entity.getState()); + entity.advance(); + assertEquals(EntityStates.T_START_HEADER, entity.getState()); + entity.advance(); + assertEquals(EntityStates.T_FIELD, entity.getState()); + assertEquals("To", entity.getFieldName()); + assertEquals(" Road Runner <[EMAIL PROTECTED]>", entity.getFieldValue()); + entity.advance(); + assertEquals(EntityStates.T_FIELD, entity.getState()); + assertEquals("From", entity.getFieldName()); + assertEquals(" Wile E. Cayote <[EMAIL PROTECTED]>", entity.getFieldValue()); + entity.advance(); + assertEquals(EntityStates.T_FIELD, entity.getState()); + assertEquals("Date", entity.getFieldName()); + assertEquals(" Tue, 12 Feb 2008 17:34:09 +0000 (GMT)", entity.getFieldValue()); + entity.advance(); + assertEquals(EntityStates.T_FIELD, entity.getState()); + assertEquals("Subject", entity.getFieldName()); + assertEquals(" Mail", entity.getFieldValue()); + entity.advance(); + assertEquals(EntityStates.T_FIELD, entity.getState()); + assertEquals("Content-Type", entity.getFieldName()); + assertEquals(" multipart/mixed;boundary=1729", entity.getFieldValue()); + entity.advance(); + assertEquals(EntityStates.T_END_HEADER, entity.getState()); + entity.advance(); + assertEquals(EntityStates.T_START_MULTIPART, entity.getState()); + entity.advance(); + assertEquals(EntityStates.T_PREAMBLE, entity.getState()); + assertEquals("Hello!", IOUtils.toString(entity.getContentStream())); + + EntityStateMachine p1 = entity.advance(); + assertNotNull(p1); + + assertEquals(EntityStates.T_START_BODYPART, p1.getState()); + p1.advance(); + assertEquals(EntityStates.T_START_HEADER, p1.getState()); + p1.advance(); + assertEquals(EntityStates.T_FIELD, p1.getState()); + assertEquals("Content-Type", p1.getFieldName()); + assertEquals(" text/plain; charset=US-ASCII", p1.getFieldValue()); + p1.advance(); + assertEquals(EntityStates.T_END_HEADER, p1.getState()); + p1.advance(); + assertEquals(EntityStates.T_BODY, p1.getState()); + assertEquals("blah blah blah", IOUtils.toString(p1.getContentStream())); + p1.advance(); + assertEquals(EntityStates.T_END_BODYPART, p1.getState()); + p1.advance(); + assertEquals(EntityStates.T_END_OF_STREAM, p1.getState()); + + EntityStateMachine p2 = entity.advance(); + assertNotNull(p2); + + assertEquals(EntityStates.T_START_BODYPART, p2.getState()); + p2.advance(); + assertEquals(EntityStates.T_START_HEADER, p2.getState()); + p2.advance(); + assertEquals(EntityStates.T_FIELD, p2.getState()); + assertEquals("Content-Type", p2.getFieldName()); + assertEquals(" text/plain; charset=US-ASCII", p2.getFieldValue()); + p2.advance(); + assertEquals(EntityStates.T_END_HEADER, p2.getState()); + p2.advance(); + assertEquals(EntityStates.T_BODY, p2.getState()); + assertEquals("yada yada yada", IOUtils.toString(p2.getContentStream())); + p2.advance(); + assertEquals(EntityStates.T_END_BODYPART, p2.getState()); + p2.advance(); + assertEquals(EntityStates.T_END_OF_STREAM, p2.getState()); + + entity.advance(); + assertEquals(EntityStates.T_EPILOGUE, entity.getState()); + assertEquals("Goodbye!", IOUtils.toString(entity.getContentStream())); + entity.advance(); + assertEquals(EntityStates.T_END_MULTIPART, entity.getState()); + entity.advance(); + assertEquals(EntityStates.T_END_MESSAGE, entity.getState()); + entity.advance(); + assertEquals(EntityStates.T_END_OF_STREAM, entity.getState()); + } + + public void testRawEntity() throws Exception { + String message = + "To: Road Runner <[EMAIL PROTECTED]>\r\n" + + "From: Wile E. Cayote <[EMAIL PROTECTED]>\r\n" + + "Date: Tue, 12 Feb 2008 17:34:09 +0000 (GMT)\r\n" + + "Subject: Mail\r\n" + + "Content-Type: multipart/mixed;boundary=1729\r\n" + + "\r\n" + + "Hello!\r\n" + + "--1729\r\n" + + "Content-Type: text/plain; charset=US-ASCII\r\n" + + "\r\n" + + "blah blah blah\r\n" + + "--1729\r\n" + + "Content-Type: text/plain; charset=US-ASCII\r\n" + + "\r\n" + + "yada yada yada\r\n" + + "--1729--\r\n" + + "Goodbye!"; + byte[] raw = message.getBytes("US-ASCII"); + ByteArrayInputStream instream = new ByteArrayInputStream(raw); + RootInputStream rootStream = new RootInputStream(instream); + InputBuffer inbuffer = new InputBuffer(rootStream, 24); + BufferingInputStream rawstream = new BufferingInputStream(inbuffer); + + MimeEntity entity = new MimeEntity( + rootStream, + rawstream, + inbuffer, + null, + EntityStates.T_START_MESSAGE, + EntityStates.T_END_MESSAGE); + + entity.setRecursionMode(RecursionMode.M_RAW); + + assertEquals(EntityStates.T_START_MESSAGE, entity.getState()); + entity.advance(); + assertEquals(EntityStates.T_START_HEADER, entity.getState()); + entity.advance(); + assertEquals(EntityStates.T_FIELD, entity.getState()); + assertEquals("To", entity.getFieldName()); + assertEquals(" Road Runner <[EMAIL PROTECTED]>", entity.getFieldValue()); + entity.advance(); + assertEquals(EntityStates.T_FIELD, entity.getState()); + assertEquals("From", entity.getFieldName()); + assertEquals(" Wile E. Cayote <[EMAIL PROTECTED]>", entity.getFieldValue()); + entity.advance(); + assertEquals(EntityStates.T_FIELD, entity.getState()); + assertEquals("Date", entity.getFieldName()); + assertEquals(" Tue, 12 Feb 2008 17:34:09 +0000 (GMT)", entity.getFieldValue()); + entity.advance(); + assertEquals(EntityStates.T_FIELD, entity.getState()); + assertEquals("Subject", entity.getFieldName()); + assertEquals(" Mail", entity.getFieldValue()); + entity.advance(); + assertEquals(EntityStates.T_FIELD, entity.getState()); + assertEquals("Content-Type", entity.getFieldName()); + assertEquals(" multipart/mixed;boundary=1729", entity.getFieldValue()); + entity.advance(); + assertEquals(EntityStates.T_END_HEADER, entity.getState()); + entity.advance(); + assertEquals(EntityStates.T_START_MULTIPART, entity.getState()); + + entity.advance(); + assertEquals(EntityStates.T_PREAMBLE, entity.getState()); + assertEquals("Hello!", IOUtils.toString(entity.getContentStream())); + + EntityStateMachine p1 = entity.advance(); + assertNotNull(p1); + + assertEquals(EntityStates.T_RAW_ENTITY, p1.getState()); + assertNull(p1.getBodyDescriptor()); + assertNull(p1.getField()); + assertNull(p1.getFieldName()); + assertNull(p1.getFieldValue()); + assertEquals( + "Content-Type: text/plain; charset=US-ASCII\r\n" + + "\r\n" + + "blah blah blah", IOUtils.toString(p1.getContentStream())); + p1.advance(); + assertEquals(EntityStates.T_END_OF_STREAM, p1.getState()); + + EntityStateMachine p2 = entity.advance(); + assertNotNull(p2); + + assertEquals(EntityStates.T_RAW_ENTITY, p2.getState()); + assertNull(p2.getBodyDescriptor()); + assertNull(p2.getField()); + assertNull(p2.getFieldName()); + assertNull(p2.getFieldValue()); + assertEquals( + "Content-Type: text/plain; charset=US-ASCII\r\n" + + "\r\n" + + "yada yada yada", IOUtils.toString(p2.getContentStream())); + p2.advance(); + assertEquals(EntityStates.T_END_OF_STREAM, p2.getState()); + + entity.advance(); + assertEquals(EntityStates.T_EPILOGUE, entity.getState()); + assertEquals("Goodbye!", IOUtils.toString(entity.getContentStream())); + entity.advance(); + assertEquals(EntityStates.T_END_MULTIPART, entity.getState()); + entity.advance(); + assertEquals(EntityStates.T_END_MESSAGE, entity.getState()); + entity.advance(); + assertEquals(EntityStates.T_END_OF_STREAM, entity.getState()); + } + +} Modified: james/mime4j/trunk/src/test/java/org/apache/james/mime4j/MultipartTokensTest.java URL: http://svn.apache.org/viewvc/james/mime4j/trunk/src/test/java/org/apache/james/mime4j/MultipartTokensTest.java?rev=674206&r1=674205&r2=674206&view=diff ============================================================================== --- james/mime4j/trunk/src/test/java/org/apache/james/mime4j/MultipartTokensTest.java (original) +++ james/mime4j/trunk/src/test/java/org/apache/james/mime4j/MultipartTokensTest.java Sat Jul 5 08:31:17 2008 @@ -57,6 +57,7 @@ MESSAGE + "\r\n" + "--42\r\n" + + "\r\n" + "Custard!" + "\r\n" + "--42--\r\n"; @@ -157,6 +158,29 @@ checkState(MimeTokenStream.T_END_OF_STREAM); } + public void testMultipartMessageWithoutHeader() throws Exception { + parser.parseHeadless(new ByteArrayInputStream(US_ASCII.encode(BODY).array()), + "multipart/mixed;boundary=1729"); + checkState(MimeTokenStream.T_END_HEADER); + checkState(MimeTokenStream.T_START_MULTIPART); + checkState(MimeTokenStream.T_PREAMBLE); + checkState(MimeTokenStream.T_START_BODYPART); + checkState(MimeTokenStream.T_START_HEADER); + checkState(MimeTokenStream.T_END_HEADER); + checkState(MimeTokenStream.T_BODY); + checkState(MimeTokenStream.T_END_BODYPART); + checkState(MimeTokenStream.T_START_BODYPART); + checkState(MimeTokenStream.T_START_HEADER); + checkState(MimeTokenStream.T_FIELD); + checkState(MimeTokenStream.T_END_HEADER); + checkState(MimeTokenStream.T_BODY); + checkState(MimeTokenStream.T_END_BODYPART); + checkState(MimeTokenStream.T_EPILOGUE); + checkState(MimeTokenStream.T_END_MULTIPART); + checkState(MimeTokenStream.T_END_MESSAGE); + checkState(MimeTokenStream.T_END_OF_STREAM); + } + private void checkState(final int state) throws IOException, MimeException { assertEquals(MimeTokenStream.stateToString(state), MimeTokenStream.stateToString(parser.next())); } Modified: james/mime4j/trunk/src/test/java/org/apache/james/mime4j/StrictMimeTokenStreamTest.java URL: http://svn.apache.org/viewvc/james/mime4j/trunk/src/test/java/org/apache/james/mime4j/StrictMimeTokenStreamTest.java?rev=674206&r1=674205&r2=674206&view=diff ============================================================================== --- james/mime4j/trunk/src/test/java/org/apache/james/mime4j/StrictMimeTokenStreamTest.java (original) +++ james/mime4j/trunk/src/test/java/org/apache/james/mime4j/StrictMimeTokenStreamTest.java Sat Jul 5 08:31:17 2008 @@ -39,7 +39,7 @@ parser.next(); fail("Expected exception to be thrown"); } catch (MimeParseEventException e) { - assertEquals("Premature end of headers", MimeTokenStream.Event.HEADERS_PREMATURE_END, e.getEvent()); + assertEquals("Premature end of headers", Event.HEADERS_PREMATURE_END, e.getEvent()); } } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
