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 ol...@apache.org on 2011/05/23 22:20:45 UTC

svn commit: r1126712 [1/2] - in /james/mime4j/trunk: core/src/main/java/org/apache/james/mime4j/util/ dom/src/main/java/org/apache/james/mime4j/dom/field/ dom/src/main/java/org/apache/james/mime4j/field/ dom/src/main/java/org/apache/james/mime4j/messag...

Author: olegk
Date: Mon May 23 20:20:44 2011
New Revision: 1126712

URL: http://svn.apache.org/viewvc?rev=1126712&view=rev
Log:
Follow-up to MIME4J-116: parsing code moved from body descriptors to individual field impls; body descriptors are now collections of lazily parsed fields

Added:
    james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentDescriptionField.java   (with props)
    james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentIdField.java   (with props)
    james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentLanguageField.java   (with props)
    james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentLengthField.java   (with props)
    james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentLocationField.java   (with props)
    james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentMD5Field.java   (with props)
    james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/MimeVersionField.java   (with props)
    james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentDescriptionFieldImpl.java   (with props)
    james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentIdFieldImpl.java   (with props)
    james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLanguageFieldImpl.java   (with props)
    james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLengthFieldImpl.java   (with props)
    james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLocationFieldImpl.java   (with props)
    james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentMD5FieldImpl.java   (with props)
    james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/MimeVersionFieldImpl.java   (with props)
Modified:
    james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/util/MimeUtil.java
    james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentDispositionField.java
    james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentTransferEncodingField.java
    james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/FieldName.java
    james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentTransferEncodingFieldImpl.java
    james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/DefaultFieldParser.java
    james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/MaximalBodyDescriptor.java
    james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/MinimalBodyDescriptor.java
    james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/message/MaximalBodyDescriptorTest.java

Modified: james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/util/MimeUtil.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/util/MimeUtil.java?rev=1126712&r1=1126711&r2=1126712&view=diff
==============================================================================
--- james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/util/MimeUtil.java (original)
+++ james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/util/MimeUtil.java Mon May 23 20:20:44 2011
@@ -54,58 +54,6 @@ public final class MimeUtil {
      */
     public static final String ENC_7BIT = "7bit";
 
-    /** <code>MIME-Version</code> header name (lowercase) */
-    public static final String MIME_HEADER_MIME_VERSION = "mime-version";
-    /** <code>Content-ID</code> header name (lowercase) */
-    public static final String MIME_HEADER_CONTENT_ID = "content-id";
-    /** <code>Content-Description</code> header name (lowercase) */
-    public static final String MIME_HEADER_CONTENT_DESCRIPTION = "content-description";
-    /** 
-     * <code>Content-Disposition</code> header name (lowercase). 
-     * See <a href='http://www.faqs.org/rfcs/rfc2183.html'>RFC2183</a>. 
-     */
-    public static final String MIME_HEADER_CONTENT_DISPOSITION = "content-disposition";
-    /** 
-     * <code>Content-Disposition</code> filename parameter (lowercase). 
-     * See <a href='http://www.faqs.org/rfcs/rfc2183.html'>RFC2183</a>. 
-     */
-    public static final String PARAM_FILENAME = "filename";
-    /** 
-     * <code>Content-Disposition</code> modification-date parameter (lowercase). 
-     * See <a href='http://www.faqs.org/rfcs/rfc2183.html'>RFC2183</a>. 
-     */
-    public static final String PARAM_MODIFICATION_DATE = "modification-date";
-    /** 
-     * <code>Content-Disposition</code> creation-date parameter (lowercase). 
-     * See <a href='http://www.faqs.org/rfcs/rfc2183.html'>RFC2183</a>. 
-     */
-    public static final String PARAM_CREATION_DATE = "creation-date";
-    /** 
-     * <code>Content-Disposition</code> read-date parameter (lowercase). 
-     * See <a href='http://www.faqs.org/rfcs/rfc2183.html'>RFC2183</a>. 
-     */
-    public static final String PARAM_READ_DATE = "read-date";
-    /** 
-     * <code>Content-Disposition</code> size parameter (lowercase). 
-     * See <a href='http://www.faqs.org/rfcs/rfc2183.html'>RFC2183</a>. 
-     */
-    public static final String PARAM_SIZE = "size";
-    /**
-     * <code>Content-Langauge</code> header (lower case).
-     * See <a href='http://www.faqs.org/rfcs/rfc4646.html'>RFC4646</a>.
-     */
-    public static final String MIME_HEADER_LANGAUGE = "content-language";
-    /**
-     * <code>Content-Location</code> header (lower case).
-     * See <a href='http://www.faqs.org/rfcs/rfc2557.html'>RFC2557</a>.
-     */
-    public static final String MIME_HEADER_LOCATION = "content-location";
-    /**
-     * <code>Content-MD5</code> header (lower case).
-     * See <a href='http://www.faqs.org/rfcs/rfc1864.html'>RFC1864</a>.
-     */
-    public static final String MIME_HEADER_MD5 = "content-md5";
-
     // used to create unique ids
     private static final Random random = new Random();
     

Added: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentDescriptionField.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentDescriptionField.java?rev=1126712&view=auto
==============================================================================
--- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentDescriptionField.java (added)
+++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentDescriptionField.java Mon May 23 20:20:44 2011
@@ -0,0 +1,31 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mime4j.dom.field;
+
+public interface ContentDescriptionField extends ParsedField {
+
+    /**
+     * Gets the content description defined in this field.
+     * 
+     * @return the content description or <code>null</code> if not set.
+     */
+    String getDescription();
+
+}
\ No newline at end of file

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentDescriptionField.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentDescriptionField.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentDescriptionField.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentDispositionField.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentDispositionField.java?rev=1126712&r1=1126711&r2=1126712&view=diff
==============================================================================
--- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentDispositionField.java (original)
+++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentDispositionField.java Mon May 23 20:20:44 2011
@@ -88,7 +88,7 @@ public interface ContentDispositionField
      * @return <code>true</code> if the disposition type of this field is
      *         <i>attachment</i>, <code>false</code> otherwise.
      */
-    public abstract boolean isAttachment();
+    boolean isAttachment();
 
     /**
      * Gets the value of the <code>filename</code> parameter if set.

Added: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentIdField.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentIdField.java?rev=1126712&view=auto
==============================================================================
--- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentIdField.java (added)
+++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentIdField.java Mon May 23 20:20:44 2011
@@ -0,0 +1,31 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mime4j.dom.field;
+
+public interface ContentIdField extends ParsedField {
+
+    /**
+     * Gets the content ID defined in this field.
+     * 
+     * @return the content ID or <code>null</code> if not set.
+     */
+    String getId();
+
+}
\ No newline at end of file

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentIdField.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentIdField.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentIdField.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentLanguageField.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentLanguageField.java?rev=1126712&view=auto
==============================================================================
--- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentLanguageField.java (added)
+++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentLanguageField.java Mon May 23 20:20:44 2011
@@ -0,0 +1,33 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mime4j.dom.field;
+
+import java.util.List;
+
+public interface ContentLanguageField extends ParsedField {
+
+    /**
+     * Gets the content language(s) defined in this field.
+     * 
+     * @return a list of content language(s).
+     */
+    List<String> getLanguages();
+
+}
\ No newline at end of file

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentLanguageField.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentLanguageField.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentLanguageField.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentLengthField.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentLengthField.java?rev=1126712&view=auto
==============================================================================
--- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentLengthField.java (added)
+++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentLengthField.java Mon May 23 20:20:44 2011
@@ -0,0 +1,31 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mime4j.dom.field;
+
+public interface ContentLengthField extends ParsedField {
+
+    /**
+     * Gets the content length value defined in this field.
+     * 
+     * @return the content length value.
+     */
+    long getContentLength();
+
+}
\ No newline at end of file

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentLengthField.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentLengthField.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentLengthField.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentLocationField.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentLocationField.java?rev=1126712&view=auto
==============================================================================
--- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentLocationField.java (added)
+++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentLocationField.java Mon May 23 20:20:44 2011
@@ -0,0 +1,31 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mime4j.dom.field;
+
+public interface ContentLocationField extends ParsedField {
+
+    /**
+     * Gets the content location defined in this field.
+     * 
+     * @return the content location or <code>null</code> if not set.
+     */
+    String getLocation();
+
+}
\ No newline at end of file

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentLocationField.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentLocationField.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentLocationField.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentMD5Field.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentMD5Field.java?rev=1126712&view=auto
==============================================================================
--- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentMD5Field.java (added)
+++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentMD5Field.java Mon May 23 20:20:44 2011
@@ -0,0 +1,31 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mime4j.dom.field;
+
+public interface ContentMD5Field extends ParsedField {
+
+    /**
+     * Gets the content MD5 raw value defined in this field.
+     * 
+     * @return the content MD5 raw value or <code>null</code> if not set.
+     */
+    String getMD5Raw();
+
+}
\ No newline at end of file

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentMD5Field.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentMD5Field.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentMD5Field.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentTransferEncodingField.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentTransferEncodingField.java?rev=1126712&r1=1126711&r2=1126712&view=diff
==============================================================================
--- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentTransferEncodingField.java (original)
+++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/ContentTransferEncodingField.java Mon May 23 20:20:44 2011
@@ -24,7 +24,7 @@ public interface ContentTransferEncoding
     /**
      * Gets the encoding defined in this field.
      * 
-     * @return the encoding or an empty string if not set.
+     * @return the content ID or <code>null</code> if not set.
      */
     String getEncoding();
 

