You are viewing a plain text version of this content. The canonical link for it is here.
Posted to mime4j-dev@james.apache.org by mw...@apache.org on 2009/06/12 13:59:10 UTC

svn commit: r784087 - in /james/mime4j/trunk/core/src: main/java/org/apache/james/mime4j/ main/java/org/apache/james/mime4j/io/ main/java/org/apache/james/mime4j/parser/ test/java/org/apache/james/mime4j/ test/java/org/apache/james/mime4j/parser/

Author: mwiederkehr
Date: Fri Jun 12 11:59:10 2009
New Revision: 784087

URL: http://svn.apache.org/viewvc?rev=784087&view=rev
Log:
removed constructor MimeIOException(String); MaxLineLimitException now extends IOException instead of MimeIOException; additional javadoc for MimeException and MimeIOException (resolves MIME4J-137).

Modified:
    james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/MimeException.java
    james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/MimeIOException.java
    james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/io/BufferedLineReaderInputStream.java
    james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/io/LineReaderInputStream.java
    james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/io/LineReaderInputStreamAdaptor.java
    james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/io/MaxLineLimitException.java
    james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/parser/AbstractEntity.java
    james/mime4j/trunk/core/src/test/java/org/apache/james/mime4j/MimeIOExceptionTest.java
    james/mime4j/trunk/core/src/test/java/org/apache/james/mime4j/parser/MimeEntityTest.java

Modified: james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/MimeException.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/MimeException.java?rev=784087&r1=784086&r2=784087&view=diff
==============================================================================
--- james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/MimeException.java (original)
+++ james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/MimeException.java Fri Jun 12 11:59:10 2009
@@ -19,8 +19,18 @@
 
 package org.apache.james.mime4j;
 
