You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2021/06/18 11:44:49 UTC

[james-mime4j] branch master updated (46f88db -> 128fdc3)

This is an automated email from the ASF dual-hosted git repository.

btellier pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/james-mime4j.git.


    from 46f88db  MIME4J-300 Set up an automated build for Apache MIME4J
     new a7a860d  MIME4J-302 Parser should avoid multiple calls to "toLowerCase"
     new 128fdc3  MIME4J-302 Use lowercase when looking up known headers

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../stream/FallbackBodyDescriptorBuilder.java      |  2 +-
 .../java/org/apache/james/mime4j/stream/Field.java |  9 +++++++++
 .../org/apache/james/mime4j/stream/RawField.java   | 11 +++++++++++
 .../java/org/apache/james/mime4j/dom/Message.java  | 20 ++++++++++----------
 .../apache/james/mime4j/dom/field/FieldName.java   | 15 +++++++++++++++
 .../apache/james/mime4j/field/AbstractField.java   | 12 ++++++++++++
 .../james/mime4j/field/DelegatingFieldParser.java  | 10 +++++++++-
 .../mime4j/internal/AbstractEntityBuilder.java     | 22 +++++++++++-----------
 .../james/mime4j/message/AbstractEntity.java       |  6 +++---
 .../james/mime4j/message/AbstractHeader.java       |  4 ++--
 .../james/mime4j/message/AbstractMessage.java      | 18 +++++++++---------
 .../message/DefaultBodyDescriptorBuilder.java      |  2 +-
 .../james/mime4j/message/DefaultMessageWriter.java |  2 +-
 13 files changed, 94 insertions(+), 39 deletions(-)

---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-mime4j] 02/02: MIME4J-302 Use lowercase when looking up known headers

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-mime4j.git

commit 128fdc383d39e84958ec3bf39a145c83eb3c93a8
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Jun 18 12:44:55 2021 +0700

    MIME4J-302 Use lowercase when looking up known headers
    
    An optimization implemented in MaximalBodyDescriptor aims at reducing the costs of toLowerCase calls: upon known header names lookup the lowercase version of the field instead of the normal version to benefit optimizations (calling toLowerCase on a lowerCase string do not do allocation, it just iterates String content). It might be worth generalizing it.
---
 .../java/org/apache/james/mime4j/dom/Message.java    | 20 ++++++++++----------
 .../org/apache/james/mime4j/dom/field/FieldName.java | 15 +++++++++++++++
 .../james/mime4j/internal/AbstractEntityBuilder.java | 18 +++++++++---------
 .../apache/james/mime4j/message/AbstractEntity.java  |  6 +++---
 .../apache/james/mime4j/message/AbstractMessage.java | 18 +++++++++---------
 .../james/mime4j/message/DefaultMessageWriter.java   |  2 +-
 6 files changed, 47 insertions(+), 32 deletions(-)

