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 ol...@apache.org on 2011/03/29 19:52:23 UTC

svn commit: r1086652 - in /james/mime4j/trunk: core/src/main/java/org/apache/james/mime4j/parser/ core/src/main/java/org/apache/james/mime4j/stream/ core/src/test/java/org/apache/james/mime4j/stream/ dom/src/main/java/org/apache/james/mime4j/message/

Author: olegk
Date: Tue Mar 29 17:52:22 2011
New Revision: 1086652

URL: http://svn.apache.org/viewvc?rev=1086652&view=rev
Log:
MIME4J-165: Use FieldBuilder to build MIME fields from individual lines. Concrete implementations of this interface can choose to truncate MIME fields that exceed a particular limit or to ignore certain fields altogether. 

Added:
    james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/DefaultFieldBuilder.java   (with props)
    james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/FieldBuilder.java   (with props)
Modified:
    james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/parser/MimeStreamParser.java
    james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/AbstractEntity.java
    james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/MimeEntity.java
    james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/MimeTokenStream.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/MessageBuilderImpl.java
    james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/MimeBuilder.java

Modified: james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/parser/MimeStreamParser.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/parser/MimeStreamParser.java?rev=1086652&r1=1086651&r2=1086652&view=diff
==============================================================================
--- james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/parser/MimeStreamParser.java (original)
+++ james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/parser/MimeStreamParser.java Tue Mar 29 17:52:22 2011
@@ -64,9 +64,9 @@ public class MimeStreamParser {
     public MimeStreamParser(
             final MimeEntityConfig config, 
             boolean clone,
-            final MutableBodyDescriptorFactory bodyDescFactory,
-            final DecodeMonitor monitor) {
-        this(new MimeTokenStream(clone ? config.clone() : config, bodyDescFactory, monitor));
+            final DecodeMonitor monitor,
+            final MutableBodyDescriptorFactory bodyDescFactory) {
+        this(new MimeTokenStream(clone ? config.clone() : config, monitor, bodyDescFactory));
     }
 
     public MimeStreamParser(final MimeEntityConfig config, boolean clone) {
@@ -74,11 +74,11 @@ public class MimeStreamParser {
     }
 
     public MimeStreamParser(
-            final MimeEntityConfig config, 
-            final MutableBodyDescriptorFactory bodyDescFactory,
-            final DecodeMonitor monitor) {
+            final MimeEntityConfig config,
+            final DecodeMonitor monitor,
+            final MutableBodyDescriptorFactory bodyDescFactory) {
         this(config != null ? config : new MimeEntityConfig(), config != null, 
-                bodyDescFactory, monitor);
+                monitor, bodyDescFactory);
     }
 
     public MimeStreamParser(final MimeEntityConfig config) {

Modified: james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/AbstractEntity.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/AbstractEntity.java?rev=1086652&r1=1086651&r2=1086652&view=diff
==============================================================================
--- james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/AbstractEntity.java (original)
+++ james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/AbstractEntity.java Tue Mar 29 17:52:22 2011
@@ -24,7 +24,6 @@ import java.io.IOException;
 import org.apache.james.mime4j.MimeException;
 import org.apache.james.mime4j.codec.DecodeMonitor;
 import org.apache.james.mime4j.io.LineReaderInputStream;
-import org.apache.james.mime4j.io.MaxHeaderLengthLimitException;
 import org.apache.james.mime4j.io.MaxHeaderLimitException;
 import org.apache.james.mime4j.io.MaxLineLimitException;
 import org.apache.james.mime4j.util.ByteArrayBuffer;
@@ -33,39 +32,42 @@ import org.apache.james.mime4j.util.Char
 /**
  * Abstract MIME entity.
  */
-public abstract class AbstractEntity implements EntityStateMachine {
+abstract class AbstractEntity implements EntityStateMachine {
 
     protected final EntityState startState;
     protected final EntityState endState;
     protected final MimeEntityConfig config;
+    protected final DecodeMonitor monitor;
+    protected final FieldBuilder fieldBuilder;
     protected final MutableBodyDescriptor body;
-    
-    protected EntityState state;
 
     private final ByteArrayBuffer linebuf;
 
+    protected EntityState state;
     private int lineCount;
-    private RawField field;
     private boolean endOfHeader;
     private int headerCount;
-    protected final DecodeMonitor monitor;
+    private RawField field;
 
     AbstractEntity(
-            MutableBodyDescriptor body,
-            EntityState startState, 
-            EntityState endState,
             MimeEntityConfig config,
-            DecodeMonitor monitor) {
+            EntityState startState,
+            EntityState endState,
+            DecodeMonitor monitor,
+            FieldBuilder fieldBuilder,
+            MutableBodyDescriptor body) {
+        this.config = config;
         this.state = startState;
         this.startState = startState;
         this.endState = endState;
-        this.config = config;
+        this.monitor = monitor;
+        this.fieldBuilder = fieldBuilder;
         this.body = body;
+
         this.linebuf = new ByteArrayBuffer(64);
         this.lineCount = 0;
         this.endOfHeader = false;
         this.headerCount = 0;
-        this.monitor = monitor;
     }
 
     public EntityState getState() {
@@ -77,27 +79,20 @@ public abstract class AbstractEntity imp
      * information is not available.
      */
     protected abstract int getLineNumber();
-    
+
     protected abstract LineReaderInputStream getDataStream();
-    
-    private ByteArrayBuffer fillFieldBuffer() throws IOException, MimeException {
-        if (endOfHeader) 
-            throw new IllegalStateException();
 
-        int maxHeaderLen = config.getMaxHeaderLen();
+    private void readRawField() throws IOException, MimeException {
+        if (endOfHeader)
+            throw new IllegalStateException();
         LineReaderInputStream instream = getDataStream();
-        ByteArrayBuffer fieldbuf = new ByteArrayBuffer(64);
-
         try {
             for (;;) {
                 // If there's still data stuck in the line buffer
                 // copy it to the field buffer
                 int len = linebuf.length();
-                if (maxHeaderLen > 0 && fieldbuf.length() + len >= maxHeaderLen) {
-                    throw new MaxHeaderLengthLimitException("Maximum header length limit exceeded");
-                }
                 if (len > 0) {
-                    fieldbuf.append(linebuf.buffer(), 0, len);
+                    fieldBuilder.append(linebuf);
                 }
                 linebuf.clear();
                 if (instream.readLine(linebuf) == -1) {
@@ -113,7 +108,7 @@ public abstract class AbstractEntity imp
                     len--;
                 }
                 if (len == 0) {
-                    // empty line detected 
+                    // empty line detected
                     endOfHeader = true;
                     break;
                 }
@@ -129,11 +124,9 @@ public abstract class AbstractEntity imp
         } catch (MaxLineLimitException e) {
             throw new MimeException(e);
         }
-
-        return fieldbuf;
     }
 
-    protected boolean parseField() throws MimeException, IOException {
+    protected boolean nextField() throws MimeException, IOException {
         int maxHeaderCount = config.getMaxHeaderCount();
         // the loop is here to transparently skip invalid headers
         for (;;) {
@@ -143,35 +136,27 @@ public abstract class AbstractEntity imp
             if (maxHeaderCount > 0 && headerCount >= maxHeaderCount) {
                 throw new MaxHeaderLimitException("Maximum header limit exceeded");
             }
-
-            ByteArrayBuffer fieldbuf = fillFieldBuffer();
             headerCount++;
-
-            // Strip away line delimiter
-            int origLen = fieldbuf.length();
-            int len = fieldbuf.length();
-            if (len > 0 && fieldbuf.byteAt(len - 1) == '\n') {
-                len--;
-            }
-            if (len > 0 && fieldbuf.byteAt(len - 1) == '\r') {
-                len--;
-            }
-            fieldbuf.setLength(len);
-            
+            fieldBuilder.reset();
+            readRawField();
             try {
-            	field = new RawField(fieldbuf);
-            	if (field.isObsoleteSyntax()) {
-            		monitor(Event.OBSOLETE_HEADER);
-            	}
+                field = fieldBuilder.build();
+                if (field == null) {
+                    continue;
+                }
+                if (field.isObsoleteSyntax()) {
+                    monitor(Event.OBSOLETE_HEADER);
+                }
                 body.addField(field);
                 return true;
             } catch (MimeException e) {
                 monitor(Event.INVALID_HEADER);
                 if (config.isMalformedHeaderStartsBody()) {
-	                fieldbuf.setLength(origLen);
-	                LineReaderInputStream instream = getDataStream();
-	                if (!instream.unread(fieldbuf)) throw new MimeParseEventException(Event.INVALID_HEADER);
-	                return false;
+                    LineReaderInputStream instream = getDataStream();
+                    if (!instream.unread(fieldBuilder.getRaw())) {
+                        throw new MimeParseEventException(Event.INVALID_HEADER);
+                    }
+                    return false;
                 }
             }
         }
@@ -233,7 +218,7 @@ public abstract class AbstractEntity imp
             }
         }
     }
-    
+
     /**
      * Creates an indicative message suitable for display
      * based on the given event and the current state of the system.
@@ -264,7 +249,7 @@ public abstract class AbstractEntity imp
 
     /**
      * Renders a state as a string suitable for logging.
-     * @param state 
+     * @param state
      * @return rendered as string, not null
      */
     public static final String stateToString(EntityState state) {
@@ -318,5 +303,5 @@ public abstract class AbstractEntity imp
         }
         return result;
     }
-    
+
 }

Added: james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/DefaultFieldBuilder.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/DefaultFieldBuilder.java?rev=1086652&view=auto
==============================================================================
--- james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/DefaultFieldBuilder.java (added)
+++ james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/DefaultFieldBuilder.java Tue Mar 29 17:52:22 2011
@@ -0,0 +1,69 @@
+/****************************************************************
+ * 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.stream;
+
+import org.apache.james.mime4j.MimeException;
+import org.apache.james.mime4j.io.MaxHeaderLengthLimitException;
+import org.apache.james.mime4j.util.ByteArrayBuffer;
+
+public class DefaultFieldBuilder implements FieldBuilder {
+
+    private final ByteArrayBuffer buf;
+    private final int maxlen;
+
+    public DefaultFieldBuilder(int maxlen) {
+        this.buf = new ByteArrayBuffer(1024);
+        this.maxlen = maxlen;
+    }
+    
+    public void reset() {
+        this.buf.clear();
+    }
+    
+    public void append(final ByteArrayBuffer line) throws MaxHeaderLengthLimitException {
+        if (line == null) {
+            return;
+        }
+        int len = line.length();
+        if (this.maxlen > 0 && this.buf.length() + len >= this.maxlen) {
+            throw new MaxHeaderLengthLimitException("Maximum header length limit exceeded");
+        }        
+        this.buf.append(line.buffer(), 0, line.length());
+    }
+    
+    public RawField build() throws MimeException {
+        int len = this.buf.length();
+        if (len > 0) {
+            if (this.buf.byteAt(len - 1) == '\n') {
+                len --;
+            }
+            if (this.buf.byteAt(len - 1) == '\r') {
+                len --;
+            }
+        }
+        ByteArrayBuffer copy = new ByteArrayBuffer(this.buf.buffer(), len, false);
+        return new RawField(copy);
+    }
+    
+    public ByteArrayBuffer getRaw() {
+        return this.buf;
+    }
+    
+}

Propchange: james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/DefaultFieldBuilder.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/DefaultFieldBuilder.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/DefaultFieldBuilder.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/FieldBuilder.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/FieldBuilder.java?rev=1086652&view=auto
==============================================================================
--- james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/FieldBuilder.java (added)
+++ james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/FieldBuilder.java Tue Mar 29 17:52:22 2011
@@ -0,0 +1,35 @@
+/****************************************************************
+ * 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.stream;
+
+import org.apache.james.mime4j.MimeException;
+import org.apache.james.mime4j.util.ByteArrayBuffer;
+
+public interface FieldBuilder {
+
+    void reset(); 
+    
+    void append(ByteArrayBuffer line) throws MimeException;
+    
+    RawField build() throws MimeException;
+    
+    ByteArrayBuffer getRaw();
+    
+}

Propchange: james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/FieldBuilder.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/FieldBuilder.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/FieldBuilder.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

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=1086652&r1=1086651&r2=1086652&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 Tue Mar 29 17:52:22 2011
@@ -34,7 +34,7 @@ import org.apache.james.mime4j.io.LineRe
 import org.apache.james.mime4j.io.MimeBoundaryInputStream;
 import org.apache.james.mime4j.util.MimeUtil;
 
-public class MimeEntity extends AbstractEntity {
+class MimeEntity extends AbstractEntity {
 
     private final LineNumberSource lineSource;
     private final BufferedLineReaderInputStream inbuffer;
@@ -45,15 +45,16 @@ public class MimeEntity extends Abstract
     
     private byte[] tmpbuf;
     
-    public MimeEntity(
+    MimeEntity(
             LineNumberSource lineSource,
             InputStream instream,
-            MutableBodyDescriptor body, 
+            MimeEntityConfig config,
             EntityState startState, 
             EntityState endState,
-            MimeEntityConfig config, 
-            DecodeMonitor monitor) {
-        super(body, startState, endState, config, monitor);
+            DecodeMonitor monitor,
+            FieldBuilder fieldBuilder,
+            MutableBodyDescriptor body) {
+        super(config, startState, endState, monitor, fieldBuilder, body);
         this.lineSource = lineSource;
         this.inbuffer = new BufferedLineReaderInputStream(
                 instream,
@@ -64,22 +65,37 @@ public class MimeEntity extends Abstract
                 config.getMaxLineLen());
     }
 
-    public MimeEntity(
+    MimeEntity(
             LineNumberSource lineSource,
             InputStream instream,
-            MutableBodyDescriptor body, 
+            MimeEntityConfig config,
             EntityState startState, 
             EntityState endState,
-            MimeEntityConfig config) {
-        this(lineSource, instream, body, startState, endState, config, config.isStrictParsing() ? DecodeMonitor.STRICT : DecodeMonitor.SILENT);
+            MutableBodyDescriptor body) {
+        this(lineSource, instream, config, startState, endState,
+                config.isStrictParsing() ? DecodeMonitor.STRICT : DecodeMonitor.SILENT,
+                new DefaultFieldBuilder(config.getMaxHeaderLen()), body);
     }
 
-    public MimeEntity(
+    MimeEntity(
             LineNumberSource lineSource,
             InputStream instream,
+            MimeEntityConfig config,
             MutableBodyDescriptor body) {
-        this(lineSource, instream, body, EntityState.T_START_MESSAGE, EntityState.T_END_MESSAGE, 
-                new MimeEntityConfig(), DecodeMonitor.SILENT);
+        this(lineSource, instream, config, 
+                EntityState.T_START_MESSAGE, EntityState.T_END_MESSAGE, 
+                config.isStrictParsing() ? DecodeMonitor.STRICT : DecodeMonitor.SILENT,
+                new DefaultFieldBuilder(config.getMaxHeaderLen()), body);
+    }
+
+    MimeEntity(
+            LineNumberSource lineSource,
+            InputStream instream,
+            MutableBodyDescriptor body) {
+        this(lineSource, instream, new MimeEntityConfig(), 
+                EntityState.T_START_MESSAGE, EntityState.T_END_MESSAGE,
+                DecodeMonitor.SILENT,
+                new DefaultFieldBuilder(-1), body);
     }
 
     public RecursionMode getRecursionMode() {
@@ -117,7 +133,7 @@ public class MimeEntity extends Abstract
             break;
         case T_START_HEADER:
         case T_FIELD:
-            state = parseField() ? EntityState.T_FIELD : EntityState.T_END_HEADER;
+            state = nextField() ? EntityState.T_FIELD : EntityState.T_END_HEADER;
             break;
         case T_END_HEADER:
             String mimeType = body.getMimeType();
@@ -247,11 +263,12 @@ public class MimeEntity extends Abstract
             MimeEntity mimeentity = new MimeEntity(
                     lineSource, 
                     instream,
-                    body.newChild(), 
+                    config,
                     startState, 
                     endState,
-                    config,
-                    monitor);
+                    monitor,
+                    fieldBuilder,
+                    body.newChild());
             mimeentity.setRecursionMode(recursionMode);
             return mimeentity;
         }

Modified: james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/MimeTokenStream.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/MimeTokenStream.java?rev=1086652&r1=1086651&r2=1086652&view=diff
==============================================================================
--- james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/MimeTokenStream.java (original)
+++ james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/MimeTokenStream.java Tue Mar 29 17:52:22 2011
@@ -76,6 +76,7 @@ public class MimeTokenStream {
     
     private final MimeEntityConfig config;
     private final DecodeMonitor monitor;
+    private final FieldBuilder fieldBuilder;
     private final MutableBodyDescriptorFactory bodyDescFactory;
     private final LinkedList<EntityStateMachine> entities = new LinkedList<EntityStateMachine>();
     
@@ -97,21 +98,31 @@ public class MimeTokenStream {
     }
 
     public MimeTokenStream(final MimeEntityConfig config) {
-        this(config, null, null);
+        this(config, null, null, null);
     }
         
     public MimeTokenStream(
             final MimeEntityConfig config, 
             final MutableBodyDescriptorFactory bodyDescFactory) {
-        this(config, bodyDescFactory, null);
+        this(config, null, null, bodyDescFactory);
     }
 
     public MimeTokenStream(
             final MimeEntityConfig config, 
-            final MutableBodyDescriptorFactory bodyDescFactory,
-            final DecodeMonitor monitor) {
+            final DecodeMonitor monitor,
+            final MutableBodyDescriptorFactory bodyDescFactory) {
+        this(config, monitor, null, bodyDescFactory);
+    }
+
+    public MimeTokenStream(
+            final MimeEntityConfig config, 
+            final DecodeMonitor monitor,
+            final FieldBuilder fieldBuilder,
+            final MutableBodyDescriptorFactory bodyDescFactory) {
         super();
         this.config = config;
+        this.fieldBuilder = fieldBuilder != null ? fieldBuilder : 
+            new DefaultFieldBuilder(config.getMaxHeaderLen());
         this.monitor = monitor != null ? monitor : 
             (config.isStrictParsing() ? DecodeMonitor.STRICT : DecodeMonitor.SILENT);
         this.bodyDescFactory = bodyDescFactory;
@@ -184,11 +195,12 @@ public class MimeTokenStream {
         rootentity = new MimeEntity(
                 lineSource,
                 stream,
-                newBodyDescriptor, 
+                config,
                 start, 
                 EntityState.T_END_MESSAGE,
-                config,
-                monitor);
+                monitor,
+                fieldBuilder,
+                newBodyDescriptor);
 
         rootentity.setRecursionMode(recursionMode);
         currentStateMachine = rootentity;

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=1086652&r1=1086651&r2=1086652&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 Tue Mar 29 17:52:22 2011
@@ -414,10 +414,8 @@ public class MimeEntityTest extends Test
         MimeEntity entity = new MimeEntity(
                 lineInput,
                 rawstream,
-                new DefaultBodyDescriptor(),
-                EntityState.T_START_MESSAGE,
-                EntityState.T_END_MESSAGE,
-                config);
+                config,
+                new DefaultBodyDescriptor());
         
         assertEquals(EntityState.T_START_MESSAGE, entity.getState());
         entity.advance(); // advances to T_START_HEADER
@@ -468,10 +466,8 @@ public class MimeEntityTest extends Test
         MimeEntity entity = new MimeEntity(
                 lineInput,
                 rawstream,
-                new DefaultBodyDescriptor(),
-                EntityState.T_START_MESSAGE,
-                EntityState.T_END_MESSAGE,
-                config);
+                config,
+                new DefaultBodyDescriptor());
         
         assertEquals(EntityState.T_START_MESSAGE, entity.getState());
         entity.advance();
@@ -516,10 +512,8 @@ public class MimeEntityTest extends Test
         MimeEntity entity = new MimeEntity(
                 lineInput,
                 rawstream,
-                new DefaultBodyDescriptor(),
-                EntityState.T_START_MESSAGE,
-                EntityState.T_END_MESSAGE,
-                config);
+                config,
+                new DefaultBodyDescriptor());
         
         assertEquals(EntityState.T_START_MESSAGE, entity.getState());
         entity.advance();
@@ -567,10 +561,8 @@ public class MimeEntityTest extends Test
         MimeEntity entity = new MimeEntity(
                 lineInput,
                 rawstream,
-                new DefaultBodyDescriptor(),
-                EntityState.T_START_MESSAGE,
-                EntityState.T_END_MESSAGE,
-                config);
+                config,
+                new DefaultBodyDescriptor());
         
         assertEquals(EntityState.T_START_MESSAGE, entity.getState());
         entity.advance();
@@ -615,10 +607,8 @@ public class MimeEntityTest extends Test
         MimeEntity entity = new MimeEntity(
                 lineInput,
                 rawstream,
-                new DefaultBodyDescriptor(),
-                EntityState.T_START_MESSAGE,
-                EntityState.T_END_MESSAGE,
-                config);
+                config,
+                new DefaultBodyDescriptor());
         
         assertEquals(EntityState.T_START_MESSAGE, entity.getState());
         entity.advance();

Modified: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/MessageBuilderImpl.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/MessageBuilderImpl.java?rev=1086652&r1=1086651&r2=1086652&view=diff
==============================================================================
--- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/MessageBuilderImpl.java (original)
+++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/MessageBuilderImpl.java Tue Mar 29 17:52:22 2011
@@ -65,12 +65,12 @@ public class MessageBuilderImpl implemen
 
     public Message parse(InputStream source) throws MimeException, IOException {
         return getMimeBuilder().parse(source, 
-                mimeEntityConfig, 
+                mimeEntityConfig,
+                decodeMonitor,
                 bodyFactory, 
                 mutableBodyDescriptorFactory, 
                 contentDecoding,
-                flatMode,
-                decodeMonitor);
+                flatMode);
     }
     
     public void setBodyFactory(BodyFactory bodyFactory) {

Modified: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/MimeBuilder.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/MimeBuilder.java?rev=1086652&r1=1086651&r2=1086652&view=diff
==============================================================================
--- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/MimeBuilder.java (original)
+++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/MimeBuilder.java Tue Mar 29 17:52:22 2011
@@ -246,15 +246,15 @@ public class MimeBuilder {
     public Message parse(
             final InputStream is, 
             final MimeEntityConfig config,
+            final DecodeMonitor monitor,
             final BodyFactory bodyFactory, 
             final MutableBodyDescriptorFactory bodyDescFactory,
             final boolean contentDecoding,
-            final boolean flatMode,
-            final DecodeMonitor monitor) throws IOException, MimeIOException {
+            final boolean flatMode) throws IOException, MimeIOException {
         try {
             MessageImpl message = new MessageImpl();
             DecodeMonitor mon = monitor != null ? monitor : DecodeMonitor.SILENT;
-            MimeStreamParser parser = new MimeStreamParser(config, bodyDescFactory, mon);
+            MimeStreamParser parser = new MimeStreamParser(config, mon, bodyDescFactory);
             parser.setContentHandler(new EntityBuilder(message, bodyFactory, mon));
             parser.setContentDecoding(contentDecoding);
             if (flatMode) {
@@ -290,10 +290,10 @@ public class MimeBuilder {
     public Message parse(
             final InputStream is, 
             final MimeEntityConfig config,
+            final DecodeMonitor monitor,
             final BodyFactory bodyFactory, 
-            final MutableBodyDescriptorFactory bodyDescFactory,
-            final DecodeMonitor monitor) throws IOException, MimeIOException {
-        return parse(is, config, bodyFactory, bodyDescFactory, true, false, monitor);
+            final MutableBodyDescriptorFactory bodyDescFactory) throws IOException, MimeIOException {
+        return parse(is, config, monitor, bodyFactory, bodyDescFactory, true, false);
     }
     
     public Message parse(
@@ -301,14 +301,14 @@ public class MimeBuilder {
             final MimeEntityConfig config,
             final BodyFactory bodyFactory, 
             final MutableBodyDescriptorFactory bodyDescFactory) throws IOException, MimeIOException {
-        return parse(is, config, bodyFactory, bodyDescFactory, null);
+        return parse(is, config, null, bodyFactory, bodyDescFactory);
     }
 
     public Message parse(
             final InputStream is, 
             final MimeEntityConfig config,
             final BodyFactory bodyFactory) throws IOException, MimeIOException {
-        return parse(is, config, bodyFactory, null, null);
+        return parse(is, config, null, bodyFactory, null);
     }
 
     /**