Added typed #getField methods

git-svn-id: https://svn.apache.org/repos/asf/james/mime4j/trunk@1617739 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/dom/src/main/java/org/apache/james/mime4j/dom/Header.java b/dom/src/main/java/org/apache/james/mime4j/dom/Header.java
index dc9428d..f28863d 100644
--- a/dom/src/main/java/org/apache/james/mime4j/dom/Header.java
+++ b/dom/src/main/java/org/apache/james/mime4j/dom/Header.java
@@ -54,6 +54,17 @@
     Field getField(String name);
 
     /**
+     * Gets a <code>Field</code> given a field name and of the given type.
+     * If there are multiple such fields defined in this header the first
+     * one will be returned.
+     *
+     * @param name the field name (e.g. From, Subject).
+     * @param clazz the field class.
+     * @return the field or <code>null</code> if none found.
+     */
+    <F extends Field> F getField(String name, Class<F> clazz);
+
+    /**
      * Gets all <code>Field</code>s having the specified field name.
      *
      * @param name the field name (e.g. From, Subject).
@@ -62,6 +73,16 @@
     List<Field> getFields(final String name);
 
     /**
+     * Gets all <code>Field</code>s having the specified field name
+     * and of the given type.
+     *
+     * @param name the field name (e.g. From, Subject).
+     * @param clazz the field class.
+     * @return the list of fields.
+     */
+    <F extends Field> List<F> getFields(final String name, Class<F> clazz);
+
+    /**
      * Returns an iterator over the list of fields of this header.
      *
      * @return an iterator.
diff --git a/dom/src/main/java/org/apache/james/mime4j/message/AbstractEntityBuilder.java b/dom/src/main/java/org/apache/james/mime4j/message/AbstractEntityBuilder.java
index effac9c..55f736f 100644
--- a/dom/src/main/java/org/apache/james/mime4j/message/AbstractEntityBuilder.java
+++ b/dom/src/main/java/org/apache/james/mime4j/message/AbstractEntityBuilder.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.mime4j.message;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
@@ -97,6 +98,26 @@
     }
 
     /**
+     * Gets a <code>Field</code> given a field name and of the given type.
+     * If there are multiple such fields defined in this header the first
+     * one will be returned.
+     *
+     * @param name the field name (e.g. From, Subject).
+     * @param clazz the field class.
+     * @return the field or <code>null</code> if none found.
+     */
+    public <F extends Field> F getField(final String name, final Class<F> clazz) {
+        List<Field> l = fieldMap.get(name.toLowerCase(Locale.US));
+        for (int i = 0; i < l.size(); i++) {
+            Field field = l.get(i);
+            if (clazz.isInstance(field)) {
+                return clazz.cast(field);
+            }
+        }
+        return null;
+    }
+
+    /**
      * Returns <code>true<code/> if there is at least one explicitly
      * set field with the given name.
      *
@@ -128,6 +149,30 @@
     }
 
     /**
+     * Gets all <code>Field</code>s having the specified field name
+     * and of the given type.
+     *
+     * @param name the field name (e.g. From, Subject).
+     * @param clazz the field class.
+     * @return the list of fields.
+     */
+    public <F extends Field> List<F> getFields(final String name, final Class<F> clazz) {
+        final String lowerCaseName = name.toLowerCase(Locale.US);
+        final List<Field> l = fieldMap.get(lowerCaseName);
+        if (l == null) {
+            return Collections.emptyList();
+        }
+        final List<F> results = new ArrayList<F>();
+        for (int i = 0; i < l.size(); i++) {
+            Field field = l.get(i);
+            if (clazz.isInstance(field)) {
+                results.add(clazz.cast(field));
+            }
+        }
+        return results;
+    }
+
+    /**
      * Removes all <code>Field</code>s having the specified field name.
      *
      * @param name
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 012808c..267b63a 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
@@ -19,11 +19,13 @@
 
 package org.apache.james.mime4j.message;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 
 import org.apache.james.mime4j.dom.Header;
@@ -65,10 +67,10 @@
      * @param field the field to add.
      */
     public void addField(Field field) {
-        List<Field> values = fieldMap.get(field.getName().toLowerCase());
+        List<Field> values = fieldMap.get(field.getName().toLowerCase(Locale.US));
         if (values == null) {
             values = new LinkedList<Field>();
-            fieldMap.put(field.getName().toLowerCase(), values);
+            fieldMap.put(field.getName().toLowerCase(Locale.US), values);
         }
         values.add(field);
         fields.add(field);
@@ -92,7 +94,7 @@
      * @return the field or <code>null</code> if none found.
      */
     public Field getField(String name) {
-        List<Field> l = fieldMap.get(name.toLowerCase());
+        List<Field> l = fieldMap.get(name.toLowerCase(Locale.US));
         if (l != null && !l.isEmpty()) {
             return l.get(0);
         }
@@ -100,13 +102,33 @@
     }
 
     /**
+     * Gets a <code>Field</code> given a field name and of the given type.
+     * If there are multiple such fields defined in this header the first
+     * one will be returned.
+     *
+     * @param name the field name (e.g. From, Subject).
+     * @param clazz the field class.
+     * @return the field or <code>null</code> if none found.
+     */
+    public <F extends Field> F getField(final String name, final Class<F> clazz) {
+        List<Field> l = fieldMap.get(name.toLowerCase(Locale.US));
+        for (int i = 0; i < l.size(); i++) {
+            Field field = l.get(i);
+            if (clazz.isInstance(field)) {
+                return clazz.cast(field);
+            }
+        }
+        return null;
+    }
+
+    /**
      * Gets all <code>Field</code>s having the specified field name.
      *
      * @param name the field name (e.g. From, Subject).
      * @return the list of fields.
      */
     public List<Field> getFields(final String name) {
-        final String lowerCaseName = name.toLowerCase();
+        final String lowerCaseName = name.toLowerCase(Locale.US);
         final List<Field> l = fieldMap.get(lowerCaseName);
         final List<Field> results;
         if (l == null || l.isEmpty()) {
@@ -118,6 +140,30 @@
     }
 
     /**
+     * Gets all <code>Field</code>s having the specified field name
+     * and of the given type.
+     *
+     * @param name the field name (e.g. From, Subject).
+     * @param clazz the field class.
+     * @return the list of fields.
+     */
+    public <F extends Field> List<F> getFields(final String name, final Class<F> clazz) {
+        final String lowerCaseName = name.toLowerCase(Locale.US);
+        final List<Field> l = fieldMap.get(lowerCaseName);
+        if (l == null) {
+            return Collections.emptyList();
+        }
+        final List<F> results = new ArrayList<F>();
+        for (int i = 0; i < l.size(); i++) {
+            Field field = l.get(i);
+            if (clazz.isInstance(field)) {
+                results.add(clazz.cast(field));
+            }
+        }
+        return results;
+    }
+
+    /**
      * Returns an iterator over the list of fields of this header.
      *
      * @return an iterator.
@@ -134,7 +180,7 @@
      * @return number of fields removed.
      */
     public int removeFields(String name) {
-        final String lowerCaseName = name.toLowerCase();
+        final String lowerCaseName = name.toLowerCase(Locale.US);
         List<Field> removed = fieldMap.remove(lowerCaseName);
         if (removed == null || removed.isEmpty())
             return 0;
@@ -161,7 +207,7 @@
      * @param field the field to set.
      */
     public void setField(Field field) {
-        final String lowerCaseName = field.getName().toLowerCase();
+        final String lowerCaseName = field.getName().toLowerCase(Locale.US);
         List<Field> l = fieldMap.get(lowerCaseName);
         if (l == null || l.isEmpty()) {
             addField(field);
diff --git a/dom/src/test/java/org/apache/james/mime4j/message/AbstractEntityBuilderTest.java b/dom/src/test/java/org/apache/james/mime4j/message/AbstractEntityBuilderTest.java
index 58f36dc..76cbcbe 100644
--- a/dom/src/test/java/org/apache/james/mime4j/message/AbstractEntityBuilderTest.java
+++ b/dom/src/test/java/org/apache/james/mime4j/message/AbstractEntityBuilderTest.java
@@ -29,6 +29,7 @@
 import org.apache.james.mime4j.dom.Message;
 import org.apache.james.mime4j.dom.Multipart;
 import org.apache.james.mime4j.dom.TextBody;
+import org.apache.james.mime4j.dom.field.ContentTransferEncodingField;
 import org.apache.james.mime4j.dom.field.ContentTypeField;
 import org.apache.james.mime4j.dom.field.ParsedField;
 import org.apache.james.mime4j.field.DefaultFieldParser;
@@ -85,20 +86,27 @@
         builder.addField(field3);
 
         Assert.assertSame(field2, builder.getField("Content-Transfer-Encoding"));
+        Assert.assertSame(field2, builder.getField("Content-Transfer-Encoding", ContentTransferEncodingField.class));
         List<Field> fields5 = builder.getFields("Content-Transfer-Encoding");
         Assert.assertNotNull(fields5);
         Assert.assertEquals(2, fields5.size());
         Assert.assertSame(field2, fields5.get(0));
         Assert.assertSame(field3, fields5.get(1));
 
+        List<ContentTransferEncodingField> fields6 = builder.getFields("Content-Transfer-Encoding", ContentTransferEncodingField.class);
+        Assert.assertNotNull(fields6);
+        Assert.assertEquals(2, fields6.size());
+        Assert.assertSame(field2, fields6.get(0));
+        Assert.assertSame(field3, fields6.get(1));
+
         builder.clearFields();
 
         Assert.assertFalse(builder.containsField("Content-Type"));
         Assert.assertFalse(builder.containsField("Content-Transfer-Encoding"));
 
-        List<Field> fields6 = builder.getFields();
-        Assert.assertNotNull(fields6);
-        Assert.assertEquals(0, fields6.size());
+        List<Field> fields7 = builder.getFields();
+        Assert.assertNotNull(fields7);
+        Assert.assertEquals(0, fields7.size());
     }
 
     @Test
diff --git a/dom/src/test/java/org/apache/james/mime4j/message/BodyPartBuilderTest.java b/dom/src/test/java/org/apache/james/mime4j/message/BodyPartBuilderTest.java
index 7a91b2b..154cf7c 100644
--- a/dom/src/test/java/org/apache/james/mime4j/message/BodyPartBuilderTest.java
+++ b/dom/src/test/java/org/apache/james/mime4j/message/BodyPartBuilderTest.java
@@ -69,7 +69,7 @@
         Assert.assertNotNull(bodyPart);
         Body body = bodyPart.getBody();
         Assert.assertSame(bodyPart, body.getParent());
-        ContentTypeField field = (ContentTypeField) bodyPart.getHeader().getField("Content-Type");
+        ContentTypeField field = bodyPart.getHeader().getField("Content-Type", ContentTypeField.class);
         Assert.assertEquals("text/stuff", field.getMimeType());
         Assert.assertEquals(null, field.getCharset());
 
@@ -99,7 +99,7 @@
         Assert.assertNotNull(bodyPart);
         Body body = bodyPart.getBody();
         Assert.assertSame(bodyPart, body.getParent());
-        ContentTypeField field = (ContentTypeField) bodyPart.getHeader().getField("Content-Type");
+        ContentTypeField field = bodyPart.getHeader().getField("Content-Type", ContentTypeField.class);
         Assert.assertEquals("application/octet-stream", field.getMimeType());
         Assert.assertEquals(null, field.getCharset());