You are viewing a plain text version of this content. The canonical link for it is here.
Posted to mime4j-dev@james.apache.org by mw...@apache.org on 2009/02/24 22:36:21 UTC

svn commit: r747555 - in /james/mime4j/trunk/src: main/java/org/apache/james/mime4j/field/ test/java/org/apache/james/mime4j/field/

Author: mwiederkehr
Date: Tue Feb 24 21:36:19 2009
New Revision: 747555

URL: http://svn.apache.org/viewvc?rev=747555&view=rev
Log:
make the behaviour of Field independent of AbstractField and the current configuration of DefaultFieldParser (related to MIME4J-100 and in preparation for MIME4J-118)

Modified:
    james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/AddressListField.java
    james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/ContentDispositionField.java
    james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/ContentTransferEncodingField.java
    james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/ContentTypeField.java
    james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/DateTimeField.java
    james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/DefaultFieldParser.java
    james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/DelegatingFieldParser.java
    james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/Fields.java
    james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/MailboxField.java
    james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/MailboxListField.java
    james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/UnstructuredField.java
    james/mime4j/trunk/src/test/java/org/apache/james/mime4j/field/FieldsTest.java

Modified: james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/AddressListField.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/AddressListField.java?rev=747555&r1=747554&r2=747555&view=diff
==============================================================================
--- james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/AddressListField.java (original)
+++ james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/AddressListField.java Tue Feb 24 21:36:19 2009
@@ -70,10 +70,10 @@
         parsed = true;
     }
 
-    static class Parser implements FieldParser {
+    static final FieldParser PARSER = new FieldParser() {
         public Field parse(final String name, final String body,
                 final String raw) {
             return new AddressListField(name, body, raw);
         }
-    }
+    };
 }

Modified: james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/ContentDispositionField.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/ContentDispositionField.java?rev=747555&r1=747554&r2=747555&view=diff
==============================================================================
--- james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/ContentDispositionField.java (original)
+++ james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/ContentDispositionField.java Tue Feb 24 21:36:19 2009
@@ -317,10 +317,10 @@
         parsed = true;
     }
 
-    static class Parser implements FieldParser {
+    static final FieldParser PARSER = new FieldParser() {
         public Field parse(final String name, final String body,
                 final String raw) {
             return new ContentDispositionField(name, body, raw);
         }
-    }
+    };
 }

Modified: james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/ContentTransferEncodingField.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/ContentTransferEncodingField.java?rev=747555&r1=747554&r2=747555&view=diff
==============================================================================
--- james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/ContentTransferEncodingField.java (original)
+++ james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/ContentTransferEncodingField.java Tue Feb 24 21:36:19 2009
@@ -56,10 +56,10 @@
         return MimeUtil.ENC_7BIT;
     }
 
-    static class Parser implements FieldParser {
+    static final FieldParser PARSER = new FieldParser() {
         public Field parse(final String name, final String body,
                 final String raw) {
             return new ContentTransferEncodingField(name, body, raw);
         }
-    }
+    };
 }

Modified: james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/ContentTypeField.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/ContentTypeField.java?rev=747555&r1=747554&r2=747555&view=diff
==============================================================================
--- james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/ContentTypeField.java (original)
+++ james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/ContentTypeField.java Tue Feb 24 21:36:19 2009
@@ -249,10 +249,10 @@
         parsed = true;
     }
 
-    static class Parser implements FieldParser {
+    static final FieldParser PARSER = new FieldParser() {
         public Field parse(final String name, final String body,
                 final String raw) {
             return new ContentTypeField(name, body, raw);
         }
-    }
+    };
 }

Modified: james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/DateTimeField.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/DateTimeField.java?rev=747555&r1=747554&r2=747555&view=diff
==============================================================================
--- james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/DateTimeField.java (original)
+++ james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/DateTimeField.java Tue Feb 24 21:36:19 2009
@@ -19,6 +19,9 @@
 
 package org.apache.james.mime4j.field;
 
