Return-Path: X-Original-To: apmail-james-mime4j-dev-archive@minotaur.apache.org Delivered-To: apmail-james-mime4j-dev-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id AE5164F79 for ; Wed, 25 May 2011 15:48:28 +0000 (UTC) Received: (qmail 50096 invoked by uid 500); 25 May 2011 15:48:28 -0000 Delivered-To: apmail-james-mime4j-dev-archive@james.apache.org Received: (qmail 50069 invoked by uid 500); 25 May 2011 15:48:28 -0000 Mailing-List: contact mime4j-dev-help@james.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: mime4j-dev@james.apache.org Delivered-To: mailing list mime4j-dev@james.apache.org Received: (qmail 50061 invoked by uid 99); 25 May 2011 15:48:28 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 25 May 2011 15:48:28 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 25 May 2011 15:48:20 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 8531723889BF; Wed, 25 May 2011 15:47:58 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1127570 - in /james/mime4j/trunk/dom/src: main/java/org/apache/james/mime4j/field/ test/java/org/apache/james/mime4j/field/ Date: Wed, 25 May 2011 15:47:58 -0000 To: mime4j-dev@james.apache.org From: olegk@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20110525154758.8531723889BF@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: olegk Date: Wed May 25 15:47:57 2011 New Revision: 1127570 URL: http://svn.apache.org/viewvc?rev=1127570&view=rev Log: MIME4J-197: Added 'lenient' ContentTypeField implementation; added LenientFieldParser as an alternative to DefaultFieldParser Added: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentTypeFieldLenientImpl.java (with props) james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/LenientFieldParser.java (with props) james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/LenientContentTypeFieldTest.java (with props) Modified: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/AbstractField.java james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/AddressListFieldImpl.java james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentDescriptionFieldImpl.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/ContentIdFieldImpl.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/ContentMD5FieldImpl.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/ContentTypeFieldImpl.java james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/DateTimeFieldImpl.java james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/MailboxFieldImpl.java james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/MailboxListFieldImpl.java james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/MimeVersionFieldImpl.java james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/UnstructuredFieldImpl.java james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/ContentTypeFieldTest.java Modified: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/AbstractField.java URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/AbstractField.java?rev=1127570&r1=1127569&r2=1127570&view=diff ============================================================================== --- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/AbstractField.java (original) +++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/AbstractField.java Wed May 25 15:47:57 2011 @@ -22,6 +22,8 @@ package org.apache.james.mime4j.field; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.field.ParseException; import org.apache.james.mime4j.dom.field.ParsedField; +import org.apache.james.mime4j.stream.Field; +import org.apache.james.mime4j.stream.RawField; import org.apache.james.mime4j.util.ByteSequence; /** @@ -29,19 +31,11 @@ import org.apache.james.mime4j.util.Byte */ public abstract class AbstractField implements ParsedField { - private final String name; - private final String body; - private final ByteSequence raw; - protected DecodeMonitor monitor; + protected final Field rawField; + protected final DecodeMonitor monitor; - protected AbstractField( - final String name, - final String body, - final ByteSequence raw, - final DecodeMonitor monitor) { - this.name = name; - this.body = body; - this.raw = raw; + protected AbstractField(final Field rawField, final DecodeMonitor monitor) { + this.rawField = rawField; this.monitor = monitor != null ? monitor : DecodeMonitor.SILENT; } @@ -52,7 +46,7 @@ public abstract class AbstractField impl * @return the field name. */ public String getName() { - return name; + return rawField.getName(); } /** @@ -62,7 +56,7 @@ public abstract class AbstractField impl * @return the unfolded unparsed field body string. */ public String getBody() { - return body; + return rawField.getBody(); } /** @@ -70,7 +64,7 @@ public abstract class AbstractField impl * null otherwise. */ public ByteSequence getRaw() { - return raw; + return rawField.getRaw(); } /** @@ -86,10 +80,18 @@ public abstract class AbstractField impl public ParseException getParseException() { return null; } - + + protected RawField getRawField() { + if (rawField instanceof RawField) { + return ((RawField) rawField); + } else { + return new RawField(rawField.getName(), rawField.getBody()); + } + } + @Override public String toString() { - return name + ": " + body; + return rawField.toString(); } } Modified: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/AddressListFieldImpl.java URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/AddressListFieldImpl.java?rev=1127570&r1=1127569&r2=1127570&view=diff ============================================================================== --- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/AddressListFieldImpl.java (original) +++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/AddressListFieldImpl.java Wed May 25 15:47:57 2011 @@ -26,7 +26,6 @@ import org.apache.james.mime4j.field.add import org.apache.james.mime4j.field.address.ParseException; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.stream.FieldParser; -import org.apache.james.mime4j.util.ByteSequence; /** * Address list field such as To or Reply-To. @@ -38,8 +37,8 @@ public class AddressListFieldImpl extend private AddressList addressList; private ParseException parseException; - AddressListFieldImpl(String name, String body, ByteSequence raw, DecodeMonitor monitor) { - super(name, body, raw, monitor); + AddressListFieldImpl(Field rawField, DecodeMonitor monitor) { + super(rawField, monitor); } /** @@ -78,7 +77,7 @@ public class AddressListFieldImpl extend public static final FieldParser PARSER = new FieldParser() { public AddressListField parse(final Field rawField, final DecodeMonitor monitor) { - return new AddressListFieldImpl(rawField.getName(), rawField.getBody(), rawField.getRaw(), monitor); + return new AddressListFieldImpl(rawField, monitor); } }; Modified: 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=1127570&r1=1127569&r2=1127570&view=diff ============================================================================== --- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentDescriptionFieldImpl.java (original) +++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentDescriptionFieldImpl.java Wed May 25 15:47:57 2011 @@ -23,7 +23,6 @@ import org.apache.james.mime4j.codec.Dec import org.apache.james.mime4j.dom.field.ContentDescriptionField; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.stream.FieldParser; -import org.apache.james.mime4j.util.ByteSequence; /** * Represents a Content-Description field. @@ -33,8 +32,8 @@ public class ContentDescriptionFieldImpl private boolean parsed = false; private String description; - ContentDescriptionFieldImpl(String name, String body, ByteSequence raw, DecodeMonitor monitor) { - super(name, body, raw, monitor); + ContentDescriptionFieldImpl(Field rawField, DecodeMonitor monitor) { + super(rawField, monitor); } private void parse() { @@ -57,7 +56,7 @@ public class ContentDescriptionFieldImpl public static final FieldParser PARSER = new FieldParser() { public ContentDescriptionField parse(final Field rawField, final DecodeMonitor monitor) { - return new ContentDescriptionFieldImpl(rawField.getName(), rawField.getBody(), rawField.getRaw(), monitor); + return new ContentDescriptionFieldImpl(rawField, monitor); } }; 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=1127570&r1=1127569&r2=1127570&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 May 25 15:47:57 2011 @@ -35,12 +35,11 @@ import org.apache.james.mime4j.field.con import org.apache.james.mime4j.field.datetime.parser.DateTimeParser; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.stream.FieldParser; -import org.apache.james.mime4j.util.ByteSequence; /** * Represents a Content-Disposition field. */ -public class ContentDispositionFieldImpl extends AbstractField implements org.apache.james.mime4j.dom.field.ContentDispositionField { +public class ContentDispositionFieldImpl extends AbstractField implements ContentDispositionField { private boolean parsed = false; @@ -57,8 +56,8 @@ public class ContentDispositionFieldImpl private boolean readDateParsed; private Date readDate; - ContentDispositionFieldImpl(String name, String body, ByteSequence raw, DecodeMonitor monitor) { - super(name, body, raw, monitor); + ContentDispositionFieldImpl(Field rawField, DecodeMonitor monitor) { + super(rawField, monitor); } /** @@ -250,7 +249,7 @@ public class ContentDispositionFieldImpl public static final FieldParser PARSER = new FieldParser() { public ContentDispositionField parse(final Field rawField, final DecodeMonitor monitor) { - return new ContentDispositionFieldImpl(rawField.getName(), rawField.getBody(), rawField.getRaw(), monitor); + return new ContentDispositionFieldImpl(rawField, monitor); } }; Modified: 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=1127570&r1=1127569&r2=1127570&view=diff ============================================================================== --- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentIdFieldImpl.java (original) +++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentIdFieldImpl.java Wed May 25 15:47:57 2011 @@ -23,7 +23,6 @@ import org.apache.james.mime4j.codec.Dec import org.apache.james.mime4j.dom.field.ContentIdField; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.stream.FieldParser; -import org.apache.james.mime4j.util.ByteSequence; /** * Represents a Content-Transfer-Encoding field. @@ -33,8 +32,8 @@ public class ContentIdFieldImpl extends private boolean parsed = false; private String id; - ContentIdFieldImpl(String name, String body, ByteSequence raw, DecodeMonitor monitor) { - super(name, body, raw, monitor); + ContentIdFieldImpl(Field rawField, DecodeMonitor monitor) { + super(rawField, monitor); } private void parse() { @@ -57,7 +56,7 @@ public class ContentIdFieldImpl extends public static final FieldParser PARSER = new FieldParser() { public ContentIdField parse(final Field rawField, final DecodeMonitor monitor) { - return new ContentIdFieldImpl(rawField.getName(), rawField.getBody(), rawField.getRaw(), monitor); + return new ContentIdFieldImpl(rawField, monitor); } }; 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=1127570&r1=1127569&r2=1127570&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 May 25 15:47:57 2011 @@ -29,7 +29,6 @@ import org.apache.james.mime4j.field.lan import org.apache.james.mime4j.field.language.parser.ParseException; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.stream.FieldParser; -import org.apache.james.mime4j.util.ByteSequence; /** * Represents a Content-Transfer-Encoding field. @@ -40,8 +39,8 @@ public class ContentLanguageFieldImpl ex private List languages; private ParseException parseException; - ContentLanguageFieldImpl(String name, String body, ByteSequence raw, DecodeMonitor monitor) { - super(name, body, raw, monitor); + ContentLanguageFieldImpl(Field rawField, DecodeMonitor monitor) { + super(rawField, monitor); } private void parse() { @@ -75,7 +74,7 @@ public class ContentLanguageFieldImpl ex public static final FieldParser PARSER = new FieldParser() { public ContentLanguageField parse(final Field rawField, final DecodeMonitor monitor) { - return new ContentLanguageFieldImpl(rawField.getName(), rawField.getBody(), rawField.getRaw(), monitor); + return new ContentLanguageFieldImpl(rawField, monitor); } }; 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=1127570&r1=1127569&r2=1127570&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 May 25 15:47:57 2011 @@ -23,7 +23,6 @@ import org.apache.james.mime4j.codec.Dec import org.apache.james.mime4j.dom.field.ContentLengthField; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.stream.FieldParser; -import org.apache.james.mime4j.util.ByteSequence; /** * Represents a Content-Length field. @@ -33,8 +32,8 @@ public class ContentLengthFieldImpl exte private boolean parsed = false; private long contentLength; - ContentLengthFieldImpl(String name, String body, ByteSequence raw, DecodeMonitor monitor) { - super(name, body, raw, monitor); + ContentLengthFieldImpl(Field rawField, DecodeMonitor monitor) { + super(rawField, monitor); } private void parse() { @@ -72,7 +71,7 @@ public class ContentLengthFieldImpl exte public static final FieldParser PARSER = new FieldParser() { public ContentLengthField parse(final Field rawField, final DecodeMonitor monitor) { - return new ContentLengthFieldImpl(rawField.getName(), rawField.getBody(), rawField.getRaw(), monitor); + return new ContentLengthFieldImpl(rawField, monitor); } }; 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=1127570&r1=1127569&r2=1127570&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 May 25 15:47:57 2011 @@ -27,7 +27,6 @@ import org.apache.james.mime4j.field.str import org.apache.james.mime4j.field.structured.parser.StructuredFieldParser; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.stream.FieldParser; -import org.apache.james.mime4j.util.ByteSequence; /** * Represents a Content-Transfer-Encoding field. @@ -38,8 +37,8 @@ public class ContentLocationFieldImpl ex private String location; private ParseException parseException; - ContentLocationFieldImpl(String name, String body, ByteSequence raw, DecodeMonitor monitor) { - super(name, body, raw, monitor); + ContentLocationFieldImpl(Field rawField, DecodeMonitor monitor) { + super(rawField, monitor); } private void parse() { @@ -81,7 +80,7 @@ public class ContentLocationFieldImpl ex public static final FieldParser PARSER = new FieldParser() { public ContentLocationField parse(final Field rawField, final DecodeMonitor monitor) { - return new ContentLocationFieldImpl(rawField.getName(), rawField.getBody(), rawField.getRaw(), monitor); + return new ContentLocationFieldImpl(rawField, monitor); } }; Modified: 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=1127570&r1=1127569&r2=1127570&view=diff ============================================================================== --- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentMD5FieldImpl.java (original) +++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentMD5FieldImpl.java Wed May 25 15:47:57 2011 @@ -23,7 +23,6 @@ import org.apache.james.mime4j.codec.Dec import org.apache.james.mime4j.dom.field.ContentMD5Field; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.stream.FieldParser; -import org.apache.james.mime4j.util.ByteSequence; /** * Represents a Content-MD5 field. @@ -33,8 +32,8 @@ public class ContentMD5FieldImpl extends private boolean parsed = false; private String md5raw; - ContentMD5FieldImpl(String name, String body, ByteSequence raw, DecodeMonitor monitor) { - super(name, body, raw, monitor); + ContentMD5FieldImpl(Field rawField, DecodeMonitor monitor) { + super(rawField, monitor); } private void parse() { @@ -57,7 +56,7 @@ public class ContentMD5FieldImpl extends public static final FieldParser PARSER = new FieldParser() { public ContentMD5Field parse(final Field rawField, final DecodeMonitor monitor) { - return new ContentMD5FieldImpl(rawField.getName(), rawField.getBody(), rawField.getRaw(), monitor); + return new ContentMD5FieldImpl(rawField, monitor); } }; 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=1127570&r1=1127569&r2=1127570&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 Wed May 25 15:47:57 2011 @@ -25,7 +25,6 @@ import org.apache.james.mime4j.codec.Dec import org.apache.james.mime4j.dom.field.ContentTransferEncodingField; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.stream.FieldParser; -import org.apache.james.mime4j.util.ByteSequence; import org.apache.james.mime4j.util.MimeUtil; /** @@ -36,8 +35,8 @@ public class ContentTransferEncodingFiel private boolean parsed = false; private String encoding; - ContentTransferEncodingFieldImpl(String name, String body, ByteSequence raw, DecodeMonitor monitor) { - super(name, body, raw, monitor); + ContentTransferEncodingFieldImpl(Field rawField, DecodeMonitor monitor) { + super(rawField, monitor); } private void parse() { @@ -77,7 +76,7 @@ public class ContentTransferEncodingFiel public static final FieldParser PARSER = new FieldParser() { public ContentTransferEncodingField parse(final Field rawField, final DecodeMonitor monitor) { - return new ContentTransferEncodingFieldImpl(rawField.getName(), rawField.getBody(), rawField.getRaw(), monitor); + return new ContentTransferEncodingFieldImpl(rawField, monitor); } }; Modified: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentTypeFieldImpl.java URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentTypeFieldImpl.java?rev=1127570&r1=1127569&r2=1127570&view=diff ============================================================================== --- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentTypeFieldImpl.java (original) +++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentTypeFieldImpl.java Wed May 25 15:47:57 2011 @@ -32,7 +32,6 @@ import org.apache.james.mime4j.field.con import org.apache.james.mime4j.field.contenttype.parser.TokenMgrError; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.stream.FieldParser; -import org.apache.james.mime4j.util.ByteSequence; /** * Represents a Content-Type field. @@ -46,8 +45,8 @@ public class ContentTypeFieldImpl extend private Map parameters = new HashMap(); private ParseException parseException; - ContentTypeFieldImpl(String name, String body, ByteSequence raw, DecodeMonitor monitor) { - super(name, body, raw, monitor); + ContentTypeFieldImpl(Field rawField, DecodeMonitor monitor) { + super(rawField, monitor); } /** @@ -226,7 +225,7 @@ public class ContentTypeFieldImpl extend public static final FieldParser PARSER = new FieldParser() { public ContentTypeField parse(final Field rawField, final DecodeMonitor monitor) { - return new ContentTypeFieldImpl(rawField.getName(), rawField.getBody(), rawField.getRaw(), monitor); + return new ContentTypeFieldImpl(rawField, monitor); } }; Added: 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=1127570&view=auto ============================================================================== --- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentTypeFieldLenientImpl.java (added) +++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentTypeFieldLenientImpl.java Wed May 25 15:47:57 2011 @@ -0,0 +1,152 @@ +/**************************************************************** + * 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.Collections; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +import org.apache.james.mime4j.codec.DecodeMonitor; +import org.apache.james.mime4j.dom.field.ContentTypeField; +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 Content-Type field. + */ +public class ContentTypeFieldLenientImpl extends AbstractField implements ContentTypeField { + + private boolean parsed = false; + + private String mimeType = null; + private String mediaType = null; + private String subType = null; + private Map parameters = new HashMap(); + + ContentTypeFieldLenientImpl(Field rawField, DecodeMonitor monitor) { + super(rawField, monitor); + } + + public String getMimeType() { + if (!parsed) { + parse(); + } + return mimeType; + } + + public String getMediaType() { + if (!parsed) { + parse(); + } + return mediaType; + } + + public String getSubType() { + if (!parsed) { + parse(); + } + return subType; + } + + public String getParameter(String name) { + if (!parsed) { + parse(); + } + return parameters.get(name.toLowerCase()); + } + + public Map getParameters() { + if (!parsed) { + parse(); + } + return Collections.unmodifiableMap(parameters); + } + + public boolean isMimeType(String mimeType) { + if (!parsed) { + parse(); + } + return this.mimeType != null && this.mimeType.equalsIgnoreCase(mimeType); + } + + public boolean isMultipart() { + if (!parsed) { + parse(); + } + return this.mimeType != null && mimeType.startsWith(TYPE_MULTIPART_PREFIX); + } + + public String getBoundary() { + return getParameter(PARAM_BOUNDARY); + } + + public String getCharset() { + return getParameter(PARAM_CHARSET); + } + + private void parse() { + parsed = true; + RawField f = getRawField(); + RawBody body = RawFieldParser.DEFAULT.parseRawBody(f); + String main = body.getValue(); + String type = null; + String subtype = null; + if (main != null) { + main = main.toLowerCase().trim(); + int index = main.indexOf('/'); + boolean valid = false; + if (index != -1) { + type = main.substring(0, index).trim(); + subtype = main.substring(index + 1).trim(); + if (type.length() > 0 && subtype.length() > 0) { + main = type + "/" + subtype; + valid = true; + } + } + if (!valid) { + main = null; + type = null; + subtype = null; + } + } + mimeType = main; + mediaType = type; + subType = subtype; + parameters.clear(); + for (NameValuePair nmp: body.getParams()) { + String name = nmp.getName().toLowerCase(Locale.US); + parameters.put(name, nmp.getValue()); + } + } + + public static final FieldParser PARSER = new FieldParser() { + + public ContentTypeField parse(final Field rawField, final DecodeMonitor monitor) { + return new ContentTypeFieldLenientImpl(rawField, monitor); + } + + }; + +} Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentTypeFieldLenientImpl.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentTypeFieldLenientImpl.java ------------------------------------------------------------------------------ svn:keywords = Date Revision Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/ContentTypeFieldLenientImpl.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/DateTimeFieldImpl.java URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/DateTimeFieldImpl.java?rev=1127570&r1=1127569&r2=1127570&view=diff ============================================================================== --- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/DateTimeFieldImpl.java (original) +++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/DateTimeFieldImpl.java Wed May 25 15:47:57 2011 @@ -29,7 +29,6 @@ import org.apache.james.mime4j.field.dat import org.apache.james.mime4j.field.datetime.parser.TokenMgrError; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.stream.FieldParser; -import org.apache.james.mime4j.util.ByteSequence; /** * Date-time field such as Date or Resent-Date. @@ -40,8 +39,8 @@ public class DateTimeFieldImpl extends A private Date date; private ParseException parseException; - DateTimeFieldImpl(String name, String body, ByteSequence raw, DecodeMonitor monitor) { - super(name, body, raw, monitor); + DateTimeFieldImpl(Field rawField, DecodeMonitor monitor) { + super(rawField, monitor); } /** @@ -83,7 +82,7 @@ public class DateTimeFieldImpl extends A public static final FieldParser PARSER = new FieldParser() { public DateTimeField parse(final Field rawField, final DecodeMonitor monitor) { - return new DateTimeFieldImpl(rawField.getName(), rawField.getBody(), rawField.getRaw(), monitor); + return new DateTimeFieldImpl(rawField, monitor); } }; Added: 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=1127570&view=auto ============================================================================== --- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/LenientFieldParser.java (added) +++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/LenientFieldParser.java Wed May 25 15:47:57 2011 @@ -0,0 +1,134 @@ +/**************************************************************** + * 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.MimeException; +import org.apache.james.mime4j.codec.DecodeMonitor; +import org.apache.james.mime4j.dom.field.AddressListField; +import org.apache.james.mime4j.dom.field.DateTimeField; +import org.apache.james.mime4j.dom.field.FieldName; +import org.apache.james.mime4j.dom.field.MailboxField; +import org.apache.james.mime4j.dom.field.MailboxListField; +import org.apache.james.mime4j.dom.field.ParsedField; +import org.apache.james.mime4j.stream.Field; +import org.apache.james.mime4j.stream.FieldParser; +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 LenientFieldParser extends DelegatingFieldParser { + + private static final LenientFieldParser PARSER = new LenientFieldParser(); + + /** + * Gets the default parser used to parse fields. + * + * @return the default field parser + */ + public static LenientFieldParser getParser() { + return PARSER; + } + + /** + * Parses the given byte sequence and returns an instance of the + * Field class. The type of the class returned depends on the + * field name. + * + * @param raw the bytes to parse. + * @param monitor a DecodeMonitor object used while parsing/decoding. + * @return a ParsedField instance. + * @throws MimeException if the raw string cannot be split into field name and body. + */ + public static ParsedField parse( + final ByteSequence raw, + final DecodeMonitor monitor) throws MimeException { + Field rawField = RawFieldParser.DEFAULT.parseField(raw); + return PARSER.parse(rawField, monitor); + } + + /** + * Parses the given string and returns an instance of the Field class. + * The type of the class returned depends on the field name. + * + * @param rawStr the string to parse. + * @param monitor a DecodeMonitor object used while parsing/decoding. + * @return a ParsedField instance. + * @throws MimeException if the raw string cannot be split into field name and body. + */ + public static ParsedField parse( + final String rawStr, + final DecodeMonitor monitor) throws MimeException { + ByteSequence raw = ContentUtil.encode(rawStr); + RawField rawField = RawFieldParser.DEFAULT.parseField(raw); + // Do not retain the original raw representation as the field + // may require folding + return PARSER.parse(rawField, monitor); + } + + public static ParsedField parse(final String rawStr) throws MimeException { + return parse(rawStr, DecodeMonitor.SILENT); + } + + public LenientFieldParser() { + setFieldParser(FieldName.CONTENT_TYPE, + ContentTypeFieldLenientImpl.PARSER); + setFieldParser(FieldName.CONTENT_LENGTH, + ContentLengthFieldImpl.PARSER); + setFieldParser(FieldName.CONTENT_TRANSFER_ENCODING, + ContentTransferEncodingFieldImpl.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 dateTimeParser = DateTimeFieldImpl.PARSER; + setFieldParser(FieldName.DATE, dateTimeParser); + setFieldParser(FieldName.RESENT_DATE, dateTimeParser); + + final FieldParser mailboxListParser = MailboxListFieldImpl.PARSER; + setFieldParser(FieldName.FROM, mailboxListParser); + setFieldParser(FieldName.RESENT_FROM, mailboxListParser); + + final FieldParser mailboxParser = MailboxFieldImpl.PARSER; + setFieldParser(FieldName.SENDER, mailboxParser); + setFieldParser(FieldName.RESENT_SENDER, mailboxParser); + + final FieldParser addressListParser = AddressListFieldImpl.PARSER; + setFieldParser(FieldName.TO, addressListParser); + setFieldParser(FieldName.RESENT_TO, addressListParser); + setFieldParser(FieldName.CC, addressListParser); + setFieldParser(FieldName.RESENT_CC, addressListParser); + setFieldParser(FieldName.BCC, addressListParser); + setFieldParser(FieldName.RESENT_BCC, addressListParser); + setFieldParser(FieldName.REPLY_TO, addressListParser); + } + +} Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/LenientFieldParser.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/LenientFieldParser.java ------------------------------------------------------------------------------ svn:keywords = Date Revision Propchange: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/LenientFieldParser.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/MailboxFieldImpl.java URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/MailboxFieldImpl.java?rev=1127570&r1=1127569&r2=1127570&view=diff ============================================================================== --- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/MailboxFieldImpl.java (original) +++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/MailboxFieldImpl.java Wed May 25 15:47:57 2011 @@ -27,7 +27,6 @@ import org.apache.james.mime4j.field.add import org.apache.james.mime4j.field.address.ParseException; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.stream.FieldParser; -import org.apache.james.mime4j.util.ByteSequence; /** * Mailbox field such as Sender or Resent-Sender. @@ -38,8 +37,8 @@ public class MailboxFieldImpl extends Ab private Mailbox mailbox; private ParseException parseException; - MailboxFieldImpl(final String name, final String body, final ByteSequence raw, DecodeMonitor monitor) { - super(name, body, raw, monitor); + MailboxFieldImpl(Field rawField, DecodeMonitor monitor) { + super(rawField, monitor); } /** @@ -81,7 +80,7 @@ public class MailboxFieldImpl extends Ab public static final FieldParser PARSER = new FieldParser() { public MailboxField parse(final Field rawField, final DecodeMonitor monitor) { - return new MailboxFieldImpl(rawField.getName(), rawField.getBody(), rawField.getRaw(), monitor); + return new MailboxFieldImpl(rawField, monitor); } }; Modified: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/MailboxListFieldImpl.java URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/MailboxListFieldImpl.java?rev=1127570&r1=1127569&r2=1127570&view=diff ============================================================================== --- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/MailboxListFieldImpl.java (original) +++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/MailboxListFieldImpl.java Wed May 25 15:47:57 2011 @@ -26,7 +26,6 @@ import org.apache.james.mime4j.field.add import org.apache.james.mime4j.field.address.ParseException; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.stream.FieldParser; -import org.apache.james.mime4j.util.ByteSequence; /** * Mailbox-list field such as From or Resent-From. @@ -37,8 +36,8 @@ public class MailboxListFieldImpl extend private MailboxList mailboxList; private ParseException parseException; - MailboxListFieldImpl(final String name, final String body, final ByteSequence raw, DecodeMonitor monitor) { - super(name, body, raw, monitor); + MailboxListFieldImpl(Field rawField, DecodeMonitor monitor) { + super(rawField, monitor); } /** @@ -77,7 +76,7 @@ public class MailboxListFieldImpl extend public static final FieldParser PARSER = new FieldParser() { public MailboxListField parse(final Field rawField, final DecodeMonitor monitor) { - return new MailboxListFieldImpl(rawField.getName(), rawField.getBody(), rawField.getRaw(), monitor); + return new MailboxListFieldImpl(rawField, monitor); } }; Modified: 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=1127570&r1=1127569&r2=1127570&view=diff ============================================================================== --- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/MimeVersionFieldImpl.java (original) +++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/MimeVersionFieldImpl.java Wed May 25 15:47:57 2011 @@ -28,7 +28,6 @@ import org.apache.james.mime4j.field.mim import org.apache.james.mime4j.field.mimeversion.parser.ParseException; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.stream.FieldParser; -import org.apache.james.mime4j.util.ByteSequence; /** * Represents a MIME-Version field. @@ -43,8 +42,8 @@ public class MimeVersionFieldImpl extend private int minor = DEFAULT_MINOR_VERSION; private ParseException parsedException; - MimeVersionFieldImpl(String name, String body, ByteSequence raw, DecodeMonitor monitor) { - super(name, body, raw, monitor); + MimeVersionFieldImpl(Field rawField, DecodeMonitor monitor) { + super(rawField, monitor); } private void parse() { @@ -93,7 +92,7 @@ public class MimeVersionFieldImpl extend public static final FieldParser PARSER = new FieldParser() { public MimeVersionField parse(final Field rawField, final DecodeMonitor monitor) { - return new MimeVersionFieldImpl(rawField.getName(), rawField.getBody(), rawField.getRaw(), monitor); + return new MimeVersionFieldImpl(rawField, monitor); } }; Modified: james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/UnstructuredFieldImpl.java URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/UnstructuredFieldImpl.java?rev=1127570&r1=1127569&r2=1127570&view=diff ============================================================================== --- james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/UnstructuredFieldImpl.java (original) +++ james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/field/UnstructuredFieldImpl.java Wed May 25 15:47:57 2011 @@ -24,18 +24,17 @@ import org.apache.james.mime4j.codec.Dec import org.apache.james.mime4j.dom.field.UnstructuredField; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.stream.FieldParser; -import org.apache.james.mime4j.util.ByteSequence; /** * Simple unstructured field such as Subject. */ -public class UnstructuredFieldImpl extends AbstractField implements org.apache.james.mime4j.dom.field.UnstructuredField { +public class UnstructuredFieldImpl extends AbstractField implements UnstructuredField { private boolean parsed = false; private String value; - UnstructuredFieldImpl(String name, String body, ByteSequence raw, DecodeMonitor monitor) { - super(name, body, raw, monitor); + UnstructuredFieldImpl(Field rawField, DecodeMonitor monitor) { + super(rawField, monitor); } /** @@ -59,7 +58,7 @@ public class UnstructuredFieldImpl exten public static final FieldParser PARSER = new FieldParser() { public UnstructuredField parse(final Field rawField, final DecodeMonitor monitor) { - return new UnstructuredFieldImpl(rawField.getName(), rawField.getBody(), rawField.getRaw(), monitor); + return new UnstructuredFieldImpl(rawField, monitor); } }; Modified: james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/ContentTypeFieldTest.java URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/ContentTypeFieldTest.java?rev=1127570&r1=1127569&r2=1127570&view=diff ============================================================================== --- james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/ContentTypeFieldTest.java (original) +++ james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/ContentTypeFieldTest.java Wed May 25 15:47:57 2011 @@ -19,83 +19,83 @@ package org.apache.james.mime4j.field; +import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.dom.field.ContentTypeField; import org.apache.james.mime4j.field.ContentTypeFieldImpl; -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 ContentTypeFieldTest extends TestCase { + static ContentTypeField parse(final String s) throws MimeException { + ByteSequence raw = ContentUtil.encode(s); + RawField rawField = RawFieldParser.DEFAULT.parseField(raw); + return ContentTypeFieldImpl.PARSER.parse(rawField, null); + } + public void testMimeTypeWithSemiColonNoParams() throws Exception { - ContentTypeField f = null; - - f = (ContentTypeField) DefaultFieldParser.parse("Content-Type: text/html;"); + ContentTypeField f = parse("Content-Type: text/html;"); assertEquals("text/html", f.getMimeType()); } public void testGetMimeType() throws Exception { - ContentTypeField f = null; - - f = (ContentTypeField) DefaultFieldParser.parse("Content-Type: text/PLAIN"); + ContentTypeField f = parse("Content-Type: text/PLAIN"); assertEquals("text/plain", f.getMimeType()); - f = (ContentTypeField) DefaultFieldParser.parse("content-type: TeXt / html "); + f = parse("content-type: TeXt / html "); assertEquals("text/html", f.getMimeType()); - f = (ContentTypeField) DefaultFieldParser.parse("CONTENT-TYPE: x-app/yada ;" + f = parse("CONTENT-TYPE: x-app/yada ;" + " param = yada"); assertEquals("x-app/yada", f.getMimeType()); - f = (ContentTypeField) DefaultFieldParser.parse("CONTENT-TYPE: yada"); + f = parse("CONTENT-TYPE: yada"); assertEquals(null, f.getMimeType()); } public void testGetMimeTypeStatic() throws Exception { - ContentTypeField child = null; - ContentTypeField parent = null; + ContentTypeField child = parse("Content-Type: child/type");; + ContentTypeField parent = parse("Content-Type: parent/type"); - child = (ContentTypeField) DefaultFieldParser.parse("Content-Type: child/type"); - parent = (ContentTypeField) DefaultFieldParser.parse("Content-Type: parent/type"); assertEquals("child/type", ContentTypeFieldImpl.getMimeType(child, parent)); child = null; - parent = (ContentTypeField) DefaultFieldParser.parse("Content-Type: parent/type"); + parent = parse("Content-Type: parent/type"); assertEquals("text/plain", ContentTypeFieldImpl.getMimeType(child, parent)); - parent = (ContentTypeField) DefaultFieldParser.parse("Content-Type: multipart/digest"); + parent = parse("Content-Type: multipart/digest"); assertEquals("message/rfc822", ContentTypeFieldImpl.getMimeType(child, parent)); - child = (ContentTypeField) DefaultFieldParser.parse("Content-Type:"); - parent = (ContentTypeField) DefaultFieldParser.parse("Content-Type: parent/type"); + child = parse("Content-Type:"); + parent = parse("Content-Type: parent/type"); assertEquals("text/plain", ContentTypeFieldImpl.getMimeType(child, parent)); - parent = (ContentTypeField) DefaultFieldParser.parse("Content-Type: multipart/digest"); + parent = parse("Content-Type: multipart/digest"); assertEquals("message/rfc822", ContentTypeFieldImpl.getMimeType(child, parent)); } public void testGetCharsetStatic() throws Exception { - ContentTypeField f = null; - - f = (ContentTypeField) DefaultFieldParser.parse("Content-Type: some/type; charset=iso8859-1"); + ContentTypeField f = parse("Content-Type: some/type; charset=iso8859-1"); assertEquals("iso8859-1", ContentTypeFieldImpl.getCharset(f)); - f = (ContentTypeField) DefaultFieldParser.parse("Content-Type: some/type;"); + f = parse("Content-Type: some/type;"); assertEquals("us-ascii", ContentTypeFieldImpl.getCharset(f)); } public void testGetParameter() throws Exception { - ContentTypeField f = null; - - f = (ContentTypeField) DefaultFieldParser.parse("CONTENT-TYPE: text / html ;" + ContentTypeField f = parse("CONTENT-TYPE: text / html ;" + " boundary=yada yada"); assertEquals("yada", f.getParameter("boundary")); - f = (ContentTypeField) DefaultFieldParser.parse("Content-Type: x-app/yada;" + f = parse("Content-Type: x-app/yada;" + " boUNdarY= \"ya:\\\"*da\"; " + "\tcharset\t = us-ascii"); assertEquals("ya:\"*da", f.getParameter("boundary")); assertEquals("us-ascii", f.getParameter("charset")); - f = (ContentTypeField) DefaultFieldParser.parse("Content-Type: x-app/yada; " + f = parse("Content-Type: x-app/yada; " + "boUNdarY= \"ya \\\"\\\"\tda \\\"\"; " + "\tcharset\t = \"\\\"hepp\\\" =us\t-ascii\""); assertEquals("ya \"\"\tda \"", f.getParameter("boundary")); Added: james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/LenientContentTypeFieldTest.java URL: http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/LenientContentTypeFieldTest.java?rev=1127570&view=auto ============================================================================== --- james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/LenientContentTypeFieldTest.java (added) +++ james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/LenientContentTypeFieldTest.java Wed May 25 15:47:57 2011 @@ -0,0 +1,90 @@ +/**************************************************************** + * 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.MimeException; +import org.apache.james.mime4j.dom.field.ContentTypeField; +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 LenientContentTypeFieldTest extends TestCase { + + static ContentTypeField parse(final String s) throws MimeException { + ByteSequence raw = ContentUtil.encode(s); + RawField rawField = RawFieldParser.DEFAULT.parseField(raw); + return ContentTypeFieldLenientImpl.PARSER.parse(rawField, null); + } + + public void testMimeTypeWithSemiColonNoParams() throws Exception { + ContentTypeField f = parse("Content-Type: text/html;"); + assertEquals("text/html", f.getMimeType()); + } + + public void testMimeTypeWithMultipleSemiColon() throws Exception { + ContentTypeField f = parse("Content-Type: text/html;;;"); + assertEquals("text/html", f.getMimeType()); + assertEquals(1, f.getParameters().size()); + } + + public void testMimeTypeWithNonameParam() throws Exception { + ContentTypeField f = parse("Content-Type: text/html;=stuff"); + assertEquals("text/html", f.getMimeType()); + assertEquals(1, f.getParameters().size()); + assertEquals("stuff", f.getParameter("")); + } + + public void testGetMimeType() throws Exception { + ContentTypeField f = parse("Content-Type: text/PLAIN"); + assertEquals("text/plain", f.getMimeType()); + + f = parse("content-type: TeXt / html "); + assertEquals("text/html", f.getMimeType()); + + f = parse("CONTENT-TYPE: x-app/yada ;" + + " param = yada"); + assertEquals("x-app/yada", f.getMimeType()); + + f = parse("CONTENT-TYPE: yada"); + assertEquals(null, f.getMimeType()); + } + + public void testGetParameter() throws Exception { + ContentTypeField f = parse("CONTENT-TYPE: text / html ;" + + " boundary=yada yada"); + assertEquals("yada yada", f.getParameter("boundary")); + + f = parse("Content-Type: x-app/yada;" + + " boUNdarY= \"ya:\\\"*da\"; " + + "\tcharset\t = us-ascii"); + assertEquals("ya:\"*da", f.getParameter("boundary")); + assertEquals("us-ascii", f.getParameter("charset")); + + f = parse("Content-Type: x-app/yada; " + + "boUNdarY= \"ya \\\"\\\"\tda \\\"\"; " + + "\tcharset\t = \"\\\"hepp\\\" =us\t-ascii\""); + assertEquals("ya \"\"\tda \"", f.getParameter("boundary")); + assertEquals("\"hepp\" =us\t-ascii", f.getParameter("charset")); + } + +} Propchange: james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/LenientContentTypeFieldTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/LenientContentTypeFieldTest.java ------------------------------------------------------------------------------ svn:keywords = Date Revision Propchange: james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/field/LenientContentTypeFieldTest.java ------------------------------------------------------------------------------ svn:mime-type = text/plain