Modified: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/FieldName.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/FieldName.java?rev=1126712&r1=1126711&r2=1126712&view=diff
==============================================================================
--- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/FieldName.java (original)
+++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/FieldName.java Mon May 23 20:20:44 2011
@@ -24,10 +24,17 @@ package org.apache.james.mime4j.dom.fiel
  */
 public class FieldName {
 
-    public static final String CONTENT_DISPOSITION = "Content-Disposition";
-    public static final String CONTENT_TRANSFER_ENCODING = "Content-Transfer-Encoding";
     public static final String CONTENT_TYPE = "Content-Type";
+    public static final String CONTENT_LENGTH = "Content-Length";
+    public static final String CONTENT_TRANSFER_ENCODING = "Content-Transfer-Encoding";
+    public static final String CONTENT_DISPOSITION = "Content-Disposition";
+    public static final String CONTENT_ID = "Content-ID";
+    public static final String CONTENT_MD5 = "Content-MD5";
+    public static final String CONTENT_DESCRIPTION = "Content-Description";
+    public static final String CONTENT_LANGUAGE = "Content-Language";
+    public static final String CONTENT_LOCATION = "Content-Location";
 
+    public static final String MIME_VERSION = "MIME-Version";
     public static final String DATE = "Date";
     public static final String MESSAGE_ID = "Message-ID";
     public static final String SUBJECT = "Subject";

Added: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/MimeVersionField.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/MimeVersionField.java?rev=1126712&view=auto
==============================================================================
--- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/MimeVersionField.java (added)
+++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/MimeVersionField.java Mon May 23 20:20:44 2011
@@ -0,0 +1,28 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mime4j.dom.field;
+
+public interface MimeVersionField extends ParsedField {
+
+    int getMinorVersion();
+
+    int getMajorVersion();
+
+}
\ No newline at end of file

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/MimeVersionField.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/MimeVersionField.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/dom/field/MimeVersionField.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentDescriptionFieldImpl.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentDescriptionFieldImpl.java?rev=1126712&view=auto
==============================================================================
--- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentDescriptionFieldImpl.java (added)
+++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentDescriptionFieldImpl.java Mon May 23 20:20:44 2011
@@ -0,0 +1,64 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mime4j.field;
+
+import org.apache.james.mime4j.codec.DecodeMonitor;
+import org.apache.james.mime4j.dom.field.ContentDescriptionField;
+import org.apache.james.mime4j.stream.FieldParser;
+import org.apache.james.mime4j.util.ByteSequence;
+
+/**
+ * Represents a <code>Content-Description</code> field.
+ */
+public class ContentDescriptionFieldImpl extends AbstractField implements ContentDescriptionField {
+
+    private boolean parsed = false;
+    private String description;
+
+    ContentDescriptionFieldImpl(String name, String body, ByteSequence raw, DecodeMonitor monitor) {
+        super(name, body, raw, monitor);
+    }
+
+    private void parse() {
+        parsed = true;
+        String body = getBody();
+        if (body != null) {
+            description = body.trim();
+        } else {
+            description = null;
+        }
+    }
+    
+    public String getDescription() {
+        if (!parsed) {
+            parse();
+        }
+        return description;
+    }
+
+    public static final FieldParser<ContentDescriptionField> PARSER = new FieldParser<ContentDescriptionField>() {
+        public ContentDescriptionField parse(final String name, final String body,
+                final ByteSequence raw, DecodeMonitor monitor) {
+            return new ContentDescriptionFieldImpl(name, body, raw, monitor);
+        }
+    };
+
+}
+

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentDescriptionFieldImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentDescriptionFieldImpl.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentDescriptionFieldImpl.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentIdFieldImpl.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentIdFieldImpl.java?rev=1126712&view=auto
==============================================================================
--- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentIdFieldImpl.java (added)
+++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentIdFieldImpl.java Mon May 23 20:20:44 2011
@@ -0,0 +1,64 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mime4j.field;
+
+import org.apache.james.mime4j.codec.DecodeMonitor;
+import org.apache.james.mime4j.dom.field.ContentIdField;
+import org.apache.james.mime4j.stream.FieldParser;
+import org.apache.james.mime4j.util.ByteSequence;
+
+/**
+ * Represents a <code>Content-Transfer-Encoding</code> field.
+ */
+public class ContentIdFieldImpl extends AbstractField implements ContentIdField {
+
+    private boolean parsed = false;
+    private String id;
+
+    ContentIdFieldImpl(String name, String body, ByteSequence raw, DecodeMonitor monitor) {
+        super(name, body, raw, monitor);
+    }
+
+    private void parse() {
+        parsed = true;
+        String body = getBody();
+        if (body != null) {
+            id = body.trim();
+        } else {
+            id = null;
+        }
+    }
+    
+    public String getId() {
+        if (!parsed) {
+            parse();
+        }
+        return id;
+    }
+
+    public static final FieldParser<ContentIdField> PARSER = new FieldParser<ContentIdField>() {
+        public ContentIdField parse(final String name, final String body,
+                final ByteSequence raw, DecodeMonitor monitor) {
+            return new ContentIdFieldImpl(name, body, raw, monitor);
+        }
+    };
+
+}
+

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentIdFieldImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentIdFieldImpl.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentIdFieldImpl.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLanguageFieldImpl.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLanguageFieldImpl.java?rev=1126712&view=auto
==============================================================================
--- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLanguageFieldImpl.java (added)
+++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLanguageFieldImpl.java Mon May 23 20:20:44 2011
@@ -0,0 +1,82 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mime4j.field;
+
+import java.io.StringReader;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.james.mime4j.codec.DecodeMonitor;
+import org.apache.james.mime4j.dom.field.ContentLanguageField;
+import org.apache.james.mime4j.field.language.parser.ContentLanguageParser;
+import org.apache.james.mime4j.field.language.parser.ParseException;
+import org.apache.james.mime4j.stream.FieldParser;
+import org.apache.james.mime4j.util.ByteSequence;
+
+/**
+ * Represents a <code>Content-Transfer-Encoding</code> field.
+ */
+public class ContentLanguageFieldImpl extends AbstractField implements ContentLanguageField {
+
+    private boolean parsed = false;
+    private List<String> languages;
+    private ParseException parseException;
+
+    ContentLanguageFieldImpl(String name, String body, ByteSequence raw, DecodeMonitor monitor) {
+        super(name, body, raw, monitor);
+    }
+
+    private void parse() {
+        parsed = true;
+        String body = getBody();
+        if (body != null) {
+            ContentLanguageParser parser = new ContentLanguageParser(new StringReader(body));
+            try {
+                languages = parser.parse();
+            } catch (ParseException ex) {
+                parseException = ex;
+                languages = Collections.<String>emptyList();
+            }
+        } else {
+            languages = Collections.<String>emptyList();
+        }
+    }
+
+    @Override
+    public org.apache.james.mime4j.dom.field.ParseException getParseException() {
+        return parseException;
+    }
+
+    public List<String> getLanguages() {
+        if (!parsed) {
+            parse();
+        }
+        return languages;
+    }
+
+    public static final FieldParser<ContentLanguageField> PARSER = new FieldParser<ContentLanguageField>() {
+        public ContentLanguageField parse(final String name, final String body,
+                final ByteSequence raw, DecodeMonitor monitor) {
+            return new ContentLanguageFieldImpl(name, body, raw, monitor);
+        }
+    };
+
+}
+

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLanguageFieldImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLanguageFieldImpl.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLanguageFieldImpl.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLengthFieldImpl.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLengthFieldImpl.java?rev=1126712&view=auto
==============================================================================
--- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLengthFieldImpl.java (added)
+++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLengthFieldImpl.java Mon May 23 20:20:44 2011
@@ -0,0 +1,77 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mime4j.field;
+
+import org.apache.james.mime4j.codec.DecodeMonitor;
+import org.apache.james.mime4j.dom.field.ContentLengthField;
+import org.apache.james.mime4j.stream.FieldParser;
+import org.apache.james.mime4j.util.ByteSequence;
+
+/**
+ * Represents a <code>Content-Length</code> field.
+ */
+public class ContentLengthFieldImpl extends AbstractField implements ContentLengthField {
+
+    private boolean parsed = false;
+    private long contentLength;
+
+    ContentLengthFieldImpl(String name, String body, ByteSequence raw, DecodeMonitor monitor) {
+        super(name, body, raw, monitor);
+    }
+
+    private void parse() {
+        parsed = true;
+        String body = getBody();
+        if (body != null) {
+            try {
+                long v = Long.parseLong(body);
+                if (v < 0) {
+                    if (monitor.warn("Negative content length: " + body, 
+                            "ignoring Content-Length header")) {
+                        contentLength = -1;
+                    }
+                } else {
+                    contentLength = v;
+                }
+            } catch (NumberFormatException e) {
+                if (monitor.warn("Invalid content length: " + body, 
+                        "ignoring Content-Length header")) {
+                    contentLength = -1;
+                }
+            }
+        } else {
+            contentLength = -1;
+        }
+    }
+    
+    public long getContentLength() {
+        if (!parsed) {
+            parse();
+        }
+        return contentLength;
+    }
+
+    public static final FieldParser<ContentLengthField> PARSER = new FieldParser<ContentLengthField>() {
+        public ContentLengthField parse(final String name, final String body,
+                final ByteSequence raw, DecodeMonitor monitor) {
+            return new ContentLengthFieldImpl(name, body, raw, monitor);
+        }
+    };
+}

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLengthFieldImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLengthFieldImpl.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLengthFieldImpl.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLocationFieldImpl.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLocationFieldImpl.java?rev=1126712&view=auto
==============================================================================
--- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLocationFieldImpl.java (added)
+++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLocationFieldImpl.java Mon May 23 20:20:44 2011
@@ -0,0 +1,88 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mime4j.field;
+
+import java.io.StringReader;
+
+import org.apache.james.mime4j.codec.DecodeMonitor;
+import org.apache.james.mime4j.dom.field.ContentLocationField;
+import org.apache.james.mime4j.field.structured.parser.ParseException;
+import org.apache.james.mime4j.field.structured.parser.StructuredFieldParser;
+import org.apache.james.mime4j.stream.FieldParser;
+import org.apache.james.mime4j.util.ByteSequence;
+
+/**
+ * Represents a <code>Content-Transfer-Encoding</code> field.
+ */
+public class ContentLocationFieldImpl extends AbstractField implements ContentLocationField {
+
+    private boolean parsed = false;
+    private String location;
+    private ParseException parseException;
+
+    ContentLocationFieldImpl(String name, String body, ByteSequence raw, DecodeMonitor monitor) {
+        super(name, body, raw, monitor);
+    }
+
+    private void parse() {
+        parsed = true;
+        String body = getBody();
+        if (body != null) {
+            StringReader stringReader = new StringReader(body);
+            StructuredFieldParser parser = new StructuredFieldParser(stringReader);
+            try {
+                // From RFC2017 3.1
+                /*
+                 * Extraction of the URL string from the URL-parameter is even simpler:
+                 * The enclosing quotes and any linear whitespace are removed and the
+                 * remaining material is the URL string.
+                 * Read more: http://www.faqs.org/rfcs/rfc2017.html#ixzz0aufO9nRL
+                 */
+                location = parser.parse().replaceAll("\\s", "");
+            } catch (ParseException ex) { 
+                parseException = ex;
+                location = null;
+            }
+        } else {
+            location = null;
+        }
+    }
+    
+    public String getLocation() {
+        if (!parsed) {
+            parse();
+        }
+        return location;
+    }
+
+    @Override
+    public org.apache.james.mime4j.dom.field.ParseException getParseException() {
+        return parseException;
+    }
+
+    public static final FieldParser<ContentLocationField> PARSER = new FieldParser<ContentLocationField>() {
+        public ContentLocationField parse(final String name, final String body,
+                final ByteSequence raw, DecodeMonitor monitor) {
+            return new ContentLocationFieldImpl(name, body, raw, monitor);
+        }
+    };
+
+}
+

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLocationFieldImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLocationFieldImpl.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLocationFieldImpl.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentMD5FieldImpl.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentMD5FieldImpl.java?rev=1126712&view=auto
==============================================================================
--- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentMD5FieldImpl.java (added)
+++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentMD5FieldImpl.java Mon May 23 20:20:44 2011
@@ -0,0 +1,64 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mime4j.field;
+
+import org.apache.james.mime4j.codec.DecodeMonitor;
+import org.apache.james.mime4j.dom.field.ContentMD5Field;
+import org.apache.james.mime4j.stream.FieldParser;
+import org.apache.james.mime4j.util.ByteSequence;
+
+/**
+ * Represents a <code>Content-MD5</code> field.
+ */
+public class ContentMD5FieldImpl extends AbstractField implements ContentMD5Field {
+
+    private boolean parsed = false;
+    private String md5raw;
+
+    ContentMD5FieldImpl(String name, String body, ByteSequence raw, DecodeMonitor monitor) {
+        super(name, body, raw, monitor);
+    }
+
+    private void parse() {
+        parsed = true;
+        String body = getBody();
+        if (body != null) {
+            md5raw = body.trim();
+        } else {
+            md5raw = null;
+        }
+    }
+    
+    public String getMD5Raw() {
+        if (!parsed) {
+            parse();
+        }
+        return md5raw;
+    }
+
+    public static final FieldParser<ContentMD5Field> PARSER = new FieldParser<ContentMD5Field>() {
+        public ContentMD5Field parse(final String name, final String body,
+                final ByteSequence raw, DecodeMonitor monitor) {
+            return new ContentMD5FieldImpl(name, body, raw, monitor);
+        }
+    };
+
+}
+

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentMD5FieldImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentMD5FieldImpl.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentMD5FieldImpl.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentTransferEncodingFieldImpl.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentTransferEncodingFieldImpl.java?rev=1126712&r1=1126711&r2=1126712&view=diff
==============================================================================
--- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentTransferEncodingFieldImpl.java (original)
+++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentTransferEncodingFieldImpl.java Mon May 23 20:20:44 2011
@@ -19,6 +19,8 @@
 
 package org.apache.james.mime4j.field;
 
+import java.util.Locale;
+
 import org.apache.james.mime4j.codec.DecodeMonitor;
 import org.apache.james.mime4j.dom.field.ContentTransferEncodingField;
 import org.apache.james.mime4j.stream.FieldParser;
@@ -29,17 +31,31 @@ import org.apache.james.mime4j.util.Mime
  * Represents a <code>Content-Transfer-Encoding</code> field.
  */
 public class ContentTransferEncodingFieldImpl extends AbstractField implements ContentTransferEncodingField {
+
+    private boolean parsed = false;
     private String encoding;
 
     ContentTransferEncodingFieldImpl(String name, String body, ByteSequence raw, DecodeMonitor monitor) {
         super(name, body, raw, monitor);
-        encoding = body.trim().toLowerCase();
     }
 
+    private void parse() {
+        parsed = true;
+        String body = getBody();
+        if (body != null) {
+            encoding = body.trim().toLowerCase(Locale.US);
+        } else {
+            encoding = null;
+        }
+    }
+    
     /**
      * @see org.apache.james.mime4j.dom.field.ContentTransferEncodingField#getEncoding()
      */
     public String getEncoding() {
+        if (!parsed) {
+            parse();
+        }
         return encoding;
     }
 

Modified: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/DefaultFieldParser.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/DefaultFieldParser.java?rev=1126712&r1=1126711&r2=1126712&view=diff
==============================================================================
--- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/DefaultFieldParser.java (original)
+++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/DefaultFieldParser.java Mon May 23 20:20:44 2011
@@ -120,11 +120,26 @@ public class DefaultFieldParser extends 
     }
 
     public DefaultFieldParser() {
+        setFieldParser(FieldName.CONTENT_TYPE, 
+                ContentTypeFieldImpl.PARSER);
+        setFieldParser(FieldName.CONTENT_LENGTH,
+                ContentLengthFieldImpl.PARSER);
         setFieldParser(FieldName.CONTENT_TRANSFER_ENCODING,
                 ContentTransferEncodingFieldImpl.PARSER);
-        setFieldParser(FieldName.CONTENT_TYPE, ContentTypeFieldImpl.PARSER);
         setFieldParser(FieldName.CONTENT_DISPOSITION,
                 ContentDispositionFieldImpl.PARSER);
+        setFieldParser(FieldName.CONTENT_ID,
+                ContentDispositionFieldImpl.PARSER);
+        setFieldParser(FieldName.CONTENT_MD5,
+                ContentMD5FieldImpl.PARSER);
+        setFieldParser(FieldName.CONTENT_DESCRIPTION,
+                ContentDescriptionFieldImpl.PARSER);
+        setFieldParser(FieldName.CONTENT_LANGUAGE,
+                ContentLanguageFieldImpl.PARSER);
+        setFieldParser(FieldName.CONTENT_LOCATION,
+                ContentLocationFieldImpl.PARSER);
+        setFieldParser(FieldName.MIME_VERSION,
+                MimeVersionFieldImpl.PARSER);
 
         final FieldParser<DateTimeField> dateTimeParser = DateTimeFieldImpl.PARSER;
         setFieldParser(FieldName.DATE, dateTimeParser);

Added: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/MimeVersionFieldImpl.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/MimeVersionFieldImpl.java?rev=1126712&view=auto
==============================================================================
--- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/MimeVersionFieldImpl.java (added)
+++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/MimeVersionFieldImpl.java Mon May 23 20:20:44 2011
@@ -0,0 +1,99 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mime4j.field;
+
+import java.io.StringReader;
+
+import org.apache.james.mime4j.MimeException;
+import org.apache.james.mime4j.codec.DecodeMonitor;
+import org.apache.james.mime4j.dom.field.MimeVersionField;
+import org.apache.james.mime4j.field.mimeversion.parser.MimeVersionParser;
+import org.apache.james.mime4j.field.mimeversion.parser.ParseException;
+import org.apache.james.mime4j.stream.FieldParser;
+import org.apache.james.mime4j.util.ByteSequence;
+
+/**
+ * Represents a <code>MIME-Version</code> field.
+ */
+public class MimeVersionFieldImpl extends AbstractField implements MimeVersionField {
+
+    public static final int DEFAULT_MINOR_VERSION = 0;
+    public static final int DEFAULT_MAJOR_VERSION = 1;
+    
+    private boolean parsed = false;
+    private int major = DEFAULT_MAJOR_VERSION;
+    private int minor = DEFAULT_MINOR_VERSION;
+    private ParseException parsedException;    
+
+    MimeVersionFieldImpl(String name, String body, ByteSequence raw, DecodeMonitor monitor) {
+        super(name, body, raw, monitor);
+    }
+
+    private void parse() {
+        parsed = true;
+        major = DEFAULT_MAJOR_VERSION;
+        minor = DEFAULT_MINOR_VERSION;
+        String body = getBody();
+        if (body != null) {
+            StringReader reader = new StringReader(body);
+            MimeVersionParser parser = new MimeVersionParser(reader);
+            try {
+                parser.parse();
+                int v = parser.getMajorVersion();
+                if (v != MimeVersionParser.INITIAL_VERSION_VALUE) {
+                    major = v;
+                }
+                v = parser.getMinorVersion();
+                if (v != MimeVersionParser.INITIAL_VERSION_VALUE) {
+                    minor = v;
+                }
+            } catch (MimeException ex) {
+                parsedException = new ParseException(ex);
+            }
+        }
+    }
+
+    public int getMinorVersion() {
+        if (!parsed) {
+            parse();
+        }
+        return minor;
+    }
+
+    public int getMajorVersion() {
+        if (!parsed) {
+            parse();
+        }
+        return major;
+    }
+
+    @Override
+    public org.apache.james.mime4j.dom.field.ParseException getParseException() {
+        return parsedException;
+    }
+
+    public static final FieldParser<MimeVersionField> PARSER = new FieldParser<MimeVersionField>() {
+        public MimeVersionField parse(final String name, final String body,
+                final ByteSequence raw, DecodeMonitor monitor) {
+            return new MimeVersionFieldImpl(name, body, raw, monitor);
+        }
+    };
+    
+}

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/MimeVersionFieldImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/MimeVersionFieldImpl.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/MimeVersionFieldImpl.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/MaximalBodyDescriptor.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/MaximalBodyDescriptor.java?rev=1126712&r1=1126711&r2=1126712&view=diff
==============================================================================
--- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/MaximalBodyDescriptor.java (original)
+++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/MaximalBodyDescriptor.java Mon May 23 20:20:44 2011
@@ -19,29 +19,31 @@
 
 package org.apache.james.mime4j.message;
 
-import java.io.StringReader;
 import java.util.Collections;
-import java.util.HashMap;
+import java.util.Date;
 import java.util.List;
-import java.util.Locale;
 import java.util.Map;
 
 import org.apache.james.mime4j.MimeException;
 import org.apache.james.mime4j.codec.DecodeMonitor;
-import org.apache.james.mime4j.dom.datetime.DateTime;
-import org.apache.james.mime4j.field.datetime.parser.DateTimeParser;
-import org.apache.james.mime4j.field.datetime.parser.ParseException;
-import org.apache.james.mime4j.field.language.parser.ContentLanguageParser;
-import org.apache.james.mime4j.field.mimeversion.parser.MimeVersionParser;
-import org.apache.james.mime4j.field.structured.parser.StructuredFieldParser;
+import org.apache.james.mime4j.dom.field.ContentDescriptionField;
+import org.apache.james.mime4j.dom.field.ContentDispositionField;
+import org.apache.james.mime4j.dom.field.ContentIdField;
+import org.apache.james.mime4j.dom.field.ContentLanguageField;
+import org.apache.james.mime4j.dom.field.ContentLocationField;
+import org.apache.james.mime4j.dom.field.ContentMD5Field;
+import org.apache.james.mime4j.dom.field.FieldName;
+import org.apache.james.mime4j.dom.field.MimeVersionField;
+import org.apache.james.mime4j.field.ContentDescriptionFieldImpl;
+import org.apache.james.mime4j.field.ContentDispositionFieldImpl;
+import org.apache.james.mime4j.field.ContentIdFieldImpl;
+import org.apache.james.mime4j.field.ContentLanguageFieldImpl;
+import org.apache.james.mime4j.field.ContentLocationFieldImpl;
+import org.apache.james.mime4j.field.ContentMD5FieldImpl;
+import org.apache.james.mime4j.field.MimeVersionFieldImpl;
 import org.apache.james.mime4j.stream.BodyDescriptor;
-import org.apache.james.mime4j.stream.RawBody;
-import org.apache.james.mime4j.stream.MutableBodyDescriptor;
-import org.apache.james.mime4j.stream.NameValuePair;
 import org.apache.james.mime4j.stream.Field;
-import org.apache.james.mime4j.stream.RawField;
-import org.apache.james.mime4j.stream.RawFieldParser;
-import org.apache.james.mime4j.util.MimeUtil;
+import org.apache.james.mime4j.stream.MutableBodyDescriptor;
 
 /**
  * Parses and stores values for standard MIME header values.
@@ -49,35 +51,13 @@ import org.apache.james.mime4j.util.Mime
  */
 public class MaximalBodyDescriptor extends MinimalBodyDescriptor {
 
-    private static final int DEFAULT_MINOR_VERSION = 0;
-    private static final int DEFAULT_MAJOR_VERSION = 1;
-    private boolean isMimeVersionSet;
-    private int mimeMinorVersion;
-    private int mimeMajorVersion;
-    private MimeException mimeVersionException;
-    private String contentId;
-    private boolean isContentIdSet;
-    private String contentDescription;
-    private boolean isContentDescriptionSet;
-    private String contentDispositionType;
-    private Map<String, String> contentDispositionParameters;
-    private DateTime contentDispositionModificationDate;
-    private MimeException contentDispositionModificationDateParseException;
-    private DateTime contentDispositionCreationDate;
-    private MimeException contentDispositionCreationDateParseException;
-    private DateTime contentDispositionReadDate;
-    private MimeException contentDispositionReadDateParseException;
-    private long contentDispositionSize;
-    private MimeException contentDispositionSizeParseException;
-    private boolean isContentDispositionSet;
-    private List<String> contentLanguage;
-    private MimeException contentLanguageParseException;
-    private boolean isContentLanguageSet;
-    private MimeException contentLocationParseException;
-    private String contentLocation;
-    private boolean isContentLocationSet;
-    private String contentMD5Raw;
-    private boolean isContentMD5Set;
+    private MimeVersionField mimeVersionField;
+    private ContentIdField contentIdField;
+    private ContentDescriptionField contentDescriptionField;
+    private ContentDispositionField contentDispositionField;
+    private ContentLanguageField contentLanguageField;
+    private ContentLocationField contentLocationField;
+    private ContentMD5Field contentMD5Field;
     
     protected MaximalBodyDescriptor() {
         this(null, null);
@@ -85,32 +65,6 @@ public class MaximalBodyDescriptor exten
 
     public MaximalBodyDescriptor(final BodyDescriptor parent, final DecodeMonitor monitor) {
         super(parent, monitor);
-        isMimeVersionSet = false;
-        mimeMajorVersion = DEFAULT_MAJOR_VERSION;
-        mimeMinorVersion = DEFAULT_MINOR_VERSION;
-        this.contentId = null;
-        this.isContentIdSet = false;
-        this.contentDescription = null;
-        this.isContentDescriptionSet = false;
-        this.contentDispositionType = null;
-        this.contentDispositionParameters = Collections.emptyMap();
-        this.contentDispositionModificationDate = null;
-        this.contentDispositionModificationDateParseException = null;
-        this.contentDispositionCreationDate = null;
-        this.contentDispositionCreationDateParseException = null;
-        this.contentDispositionReadDate = null;
-        this.contentDispositionReadDateParseException = null;
-        this.contentDispositionSize = -1;
-        this.contentDispositionSizeParseException = null;
-        this.isContentDispositionSet = false;
-        this.contentLanguage = null;
-        this.contentLanguageParseException = null;
-        this.isContentIdSet = false;
-        this.contentLocation = null;
-        this.contentLocationParseException = null;
-        this.isContentLocationSet = false;
-        this.contentMD5Raw = null;
-        this.isContentMD5Set = false;
     }
 
     @Override
@@ -120,20 +74,20 @@ public class MaximalBodyDescriptor exten
 
     @Override
     public void addField(Field field) throws MimeException {
-        String name = field.getName().toLowerCase(Locale.US);;
-        if (MimeUtil.MIME_HEADER_MIME_VERSION.equals(name) && !isMimeVersionSet) {
+        String name = field.getName();
+        if (name.equalsIgnoreCase(FieldName.MIME_VERSION) && mimeVersionField == null) {
             parseMimeVersion(field);
-        } else if (MimeUtil.MIME_HEADER_CONTENT_ID.equals(name) && !isContentIdSet) {
+        } else if (name.equalsIgnoreCase(FieldName.CONTENT_ID) && contentIdField == null) {
             parseContentId(field);
-        } else if (MimeUtil.MIME_HEADER_CONTENT_DESCRIPTION.equals(name) && !isContentDescriptionSet) {
+        } else if (name.equalsIgnoreCase(FieldName.CONTENT_DESCRIPTION) && contentDescriptionField == null) {
             parseContentDescription(field);
-        } else if (MimeUtil.MIME_HEADER_CONTENT_DISPOSITION.equals(name) && !isContentDispositionSet) {
+        } else if (name.equalsIgnoreCase(FieldName.CONTENT_DISPOSITION) && contentDispositionField == null) {
             parseContentDisposition(field);
-        } else if (MimeUtil.MIME_HEADER_LANGAUGE.equals(name) && !isContentLanguageSet) {
+        } else if (name.equalsIgnoreCase(FieldName.CONTENT_LANGUAGE) && contentLanguageField == null) {
             parseLanguage(field);
-        } else if (MimeUtil.MIME_HEADER_LOCATION.equals(name) && !isContentLocationSet) {
+        } else if (name.equalsIgnoreCase(FieldName.CONTENT_LOCATION) && contentLocationField == null) {
             parseLocation(field);
-        } else if (MimeUtil.MIME_HEADER_MD5.equals(name) && !isContentMD5Set) {
+        } else if (name.equalsIgnoreCase(FieldName.CONTENT_MD5) && contentMD5Field == null) {
             parseMD5(field);
         } else {
             super.addField(field);
@@ -141,150 +95,66 @@ public class MaximalBodyDescriptor exten
     }
     
     private void parseMD5(final Field field) {
-        String value = field.getBody();
-        isContentMD5Set = true;
-        if (value != null) {
-            contentMD5Raw = value.trim();
+        if (field instanceof ContentMD5Field) {
+            contentMD5Field = (ContentMD5Field) field;
+        } else {
+            contentMD5Field = ContentMD5FieldImpl.PARSER.parse(
+                    field.getName(), field.getBody(), field.getRaw(), getDecodeMonitor());
         }
     }
 
     private void parseLocation(final Field field) {
-        isContentLocationSet = true;
-        String value = field.getBody();
-        if (value != null) {
-            final StringReader stringReader = new StringReader(value);
-            final StructuredFieldParser parser = new StructuredFieldParser(stringReader);
-            try {
-                // From RFC2017 3.1
-                /*
-                 * Extraction of the URL string from the URL-parameter is even simpler:
-                 * The enclosing quotes and any linear whitespace are removed and the
-                 * remaining material is the URL string.
-                 * Read more: http://www.faqs.org/rfcs/rfc2017.html#ixzz0aufO9nRL
-                 */
-                contentLocation = parser.parse().replaceAll("\\s", "");
-            } catch (MimeException e) { 
-                contentLocationParseException = e;
-            }
+        if (field instanceof ContentLocationField) {
+            contentLocationField = (ContentLocationField) field;
+        } else {
+            contentLocationField = ContentLocationFieldImpl.PARSER.parse(
+                    field.getName(), field.getBody(), field.getRaw(), getDecodeMonitor());
         }
     }
     
     private void parseLanguage(final Field field) {
-        isContentLanguageSet = true;
-        String value = field.getBody();
-        if (value != null) {
-            try {
-                final ContentLanguageParser parser = new ContentLanguageParser(new StringReader(value));
-                contentLanguage = parser.parse();
-            } catch (MimeException e) {
-                contentLanguageParseException = e;
-            }
+        if (field instanceof ContentLanguageField) {
+            contentLanguageField = (ContentLanguageField) field;
+        } else {
+            contentLanguageField = ContentLanguageFieldImpl.PARSER.parse(
+                    field.getName(), field.getBody(), field.getRaw(), getDecodeMonitor());
         }
     }
 
     private void parseContentDisposition(final Field field) throws MimeException {
-        isContentDispositionSet = true;
-        RawField rawfield;
-        if (field instanceof RawField) {
-            rawfield = ((RawField) field);
+        if (field instanceof ContentDispositionField) {
+            contentDispositionField = (ContentDispositionField) field;
         } else {
-            rawfield = new RawField(field.getName(), field.getBody());
-        }
-        RawBody body = RawFieldParser.DEFAULT.parseRawBody(rawfield);
-        Map<String, String> params = new HashMap<String, String>();
-        for (NameValuePair nmp: body.getParams()) {
-            String name = nmp.getName().toLowerCase(Locale.US);
-            params.put(name, nmp.getValue());
-        }
-        
-        contentDispositionType = body.getValue();
-        contentDispositionParameters = params;
-        
-        final String contentDispositionModificationDate 
-            = contentDispositionParameters.get(MimeUtil.PARAM_MODIFICATION_DATE);
-        if (contentDispositionModificationDate != null) {
-            try {
-                this.contentDispositionModificationDate = parseDate(contentDispositionModificationDate);
-            } catch (ParseException e) {
-                this.contentDispositionModificationDateParseException = e;
-            } 
+            contentDispositionField = ContentDispositionFieldImpl.PARSER.parse(
+                    field.getName(), field.getBody(), field.getRaw(), getDecodeMonitor());
         }
-        
-        final String contentDispositionCreationDate 
-            = contentDispositionParameters.get(MimeUtil.PARAM_CREATION_DATE);
-        if (contentDispositionCreationDate != null) {
-            try {
-                this.contentDispositionCreationDate = parseDate(contentDispositionCreationDate);
-            } catch (ParseException e) {
-                this.contentDispositionCreationDateParseException = e;
-            }         
-        }
-        
-        final String contentDispositionReadDate 
-            = contentDispositionParameters.get(MimeUtil.PARAM_READ_DATE);
-        if (contentDispositionReadDate != null) {
-            try {
-                this.contentDispositionReadDate = parseDate(contentDispositionReadDate);
-            } catch (ParseException e) {
-                this.contentDispositionReadDateParseException = e;
-            }         
-        }
-        
-        final String size = contentDispositionParameters.get(MimeUtil.PARAM_SIZE);
-        if (size != null) {
-            try {
-                contentDispositionSize = Long.parseLong(size);
-            } catch (NumberFormatException e) {
-                this.contentDispositionSizeParseException = (MimeException) new MimeException(e.getMessage(), e).fillInStackTrace();
-            }
-        }
-        contentDispositionParameters.remove("");
     }
 
-    private DateTime parseDate(final String date) throws ParseException {
-        final StringReader stringReader = new StringReader(date);
-        final DateTimeParser parser = new DateTimeParser(stringReader);
-        DateTime result = parser.date_time();
-        return result;
-    }
-    
     private void parseContentDescription(final Field field) {
-        String value = field.getBody();
-        if (value == null) {
-            contentDescription = "";
+        if (field instanceof ContentDescriptionField) {
+            contentDescriptionField = (ContentDescriptionField) field;
         } else {
-            contentDescription = value.trim();
+            contentDescriptionField = ContentDescriptionFieldImpl.PARSER.parse(
+                    field.getName(), field.getBody(), field.getRaw(), getDecodeMonitor());
         }
-        isContentDescriptionSet = true;
     }
 
     private void parseContentId(final Field field) {
-        String value = field.getBody();
-        if (value == null) {
-            contentId = "";
+        if (field instanceof ContentIdField) {
+            contentIdField = (ContentIdField) field;
         } else {
-            contentId = value.trim();
+            contentIdField = ContentIdFieldImpl.PARSER.parse(
+                    field.getName(), field.getBody(), field.getRaw(), getDecodeMonitor());
         }
-        isContentIdSet = true;
     }
 
-    private void parseMimeVersion(Field field) {
-        final StringReader reader = new StringReader(field.getBody());
-        final MimeVersionParser parser = new MimeVersionParser(reader);
-        try {
-            parser.parse();
-            final int major = parser.getMajorVersion();
-            if (major != MimeVersionParser.INITIAL_VERSION_VALUE) {
-                mimeMajorVersion = major;
-            }
-            final int minor = parser.getMinorVersion();
-            if (minor != MimeVersionParser.INITIAL_VERSION_VALUE) {
-                mimeMinorVersion = minor;
-            }
-        } catch (MimeException e) {
-            this.mimeVersionException = e;
+    private void parseMimeVersion(final Field field) {
+        if (field instanceof MimeVersionField) {
+            mimeVersionField = (MimeVersionField) field;
+        } else {
+            mimeVersionField = MimeVersionFieldImpl.PARSER.parse(
+                    field.getName(), field.getBody(), field.getRaw(), getDecodeMonitor());
         }
-        isMimeVersionSet = true;
     }
     
     /**
@@ -295,7 +165,8 @@ public class MaximalBodyDescriptor exten
      * @return positive integer
      */
     public int getMimeMajorVersion() {
-        return mimeMajorVersion;
+        return mimeVersionField != null ? mimeVersionField.getMajorVersion() : 
+            MimeVersionFieldImpl.DEFAULT_MAJOR_VERSION;
     }
     
     /**
@@ -306,28 +177,19 @@ public class MaximalBodyDescriptor exten
      * @return positive integer
      */
     public int getMimeMinorVersion() {
-        return mimeMinorVersion;
+        return mimeVersionField != null ? mimeVersionField.getMinorVersion() : 
+            MimeVersionFieldImpl.DEFAULT_MINOR_VERSION;
     }
     
 
     /**
-     * When the MIME version header exists but cannot be parsed
-     * this field will be contain the exception.
-     * @return <code>MimeException</code> if the mime header cannot
-     * be parsed, null otherwise
-     */
-    public MimeException getMimeVersionParseException() {
-        return mimeVersionException;
-    }
-    
-    /**
      * Gets the value of the <a href='http://www.faqs.org/rfcs/rfc2045'>RFC</a> 
      * <code>Content-Description</code> header.
      * @return value of the <code>Content-Description</code> when present,
      * null otherwise
      */
     public String getContentDescription() {
-        return contentDescription;
+        return contentDescriptionField != null ? contentDescriptionField.getDescription() : null;
     }
     
     /**
@@ -337,7 +199,7 @@ public class MaximalBodyDescriptor exten
      * null otherwise
      */
     public String getContentId() {
-        return contentId;
+        return contentIdField != null ? contentIdField.getId() : null;
     }
     
     /**
@@ -348,7 +210,7 @@ public class MaximalBodyDescriptor exten
      * or null when this has not been set
      */
     public String getContentDispositionType() {
-        return contentDispositionType;
+        return contentDispositionField != null ? contentDispositionField.getDispositionType() : null;
     }
     
     /**
@@ -358,7 +220,8 @@ public class MaximalBodyDescriptor exten
      * not null
      */
     public Map<String, String> getContentDispositionParameters() {
-        return contentDispositionParameters;
+        return contentDispositionField != null ? contentDispositionField.getParameters() : 
+            Collections.<String, String>emptyMap();
     }
     
     /**
@@ -368,7 +231,7 @@ public class MaximalBodyDescriptor exten
      * or null when it is not present
      */
     public String getContentDispositionFilename() {
-        return contentDispositionParameters.get(MimeUtil.PARAM_FILENAME);
+        return contentDispositionField != null ? contentDispositionField.getFilename() : null;
     }
     
     /**
@@ -377,17 +240,8 @@ public class MaximalBodyDescriptor exten
      * @return modification-date parameter value,
      * or null when this is not present
      */
-    public DateTime getContentDispositionModificationDate() {
-        return contentDispositionModificationDate;
-    }
-    
-    /**
-     * Gets any exception thrown during the parsing of {@link #getContentDispositionModificationDate()}
-     * @return <code>ParseException</code> when the modification-date parse fails,
-     * null otherwise
-     */
-    public MimeException getContentDispositionModificationDateParseException() {
-        return contentDispositionModificationDateParseException;
+    public Date getContentDispositionModificationDate() {
+        return contentDispositionField != null ? contentDispositionField.getModificationDate() : null;
     }
     
     /**
@@ -396,17 +250,8 @@ public class MaximalBodyDescriptor exten
      * @return creation-date parameter value,
      * or null when this is not present
      */
-    public DateTime getContentDispositionCreationDate() {
-        return contentDispositionCreationDate;
-    }
-    
-    /**
-     * Gets any exception thrown during the parsing of {@link #getContentDispositionCreationDate()}
-     * @return <code>ParseException</code> when the creation-date parse fails,
-     * null otherwise
-     */
-    public MimeException getContentDispositionCreationDateParseException() {
-        return contentDispositionCreationDateParseException;
+    public Date getContentDispositionCreationDate() {
+        return contentDispositionField != null ? contentDispositionField.getCreationDate() : null;
     }
     
     /**
@@ -415,17 +260,8 @@ public class MaximalBodyDescriptor exten
      * @return read-date parameter value,
      * or null when this is not present
      */
-    public DateTime getContentDispositionReadDate() {
-        return contentDispositionReadDate;
-    }
-    
-    /**
-     * Gets any exception thrown during the parsing of {@link #getContentDispositionReadDate()}
-     * @return <code>ParseException</code> when the read-date parse fails,
-     * null otherwise
-     */
-    public MimeException getContentDispositionReadDateParseException() {
-        return contentDispositionReadDateParseException;
+    public Date getContentDispositionReadDate() {
+        return contentDispositionField != null ? contentDispositionField.getReadDate() : null;
     }
     
     /**
@@ -435,16 +271,7 @@ public class MaximalBodyDescriptor exten
      * or -1 if this size has not been set
      */
     public long getContentDispositionSize() {
-        return contentDispositionSize;
-    }
-    
-    /**
-     * Gets any exception thrown during the parsing of {@link #getContentDispositionSize()}
-     * @return <code>ParseException</code> when the read-date parse fails,
-     * null otherwise
-     */
-    public MimeException getContentDispositionSizeParseException() {
-        return contentDispositionSizeParseException;
+        return contentDispositionField != null ? contentDispositionField.getSize() : -1;
     }
     
     /**
@@ -456,36 +283,18 @@ public class MaximalBodyDescriptor exten
      * or null if no header exists
      */
     public List<String> getContentLanguage() {
-        return contentLanguage;
+        return contentLanguageField != null ? contentLanguageField.getLanguages() : 
+            Collections.<String>emptyList();
     }
 
     /**
-     * Gets any exception thrown during the parsing of {@link #getContentLanguage()}
-     * @return <code>ParseException</code> when the content-language parse fails,
-     * null otherwise
-     */
-    public MimeException getContentLanguageParseException() {
-        return contentLanguageParseException;
-    }
-    
-
-    /**
      * Get the <code>content-location</code> header value.
      * See <a href='http://tools.ietf.org/html/rfc2557'>RFC2557</a> 
      * @return the URL content-location
      * or null if no header exists
      */
     public String getContentLocation() {
-        return contentLocation;
-    }
-    
-    /**
-     * Gets any exception thrown during the parsing of {@link #getContentLocation()}
-     * @return <code>ParseException</code> when the content-language parse fails,
-     * null otherwise
-     */
-    public MimeException getContentLocationParseException() {
-        return contentLocationParseException;
+        return contentLocationField != null ? contentLocationField.getLocation() : null;
     }
     
     /**
@@ -496,8 +305,7 @@ public class MaximalBodyDescriptor exten
      * or null if no header exists
      */
     public String getContentMD5Raw() {
-        return contentMD5Raw;
+        return contentMD5Field != null ? contentMD5Field.getMD5Raw() : null;
     }
     
-    
 }