Merge pull request #40 from chibenwa/MIME4J-299

MIME4J-299 Access to the Header map
diff --git a/core/src/main/java/org/apache/james/mime4j/codec/EncoderUtil.java b/core/src/main/java/org/apache/james/mime4j/codec/EncoderUtil.java
index e883646..3b3690c 100644
--- a/core/src/main/java/org/apache/james/mime4j/codec/EncoderUtil.java
+++ b/core/src/main/java/org/apache/james/mime4j/codec/EncoderUtil.java
@@ -26,6 +26,7 @@
 import java.nio.charset.Charset;
 import java.util.BitSet;
 import java.util.Locale;
+import java.util.regex.Pattern;
 
 import org.apache.james.mime4j.Charsets;
 import org.apache.james.mime4j.util.CharsetUtil;
@@ -55,6 +56,8 @@
 
     private static final BitSet ATEXT_CHARS = initChars("()<>@.,;:\\\"[]");
 
+    private static final Pattern QUOTE = Pattern.compile("[\\\\\"]");
+
     private static BitSet initChars(String specials) {
         BitSet bs = new BitSet(128);
         for (char ch = 33; ch < 127; ch++) {
@@ -526,8 +529,7 @@
         // VCHAR = %x21-7E
         // DQUOTE = %x22
 
-        String escaped = str.replaceAll("[\\\\\"]", "\\\\$0");
-        return "\"" + escaped + "\"";
+        return '"' + QUOTE.matcher(str).replaceAll("\\\\$0") + '"';
     }
 
     private static String encodeB(String prefix, String text,
diff --git a/core/src/main/java/org/apache/james/mime4j/util/MimeUtil.java b/core/src/main/java/org/apache/james/mime4j/util/MimeUtil.java
index 59deb6a..fb07272 100644
--- a/core/src/main/java/org/apache/james/mime4j/util/MimeUtil.java
+++ b/core/src/main/java/org/apache/james/mime4j/util/MimeUtil.java
@@ -218,7 +218,7 @@
             int nextWspIdx = indexOfWsp(s, wspIdx + 1);
 
             if (nextWspIdx - lastLineBreak > maxCharacters) {
-                sb.append(s.substring(Math.max(0, lastLineBreak), wspIdx));
+                sb.append(s, Math.max(0, lastLineBreak), wspIdx);
                 sb.append("\r\n");
                 lastLineBreak = wspIdx;
             }
@@ -260,7 +260,7 @@
         StringBuilder sb = new StringBuilder(length);
 
         if (crlfIdx > 0) {
-            sb.append(s.substring(0, crlfIdx));
+            sb.append(s, 0, crlfIdx);
         }
 
         for (int idx = crlfIdx + 1; idx < length; idx++) {
diff --git a/dom/src/main/java/org/apache/james/mime4j/field/ContentLocationFieldImpl.java b/dom/src/main/java/org/apache/james/mime4j/field/ContentLocationFieldImpl.java
index 790dae1..aa27b00 100644
--- a/dom/src/main/java/org/apache/james/mime4j/field/ContentLocationFieldImpl.java
+++ b/dom/src/main/java/org/apache/james/mime4j/field/ContentLocationFieldImpl.java
@@ -20,6 +20,7 @@
 package org.apache.james.mime4j.field;
 
 import java.io.StringReader;
+import java.util.regex.Pattern;
 
 import org.apache.james.mime4j.codec.DecodeMonitor;
 import org.apache.james.mime4j.dom.FieldParser;
@@ -32,6 +33,7 @@
  * Represents a <code>Content-Location</code> field.
  */
 public class ContentLocationFieldImpl extends AbstractField implements ContentLocationField {
+    private static final Pattern PATTERN = Pattern.compile("\\s");
 
     private boolean parsed = false;
     private String location;
@@ -56,7 +58,7 @@
                  * remaining material is the URL string.
                  * Read more: http://www.faqs.org/rfcs/rfc2017.html#ixzz0aufO9nRL
                  */
-                location = parser.parse().replaceAll("\\s", "");
+                location = PATTERN.matcher(parser.parse()).replaceAll("");
             } catch (ParseException ex) {
                 parseException = ex;
             }
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 e5e12b2..5561c5a 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
@@ -66,10 +66,11 @@
      * @param field the field to add.
      */
     public AbstractEntityBuilder addField(Field field) {
-        List<Field> values = fieldMap.get(field.getName().toLowerCase(Locale.US));
+        String lowerCasedFieldName = field.getName().toLowerCase(Locale.US);
+        List<Field> values = fieldMap.get(lowerCasedFieldName);
         if (values == null) {
             values = new LinkedList<Field>();
-            fieldMap.put(field.getName().toLowerCase(Locale.US), values);
+            fieldMap.put(lowerCasedFieldName, values);
         }
         values.add(field);
         fields.add(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 5ecc7d3..63ac5af 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,10 +67,11 @@
      * @param field the field to add.
      */
     public void addField(Field field) {
-        List<Field> values = fieldMap.get(field.getName().toLowerCase(Locale.US));
+        String lowerCaseFieldName = field.getName().toLowerCase(Locale.US);
+        List<Field> values = fieldMap.get(lowerCaseFieldName);
         if (values == null) {
             values = new LinkedList<Field>();
-            fieldMap.put(field.getName().toLowerCase(Locale.US), values);
+            fieldMap.put(lowerCaseFieldName, values);
         }
         values.add(field);
         fields.add(field);