+import java.io.StringReader;
+import java.util.Date;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.james.mime4j.field.datetime.parser.DateTimeParser;
@@ -26,9 +29,6 @@
 import org.apache.james.mime4j.field.datetime.parser.TokenMgrError;
 import org.apache.james.mime4j.parser.Field;
 
-import java.io.StringReader;
-import java.util.Date;
-
 /**
  * Date-time field such as <code>Date</code> or <code>Resent-Date</code>.
  */
@@ -80,10 +80,10 @@
         parsed = true;
     }
 
-    static class Parser implements FieldParser {
+    static final FieldParser PARSER = new FieldParser() {
         public Field parse(final String name, final String body,
                 final String raw) {
             return new DateTimeField(name, body, raw);
         }
-    }
+    };
 }

Modified: james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/DefaultFieldParser.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/DefaultFieldParser.java?rev=747555&r1=747554&r2=747555&view=diff
==============================================================================
--- james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/DefaultFieldParser.java (original)
+++ james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/DefaultFieldParser.java Tue Feb 24 21:36:19 2009
@@ -20,25 +20,27 @@
 package org.apache.james.mime4j.field;
 
 public class DefaultFieldParser extends DelegatingFieldParser {
-    
+
     public DefaultFieldParser() {
-        setFieldParser(FieldName.CONTENT_TRANSFER_ENCODING, new ContentTransferEncodingField.Parser());
-        setFieldParser(FieldName.CONTENT_TYPE, new ContentTypeField.Parser());
-        setFieldParser(FieldName.CONTENT_DISPOSITION, new ContentDispositionField.Parser());
-        
-        final DateTimeField.Parser dateTimeParser = new DateTimeField.Parser();
+        setFieldParser(FieldName.CONTENT_TRANSFER_ENCODING,
+                ContentTransferEncodingField.PARSER);
+        setFieldParser(FieldName.CONTENT_TYPE, ContentTypeField.PARSER);
+        setFieldParser(FieldName.CONTENT_DISPOSITION,
+                ContentDispositionField.PARSER);
+
+        final FieldParser dateTimeParser = DateTimeField.PARSER;
         setFieldParser(FieldName.DATE, dateTimeParser);
         setFieldParser(FieldName.RESENT_DATE, dateTimeParser);
-        
-        final MailboxListField.Parser mailboxListParser = new MailboxListField.Parser();
+
+        final FieldParser mailboxListParser = MailboxListField.PARSER;
         setFieldParser(FieldName.FROM, mailboxListParser);
         setFieldParser(FieldName.RESENT_FROM, mailboxListParser);
-        
-        final MailboxField.Parser mailboxParser = new MailboxField.Parser();
+
+        final FieldParser mailboxParser = MailboxField.PARSER;
         setFieldParser(FieldName.SENDER, mailboxParser);
         setFieldParser(FieldName.RESENT_SENDER, mailboxParser);
-        
-        final AddressListField.Parser addressListParser = new AddressListField.Parser();
+
+        final FieldParser addressListParser = AddressListField.PARSER;
         setFieldParser(FieldName.TO, addressListParser);
         setFieldParser(FieldName.RESENT_TO, addressListParser);
         setFieldParser(FieldName.CC, addressListParser);
@@ -47,4 +49,5 @@
         setFieldParser(FieldName.RESENT_BCC, addressListParser);
         setFieldParser(FieldName.REPLY_TO, addressListParser);
     }
+
 }

