Author: olegk
Date: Sat Nov  1 11:12:42 2014
New Revision: 1635923

URL: http://svn.apache.org/r1635923
Log:
MIME4J-218: improves defaultCharset handling
improves messages for limit exceptions with details about limit sizes
Contributed by Wolfgang Fahl <wf at bitplan.com>

Modified:
    
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/LineReaderInputStreamAdaptor.java
    
james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/MimeEntity.java
    
james/mime4j/trunk/core/src/test/java/org/apache/james/mime4j/stream/MimeEntityTest.java
    
james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/BasicBodyFactory.java
    
james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/DefaultMessageBuilder.java
    
james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/MessageBuilder.java
    
james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/dom/MessageCharsetLenientTest.java

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=1635923&r1=1635922&r2=1635923&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
 Sat Nov  1 11:12:42 2014
@@ -215,7 +215,7 @@ public class BufferedLineReaderInputStre
                 total += chunk;
             }
             if (this.maxLineLen > 0 && dst.length() >= this.maxLineLen) {
-                throw new MaxLineLimitException("Maximum line length limit 
exceeded");
+                throw new MaxLineLimitException("Maximum line length limit (" 
+ this.maxLineLen +") exceeded");
             }
         }
         if (total == 0 && bytesRead == -1) {

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=1635923&r1=1635922&r2=1635923&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
 Sat Nov  1 11:12:42 2014
@@ -92,7 +92,7 @@ public class LineReaderInputStreamAdapto
             dst.append(ch);
             total++;
             if (this.maxLineLen > 0 && dst.length() >= this.maxLineLen) {
-                throw new MaxLineLimitException("Maximum line length limit 
exceeded");
+                throw new MaxLineLimitException("Maximum line length limit ( 
"+ this.maxLineLen +") exceeded");
             }
             if (ch == '\n') {
                 break;

Modified: 
james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/MimeEntity.java
URL: 
http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/MimeEntity.java?rev=1635923&r1=1635922&r2=1635923&view=diff
==============================================================================
--- 
james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/MimeEntity.java
 (original)
+++ 
james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/MimeEntity.java
 Sat Nov  1 11:12:42 2014
@@ -251,7 +251,7 @@ class MimeEntity implements EntityStateM
                 return false;
             }
             if (maxHeaderCount > 0 && headerCount >= maxHeaderCount) {
-                throw new MaxHeaderLimitException("Maximum header limit 
exceeded");
+                throw new MaxHeaderLimitException("Maximum header limit (" + 
maxHeaderCount + ") exceeded");
             }
             headerCount++;
             fieldBuilder.reset();

Modified: 
james/mime4j/trunk/core/src/test/java/org/apache/james/mime4j/stream/MimeEntityTest.java
URL: 
http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/test/java/org/apache/james/mime4j/stream/MimeEntityTest.java?rev=1635923&r1=1635922&r2=1635923&view=diff
==============================================================================
--- 
james/mime4j/trunk/core/src/test/java/org/apache/james/mime4j/stream/MimeEntityTest.java
 (original)
+++ 
james/mime4j/trunk/core/src/test/java/org/apache/james/mime4j/stream/MimeEntityTest.java
 Sat Nov  1 11:12:42 2014
@@ -433,6 +433,8 @@ public class MimeEntityTest extends Test
             fail("MimeException caused by MaxLineLimitException should have 
been thrown");
         } catch (MimeException expected) {
             assertTrue(expected.getCause() instanceof MaxLineLimitException);
+            // make sure the exception contains the information about the 
current maxlinelen setting
+            
assertTrue(expected.getMessage().contains(""+config.getMaxLineLen()));
         }
     }
 
@@ -488,6 +490,8 @@ public class MimeEntityTest extends Test
             entity.advance();
             fail("MimeException caused by MaxLineLimitException should have 
been thrown");
         } catch (MaxHeaderLengthLimitException expected) {
+               // make sure the message contains the current setting of 
maxheaderlen
+               
assertTrue(expected.getMessage().contains(""+config.getMaxHeaderLen()));
         }
     }
 
@@ -582,6 +586,8 @@ public class MimeEntityTest extends Test
             entity.advance();
             fail("MaxHeaderLimitException should have been thrown");
         } catch (MaxHeaderLimitException expected) {
+               // make sure the message contains the current setting of 
maxheadercount
+               
assertTrue(expected.getMessage().contains(""+config.getMaxHeaderCount()));
         }
     }
 

Modified: 
james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/BasicBodyFactory.java
URL: 
http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/BasicBodyFactory.java?rev=1635923&r1=1635922&r2=1635923&view=diff
==============================================================================
--- 
james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/BasicBodyFactory.java
 (original)
+++ 
james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/BasicBodyFactory.java
 Sat Nov  1 11:12:42 2014
@@ -43,44 +43,55 @@ public class BasicBodyFactory implements
 
     public static final BasicBodyFactory INSTANCE = new BasicBodyFactory();
 
-    private final boolean lenient;
+    private final Charset defaultCharset;
 
     public BasicBodyFactory() {
         this(true);
     }
 