diff --git a/dom/src/main/java/org/apache/james/mime4j/dom/Message.java b/dom/src/main/java/org/apache/james/mime4j/dom/Message.java
index 6084dd1..d004a71 100644
--- a/dom/src/main/java/org/apache/james/mime4j/dom/Message.java
+++ b/dom/src/main/java/org/apache/james/mime4j/dom/Message.java
@@ -442,7 +442,7 @@ public interface Message extends Entity, Body {
          * @return the identifier of this message.
          */
         public String getMessageId() {
-            Field field = obtainField(FieldName.MESSAGE_ID);
+            Field field = obtainField(FieldName.MESSAGE_ID_LOWERCASE);
             return field != null ? field.getBody() : null;
         }
 
@@ -484,7 +484,7 @@ public interface Message extends Entity, Body {
          * @return the subject of this message.
          */
         public String getSubject() {
-            UnstructuredField field = obtainField(FieldName.SUBJECT);
+            UnstructuredField field = obtainField(FieldName.SUBJECT_LOWERCASE);
             return field != null ? field.getValue() : null;
         }
 
@@ -513,7 +513,7 @@ public interface Message extends Entity, Body {
          * @return the date of this message.
          */
         public Date getDate() {
-            DateTimeField field = obtainField(FieldName.DATE);
+            DateTimeField field = obtainField(FieldName.DATE_LOWERCASE);
             return field != null ? field.getDate() : null;
         }
 
@@ -558,7 +558,7 @@ public interface Message extends Entity, Body {
          * @return the sender of this message.
          */
         public Mailbox getSender() {
-            return getMailbox(FieldName.SENDER);
+            return getMailbox(FieldName.SENDER_LOWERCASE);
         }
 
         /**
@@ -593,7 +593,7 @@ public interface Message extends Entity, Body {
          * @return value of the from field of this message.
          */
         public MailboxList getFrom() {
-            return getMailboxList(FieldName.FROM);
+            return getMailboxList(FieldName.FROM_LOWERCASE);
         }
 
         /**
@@ -664,7 +664,7 @@ public interface Message extends Entity, Body {
          * @return value of the to field of this message.
          */
         public AddressList getTo() {
-            return getAddressList(FieldName.TO);
+            return getAddressList(FieldName.TO_LOWERCASE);
         }
 
         /**
@@ -735,7 +735,7 @@ public interface Message extends Entity, Body {
          * @return value of the cc field of this message.
          */
         public AddressList getCc() {
-            return getAddressList(FieldName.CC);
+            return getAddressList(FieldName.CC_LOWERCASE);
         }
 
         /**
@@ -782,7 +782,7 @@ public interface Message extends Entity, Body {
          * @return value of the bcc field of this message.
          */
         public AddressList getBcc() {
-            return getAddressList(FieldName.BCC);
+            return getAddressList(FieldName.BCC_LOWERCASE);
         }
 
         /**
@@ -829,7 +829,7 @@ public interface Message extends Entity, Body {
          * @return value of the reply to field of this message.
          */
         public AddressList getReplyTo() {
-            return getAddressList(FieldName.REPLY_TO);
+            return getAddressList(FieldName.REPLY_TO_LOWERCASE);
         }
 
         /**
@@ -902,7 +902,7 @@ public interface Message extends Entity, Body {
             MessageImpl message = new MessageImpl();
             HeaderImpl header = new HeaderImpl();
             message.setHeader(header);
-            if (!containsField(FieldName.MIME_VERSION)) {
+            if (!containsField(FieldName.MIME_VERSION_LOWERCASE)) {
                 header.setField(Fields.version("1.0"));
             }
             for (Field field : getFields()) {
diff --git a/dom/src/main/java/org/apache/james/mime4j/dom/field/FieldName.java b/dom/src/main/java/org/apache/james/mime4j/dom/field/FieldName.java
index 163154a..9edc5f4 100644
--- a/dom/src/main/java/org/apache/james/mime4j/dom/field/FieldName.java
+++ b/dom/src/main/java/org/apache/james/mime4j/dom/field/FieldName.java
@@ -19,15 +19,20 @@
 
 package org.apache.james.mime4j.dom.field;
 
+import java.util.Locale;
+
 /**
  * Constants for common header field names.
  */
 public class FieldName {
 
     public static final String CONTENT_TYPE = "Content-Type";
+    public static final String CONTENT_TYPE_LOWERCASE = CONTENT_TYPE.toLowerCase(Locale.US);
     public static final String CONTENT_LENGTH = "Content-Length";
     public static final String CONTENT_TRANSFER_ENCODING = "Content-Transfer-Encoding";
+    public static final String CONTENT_TRANSFER_ENCODING_LOWERCASE = CONTENT_TRANSFER_ENCODING.toLowerCase(Locale.US);
     public static final String CONTENT_DISPOSITION = "Content-Disposition";
+    public static final String CONTENT_DISPOSITION_LOWERCASE = CONTENT_DISPOSITION.toLowerCase(Locale.US);
     public static final String CONTENT_ID = "Content-ID";
     public static final String CONTENT_MD5 = "Content-MD5";
     public static final String CONTENT_DESCRIPTION = "Content-Description";
@@ -35,16 +40,26 @@ public class FieldName {
     public static final String CONTENT_LOCATION = "Content-Location";
 
     public static final String MIME_VERSION = "MIME-Version";
+    public static final String MIME_VERSION_LOWERCASE = MIME_VERSION.toLowerCase(Locale.US);
     public static final String DATE = "Date";
+    public static final String DATE_LOWERCASE = DATE.toLowerCase(Locale.US);
     public static final String MESSAGE_ID = "Message-ID";
+    public static final String MESSAGE_ID_LOWERCASE = MESSAGE_ID.toLowerCase(Locale.US);
     public static final String SUBJECT = "Subject";
+    public static final String SUBJECT_LOWERCASE = SUBJECT.toLowerCase(Locale.US);
 
     public static final String FROM = "From";
+    public static final String FROM_LOWERCASE = FROM.toLowerCase(Locale.US);
     public static final String SENDER = "Sender";
+    public static final String SENDER_LOWERCASE = SENDER.toLowerCase(Locale.US);
     public static final String TO = "To";
+    public static final String TO_LOWERCASE = TO.toLowerCase(Locale.US);
     public static final String CC = "Cc";
+    public static final String CC_LOWERCASE = CC.toLowerCase(Locale.US);
     public static final String BCC = "Bcc";
+    public static final String BCC_LOWERCASE = BCC.toLowerCase(Locale.US);
     public static final String REPLY_TO = "Reply-To";
+    public static final String REPLY_TO_LOWERCASE = REPLY_TO.toLowerCase(Locale.US);
 
     public static final String RESENT_DATE = "Resent-Date";
 
diff --git a/dom/src/main/java/org/apache/james/mime4j/internal/AbstractEntityBuilder.java b/dom/src/main/java/org/apache/james/mime4j/internal/AbstractEntityBuilder.java
index c8f0871..ef98769 100644
--- a/dom/src/main/java/org/apache/james/mime4j/internal/AbstractEntityBuilder.java
+++ b/dom/src/main/java/org/apache/james/mime4j/internal/AbstractEntityBuilder.java
@@ -256,7 +256,7 @@ public abstract class AbstractEntityBuilder {
      *         type has been set.
      */
     public String getMimeType() {
-        ContentTypeField field = obtainField(FieldName.CONTENT_TYPE);
+        ContentTypeField field = obtainField(FieldName.CONTENT_TYPE_LOWERCASE);
         return field != null ? field.getMimeType() : null;
     }
 
@@ -267,7 +267,7 @@ public abstract class AbstractEntityBuilder {
      *         type has been set.
      */
     public String getCharset() {
-        ContentTypeField field = obtainField(FieldName.CONTENT_TYPE);
+        ContentTypeField field = obtainField(FieldName.CONTENT_TYPE_LOWERCASE);
         return field != null ? field.getCharset() : null;
     }
 
@@ -293,7 +293,7 @@ public abstract class AbstractEntityBuilder {
      * @return the transfer encoding.
      */
     public String getContentTransferEncoding() {
-        ContentTransferEncodingField field = obtainField(FieldName.CONTENT_TRANSFER_ENCODING);
+        ContentTransferEncodingField field = obtainField(FieldName.CONTENT_TRANSFER_ENCODING_LOWERCASE);
         return field != null ? field.getEncoding() : null;
     }
 
@@ -319,7 +319,7 @@ public abstract class AbstractEntityBuilder {
      *         type has been set.
      */
     public String getDispositionType() {
-        ContentDispositionField field = obtainField(FieldName.CONTENT_DISPOSITION);
+        ContentDispositionField field = obtainField(FieldName.CONTENT_DISPOSITION_LOWERCASE);
         return field != null ? field.getDispositionType() : null;
     }
 
@@ -428,7 +428,7 @@ public abstract class AbstractEntityBuilder {
      *         <code>null</code> if the filename has not been set.
      */
     public String getFilename() {
-        ContentDispositionField field = obtainField(FieldName.CONTENT_DISPOSITION);
+        ContentDispositionField field = obtainField(FieldName.CONTENT_DISPOSITION_LOWERCASE);
         return field != null ? field.getFilename() : null;
     }
 
@@ -439,7 +439,7 @@ public abstract class AbstractEntityBuilder {
      *         <code>-1</code> if the filename has not been set.
      */
     public long getSize() {
-        ContentDispositionField field = obtainField(FieldName.CONTENT_DISPOSITION);
+        ContentDispositionField field = obtainField(FieldName.CONTENT_DISPOSITION_LOWERCASE);
         return field != null ? field.getSize() : -1;
     }
 
@@ -450,7 +450,7 @@ public abstract class AbstractEntityBuilder {
      *         <code>null</code> if the filename has not been set.
      */
     public Date getCreationDate() {
-        ContentDispositionField field = obtainField(FieldName.CONTENT_DISPOSITION);
+        ContentDispositionField field = obtainField(FieldName.CONTENT_DISPOSITION_LOWERCASE);
         return field != null ? field.getCreationDate() : null;
     }
 
@@ -461,7 +461,7 @@ public abstract class AbstractEntityBuilder {
      *         <code>null</code> if the filename has not been set.
      */
     public Date getModificationDate() {
-        ContentDispositionField field = obtainField(FieldName.CONTENT_DISPOSITION);
+        ContentDispositionField field = obtainField(FieldName.CONTENT_DISPOSITION_LOWERCASE);
         return field != null ? field.getModificationDate() : null;
     }
 
@@ -472,7 +472,7 @@ public abstract class AbstractEntityBuilder {
      *         <code>null</code> if the filename has not been set.
      */
     public Date getReadDate() {
-        ContentDispositionField field = obtainField(FieldName.CONTENT_DISPOSITION);
+        ContentDispositionField field = obtainField(FieldName.CONTENT_DISPOSITION_LOWERCASE);
         return field != null ? field.getReadDate() : null;
     }
 
diff --git a/dom/src/main/java/org/apache/james/mime4j/message/AbstractEntity.java b/dom/src/main/java/org/apache/james/mime4j/message/AbstractEntity.java
index d050059..e69db7c 100644
--- a/dom/src/main/java/org/apache/james/mime4j/message/AbstractEntity.java
+++ b/dom/src/main/java/org/apache/james/mime4j/message/AbstractEntity.java
@@ -126,12 +126,12 @@ public abstract class AbstractEntity implements Entity {
     public String getMimeType() {
         ContentTypeField childType = getContentTypeField();
         Entity parent = getParent();
-        ContentTypeField parentType = parent != null ? (ContentTypeField) (parent).getHeader().getField(FieldName.CONTENT_TYPE) : null;
+        ContentTypeField parentType = parent != null ? (ContentTypeField) (parent).getHeader().getField(FieldName.CONTENT_TYPE_LOWERCASE) : null;
         return calcMimeType(childType, parentType);
     }
 
     private ContentTypeField getContentTypeField() {
-        return (ContentTypeField) getHeader().getField(FieldName.CONTENT_TYPE);
+        return (ContentTypeField) getHeader().getField(FieldName.CONTENT_TYPE_LOWERCASE);
     }
 
     /**
@@ -140,7 +140,7 @@ public abstract class AbstractEntity implements Entity {
      * @return the MIME character set encoding.
      */
     public String getCharset() {
-        return calcCharset((ContentTypeField) getHeader().getField(FieldName.CONTENT_TYPE));
+        return calcCharset((ContentTypeField) getHeader().getField(FieldName.CONTENT_TYPE_LOWERCASE));
     }
 
     /**
diff --git a/dom/src/main/java/org/apache/james/mime4j/message/AbstractMessage.java b/dom/src/main/java/org/apache/james/mime4j/message/AbstractMessage.java
index 170dd9f..44949ab 100644
--- a/dom/src/main/java/org/apache/james/mime4j/message/AbstractMessage.java
+++ b/dom/src/main/java/org/apache/james/mime4j/message/AbstractMessage.java
@@ -45,7 +45,7 @@ public abstract class AbstractMessage extends AbstractEntity implements Message
      * @return the identifier of this message.
      */
     public String getMessageId() {
-        Field field = obtainField(FieldName.MESSAGE_ID);
+        Field field = obtainField(FieldName.MESSAGE_ID_LOWERCASE);
         if (field == null)
             return null;
 
@@ -59,7 +59,7 @@ public abstract class AbstractMessage extends AbstractEntity implements Message
      * @return the subject of this message.
      */
     public String getSubject() {
-        UnstructuredField field = obtainField(FieldName.SUBJECT);
+        UnstructuredField field = obtainField(FieldName.SUBJECT_LOWERCASE);
         if (field == null)
             return null;
 
@@ -73,7 +73,7 @@ public abstract class AbstractMessage extends AbstractEntity implements Message
      * @return the date of this message.
      */
     public Date getDate() {
-        DateTimeField dateField = obtainField(FieldName.DATE);
+        DateTimeField dateField = obtainField(FieldName.DATE_LOWERCASE);
         if (dateField == null)
             return null;
 
@@ -88,7 +88,7 @@ public abstract class AbstractMessage extends AbstractEntity implements Message
      * @return the sender of this message.
      */
     public Mailbox getSender() {
-        return getMailbox(FieldName.SENDER);
+        return getMailbox(FieldName.SENDER_LOWERCASE);
     }
 
     /**
@@ -99,7 +99,7 @@ public abstract class AbstractMessage extends AbstractEntity implements Message
      * @return value of the from field of this message.
      */
     public MailboxList getFrom() {
-        return getMailboxList(FieldName.FROM);
+        return getMailboxList(FieldName.FROM_LOWERCASE);
     }
 
     /**
@@ -110,7 +110,7 @@ public abstract class AbstractMessage extends AbstractEntity implements Message
      * @return value of the to field of this message.
      */
     public AddressList getTo() {
-        return getAddressList(FieldName.TO);
+        return getAddressList(FieldName.TO_LOWERCASE);
     }
 
     /**
@@ -121,7 +121,7 @@ public abstract class AbstractMessage extends AbstractEntity implements Message
      * @return value of the cc field of this message.
      */
     public AddressList getCc() {
-        return getAddressList(FieldName.CC);
+        return getAddressList(FieldName.CC_LOWERCASE);
     }
 
     /**
@@ -132,7 +132,7 @@ public abstract class AbstractMessage extends AbstractEntity implements Message
      * @return value of the bcc field of this message.
      */
     public AddressList getBcc() {
-        return getAddressList(FieldName.BCC);
+        return getAddressList(FieldName.BCC_LOWERCASE);
     }
 
     /**
@@ -143,7 +143,7 @@ public abstract class AbstractMessage extends AbstractEntity implements Message
      * @return value of the reply to field of this message.
      */
     public AddressList getReplyTo() {
-        return getAddressList(FieldName.REPLY_TO);
+        return getAddressList(FieldName.REPLY_TO_LOWERCASE);
     }
 
     private Mailbox getMailbox(String fieldName) {
diff --git a/dom/src/main/java/org/apache/james/mime4j/message/DefaultMessageWriter.java b/dom/src/main/java/org/apache/james/mime4j/message/DefaultMessageWriter.java
index 4ce7f7b..5c4c1ce 100644
--- a/dom/src/main/java/org/apache/james/mime4j/message/DefaultMessageWriter.java
+++ b/dom/src/main/java/org/apache/james/mime4j/message/DefaultMessageWriter.java
@@ -250,7 +250,7 @@ public class DefaultMessageWriter implements MessageWriter {
                     "Missing header in parent entity");
 
         ContentTypeField contentType = (ContentTypeField) header
-                .getField(FieldName.CONTENT_TYPE);
+                .getField(FieldName.CONTENT_TYPE_LOWERCASE);
         if (contentType == null)
             throw new IllegalArgumentException(
                     "Content-Type field not specified");

---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-mime4j] 01/02: MIME4J-302 Parser should avoid multiple calls to "toLowerCase"

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-mime4j.git

commit a7a860d3eab7539c53a7d0ed0ea8ddd9e894e532
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Jun 17 15:13:20 2021 +0700

    MIME4J-302 Parser should avoid multiple calls to "toLowerCase"
    
    I was surprised MIME4J parsing spends 18% of its time calling toLowerCase on header names. This represents 12% of allocated memory.
    
    By holding the lowerCased name as part of the field name, and doing lazy initialization on it we can get this down to 6%.
---
 .../james/mime4j/stream/FallbackBodyDescriptorBuilder.java   |  2 +-
 core/src/main/java/org/apache/james/mime4j/stream/Field.java |  9 +++++++++
 .../main/java/org/apache/james/mime4j/stream/RawField.java   | 11 +++++++++++
 .../java/org/apache/james/mime4j/field/AbstractField.java    | 12 ++++++++++++
 .../org/apache/james/mime4j/field/DelegatingFieldParser.java | 10 +++++++++-
 .../apache/james/mime4j/internal/AbstractEntityBuilder.java  |  4 ++--
 .../java/org/apache/james/mime4j/message/AbstractHeader.java |  4 ++--
 .../james/mime4j/message/DefaultBodyDescriptorBuilder.java   |  2 +-
 8 files changed, 47 insertions(+), 7 deletions(-)

diff --git a/core/src/main/java/org/apache/james/mime4j/stream/FallbackBodyDescriptorBuilder.java b/core/src/main/java/org/apache/james/mime4j/stream/FallbackBodyDescriptorBuilder.java
index 2f0863a..4872654 100644
--- a/core/src/main/java/org/apache/james/mime4j/stream/FallbackBodyDescriptorBuilder.java
+++ b/core/src/main/java/org/apache/james/mime4j/stream/FallbackBodyDescriptorBuilder.java
@@ -117,7 +117,7 @@ class FallbackBodyDescriptorBuilder implements BodyDescriptorBuilder {
      * @param field the MIME field.
      */
     public Field addField(RawField field) throws MimeException {
-        String name = field.getName().toLowerCase(Locale.US);
+        String name = field.getNameLowerCase();
 
         if (name.equals("content-transfer-encoding") && transferEncoding == null) {
             String value = field.getBody();
diff --git a/core/src/main/java/org/apache/james/mime4j/stream/Field.java b/core/src/main/java/org/apache/james/mime4j/stream/Field.java
index 6c58dec..bde3c79 100644
--- a/core/src/main/java/org/apache/james/mime4j/stream/Field.java
+++ b/core/src/main/java/org/apache/james/mime4j/stream/Field.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.mime4j.stream;
 
+import java.util.Locale;
+
 import org.apache.james.mime4j.util.ByteSequence;
 
 /**
@@ -40,6 +42,13 @@ public interface Field {
     String getName();
 
     /**
+     * Returns the name of the field in lower case.
+     */
+    default String getNameLowerCase() {
+        return getName().toLowerCase(Locale.US);
+    }
+
+    /**
      * Gets the unparsed and possibly encoded (see RFC 2047) field body string.
      *
      * @return the unparsed field body string.
diff --git a/core/src/main/java/org/apache/james/mime4j/stream/RawField.java b/core/src/main/java/org/apache/james/mime4j/stream/RawField.java
index f263b99..8bcaa77 100644
--- a/core/src/main/java/org/apache/james/mime4j/stream/RawField.java
+++ b/core/src/main/java/org/apache/james/mime4j/stream/RawField.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.mime4j.stream;
 
+import java.util.Locale;
+
 import org.apache.james.mime4j.util.ByteSequence;
 import org.apache.james.mime4j.util.CharsetUtil;
 import org.apache.james.mime4j.util.ContentUtil;
@@ -39,6 +41,7 @@ public final class RawField implements Field {
     private final int delimiterIdx;
     private final String name;
     private final String body;
+    private String nameLowerCase;
 
     RawField(ByteSequence raw, int delimiterIdx, String name, String body) {
         if (name == null) {
@@ -62,6 +65,14 @@ public final class RawField implements Field {
         return name;
     }
 
+    @Override
+    public String getNameLowerCase() {
+        if (nameLowerCase == null) {
+            nameLowerCase = name.toLowerCase(Locale.US);
+        }
+        return nameLowerCase;
+    }
+
     public String getBody() {
         if (body != null) {
             return body;
diff --git a/dom/src/main/java/org/apache/james/mime4j/field/AbstractField.java b/dom/src/main/java/org/apache/james/mime4j/field/AbstractField.java
index d4330d9..f0580a3 100644
--- a/dom/src/main/java/org/apache/james/mime4j/field/AbstractField.java
+++ b/dom/src/main/java/org/apache/james/mime4j/field/AbstractField.java
@@ -49,6 +49,18 @@ public abstract class AbstractField implements ParsedField {
         return rawField.getName();
     }
 
+
+    /**
+     * Gets the name of the field in lower case (<code>subject</code>,
+     * <code>from</code>, etc).
+     *
+     * @return the field name.
+     */
+    @Override
+    public String getNameLowerCase() {
+        return rawField.getNameLowerCase();
+    }
+
     /**
      * Gets the unfolded, unparsed and possibly encoded (see RFC 2047) field
      * body string.
diff --git a/dom/src/main/java/org/apache/james/mime4j/field/DelegatingFieldParser.java b/dom/src/main/java/org/apache/james/mime4j/field/DelegatingFieldParser.java
index 008918f..727958b 100644
--- a/dom/src/main/java/org/apache/james/mime4j/field/DelegatingFieldParser.java
+++ b/dom/src/main/java/org/apache/james/mime4j/field/DelegatingFieldParser.java
@@ -55,8 +55,16 @@ public class DelegatingFieldParser implements FieldParser<ParsedField> {
         return field;
     }
 
+    private FieldParser<? extends ParsedField> getParser(final Field rawField) {
+        final FieldParser<? extends ParsedField> field = parsers.get(rawField.getNameLowerCase());
+        if (field == null) {
+            return defaultParser;
+        }
+        return field;
+    }
+
     public ParsedField parse(final Field rawField, final DecodeMonitor monitor) {
-        final FieldParser<? extends ParsedField> parser = getParser(rawField.getName());
+        final FieldParser<? extends ParsedField> parser = getParser(rawField);
         return parser.parse(rawField, monitor);
     }
 }
diff --git a/dom/src/main/java/org/apache/james/mime4j/internal/AbstractEntityBuilder.java b/dom/src/main/java/org/apache/james/mime4j/internal/AbstractEntityBuilder.java
index 5b83625..c8f0871 100644
--- a/dom/src/main/java/org/apache/james/mime4j/internal/AbstractEntityBuilder.java
+++ b/dom/src/main/java/org/apache/james/mime4j/internal/AbstractEntityBuilder.java
@@ -65,7 +65,7 @@ public abstract class AbstractEntityBuilder {
      * @param field the field to add.
      */
     public AbstractEntityBuilder addField(Field field) {
-        String lowerCasedFieldName = field.getName().toLowerCase(Locale.US);
+        String lowerCasedFieldName = field.getNameLowerCase();
         List<Field> values = fieldMap.get(lowerCasedFieldName);
         if (values == null) {
             values = new LinkedList<Field>();
@@ -210,7 +210,7 @@ public abstract class AbstractEntityBuilder {
      * @param field the field to set.
      */
     public AbstractEntityBuilder setField(Field field) {
-        final String lowerCaseName = field.getName().toLowerCase(Locale.US);
+        final String lowerCaseName = field.getNameLowerCase();
         List<Field> l = fieldMap.get(lowerCaseName);
         if (l == null || l.isEmpty()) {
             addField(field);
diff --git a/dom/src/main/java/org/apache/james/mime4j/message/AbstractHeader.java b/dom/src/main/java/org/apache/james/mime4j/message/AbstractHeader.java
index 63ac5af..c83de6f 100644
--- a/dom/src/main/java/org/apache/james/mime4j/message/AbstractHeader.java
+++ b/dom/src/main/java/org/apache/james/mime4j/message/AbstractHeader.java
@@ -67,7 +67,7 @@ public abstract class AbstractHeader implements Header {
      * @param field the field to add.
      */
     public void addField(Field field) {
-        String lowerCaseFieldName = field.getName().toLowerCase(Locale.US);
+        String lowerCaseFieldName = field.getNameLowerCase();
         List<Field> values = fieldMap.get(lowerCaseFieldName);
         if (values == null) {
             values = new LinkedList<Field>();
@@ -220,7 +220,7 @@ public abstract class AbstractHeader implements Header {
      * @param field the field to set.
      */
     public void setField(Field field) {
-        final String lowerCaseName = field.getName().toLowerCase(Locale.US);
+        final String lowerCaseName = field.getNameLowerCase();
         List<Field> l = fieldMap.get(lowerCaseName);
         if (l == null || l.isEmpty()) {
             addField(field);
diff --git a/dom/src/main/java/org/apache/james/mime4j/message/DefaultBodyDescriptorBuilder.java b/dom/src/main/java/org/apache/james/mime4j/message/DefaultBodyDescriptorBuilder.java
index e3d5e7e..de8d5a2 100644
--- a/dom/src/main/java/org/apache/james/mime4j/message/DefaultBodyDescriptorBuilder.java
+++ b/dom/src/main/java/org/apache/james/mime4j/message/DefaultBodyDescriptorBuilder.java
@@ -88,7 +88,7 @@ public class DefaultBodyDescriptorBuilder implements BodyDescriptorBuilder {
 
     public Field addField(final RawField rawfield) throws MimeException {
         ParsedField field = fieldParser.parse(rawfield, monitor);
-        String name = field.getName().toLowerCase(Locale.US);
+        String name = field.getNameLowerCase();
         if (!fields.containsKey(name)) {
             fields.put(name, field);
         }

---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org