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/06/01 13:58:12 UTC

svn commit: r1130114 - in /james/mime4j/trunk: core/src/main/java/org/apache/james/mime4j/codec/ core/src/main/java/org/apache/james/mime4j/stream/ dom/src/main/java/org/apache/james/mime4j/field/ dom/src/test/java/org/apache/james/mime4j/field/

Author: olegk
Date: Wed Jun  1 11:58:11 2011
New Revision: 1130114

URL: http://svn.apache.org/viewvc?rev=1130114&view=rev
Log:
MIME4J-197: added lenient implementations of ContentDispositionField and ContentLanguageField

Added:
    james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentDispositionFieldLenientImpl.java   (with props)
    james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLanguageFieldLenientImpl.java   (with props)
    james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/ContentLanguageFieldTest.java   (with props)
    james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/LenientContentDispositionFieldTest.java   (with props)
    james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/LenientContentLanguageFieldTest.java   (with props)
Modified:
    james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/codec/DecodeMonitor.java
    james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/ParserCursor.java
    james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/RawField.java
    james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/RawFieldParser.java
    james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentDispositionFieldImpl.java
    james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLanguageFieldImpl.java
    james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLengthFieldImpl.java
    james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLocationFieldImpl.java
    james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentTypeFieldLenientImpl.java
    james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/LenientFieldParser.java
    james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/ContentDispositionFieldTest.java
    james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/ContentTransferEncodingFieldTest.java

Modified: james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/codec/DecodeMonitor.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/codec/DecodeMonitor.java?rev=1130114&r1=1130113&r2=1130114&view=diff
==============================================================================
--- james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/codec/DecodeMonitor.java (original)
+++ james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/codec/DecodeMonitor.java Wed Jun  1 11:58:11 2011
@@ -25,7 +25,7 @@ package org.apache.james.mime4j.codec;
  * and unexpected data.
  * 
  * 2 basic implementations are provided:
- * STRICT return "true" on any occourence.
+ * STRICT return "true" on any occurrence.
  * SILENT ignores any problem.
  * 
  * @see org.apache.james.mime4j.field.LoggingMonitor for an example

Modified: james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/ParserCursor.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/ParserCursor.java?rev=1130114&r1=1130113&r2=1130114&view=diff
==============================================================================
--- james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/ParserCursor.java (original)
+++ james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/ParserCursor.java Wed Jun  1 11:58:11 2011
@@ -28,7 +28,7 @@ package org.apache.james.mime4j.stream;
  * <p/>
  * Copied from Apache HttpCore project
  */