Modified: james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/DelegatingFieldParser.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/DelegatingFieldParser.java?rev=747555&r1=747554&r2=747555&view=diff
==============================================================================
--- james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/DelegatingFieldParser.java (original)
+++ james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/DelegatingFieldParser.java Tue Feb 24 21:36:19 2009
@@ -27,7 +27,7 @@
 public class DelegatingFieldParser implements FieldParser {
     
     private Map<String, FieldParser> parsers = new HashMap<String, FieldParser>();
-    private FieldParser defaultParser = new UnstructuredField.Parser();
+    private FieldParser defaultParser = UnstructuredField.PARSER;
     
     /**
      * Sets the parser used for the field named <code>name</code>.

Modified: james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/Fields.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/Fields.java?rev=747555&r1=747554&r2=747555&view=diff
==============================================================================
--- james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/Fields.java (original)
+++ james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/Fields.java Tue Feb 24 21:36:19 2009
@@ -25,8 +25,8 @@
 import java.util.HashMap;
 import java.util.Map;
 import java.util.TimeZone;
+import java.util.regex.Pattern;
 
-import org.apache.james.mime4j.MimeException;
 import org.apache.james.mime4j.codec.EncoderUtil;
 import org.apache.james.mime4j.field.address.Address;
 import org.apache.james.mime4j.field.address.Mailbox;
@@ -38,6 +38,9 @@
  */
 public class Fields {
 
+    private static final Pattern FIELD_NAME_PATTERN = Pattern
+            .compile("[\\x21-\\x39\\x3b-\\x7e]+");
+
     private Fields() {
     }
 
@@ -52,7 +55,8 @@
      * @return the newly created <i>Content-Type</i> field.
      */
     public static ContentTypeField contentType(String contentType) {
-        return parse(ContentTypeField.class, FieldName.CONTENT_TYPE, contentType);
+        return parse(ContentTypeField.PARSER, FieldName.CONTENT_TYPE,
+                contentType);
     }
 
     /**
@@ -73,7 +77,8 @@
             throw new IllegalArgumentException();
 
         if (parameters == null || parameters.isEmpty()) {
-            return parse(ContentTypeField.class, FieldName.CONTENT_TYPE, mimeType);
+            return parse(ContentTypeField.PARSER, FieldName.CONTENT_TYPE,
+                    mimeType);
         } else {
             StringBuilder sb = new StringBuilder(mimeType);
             for (Map.Entry<String, String> entry : parameters.entrySet()) {
@@ -97,7 +102,7 @@
      */
     public static ContentTransferEncodingField contentTransferEncoding(
             String contentTransferEncoding) {
-        return parse(ContentTransferEncodingField.class,
+        return parse(ContentTransferEncodingField.PARSER,
                 FieldName.CONTENT_TRANSFER_ENCODING, contentTransferEncoding);
     }
 
@@ -113,8 +118,8 @@
      */
     public static ContentDispositionField contentDisposition(
             String contentDisposition) {
-        return parse(ContentDispositionField.class, FieldName.CONTENT_DISPOSITION,
-                contentDisposition);
+        return parse(ContentDispositionField.PARSER,
+                FieldName.CONTENT_DISPOSITION, contentDisposition);
     }
 
     /**
@@ -135,7 +140,7 @@
             throw new IllegalArgumentException();
 
         if (parameters == null || parameters.isEmpty()) {
-            return parse(ContentDispositionField.class,
+            return parse(ContentDispositionField.PARSER,
                     FieldName.CONTENT_DISPOSITION, dispositionType);
         } else {
             StringBuilder sb = new StringBuilder(dispositionType);
@@ -245,7 +250,7 @@
      * @return the newly created <i>Date</i> field.
      */
     public static DateTimeField date(Date date) {
-        return date(FieldName.DATE, date, null);
+        return date0(FieldName.DATE, date, null);
     }
 
     /**
@@ -260,7 +265,8 @@
      * @return the newly created date field.
      */
     public static DateTimeField date(String fieldName, Date date) {
-        return date(fieldName, date, null);
+        checkValidFieldName(fieldName);
+        return date0(fieldName, date, null);
     }
 
     /**
@@ -277,8 +283,8 @@
      * @return the newly created date field.
      */
     public static DateTimeField date(String fieldName, Date date, TimeZone zone) {
-        return parse(DateTimeField.class, fieldName, MimeUtil.formatDate(date,
-                zone));
+        checkValidFieldName(fieldName);
+        return date0(fieldName, date, zone);
     }
 
     /**
@@ -291,7 +297,7 @@
      */
     public static Field messageId(String hostname) {
         String fieldValue = MimeUtil.createUniqueMessageId(hostname);
-        return parse(UnstructuredField.class, FieldName.MESSAGE_ID, fieldValue);
+        return parse(UnstructuredField.PARSER, FieldName.MESSAGE_ID, fieldValue);
     }
 
     /**
@@ -307,7 +313,7 @@
         String fieldValue = EncoderUtil.encodeIfNecessary(subject,
                 EncoderUtil.Usage.TEXT_TOKEN, usedCharacters);
 
-        return parse(UnstructuredField.class, FieldName.SUBJECT, fieldValue);
+        return parse(UnstructuredField.PARSER, FieldName.SUBJECT, fieldValue);
     }
 
     /**
@@ -318,7 +324,7 @@
      * @return the newly created <i>Sender</i> field.
      */
     public static MailboxField sender(Mailbox mailbox) {
-        return mailbox(FieldName.SENDER, mailbox);
+        return mailbox0(FieldName.SENDER, mailbox);
     }
 
     /**
@@ -329,7 +335,7 @@
      * @return the newly created <i>From</i> field.
      */
     public static MailboxListField from(Mailbox mailbox) {
-        return mailboxList(FieldName.FROM, Collections.singleton(mailbox));
+        return mailboxList0(FieldName.FROM, Collections.singleton(mailbox));
     }
 
     /**
@@ -340,7 +346,7 @@
      * @return the newly created <i>From</i> field.
      */
     public static MailboxListField from(Mailbox... mailboxes) {
-        return mailboxList(FieldName.FROM, Arrays.asList(mailboxes));
+        return mailboxList0(FieldName.FROM, Arrays.asList(mailboxes));
     }
 
     /**
@@ -351,7 +357,7 @@
      * @return the newly created <i>From</i> field.
      */
     public static MailboxListField from(Iterable<Mailbox> mailboxes) {
-        return mailboxList(FieldName.FROM, mailboxes);
+        return mailboxList0(FieldName.FROM, mailboxes);
     }
 
     /**
@@ -362,7 +368,7 @@
      * @return the newly created <i>To</i> field.
      */
     public static AddressListField to(Address address) {
-        return addressList(FieldName.TO, Collections.singleton(address));
+        return addressList0(FieldName.TO, Collections.singleton(address));
     }
 
     /**
@@ -373,7 +379,7 @@
      * @return the newly created <i>To</i> field.
      */
     public static AddressListField to(Address... addresses) {
-        return addressList(FieldName.TO, Arrays.asList(addresses));
+        return addressList0(FieldName.TO, Arrays.asList(addresses));
     }
 
     /**
@@ -384,7 +390,7 @@
      * @return the newly created <i>To</i> field.
      */
     public static AddressListField to(Iterable<Address> addresses) {
-        return addressList(FieldName.TO, addresses);
+        return addressList0(FieldName.TO, addresses);
     }
 
     /**
@@ -395,7 +401,7 @@
      * @return the newly created <i>Cc</i> field.
      */
     public static AddressListField cc(Address address) {
-        return addressList(FieldName.CC, Collections.singleton(address));
+        return addressList0(FieldName.CC, Collections.singleton(address));
     }
 
     /**
@@ -406,7 +412,7 @@
      * @return the newly created <i>Cc</i> field.
      */
     public static AddressListField cc(Address... addresses) {
-        return addressList(FieldName.CC, Arrays.asList(addresses));
+        return addressList0(FieldName.CC, Arrays.asList(addresses));
     }
 
     /**
@@ -417,7 +423,7 @@
      * @return the newly created <i>Cc</i> field.
      */
     public static AddressListField cc(Iterable<Address> addresses) {
-        return addressList(FieldName.CC, addresses);
+        return addressList0(FieldName.CC, addresses);
     }
 
     /**
@@ -428,7 +434,7 @@
      * @return the newly created <i>Bcc</i> field.
      */
     public static AddressListField bcc(Address address) {
-        return addressList(FieldName.BCC, Collections.singleton(address));
+        return addressList0(FieldName.BCC, Collections.singleton(address));
     }
 
     /**
@@ -439,7 +445,7 @@
      * @return the newly created <i>Bcc</i> field.
      */
     public static AddressListField bcc(Address... addresses) {
-        return addressList(FieldName.BCC, Arrays.asList(addresses));
+        return addressList0(FieldName.BCC, Arrays.asList(addresses));
     }
 
     /**
@@ -450,7 +456,7 @@
      * @return the newly created <i>Bcc</i> field.
      */
     public static AddressListField bcc(Iterable<Address> addresses) {
-        return addressList(FieldName.BCC, addresses);
+        return addressList0(FieldName.BCC, addresses);
     }
 
     /**
@@ -462,7 +468,7 @@
      * @return the newly created <i>Reply-To</i> field.
      */
     public static AddressListField replyTo(Address address) {
-        return addressList(FieldName.REPLY_TO, Collections.singleton(address));
+        return addressList0(FieldName.REPLY_TO, Collections.singleton(address));
     }
 
     /**
@@ -474,7 +480,7 @@
      * @return the newly created <i>Reply-To</i> field.
      */
     public static AddressListField replyTo(Address... addresses) {
-        return addressList(FieldName.REPLY_TO, Arrays.asList(addresses));
+        return addressList0(FieldName.REPLY_TO, Arrays.asList(addresses));
     }
 
     /**
@@ -486,7 +492,7 @@
      * @return the newly created <i>Reply-To</i> field.
      */
     public static AddressListField replyTo(Iterable<Address> addresses) {
-        return addressList(FieldName.REPLY_TO, addresses);
+        return addressList0(FieldName.REPLY_TO, addresses);
     }
 
     /**
@@ -502,8 +508,8 @@
      * @return the newly created mailbox field.
      */
     public static MailboxField mailbox(String fieldName, Mailbox mailbox) {
-        String fieldValue = encodeAddresses(Collections.singleton(mailbox));
-        return parse(MailboxField.class, fieldName, fieldValue);
+        checkValidFieldName(fieldName);
+        return mailbox0(fieldName, mailbox);
     }
 
     /**
@@ -520,8 +526,8 @@
      */
     public static MailboxListField mailboxList(String fieldName,
             Iterable<Mailbox> mailboxes) {
-        String fieldValue = encodeAddresses(mailboxes);
-        return parse(MailboxListField.class, fieldName, fieldValue);
+        checkValidFieldName(fieldName);
+        return mailboxList0(fieldName, mailboxes);
     }
 
     /**
@@ -542,8 +548,36 @@
      */
     public static AddressListField addressList(String fieldName,
             Iterable<Address> addresses) {
+        checkValidFieldName(fieldName);
+        return addressList0(fieldName, addresses);
+    }
+
+    private static DateTimeField date0(String fieldName, Date date,
+            TimeZone zone) {
+        final String formattedDate = MimeUtil.formatDate(date, zone);
+        return parse(DateTimeField.PARSER, fieldName, formattedDate);
+    }
+
+    private static MailboxField mailbox0(String fieldName, Mailbox mailbox) {
+        String fieldValue = encodeAddresses(Collections.singleton(mailbox));
+        return parse(MailboxField.PARSER, fieldName, fieldValue);
+    }
+
+    private static MailboxListField mailboxList0(String fieldName,
+            Iterable<Mailbox> mailboxes) {
+        String fieldValue = encodeAddresses(mailboxes);
+        return parse(MailboxListField.PARSER, fieldName, fieldValue);
+    }
+
+    private static AddressListField addressList0(String fieldName,
+            Iterable<Address> addresses) {
         String fieldValue = encodeAddresses(addresses);
-        return parse(AddressListField.class, fieldName, fieldValue);
+        return parse(AddressListField.PARSER, fieldName, fieldValue);
+    }
+
+    private static void checkValidFieldName(String fieldName) {
+        if (!FIELD_NAME_PATTERN.matcher(fieldName).matches())
+            throw new IllegalArgumentException("Invalid field name");
     }
 
     private static boolean isValidMimeType(String mimeType) {
@@ -566,22 +600,15 @@
         return EncoderUtil.isToken(dispositionType);
     }
 
-    private static <F extends Field> F parse(Class<F> fieldClass,
+    private static <F extends Field> F parse(FieldParser parser,
             String fieldName, String fieldBody) {
-        try {
-            String raw = MimeUtil.fold(fieldName + ": " + fieldBody, 0);
+        String raw = MimeUtil.fold(fieldName + ": " + fieldBody, 0);
 
-            Field field = AbstractField.parse(raw);
-            if (!fieldClass.isInstance(field)) {
-                throw new IllegalArgumentException("Incompatible field name: "
-                        + fieldName);
-            }
+        Field field = parser.parse(fieldName, fieldBody, raw);
 
-            return fieldClass.cast(field);
-        } catch (MimeException e) {
-            throw new IllegalArgumentException("Illegal field name: "
-                    + fieldName);
-        }
+        @SuppressWarnings("unchecked")
+        F f = (F) field;
+        return f;
     }
 
     private static String encodeAddresses(Iterable<? extends Address> addresses) {

Modified: james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/MailboxField.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/MailboxField.java?rev=747555&r1=747554&r2=747555&view=diff
==============================================================================
--- james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/MailboxField.java (original)
+++ james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/MailboxField.java Tue Feb 24 21:36:19 2009
@@ -75,10 +75,10 @@
         parsed = true;
     }
 
-    static class Parser implements FieldParser {
+    static final FieldParser PARSER = new FieldParser() {
         public Field parse(final String name, final String body,
                 final String raw) {
             return new MailboxField(name, body, raw);
         }
-    }
+    };
 }

Modified: james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/MailboxListField.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/MailboxListField.java?rev=747555&r1=747554&r2=747555&view=diff
==============================================================================
--- james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/MailboxListField.java (original)
+++ james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/MailboxListField.java Tue Feb 24 21:36:19 2009
@@ -71,10 +71,10 @@
         parsed = true;
     }
 
-    static class Parser implements FieldParser {
+    static final FieldParser PARSER = new FieldParser() {
         public Field parse(final String name, final String body,
                 final String raw) {
             return new MailboxListField(name, body, raw);
         }
-    }
+    };
 }

Modified: james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/UnstructuredField.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/UnstructuredField.java?rev=747555&r1=747554&r2=747555&view=diff
==============================================================================
--- james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/UnstructuredField.java (original)
+++ james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/UnstructuredField.java Tue Feb 24 21:36:19 2009
@@ -49,10 +49,10 @@
         parsed = true;
     }
 
-    static class Parser implements FieldParser {
+    static final FieldParser PARSER = new FieldParser() {
         public Field parse(final String name, final String body,
                 final String raw) {
             return new UnstructuredField(name, body, raw);
         }
-    }
+    };
 }

Modified: james/mime4j/trunk/src/test/java/org/apache/james/mime4j/field/FieldsTest.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/src/test/java/org/apache/james/mime4j/field/FieldsTest.java?rev=747555&r1=747554&r2=747555&view=diff
==============================================================================
--- james/mime4j/trunk/src/test/java/org/apache/james/mime4j/field/FieldsTest.java (original)
+++ james/mime4j/trunk/src/test/java/org/apache/james/mime4j/field/FieldsTest.java Tue Feb 24 21:36:19 2009
@@ -359,4 +359,12 @@
                 field.getRaw());
     }
 
+    public void testInvalidFieldName() throws Exception {
+        try {
+            Fields.date("invalid field name", new Date());
+            fail();
+        } catch (IllegalArgumentException expected) {
+        }
+    }
+
 }