+    public BasicBodyFactory(final Charset defaultCharset) {
+        this.defaultCharset = defaultCharset;
+    }
+
     public BasicBodyFactory(final boolean lenient) {
-        this.lenient = lenient;
+        this(lenient ? Charset.defaultCharset() : null);
+    }
+
+    /**
+     * @return the defaultCharset
+     */
+    public Charset getDefaultCharset() {
+        return defaultCharset;
     }
 
     /**
      * select the Charset for the given mimeCharset string
-     * 
-     *  if you need support for non standard or invalid mimeCharset 
specifications
-     *  you might want to create your own derived BodyFactory extending 
BasicBodyFactory and
-     *  overriding this method as suggested by:
-     *    https://issues.apache.org/jira/browse/MIME4J-218
-     *  
-     *  the default behavior is lenient, invalid mimeCharset specifications 
will return the defaultCharset
-     * 
-     *  @param mimeCharset - the string specification for a Charset e.g. 
"UTF-8"
-     *  @throws UnsupportedEncodingException if the mimeCharset is invalid
-     */ 
+     * <p/>
+     * if you need support for non standard or invalid mimeCharset 
specifications you might want to
+     * create your own derived BodyFactory extending BasicBodyFactory and 
overriding this method as
+     * suggested by: https://issues.apache.org/jira/browse/MIME4J-218
+     * <p/>
+     * the default behavior is lenient, invalid mimeCharset specifications 
will return the
+     * defaultCharset
+     *
+     * @param mimeCharset - the string specification for a Charset e.g. "UTF-8"
+     * @throws UnsupportedEncodingException if the mimeCharset is invalid
+     */
     protected Charset resolveCharset(final String mimeCharset) throws 
UnsupportedEncodingException {
         if (mimeCharset != null) {
             try {
                 return Charset.forName(mimeCharset);
             } catch (UnsupportedCharsetException ex) {
-                if (!lenient) {
+                if (defaultCharset == null) {
                     throw new UnsupportedEncodingException(mimeCharset);
                 }
             } catch (IllegalCharsetNameException ex) {
-                if (!lenient) {
+                if (defaultCharset == null) {
                     throw new UnsupportedEncodingException(mimeCharset);
                 }
             }
         }
-        return Charset.defaultCharset();
+        return defaultCharset;
     }
 
     public TextBody textBody(final String text, final String mimeCharset) 
throws UnsupportedEncodingException {

Modified: 
james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/DefaultMessageBuilder.java
URL: 
http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/DefaultMessageBuilder.java?rev=1635923&r1=1635922&r2=1635923&view=diff
==============================================================================
--- 
james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/DefaultMessageBuilder.java
 (original)
+++ 
james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/DefaultMessageBuilder.java
 Sat Nov  1 11:12:42 2014
@@ -302,7 +302,7 @@ public class DefaultMessageBuilder imple
             BodyDescriptorBuilder bdb = bodyDescBuilder != null ? 
bodyDescBuilder :
                 new DefaultBodyDescriptorBuilder(null, fieldParser != null ? 
fieldParser :
                     strict ? DefaultFieldParser.getParser() : 
LenientFieldParser.getParser(), mon);
-            BodyFactory bf = bodyFactory != null ? bodyFactory : new 
BasicBodyFactory(!strict);
+            BodyFactory bf = bodyFactory != null ? bodyFactory : new 
BasicBodyFactory();
             MimeStreamParser parser = new MimeStreamParser(cfg, mon, bdb);
             parser.setContentHandler(new ParserStreamContentHandler(message, 
bf));
             parser.setContentDecoding(contentDecoding);

Modified: 
james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/MessageBuilder.java
URL: 
http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/MessageBuilder.java?rev=1635923&r1=1635922&r2=1635923&view=diff
==============================================================================
--- 
james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/MessageBuilder.java
 (original)
+++ 
james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/MessageBuilder.java
 Sat Nov  1 11:12:42 2014
@@ -898,7 +898,7 @@ public class MessageBuilder extends Abst
         BodyDescriptorBuilder currentBodyDescBuilder = bodyDescBuilder != null 
? bodyDescBuilder :
                 new DefaultBodyDescriptorBuilder(null, fieldParser != null ? 
fieldParser :
                         strict ? DefaultFieldParser.getParser() : 
LenientFieldParser.getParser(), currentMonitor);
-        BodyFactory currentBodyFactory = bodyFactory != null ? bodyFactory : 
new BasicBodyFactory(!strict);
+        BodyFactory currentBodyFactory = bodyFactory != null ? bodyFactory : 
new BasicBodyFactory();
         MimeStreamParser parser = new MimeStreamParser(currentConfig, 
currentMonitor, currentBodyDescBuilder);
 
         Message message = new MessageImpl();

Modified: 
james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/dom/MessageCharsetLenientTest.java
URL: 
http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/dom/MessageCharsetLenientTest.java?rev=1635923&r1=1635922&r2=1635923&view=diff
==============================================================================
--- 
james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/dom/MessageCharsetLenientTest.java
 (original)
+++ 
james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/dom/MessageCharsetLenientTest.java
 Sat Nov  1 11:12:42 2014
@@ -99,7 +99,8 @@ public class MessageCharsetLenientTest {
                // test in bosh states
                for (boolean lenient : lenientstates) {
                        // set how lenient we are
-            builder.setBodyFactory(new BasicBodyFactory(lenient));
+                       BasicBodyFactory basicBodyFactory = new 
BasicBodyFactory(lenient );
+            builder.setBodyFactory(basicBodyFactory);
                        // check the list of invalid Charsets
                        for (String invalidCharset : invalidCharsets) {
                                // create a message with the charset 


Reply via email to