commit 6c9774b1b88d87c77f0bc9a8b298e7859cbf155d
Author: Raman Gupta <raman@vivosys.com>
Date:   Sun Mar 10 13:09:55 2013 -0400

    MIME4J-222: Support MessageImplFactory

diff --git a/dom/src/main/java/org/apache/james/mime4j/message/DefaultMessageBuilder.java b/dom/src/main/java/org/apache/james/mime4j/message/DefaultMessageBuilder.java
index 4942661..4e4a066 100644
--- a/dom/src/main/java/org/apache/james/mime4j/message/DefaultMessageBuilder.java
+++ b/dom/src/main/java/org/apache/james/mime4j/message/DefaultMessageBuilder.java
@@ -49,6 +49,7 @@ import org.apache.james.mime4j.stream.MimeConfig;
 public class DefaultMessageBuilder implements MessageBuilder {
 
     private FieldParser<? extends ParsedField> fieldParser = null;
+    private MessageImplFactory messageImplFactory = null;
     private BodyFactory bodyFactory = null;
     private MimeConfig config = null;
     private BodyDescriptorBuilder bodyDescBuilder = null;
@@ -64,6 +65,10 @@ public class DefaultMessageBuilder implements MessageBuilder {
         this.fieldParser = fieldParser;
     }
 
+    public void setMessageImplFactory(final MessageImplFactory messageImplFactory) {
+        this.messageImplFactory = messageImplFactory;
+    }
+
     public void setBodyFactory(final BodyFactory bodyFactory) {
         this.bodyFactory = bodyFactory;
     }
@@ -220,7 +225,7 @@ public class DefaultMessageBuilder implements MessageBuilder {
      *             {@link SingleBody}.
      */
     public Message copy(Message other) {
-        MessageImpl copy = new MessageImpl();
+        MessageImpl copy = newMessageImpl();
         if (other.getHeader() != null) {
             copy.setHeader(copy(other.getHeader()));
         }
@@ -280,7 +285,7 @@ public class DefaultMessageBuilder implements MessageBuilder {
     }
 
     public Message newMessage() {
-        return new MessageImpl();
+        return newMessageImpl();
     }
 
     public Message newMessage(final Message source) {
@@ -289,7 +294,7 @@ public class DefaultMessageBuilder implements MessageBuilder {
 
     public Message parseMessage(final InputStream is) throws IOException, MimeIOException {
         try {
-            MessageImpl message = new MessageImpl();
+            MessageImpl message = newMessageImpl();
             MimeConfig cfg = config != null ? config : new MimeConfig();
             boolean strict = cfg.isStrictParsing();
             DecodeMonitor mon = monitor != null ? monitor :
@@ -315,4 +320,9 @@ public class DefaultMessageBuilder implements MessageBuilder {
         }
     }
 
+    private MessageImpl newMessageImpl() {
+        MessageImplFactory mif = messageImplFactory != null ? messageImplFactory : new DefaultMessageImplFactory();
+        return mif.messageImpl();
+    }
+
 }
diff --git a/dom/src/main/java/org/apache/james/mime4j/message/DefaultMessageImplFactory.java b/dom/src/main/java/org/apache/james/mime4j/message/DefaultMessageImplFactory.java
new file mode 100644
index 0000000..c5d09ef
--- /dev/null
+++ b/dom/src/main/java/org/apache/james/mime4j/message/DefaultMessageImplFactory.java
@@ -0,0 +1,30 @@
+/****************************************************************
+ * 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.message;
+
+/**
+ * A default MessageImplFactory that returns an unmodified MessageImpl using the default constructor.
+ */
+public class DefaultMessageImplFactory implements MessageImplFactory {
+
+    public MessageImpl messageImpl() {
+        return new MessageImpl();
+    }
+}
diff --git a/dom/src/main/java/org/apache/james/mime4j/message/EntityBuilder.java b/dom/src/main/java/org/apache/james/mime4j/message/EntityBuilder.java
index 034953c..ba95b60 100644
--- a/dom/src/main/java/org/apache/james/mime4j/message/EntityBuilder.java
+++ b/dom/src/main/java/org/apache/james/mime4j/message/EntityBuilder.java
@@ -43,6 +43,7 @@ import org.apache.james.mime4j.util.ByteSequence;
 class EntityBuilder implements ContentHandler {
 
     private final Entity entity;
+    private MessageImplFactory messageImplFactory;
     private final BodyFactory bodyFactory;
     private final Stack<Object> stack;
 
@@ -50,6 +51,17 @@ class EntityBuilder implements ContentHandler {
             final Entity entity,
             final BodyFactory bodyFactory) {
         this.entity = entity;
+        this.messageImplFactory = new DefaultMessageImplFactory();
+        this.bodyFactory = bodyFactory;
+        this.stack = new Stack<Object>();
+    }
+
+    EntityBuilder(
+            final Entity entity,
+            final MessageImplFactory messageImplFactory,
+            final BodyFactory bodyFactory) {
+        this.entity = entity;
+        this.messageImplFactory = messageImplFactory;
         this.bodyFactory = bodyFactory;
         this.stack = new Stack<Object>();
     }
@@ -70,7 +82,7 @@ class EntityBuilder implements ContentHandler {
             stack.push(this.entity);
         } else {
             expect(Entity.class);
-            Message m = new MessageImpl();
+            Message m = messageImplFactory.messageImpl();
             ((Entity) stack.peek()).setBody(m);
             stack.push(m);
         }
diff --git a/dom/src/main/java/org/apache/james/mime4j/message/MessageImplFactory.java b/dom/src/main/java/org/apache/james/mime4j/message/MessageImplFactory.java
new file mode 100644
index 0000000..3d45df8
--- /dev/null
+++ b/dom/src/main/java/org/apache/james/mime4j/message/MessageImplFactory.java
@@ -0,0 +1,29 @@
+/****************************************************************
+ * 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.message;
+
+/**
+ * Factory for creating message implementations.
+ */
+public interface MessageImplFactory {
+
+    MessageImpl messageImpl();
+
+}