+import org.apache.james.mime4j.parser.ContentHandler;
+
 /**
  * MIME processing exception.
+ * <p>
+ * A <code>MimeException</code> may be thrown by a {@link ContentHandler} to
+ * indicate that it has failed to process a message event and that no further
+ * events should be generated.
+ * <p>
+ * <code>MimeException</code> also gets thrown by the parser to indicate MIME
+ * protocol errors, e.g. if a message boundary is too long or a header field
+ * cannot be parsed.
  */
 public class MimeException extends Exception {
 

Modified: james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/MimeIOException.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/MimeIOException.java?rev=784087&r1=784086&r2=784087&view=diff
==============================================================================
--- james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/MimeIOException.java (original)
+++ james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/MimeIOException.java Fri Jun 12 11:59:10 2009
@@ -23,28 +23,36 @@
 
 /**
  * A wrapper class based on {@link IOException} for MIME protocol exceptions.
+ * <p>
+ * This exception is used to signal a <code>MimeException</code> in methods
+ * that only permit <code>IOException</code> to be thrown.
+ * <p>
+ * The cause of a <code>MimeIOException</code> is always a
+ * <code>MimeException</code> therefore.
  */
 public class MimeIOException extends IOException {
 
     private static final long serialVersionUID = 5393613459533735409L;
 
     /**
-     * Creates a new MimeIOException from the specified detail message.
+     * Constructs an IO exception based on {@link MimeException}.
      * 
-     * @param message detail message.
+     * @param cause the cause.
      */
-    public MimeIOException(String message) {
-        this(new MimeException(message));
+    public MimeIOException(MimeException cause) {
+        super(cause == null ? null : cause.getMessage());
+        initCause(cause);
     }
 
     /**
-     * Constructs an IO exception based on {@link MimeException}.
+     * Returns the <code>MimeException</code> that caused this
+     * <code>MimeIOException</code>.
      * 
-     * @param cause the cause.
+     * @return the cause of this <code>MimeIOException</code>.
      */
-    public MimeIOException(MimeException cause) {
-        super(cause == null ? null : cause.getMessage());
-		initCause(cause);
+    @Override
+    public MimeException getCause() {
+        return (MimeException) super.getCause();
     }
 
 }

Modified: james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/io/BufferedLineReaderInputStream.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/io/BufferedLineReaderInputStream.java?rev=784087&r1=784086&r2=784087&view=diff
==============================================================================
--- james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/io/BufferedLineReaderInputStream.java (original)
+++ james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/io/BufferedLineReaderInputStream.java Fri Jun 12 11:59:10 2009
@@ -164,9 +164,9 @@
         return false;
     }
 
-    
     @Override
-    public int readLine(final ByteArrayBuffer dst) throws IOException {
+    public int readLine(final ByteArrayBuffer dst)
+            throws MaxLineLimitException, IOException {
         if (dst == null) {
             throw new IllegalArgumentException("Buffer may not be null");
         }

Modified: james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/io/LineReaderInputStream.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/io/LineReaderInputStream.java?rev=784087&r1=784086&r2=784087&view=diff
==============================================================================
--- james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/io/LineReaderInputStream.java (original)
+++ james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/io/LineReaderInputStream.java Fri Jun 12 11:59:10 2009
@@ -41,8 +41,11 @@
      * @return number of bytes copied or <code>-1</code> if the end of 
      * the stream has been reached.
      * 
+     * @throws MaxLineLimitException if the line exceeds a limit on
+     *   the line length imposed by a subclass.
      * @throws IOException in case of an I/O error.
      */
-    public abstract int readLine(final ByteArrayBuffer dst) throws IOException;
-    
+    public abstract int readLine(final ByteArrayBuffer dst)
+            throws MaxLineLimitException, IOException;
+
 }

Modified: james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/io/LineReaderInputStreamAdaptor.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/io/LineReaderInputStreamAdaptor.java?rev=784087&r1=784086&r2=784087&view=diff
==============================================================================
--- james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/io/LineReaderInputStreamAdaptor.java (original)
+++ james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/io/LineReaderInputStreamAdaptor.java Fri Jun 12 11:59:10 2009
@@ -71,7 +71,8 @@
     }
     
     @Override
-    public int readLine(final ByteArrayBuffer dst) throws IOException {
+    public int readLine(final ByteArrayBuffer dst)
+            throws MaxLineLimitException, IOException {
         int i;
         if (this.bis != null) {
              i = this.bis.readLine(dst);
@@ -83,7 +84,8 @@
         return i;
     }
 
-    private int doReadLine(final ByteArrayBuffer dst) throws IOException {
+    private int doReadLine(final ByteArrayBuffer dst)
+            throws MaxLineLimitException, IOException {
         int total = 0;
         int ch;
         while ((ch = in.read()) != -1) {

Modified: james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/io/MaxLineLimitException.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/io/MaxLineLimitException.java?rev=784087&r1=784086&r2=784087&view=diff
==============================================================================
--- james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/io/MaxLineLimitException.java (original)
+++ james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/io/MaxLineLimitException.java Fri Jun 12 11:59:10 2009
@@ -19,15 +19,15 @@
 
 package org.apache.james.mime4j.io;
 
-import org.apache.james.mime4j.MimeIOException;
+import java.io.IOException;
 
 /**
- * Signals a I/O error due to a line exceeding the limit on the 
- * maximum line length.
+ * Signals an I/O error due to a line exceeding the limit on the maximum line
+ * length.
  */
-public class MaxLineLimitException extends MimeIOException {
-    
-    private static final long serialVersionUID = 8039001187837730773L;
+public class MaxLineLimitException extends IOException {
+
+    private static final long serialVersionUID = 1855987166990764426L;
 
     public MaxLineLimitException(final String message) {
         super(message);

Modified: james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/parser/AbstractEntity.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/parser/AbstractEntity.java?rev=784087&r1=784086&r2=784087&view=diff
==============================================================================
--- james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/parser/AbstractEntity.java (original)
+++ james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/parser/AbstractEntity.java Fri Jun 12 11:59:10 2009
@@ -130,43 +130,48 @@
         LineReaderInputStream instream = getDataStream();
         ByteArrayBuffer fieldbuf = new ByteArrayBuffer(64);
 
-        for (;;) {
-            // If there's still data stuck in the line buffer
-            // copy it to the field buffer
-            int len = linebuf.length();
-            if (maxLineLen > 0 && fieldbuf.length() + len >= maxLineLen) {
-                throw new MaxLineLimitException("Maximum line length limit exceeded");
-            }
-            if (len > 0) {
-                fieldbuf.append(linebuf.buffer(), 0, len);
-            }
-            linebuf.clear();
-            if (instream.readLine(linebuf) == -1) {
-                monitor(Event.HEADERS_PREMATURE_END);
-                endOfHeader = true;
-                break;
-            }
-            len = linebuf.length();
-            if (len > 0 && linebuf.byteAt(len - 1) == '\n') {
-                len--;
-            }
-            if (len > 0 && linebuf.byteAt(len - 1) == '\r') {
-                len--;
-            }
-            if (len == 0) {
-                // empty line detected 
-                endOfHeader = true;
-                break;
-            }
-            lineCount++;
-            if (lineCount > 1) {
-                int ch = linebuf.byteAt(0);
-                if (ch != CharsetUtil.SP && ch != CharsetUtil.HT) {
-                    // new header detected
+        try {
+            for (;;) {
+                // If there's still data stuck in the line buffer
+                // copy it to the field buffer
+                int len = linebuf.length();
+                if (maxLineLen > 0 && fieldbuf.length() + len >= maxLineLen) {
+                    throw new MaxLineLimitException("Maximum line length limit exceeded");
+                }
+                if (len > 0) {
+                    fieldbuf.append(linebuf.buffer(), 0, len);
+                }
+                linebuf.clear();
+                if (instream.readLine(linebuf) == -1) {
+                    monitor(Event.HEADERS_PREMATURE_END);
+                    endOfHeader = true;
+                    break;
+                }
+                len = linebuf.length();
+                if (len > 0 && linebuf.byteAt(len - 1) == '\n') {
+                    len--;
+                }
+                if (len > 0 && linebuf.byteAt(len - 1) == '\r') {
+                    len--;
+                }
+                if (len == 0) {
+                    // empty line detected 
+                    endOfHeader = true;
                     break;
                 }
+                lineCount++;
+                if (lineCount > 1) {
+                    int ch = linebuf.byteAt(0);
+                    if (ch != CharsetUtil.SP && ch != CharsetUtil.HT) {
+                        // new header detected
+                        break;
+                    }
+                }
             }
         }
+        catch (MaxLineLimitException e) {
+            throw new MimeException(e);
+        }
 
         return fieldbuf;
     }

Modified: james/mime4j/trunk/core/src/test/java/org/apache/james/mime4j/MimeIOExceptionTest.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/test/java/org/apache/james/mime4j/MimeIOExceptionTest.java?rev=784087&r1=784086&r2=784087&view=diff
==============================================================================
--- james/mime4j/trunk/core/src/test/java/org/apache/james/mime4j/MimeIOExceptionTest.java (original)
+++ james/mime4j/trunk/core/src/test/java/org/apache/james/mime4j/MimeIOExceptionTest.java Fri Jun 12 11:59:10 2009
@@ -23,14 +23,6 @@
 
 public class MimeIOExceptionTest extends TestCase {
 
-    public void testMimeIOExceptionString() {
-        MimeIOException e =  new MimeIOException("message");
-        assertEquals("message", e.getMessage());
-        assertNotNull(e.getCause());
-        assertTrue(e.getCause() instanceof MimeException);
-        assertEquals("message", e.getCause().getMessage());
-    }
-
     public void testMimeIOExceptionMimeException() {
         MimeException cause = new MimeException("cause");
         MimeIOException e = new MimeIOException(cause);

Modified: james/mime4j/trunk/core/src/test/java/org/apache/james/mime4j/parser/MimeEntityTest.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/test/java/org/apache/james/mime4j/parser/MimeEntityTest.java?rev=784087&r1=784086&r2=784087&view=diff
==============================================================================
--- james/mime4j/trunk/core/src/test/java/org/apache/james/mime4j/parser/MimeEntityTest.java (original)
+++ james/mime4j/trunk/core/src/test/java/org/apache/james/mime4j/parser/MimeEntityTest.java Fri Jun 12 11:59:10 2009
@@ -23,6 +23,7 @@
 import java.io.IOException;
 
 import org.apache.commons.io.IOUtils;
+import org.apache.james.mime4j.MimeException;
 import org.apache.james.mime4j.io.BufferedLineReaderInputStream;
 import org.apache.james.mime4j.io.MaxHeaderLimitException;
 import org.apache.james.mime4j.io.MaxLineLimitException;
@@ -366,8 +367,9 @@
         assertEquals(EntityStates.T_FIELD, entity.getState());
         try {
             entity.advance();
-            fail("MaxLineLimitException should have been thrown");
-        } catch (MaxLineLimitException expected) {
+            fail("MimeException caused by MaxLineLimitException should have been thrown");
+        } catch (MimeException expected) {
+            assertTrue(expected.getCause() instanceof MaxLineLimitException);
         }
     }
     
@@ -420,8 +422,9 @@
         assertEquals(EntityStates.T_FIELD, entity.getState());
         try {
             entity.advance();
-            fail("MaxLineLimitException should have been thrown");
-        } catch (MaxLineLimitException expected) {
+            fail("MimeException caused by MaxLineLimitException should have been thrown");
+        } catch (MimeException expected) {
+            assertTrue(expected.getCause() instanceof MaxLineLimitException);
         }
     }