-class ParserCursor {
+public class ParserCursor {
 
     private final int lowerBound;
     private final int upperBound;

Modified: james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/RawField.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/RawField.java?rev=1130114&r1=1130113&r2=1130114&view=diff
==============================================================================
--- james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/RawField.java (original)
+++ james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/RawField.java Wed Jun  1 11:58:11 2011
@@ -68,7 +68,7 @@ public final class RawField implements F
         return null;
     }
 
-    int getDelimiterIdx() {
+    public int getDelimiterIdx() {
         return delimiterIdx;
     }
 

Modified: james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/RawFieldParser.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/RawFieldParser.java?rev=1130114&r1=1130113&r2=1130114&view=diff
==============================================================================
--- james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/RawFieldParser.java (original)
+++ james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/RawFieldParser.java Wed Jun  1 11:58:11 2011
@@ -66,7 +66,7 @@ public class RawFieldParser {
         return parseRawBody(buf, cursor);
     }
 
-    RawBody parseRawBody(final ByteSequence buf, final ParserCursor cursor) {
+    public RawBody parseRawBody(final ByteSequence buf, final ParserCursor cursor) {
         String value = parseToken(buf, cursor, SEMICOLON);
         if (cursor.atEnd()) {
             return new RawBody(value, new ArrayList<NameValuePair>());
@@ -76,7 +76,7 @@ public class RawFieldParser {
         return new RawBody(value, params);
     }
 
-    List<NameValuePair> parseParameters(final ByteSequence buf, final ParserCursor cursor) {
+    public List<NameValuePair> parseParameters(final ByteSequence buf, final ParserCursor cursor) {
         List<NameValuePair> params = new ArrayList<NameValuePair>();
         skipWhiteSpace(buf, cursor);
         while (!cursor.atEnd()) {
@@ -86,7 +86,7 @@ public class RawFieldParser {
         return params;
     }
 
-    NameValuePair parseParameter(final ByteSequence buf, final ParserCursor cursor) {
+    public NameValuePair parseParameter(final ByteSequence buf, final ParserCursor cursor) {
         String name = parseToken(buf, cursor, EQUAL_OR_SEMICOLON);
         if (cursor.atEnd()) {
             return new NameValuePair(name, null);
@@ -114,7 +114,7 @@ public class RawFieldParser {
         return false;
     }
 
-    static String parseToken(final ByteSequence buf, final ParserCursor cursor, final int[] delimiters) {
+    public static String parseToken(final ByteSequence buf, final ParserCursor cursor, final int[] delimiters) {
         StringBuilder dst = new StringBuilder();
         boolean whitespace = false;
         while (!cursor.atEnd()) {
@@ -137,7 +137,7 @@ public class RawFieldParser {
         return dst.toString();
     }
 
-    static String parseValue(final ByteSequence buf, final ParserCursor cursor, final int[] delimiters) {
+    public static String parseValue(final ByteSequence buf, final ParserCursor cursor, final int[] delimiters) {
         StringBuilder dst = new StringBuilder();
         boolean whitespace = false;
         while (!cursor.atEnd()) {
@@ -166,7 +166,7 @@ public class RawFieldParser {
         return dst.toString();
     }
 
-    static void skipWhiteSpace(final ByteSequence buf, final ParserCursor cursor) {
+    public static void skipWhiteSpace(final ByteSequence buf, final ParserCursor cursor) {
         int pos = cursor.getPos();
         int indexFrom = cursor.getPos();
         int indexTo = cursor.getUpperBound();
@@ -181,7 +181,7 @@ public class RawFieldParser {
         cursor.updatePos(pos);
     }
 
-    static void skipComment(final ByteSequence buf, final ParserCursor cursor) {
+    public static void skipComment(final ByteSequence buf, final ParserCursor cursor) {
         if (cursor.atEnd()) {
             return;
         }
@@ -218,7 +218,7 @@ public class RawFieldParser {
         cursor.updatePos(pos);
     }
 
-    static void copyContent(final ByteSequence buf, final ParserCursor cursor, final int[] delimiters,
+    public static void copyContent(final ByteSequence buf, final ParserCursor cursor, final int[] delimiters,
             final StringBuilder dst) {
         int pos = cursor.getPos();
         int indexFrom = cursor.getPos();
@@ -235,7 +235,7 @@ public class RawFieldParser {
         cursor.updatePos(pos);
     }
 
-    static void copyQuotedContent(final ByteSequence buf, final ParserCursor cursor,
+    public static void copyQuotedContent(final ByteSequence buf, final ParserCursor cursor,
             final StringBuilder dst) {
         if (cursor.atEnd()) {
             return;

Modified: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentDispositionFieldImpl.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentDispositionFieldImpl.java?rev=1130114&r1=1130113&r2=1130114&view=diff
==============================================================================
--- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentDispositionFieldImpl.java (original)
+++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentDispositionFieldImpl.java Wed Jun  1 11:58:11 2011
@@ -202,12 +202,14 @@ public class ContentDispositionFieldImpl
             return new DateTimeParser(new StringReader(value)).parseAll()
                     .getDate();
         } catch (org.apache.james.mime4j.field.datetime.parser.ParseException e) {
-            monitor.warn("Parsing " + paramName + " '" + value + "': "
-                    + e.getMessage(), "returning null");
+            if (monitor.isListening()) {
+                monitor.warn(paramName + " parameter is invalid: " + value, 
+                        paramName + " parameter is ignored");
+            }
             return null;
-        } catch (org.apache.james.mime4j.field.datetime.parser.TokenMgrError e) {
-            monitor.warn("Parsing " + paramName + " '" + value + "': "
-                    + e.getMessage(), "returning null");
+        } catch (TokenMgrError e) {
+            monitor.warn(paramName + " parameter is invalid: " + value, 
+                    paramName + "parameter is ignored");
             return null;
         }
     }

Added: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentDispositionFieldLenientImpl.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentDispositionFieldLenientImpl.java?rev=1130114&view=auto
==============================================================================
--- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentDispositionFieldLenientImpl.java (added)
+++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentDispositionFieldLenientImpl.java Wed Jun  1 11:58:11 2011
@@ -0,0 +1,205 @@
+/****************************************************************
+ * 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.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.TimeZone;
+
+import org.apache.james.mime4j.codec.DecodeMonitor;
+import org.apache.james.mime4j.dom.field.ContentDispositionField;
+import org.apache.james.mime4j.stream.Field;
+import org.apache.james.mime4j.stream.FieldParser;
+import org.apache.james.mime4j.stream.NameValuePair;
+import org.apache.james.mime4j.stream.RawBody;
+import org.apache.james.mime4j.stream.RawField;
+import org.apache.james.mime4j.stream.RawFieldParser;
+
+/**
+ * Represents a <code>Content-Disposition</code> field.
+ */
+public class ContentDispositionFieldLenientImpl extends AbstractField implements ContentDispositionField {
+
+    private static final String DEFAULT_DATE_FORMAT = "EEE, dd MMM yyyy hh:mm:ss ZZZZ";
+    
+    private final List<String> datePatterns;
+    
+    private boolean parsed = false;
+
+    private String dispositionType = "";
+    private Map<String, String> parameters = new HashMap<String, String>();
+
+    private boolean creationDateParsed;
+    private Date creationDate;
+
+    private boolean modificationDateParsed;
+    private Date modificationDate;
+
+    private boolean readDateParsed;
+    private Date readDate;
+
+    ContentDispositionFieldLenientImpl(final Field rawField, 
+            final Collection<String> dateParsers, final DecodeMonitor monitor) {
+        super(rawField, monitor);
+        this.datePatterns = new ArrayList<String>();
+        if (dateParsers != null) {
+            this.datePatterns.addAll(dateParsers);
+        } else {
+            this.datePatterns.add(DEFAULT_DATE_FORMAT);
+        }
+    }
+
+    public String getDispositionType() {
+        if (!parsed) {
+            parse();
+        }
+        return dispositionType;
+    }
+
+    public String getParameter(String name) {
+        if (!parsed) {
+            parse();
+        }
+        return parameters.get(name.toLowerCase());
+    }
+
+    public Map<String, String> getParameters() {
+        if (!parsed) {
+            parse();
+        }
+        return Collections.unmodifiableMap(parameters);
+    }
+
+    public boolean isDispositionType(String dispositionType) {
+        if (!parsed) {
+            parse();
+        }
+        return this.dispositionType.equalsIgnoreCase(dispositionType);
+    }
+
+    public boolean isInline() {
+        if (!parsed) {
+            parse();
+        }
+        return dispositionType.equals(DISPOSITION_TYPE_INLINE);
+    }
+
+    public boolean isAttachment() {
+        if (!parsed) {
+            parse();
+        }
+        return dispositionType.equals(DISPOSITION_TYPE_ATTACHMENT);
+    }
+
+    public String getFilename() {
+        return getParameter(PARAM_FILENAME);
+    }
+
+    public Date getCreationDate() {
+        if (!creationDateParsed) {
+            creationDate = parseDate(PARAM_CREATION_DATE);
+            creationDateParsed = true;
+        }
+        return creationDate;
+    }
+
+    public Date getModificationDate() {
+        if (!modificationDateParsed) {
+            modificationDate = parseDate(PARAM_MODIFICATION_DATE);
+            modificationDateParsed = true;
+        }
+        return modificationDate;
+    }
+
+    public Date getReadDate() {
+        if (!readDateParsed) {
+            readDate = parseDate(PARAM_READ_DATE);
+            readDateParsed = true;
+        }
+        return readDate;
+    }
+
+    public long getSize() {
+        String value = getParameter(PARAM_SIZE);
+        if (value == null)
+            return -1;
+
+        try {
+            long size = Long.parseLong(value);
+            return size < 0 ? -1 : size;
+        } catch (NumberFormatException e) {
+            return -1;
+        }
+    }
+
+    private void parse() {
+        parsed = true;
+        RawField f = getRawField();
+        RawBody body = RawFieldParser.DEFAULT.parseRawBody(f);
+        String main = body.getValue();
+        if (main != null) {
+            dispositionType = main.toLowerCase(Locale.US);
+        } else {
+            dispositionType = null;
+        }
+        parameters.clear();
+        for (NameValuePair nmp: body.getParams()) {
+            String name = nmp.getName().toLowerCase(Locale.US);
+            parameters.put(name, nmp.getValue());
+        }
+    }
+
+    private Date parseDate(final String paramName) {
+        String value = getParameter(paramName);
+        if (value == null) {
+            return null;
+        }
+        for (String datePattern: datePatterns) {
+            try {
+                SimpleDateFormat parser = new SimpleDateFormat(datePattern, Locale.US);
+                parser.setTimeZone(TimeZone.getTimeZone("GMT"));
+                parser.setLenient(true);
+                return parser.parse(value);
+            } catch (ParseException ignore) {
+            }
+        }
+        if (monitor.isListening()) {
+            monitor.warn(paramName + " parameter is invalid: " + value, 
+                    paramName + " parameter is ignored");
+        }
+        return null;
+    }
+
+    public static final FieldParser<ContentDispositionField> PARSER = new FieldParser<ContentDispositionField>() {
+        
+        public ContentDispositionField parse(final Field rawField, final DecodeMonitor monitor) {
+            return new ContentDispositionFieldLenientImpl(rawField, null, monitor);
+        }
+        
+    };
+}

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

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

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

Modified: 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=1130114&r1=1130113&r2=1130114&view=diff
==============================================================================
--- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLanguageFieldImpl.java (original)
+++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLanguageFieldImpl.java Wed Jun  1 11:58:11 2011
@@ -20,6 +20,7 @@
 package org.apache.james.mime4j.field;
 
 import java.io.StringReader;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
@@ -45,6 +46,7 @@ public class ContentLanguageFieldImpl ex
 
     private void parse() {
         parsed = true;
+        languages = Collections.<String>emptyList();
         String body = getBody();
         if (body != null) {
             ContentLanguageParser parser = new ContentLanguageParser(new StringReader(body));
@@ -52,10 +54,7 @@ public class ContentLanguageFieldImpl ex
                 languages = parser.parse();
             } catch (ParseException ex) {
                 parseException = ex;
-                languages = Collections.<String>emptyList();
             }
-        } else {
-            languages = Collections.<String>emptyList();
         }
     }
 
@@ -68,7 +67,7 @@ public class ContentLanguageFieldImpl ex
         if (!parsed) {
             parse();
         }
-        return languages;
+        return new ArrayList<String>(languages);
     }
 
     public static final FieldParser<ContentLanguageField> PARSER = new FieldParser<ContentLanguageField>() {

Added: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLanguageFieldLenientImpl.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLanguageFieldLenientImpl.java?rev=1130114&view=auto
==============================================================================
--- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLanguageFieldLenientImpl.java (added)
+++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLanguageFieldLenientImpl.java Wed Jun  1 11:58:11 2011
@@ -0,0 +1,97 @@
+/****************************************************************
+ * 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.util.ArrayList;
+import java.util.List;
+
+import org.apache.james.mime4j.codec.DecodeMonitor;
+import org.apache.james.mime4j.dom.field.ContentLanguageField;
+import org.apache.james.mime4j.stream.Field;
+import org.apache.james.mime4j.stream.FieldParser;
+import org.apache.james.mime4j.stream.ParserCursor;
+import org.apache.james.mime4j.stream.RawField;
+import org.apache.james.mime4j.stream.RawFieldParser;
+import org.apache.james.mime4j.util.ByteSequence;
+import org.apache.james.mime4j.util.ContentUtil;
+
+/**
+ * Represents a <code>Content-Transfer-Encoding</code> field.
+ */
+public class ContentLanguageFieldLenientImpl extends AbstractField implements ContentLanguageField {
+
+    private final static int   COMMA = ',';
+    private final static int[] DELIM = new int[] { COMMA };
+    
+    private boolean parsed = false;
+    private List<String> languages;
+
+    ContentLanguageFieldLenientImpl(final Field rawField, final DecodeMonitor monitor) {
+        super(rawField, monitor);
+    }
+
+    private void parse() {
+        parsed = true;
+        RawField f = getRawField();
+        ByteSequence buf = f.getRaw();
+        int pos = f.getDelimiterIdx() + 1;
+        if (buf == null) {
+            String body = f.getBody();
+            if (body == null) {
+                return;
+            }
+            buf = ContentUtil.encode(body);
+            pos = 0;
+        }
+        languages = new ArrayList<String>();
+        ParserCursor cursor = new ParserCursor(pos, buf.length());
+        for (;;) {
+            String token = RawFieldParser.parseToken(buf, cursor, DELIM);
+            if (token.length() > 0) {
+                languages.add(token);
+            }
+            if (cursor.atEnd()) {
+                break;
+            } else {
+                pos = cursor.getPos();
+                if (buf.byteAt(pos) == COMMA) {
+                    cursor.updatePos(pos + 1);
+                }
+            }
+        }
+    }
+
+    public List<String> getLanguages() {
+        if (!parsed) {
+            parse();
+        }
+        return new ArrayList<String>(languages);
+    }
+
+    public static final FieldParser<ContentLanguageField> PARSER = new FieldParser<ContentLanguageField>() {
+        
+        public ContentLanguageField parse(final Field rawField, final DecodeMonitor monitor) {
+            return new ContentLanguageFieldLenientImpl(rawField, monitor);
+        }
+        
+    };
+
+}
+

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

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

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

Modified: 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=1130114&r1=1130113&r2=1130114&view=diff
==============================================================================
--- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLengthFieldImpl.java (original)
+++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLengthFieldImpl.java Wed Jun  1 11:58:11 2011
@@ -38,26 +38,24 @@ public class ContentLengthFieldImpl exte
 
     private void parse() {
         parsed = true;
+        contentLength = -1;
         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;
+                contentLength = Long.parseLong(body);
+                if (contentLength < 0) {
+                    contentLength = -1;
+                    if (monitor.isListening()) {
+                        monitor.warn("Negative content length: " + body, 
+                                "ignoring Content-Length header");
                     }
-                } else {
-                    contentLength = v;
                 }
             } catch (NumberFormatException e) {
-                if (monitor.warn("Invalid content length: " + body, 
-                        "ignoring Content-Length header")) {
-                    contentLength = -1;
+                if (monitor.isListening()) {
+                    monitor.warn("Invalid content length: " + body, 
+                            "ignoring Content-Length header");
                 }
             }
-        } else {
-            contentLength = -1;
         }
     }
     

Modified: 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=1130114&r1=1130113&r2=1130114&view=diff
==============================================================================
--- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLocationFieldImpl.java (original)
+++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentLocationFieldImpl.java Wed Jun  1 11:58:11 2011
@@ -44,6 +44,7 @@ public class ContentLocationFieldImpl ex
     private void parse() {
         parsed = true;
         String body = getBody();
+        location = null;
         if (body != null) {
             StringReader stringReader = new StringReader(body);
             StructuredFieldParser parser = new StructuredFieldParser(stringReader);
@@ -58,10 +59,7 @@ public class ContentLocationFieldImpl ex
                 location = parser.parse().replaceAll("\\s", "");
             } catch (ParseException ex) { 
                 parseException = ex;
-                location = null;
             }
-        } else {
-            location = null;
         }
     }
     

Modified: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentTypeFieldLenientImpl.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentTypeFieldLenientImpl.java?rev=1130114&r1=1130113&r2=1130114&view=diff
==============================================================================
--- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentTypeFieldLenientImpl.java (original)
+++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentTypeFieldLenientImpl.java Wed Jun  1 11:58:11 2011
@@ -45,7 +45,7 @@ public class ContentTypeFieldLenientImpl
     private String subType = null;
     private Map<String, String> parameters = new HashMap<String, String>();
 
-    ContentTypeFieldLenientImpl(Field rawField, DecodeMonitor monitor) {
+    ContentTypeFieldLenientImpl(final Field rawField, final DecodeMonitor monitor) {
         super(rawField, monitor);
     }
 
@@ -126,6 +126,9 @@ public class ContentTypeFieldLenientImpl
                 }
             }
             if (!valid) {
+                if (monitor.isListening()) {
+                    monitor.warn("Invalid Content-Type: " + body, "Content-Type value ignored");
+                }
                 main = null;
                 type = null;
                 subtype = null;

Modified: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/LenientFieldParser.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/LenientFieldParser.java?rev=1130114&r1=1130113&r2=1130114&view=diff
==============================================================================
--- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/LenientFieldParser.java (original)
+++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/LenientFieldParser.java Wed Jun  1 11:58:11 2011
@@ -89,21 +89,21 @@ public class LenientFieldParser extends 
 
     public LenientFieldParser() {
         setFieldParser(FieldName.CONTENT_TYPE, 
-                ContentTypeFieldLenientImpl.PARSER);
+                ContentTypeFieldLenientImpl.PARSER);        // lenient 
         setFieldParser(FieldName.CONTENT_LENGTH,
-                ContentLengthFieldImpl.PARSER);
+                ContentLengthFieldImpl.PARSER);             // default
         setFieldParser(FieldName.CONTENT_TRANSFER_ENCODING,
-                ContentTransferEncodingFieldImpl.PARSER);
+                ContentTransferEncodingFieldImpl.PARSER);   // default
         setFieldParser(FieldName.CONTENT_DISPOSITION,
-                ContentDispositionFieldImpl.PARSER);
+                ContentDispositionFieldLenientImpl.PARSER); // lenient
         setFieldParser(FieldName.CONTENT_ID,
-                ContentDispositionFieldImpl.PARSER);
+                ContentIdFieldImpl.PARSER);                 // default
         setFieldParser(FieldName.CONTENT_MD5,
-                ContentMD5FieldImpl.PARSER);
+                ContentMD5FieldImpl.PARSER);                // default
         setFieldParser(FieldName.CONTENT_DESCRIPTION,
-                ContentDescriptionFieldImpl.PARSER);
+                ContentDescriptionFieldImpl.PARSER);        // default
         setFieldParser(FieldName.CONTENT_LANGUAGE,
-                ContentLanguageFieldImpl.PARSER);
+                ContentLanguageFieldLenientImpl.PARSER);    // lenient
         setFieldParser(FieldName.CONTENT_LOCATION,
                 ContentLocationFieldImpl.PARSER);
         setFieldParser(FieldName.MIME_VERSION,

Modified: james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/ContentDispositionFieldTest.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/ContentDispositionFieldTest.java?rev=1130114&r1=1130113&r2=1130114&view=diff
==============================================================================
--- james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/ContentDispositionFieldTest.java (original)
+++ james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/ContentDispositionFieldTest.java Wed Jun  1 11:58:11 2011
@@ -23,54 +23,51 @@ import java.util.Date;
 
 import junit.framework.TestCase;
 
+import org.apache.james.mime4j.MimeException;
 import org.apache.james.mime4j.dom.field.ContentDispositionField;
-import org.apache.james.mime4j.field.DefaultFieldParser;
+import org.apache.james.mime4j.stream.RawField;
+import org.apache.james.mime4j.stream.RawFieldParser;
+import org.apache.james.mime4j.util.ByteSequence;
+import org.apache.james.mime4j.util.ContentUtil;
 
 public class ContentDispositionFieldTest extends TestCase {
 
+    static ContentDispositionField parse(final String s) throws MimeException {
+        ByteSequence raw = ContentUtil.encode(s);
+        RawField rawField = RawFieldParser.DEFAULT.parseField(raw);
+        return ContentDispositionFieldImpl.PARSER.parse(rawField, null);
+    }
+    
     public void testDispositionTypeWithSemiColonNoParams() throws Exception {
-        ContentDispositionField f = null;
-
-        f = (ContentDispositionField) DefaultFieldParser
-                .parse("Content-Disposition: inline;");
+        ContentDispositionField f = parse("Content-Disposition: inline;");
         assertEquals("inline", f.getDispositionType());
     }
 
     public void testGetDispositionType() throws Exception {
-        ContentDispositionField f = null;
-
-        f = (ContentDispositionField) DefaultFieldParser
-                .parse("Content-Disposition: attachment");
+        ContentDispositionField f = parse("Content-Disposition: attachment");
         assertEquals("attachment", f.getDispositionType());
 
-        f = (ContentDispositionField) DefaultFieldParser
-                .parse("content-disposition:   InLiNe   ");
+        f = parse("content-disposition:   InLiNe   ");
         assertEquals("inline", f.getDispositionType());
 
-        f = (ContentDispositionField) DefaultFieldParser
-                .parse("CONTENT-DISPOSITION:   x-yada ;" + "  param = yada");
+        f = parse("CONTENT-DISPOSITION:   x-yada ;" + "  param = yada");
         assertEquals("x-yada", f.getDispositionType());
 
-        f = (ContentDispositionField) DefaultFieldParser.parse("CONTENT-DISPOSITION:   ");
+        f = parse("CONTENT-DISPOSITION:   ");
         assertEquals("", f.getDispositionType());
     }
 
     public void testGetParameter() throws Exception {
-        ContentDispositionField f = null;
-
-        f = (ContentDispositionField) DefaultFieldParser
-                .parse("CONTENT-DISPOSITION:   inline ;"
+        ContentDispositionField f = parse("CONTENT-DISPOSITION:   inline ;"
                         + "  filename=yada yada");
         assertEquals("yada", f.getParameter("filename"));
 
-        f = (ContentDispositionField) DefaultFieldParser
-                .parse("Content-Disposition: x-yada;"
+        f = parse("Content-Disposition: x-yada;"
                         + "  fileNAme= \"ya:\\\"*da\"; " + "\tSIZE\t =  1234");
         assertEquals("ya:\"*da", f.getParameter("filename"));
         assertEquals("1234", f.getParameter("size"));
 
-        f = (ContentDispositionField) DefaultFieldParser
-                .parse("Content-Disposition: x-yada;  "
+        f = parse("Content-Disposition: x-yada;  "
                         + "fileNAme= \"ya \\\"\\\"\tda \\\"\"; "
                         + "\tx-Yada\t =  \"\\\"hepp\\\"  =us\t-ascii\"");
         assertEquals("ya \"\"\tda \"", f.getParameter("filename"));
@@ -78,126 +75,93 @@ public class ContentDispositionFieldTest
     }
 
     public void testIsDispositionType() throws Exception {
-        ContentDispositionField f = null;
-
-        f = (ContentDispositionField) DefaultFieldParser.parse("Content-Disposition:INline");
+        ContentDispositionField f = parse("Content-Disposition:INline");
         assertTrue(f.isDispositionType("InLiNe"));
         assertFalse(f.isDispositionType("NiLiNe"));
         assertTrue(f.isInline());
         assertFalse(f.isAttachment());
 
-        f = (ContentDispositionField) DefaultFieldParser
-                .parse("Content-Disposition: attachment");
+        f = parse("Content-Disposition: attachment");
         assertTrue(f.isDispositionType("ATTACHMENT"));
         assertFalse(f.isInline());
         assertTrue(f.isAttachment());
 
-        f = (ContentDispositionField) DefaultFieldParser
-                .parse("Content-Disposition: x-something");
+        f = parse("Content-Disposition: x-something");
         assertTrue(f.isDispositionType("x-SomeThing"));
         assertFalse(f.isInline());
         assertFalse(f.isAttachment());
     }
 
     public void testGetFilename() throws Exception {
-        ContentDispositionField f = null;
-
-        f = (ContentDispositionField) DefaultFieldParser
-                .parse("Content-Disposition: inline; filename=yada.txt");
+        ContentDispositionField f = parse("Content-Disposition: inline; filename=yada.txt");
         assertEquals("yada.txt", f.getFilename());
 
-        f = (ContentDispositionField) DefaultFieldParser
-                .parse("Content-Disposition: inline; filename=yada yada.txt");
+        f = parse("Content-Disposition: inline; filename=yada yada.txt");
         assertEquals("yada", f.getFilename());
 
-        f = (ContentDispositionField) DefaultFieldParser
-                .parse("Content-Disposition: inline; filename=\"yada yada.txt\"");
+        f = parse("Content-Disposition: inline; filename=\"yada yada.txt\"");
         assertEquals("yada yada.txt", f.getFilename());
 
-        f = (ContentDispositionField) DefaultFieldParser
-                .parse("Content-Disposition: inline");
+        f = parse("Content-Disposition: inline");
         assertNull(f.getFilename());
     }
 
     public void testGetCreationDate() throws Exception {
-        ContentDispositionField f = null;
-
-        f = (ContentDispositionField) DefaultFieldParser
-                .parse("Content-Disposition: inline; "
+        ContentDispositionField f = parse("Content-Disposition: inline; "
                         + "creation-date=\"Tue, 01 Jan 1970 00:00:00 +0000\"");
         assertEquals(new Date(0), f.getCreationDate());
 
-        f = (ContentDispositionField) DefaultFieldParser
-                .parse("Content-Disposition: inline; "
+        f = parse("Content-Disposition: inline; "
                         + "creation-date=Tue, 01 Jan 1970 00:00:00 +0000");
         assertNull(f.getCreationDate());
 
-        f = (ContentDispositionField) DefaultFieldParser
-                .parse("Content-Disposition: attachment");
+        f = parse("Content-Disposition: attachment");
         assertNull(f.getCreationDate());
     }
 
     public void testGetModificationDate() throws Exception {
-        ContentDispositionField f = null;
-
-        f = (ContentDispositionField) DefaultFieldParser
-                .parse("Content-Disposition: inline; "
+        ContentDispositionField f = parse("Content-Disposition: inline; "
                         + "modification-date=\"Tue, 01 Jan 1970 00:00:00 +0000\"");
         assertEquals(new Date(0), f.getModificationDate());
 
-        f = (ContentDispositionField) DefaultFieldParser
-                .parse("Content-Disposition: inline; "
+        f = parse("Content-Disposition: inline; "
                         + "modification-date=\"Wed, 12 Feb 1997 16:29:51 -0500\"");
         assertEquals(new Date(855782991000l), f.getModificationDate());
 
-        f = (ContentDispositionField) DefaultFieldParser
-                .parse("Content-Disposition: inline; "
+        f = parse("Content-Disposition: inline; "
                         + "modification-date=yesterday");
         assertNull(f.getModificationDate());
 
-        f = (ContentDispositionField) DefaultFieldParser
-                .parse("Content-Disposition: attachment");
+        f = parse("Content-Disposition: attachment");
         assertNull(f.getModificationDate());
     }
 
     public void testGetReadDate() throws Exception {
-        ContentDispositionField f = null;
-
-        f = (ContentDispositionField) DefaultFieldParser
-                .parse("Content-Disposition: inline; "
+        ContentDispositionField f = parse("Content-Disposition: inline; "
                         + "read-date=\"Tue, 01 Jan 1970 00:00:00 +0000\"");
         assertEquals(new Date(0), f.getReadDate());
 
-        f = (ContentDispositionField) DefaultFieldParser
-                .parse("Content-Disposition: inline; read-date=");
+        f = parse("Content-Disposition: inline; read-date=");
         assertNull(f.getReadDate());
 
-        f = (ContentDispositionField) DefaultFieldParser
-                .parse("Content-Disposition: attachment");
+        f = parse("Content-Disposition: attachment");
         assertNull(f.getReadDate());
     }
 
     public void testGetSize() throws Exception {
-        ContentDispositionField f = null;
-
-        f = (ContentDispositionField) DefaultFieldParser
-                .parse("Content-Disposition: attachment; size=0");
+        ContentDispositionField f = parse("Content-Disposition: attachment; size=0");
         assertEquals(0, f.getSize());
 
-        f = (ContentDispositionField) DefaultFieldParser
-                .parse("Content-Disposition: attachment; size=matters");
+        f = parse("Content-Disposition: attachment; size=matters");
         assertEquals(-1, f.getSize());
 
-        f = (ContentDispositionField) DefaultFieldParser
-                .parse("Content-Disposition: attachment");
+        f = parse("Content-Disposition: attachment");
         assertEquals(-1, f.getSize());
 
-        f = (ContentDispositionField) DefaultFieldParser
-                .parse("Content-Disposition: attachment; size=-12");
+        f = parse("Content-Disposition: attachment; size=-12");
         assertEquals(-1, f.getSize());
 
-        f = (ContentDispositionField) DefaultFieldParser
-                .parse("Content-Disposition: attachment; size=12");
+        f = parse("Content-Disposition: attachment; size=12");
         assertEquals(12, f.getSize());
     }
 

Added: james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/ContentLanguageFieldTest.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/ContentLanguageFieldTest.java?rev=1130114&view=auto
==============================================================================
--- james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/ContentLanguageFieldTest.java (added)
+++ james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/ContentLanguageFieldTest.java Wed Jun  1 11:58:11 2011
@@ -0,0 +1,75 @@
+/****************************************************************
+ * 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.util.List;
+
+import org.apache.james.mime4j.MimeException;
+import org.apache.james.mime4j.dom.field.ContentLanguageField;
+import org.apache.james.mime4j.stream.RawField;
+import org.apache.james.mime4j.stream.RawFieldParser;
+import org.apache.james.mime4j.util.ByteSequence;
+import org.apache.james.mime4j.util.ContentUtil;
+
+import junit.framework.TestCase;
+
+public class ContentLanguageFieldTest extends TestCase {
+
+    static ContentLanguageField parse(final String s) throws MimeException {
+        ByteSequence raw = ContentUtil.encode(s);
+        RawField rawField = RawFieldParser.DEFAULT.parseField(raw);
+        return ContentLanguageFieldImpl.PARSER.parse(rawField, null);
+    }
+    
+    public void testGetLanguage() throws Exception {
+        ContentLanguageField f = parse("Content-Language: en, de");
+        List<String> langs = f.getLanguages();
+        assertNotNull(langs);
+        assertEquals(2, langs.size());
+        assertEquals("en", langs.get(0));
+        assertEquals("de", langs.get(1));
+    }
+    
+    public void testGetLanguageWithComments() throws Exception {
+        ContentLanguageField f = parse("Content-Language: en (yada yada), (blah blah)de");
+        List<String> langs = f.getLanguages();
+        assertNotNull(langs);
+        assertEquals(2, langs.size());
+        assertEquals("en", langs.get(0));
+        assertEquals("de", langs.get(1));
+    }
+    
+    public void testGetLanguageWithUnderscore() throws Exception {
+        ContentLanguageField f = parse("Content-Language: en, en_GB (Great Britain)");
+        List<String> langs = f.getLanguages();
+        assertNotNull(langs);
+        assertEquals(0, langs.size());
+        assertNotNull(f.getParseException());
+    }
+    
+    public void testGetLanguageWithEmptyElement() throws Exception {
+        ContentLanguageField f = parse("Content-Language: en,, de");
+        List<String> langs = f.getLanguages();
+        assertNotNull(langs);
+        assertEquals(0, langs.size());
+        assertNotNull(f.getParseException());
+    }
+    
+}

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

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

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

Modified: james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/ContentTransferEncodingFieldTest.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/ContentTransferEncodingFieldTest.java?rev=1130114&r1=1130113&r2=1130114&view=diff
==============================================================================
--- james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/ContentTransferEncodingFieldTest.java (original)
+++ james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/ContentTransferEncodingFieldTest.java Wed Jun  1 11:58:11 2011
@@ -19,50 +19,49 @@
 
 package org.apache.james.mime4j.field;
 
+import org.apache.james.mime4j.MimeException;
 import org.apache.james.mime4j.dom.field.ContentTransferEncodingField;
 import org.apache.james.mime4j.field.ContentTransferEncodingFieldImpl;
-import org.apache.james.mime4j.field.DefaultFieldParser;
+import org.apache.james.mime4j.stream.RawField;
+import org.apache.james.mime4j.stream.RawFieldParser;
+import org.apache.james.mime4j.util.ByteSequence;
+import org.apache.james.mime4j.util.ContentUtil;
 
 import junit.framework.TestCase;
 
 public class ContentTransferEncodingFieldTest extends TestCase {
 
+    static ContentTransferEncodingField parse(final String s) throws MimeException {
+        ByteSequence raw = ContentUtil.encode(s);
+        RawField rawField = RawFieldParser.DEFAULT.parseField(raw);
+        return ContentTransferEncodingFieldImpl.PARSER.parse(rawField, null);
+    }
+    
     public void testGetEncoding() throws Exception {
-        ContentTransferEncodingField f = null;
-        
-        f = (ContentTransferEncodingField) 
-                    DefaultFieldParser.parse("Content-Transfer-Encoding: 8bit");
+        ContentTransferEncodingField f = parse("Content-Transfer-Encoding: 8bit");
         assertEquals("8bit", f.getEncoding());
         
-        f = (ContentTransferEncodingField) 
-                    DefaultFieldParser.parse("Content-Transfer-Encoding:    BaSE64   ");
+        f = parse("Content-Transfer-Encoding:    BaSE64   ");
         assertEquals("base64", f.getEncoding());
         
-        f = (ContentTransferEncodingField) 
-                    DefaultFieldParser.parse("Content-Transfer-Encoding:       ");
+        f = parse("Content-Transfer-Encoding:       ");
         assertEquals("", f.getEncoding());
         
-        f = (ContentTransferEncodingField) 
-                    DefaultFieldParser.parse("Content-Transfer-Encoding:");
+        f = parse("Content-Transfer-Encoding:");
         assertEquals("", f.getEncoding());
     }
     
     public void testGetEncodingStatic() throws Exception {
-        ContentTransferEncodingField f = null;
-        
-        f = (ContentTransferEncodingField) 
-                    DefaultFieldParser.parse("Content-Transfer-Encoding: 8bit");
+        ContentTransferEncodingField f = parse("Content-Transfer-Encoding: 8bit");
         assertEquals("8bit", ContentTransferEncodingFieldImpl.getEncoding(f));
         
         f = null;
         assertEquals("7bit", ContentTransferEncodingFieldImpl.getEncoding(f));
         
-        f = (ContentTransferEncodingField) 
-                    DefaultFieldParser.parse("Content-Transfer-Encoding:       ");
+        f = parse("Content-Transfer-Encoding:       ");
         assertEquals("7bit", ContentTransferEncodingFieldImpl.getEncoding(f));
         
-        f = (ContentTransferEncodingField) 
-                    DefaultFieldParser.parse("Content-Transfer-Encoding:");
+        f = parse("Content-Transfer-Encoding:");
         assertEquals("7bit", ContentTransferEncodingFieldImpl.getEncoding(f));
     }
 

Added: james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/LenientContentDispositionFieldTest.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/LenientContentDispositionFieldTest.java?rev=1130114&view=auto
==============================================================================
--- james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/LenientContentDispositionFieldTest.java (added)
+++ james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/LenientContentDispositionFieldTest.java Wed Jun  1 11:58:11 2011
@@ -0,0 +1,168 @@
+/****************************************************************
+ * 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.util.Date;
+
+import junit.framework.TestCase;
+
+import org.apache.james.mime4j.MimeException;
+import org.apache.james.mime4j.dom.field.ContentDispositionField;
+import org.apache.james.mime4j.stream.RawField;
+import org.apache.james.mime4j.stream.RawFieldParser;
+import org.apache.james.mime4j.util.ByteSequence;
+import org.apache.james.mime4j.util.ContentUtil;
+
+public class LenientContentDispositionFieldTest extends TestCase {
+
+    static ContentDispositionField parse(final String s) throws MimeException {
+        ByteSequence raw = ContentUtil.encode(s);
+        RawField rawField = RawFieldParser.DEFAULT.parseField(raw);
+        return ContentDispositionFieldLenientImpl.PARSER.parse(rawField, null);
+    }
+    
+    public void testDispositionTypeWithSemiColonNoParams() throws Exception {
+        ContentDispositionField f = parse("Content-Disposition: inline;");
+        assertEquals("inline", f.getDispositionType());
+    }
+
+    public void testGetDispositionType() throws Exception {
+        ContentDispositionField f = parse("Content-Disposition: attachment");
+        assertEquals("attachment", f.getDispositionType());
+
+        f = parse("content-disposition:   InLiNe   ");
+        assertEquals("inline", f.getDispositionType());
+
+        f = parse("CONTENT-DISPOSITION:   x-yada ;" + "  param = yada");
+        assertEquals("x-yada", f.getDispositionType());
+
+        f = parse("CONTENT-DISPOSITION:   ");
+        assertEquals("", f.getDispositionType());
+    }
+
+    public void testGetParameter() throws Exception {
+        ContentDispositionField f = parse("CONTENT-DISPOSITION:   inline ;"
+                        + "  filename=yada yada");
+        assertEquals("yada yada", f.getParameter("filename"));
+
+        f = parse("Content-Disposition: x-yada;"
+                        + "  fileNAme= \"ya:\\\"*da\"; " + "\tSIZE\t =  1234");
+        assertEquals("ya:\"*da", f.getParameter("filename"));
+        assertEquals("1234", f.getParameter("size"));
+
+        f = parse("Content-Disposition: x-yada;  "
+                        + "fileNAme= \"ya \\\"\\\"\tda \\\"\"; "
+                        + "\tx-Yada\t =  \"\\\"hepp\\\"  =us\t-ascii\"");
+        assertEquals("ya \"\"\tda \"", f.getParameter("filename"));
+        assertEquals("\"hepp\"  =us\t-ascii", f.getParameter("x-yada"));
+    }
+
+    public void testIsDispositionType() throws Exception {
+        ContentDispositionField f = parse("Content-Disposition:INline");
+        assertTrue(f.isDispositionType("InLiNe"));
+        assertFalse(f.isDispositionType("NiLiNe"));
+        assertTrue(f.isInline());
+        assertFalse(f.isAttachment());
+
+        f = parse("Content-Disposition: attachment");
+        assertTrue(f.isDispositionType("ATTACHMENT"));
+        assertFalse(f.isInline());
+        assertTrue(f.isAttachment());
+
+        f = parse("Content-Disposition: x-something");
+        assertTrue(f.isDispositionType("x-SomeThing"));
+        assertFalse(f.isInline());
+        assertFalse(f.isAttachment());
+    }
+
+    public void testGetFilename() throws Exception {
+        ContentDispositionField f = parse("Content-Disposition: inline; filename=yada.txt");
+        assertEquals("yada.txt", f.getFilename());
+
+        f = parse("Content-Disposition: inline; filename=yada yada.txt");
+        assertEquals("yada yada.txt", f.getFilename());
+
+        f = parse("Content-Disposition: inline; filename=\"yada yada.txt\"");
+        assertEquals("yada yada.txt", f.getFilename());
+
+        f = parse("Content-Disposition: inline");
+        assertNull(f.getFilename());
+    }
+
+    public void testGetCreationDate() throws Exception {
+        ContentDispositionField f = parse("Content-Disposition: inline; "
+                        + "creation-date=\"Tue, 01 Jan 1970 00:00:00 +0000\"");
+        assertEquals(new Date(0), f.getCreationDate());
+
+        f = parse("Content-Disposition: inline; "
+                        + "creation-date=Tue, 01 Jan 1970 00:00:00 +0000");
+        assertEquals(new Date(0), f.getCreationDate());
+
+        f = parse("Content-Disposition: attachment");
+        assertNull(f.getCreationDate());
+    }
+
+    public void testGetModificationDate() throws Exception {
+        ContentDispositionField f = parse("Content-Disposition: inline; "
+                        + "modification-date=\"Tue, 01 Jan 1970 00:00:00 +0000\"");
+        assertEquals(new Date(0), f.getModificationDate());
+
+        f = parse("Content-Disposition: inline; "
+                        + "modification-date=\"Wed, 12 Feb 1997 16:29:51 -0500\"");
+        assertEquals(new Date(855782991000l), f.getModificationDate());
+
+        f = parse("Content-Disposition: inline; "
+                        + "modification-date=yesterday");
+        assertNull(f.getModificationDate());
+
+        f = parse("Content-Disposition: attachment");
+        assertNull(f.getModificationDate());
+    }
+
+    public void testGetReadDate() throws Exception {
+        ContentDispositionField f = parse("Content-Disposition: inline; "
+                        + "read-date=\"Tue, 01 Jan 1970 00:00:00 +0000\"");
+        assertEquals(new Date(0), f.getReadDate());
+
+        f = parse("Content-Disposition: inline; read-date=");
+        assertNull(f.getReadDate());
+
+        f = parse("Content-Disposition: attachment");
+        assertNull(f.getReadDate());
+    }
+
+    public void testGetSize() throws Exception {
+        ContentDispositionField f = parse("Content-Disposition: attachment; size=0");
+        assertEquals(0, f.getSize());
+
+        f = parse("Content-Disposition: attachment; size=matters");
+        assertEquals(-1, f.getSize());
+
+        f = parse("Content-Disposition: attachment");
+        assertEquals(-1, f.getSize());
+
+        f = parse("Content-Disposition: attachment; size=-12");
+        assertEquals(-1, f.getSize());
+
+        f = parse("Content-Disposition: attachment; size=12");
+        assertEquals(12, f.getSize());
+    }
+
+}

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

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

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

Added: james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/LenientContentLanguageFieldTest.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/LenientContentLanguageFieldTest.java?rev=1130114&view=auto
==============================================================================
--- james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/LenientContentLanguageFieldTest.java (added)
+++ james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/LenientContentLanguageFieldTest.java Wed Jun  1 11:58:11 2011
@@ -0,0 +1,84 @@
+/****************************************************************
+ * 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.util.List;
+
+import org.apache.james.mime4j.MimeException;
+import org.apache.james.mime4j.dom.field.ContentLanguageField;
+import org.apache.james.mime4j.stream.RawField;
+import org.apache.james.mime4j.stream.RawFieldParser;
+import org.apache.james.mime4j.util.ByteSequence;
+import org.apache.james.mime4j.util.ContentUtil;
+
+import junit.framework.TestCase;
+
+public class LenientContentLanguageFieldTest extends TestCase {
+
+    static ContentLanguageField parse(final String s) throws MimeException {
+        ByteSequence raw = ContentUtil.encode(s);
+        RawField rawField = RawFieldParser.DEFAULT.parseField(raw);
+        return ContentLanguageFieldLenientImpl.PARSER.parse(rawField, null);
+    }
+    
+    public void testGetLanguage() throws Exception {
+        ContentLanguageField f = parse("Content-Language: en, de");
+        List<String> langs = f.getLanguages();
+        assertNotNull(langs);
+        assertEquals(2, langs.size());
+        assertEquals("en", langs.get(0));
+        assertEquals("de", langs.get(1));
+    }
+    
+    public void testGetLanguageEmpty() throws Exception {
+        ContentLanguageField f = parse("Content-Language: ");
+        List<String> langs = f.getLanguages();
+        assertNotNull(langs);
+        assertEquals(0, langs.size());
+    }
+    
+    public void testGetLanguageWithComments() throws Exception {
+        ContentLanguageField f = parse("Content-Language: en (yada yada), (blah blah)de");
+        List<String> langs = f.getLanguages();
+        assertNotNull(langs);
+        assertEquals(2, langs.size());
+        assertEquals("en", langs.get(0));
+        assertEquals("de", langs.get(1));
+    }
+    
+    public void testGetLanguageWithUnderscore() throws Exception {
+        ContentLanguageField f = parse("Content-Language: en, en_GB (Great Britain)");
+        List<String> langs = f.getLanguages();
+        assertNotNull(langs);
+        assertEquals(2, langs.size());
+        assertEquals("en", langs.get(0));
+        assertEquals("en_GB", langs.get(1));
+    }
+    
+    public void testGetLanguageWithEmptyElement() throws Exception {
+        ContentLanguageField f = parse("Content-Language: en,, de,");
+        List<String> langs = f.getLanguages();
+        assertNotNull(langs);
+        assertEquals(2, langs.size());
+        assertEquals("en", langs.get(0));
+        assertEquals("de", langs.get(1));
+    }
+    
+}

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

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

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