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());