1d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen/****************************************************************
2d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * Licensed to the Apache Software Foundation (ASF) under one   *
3d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * or more contributor license agreements.  See the NOTICE file *
4d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * distributed with this work for additional information        *
5d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * regarding copyright ownership.  The ASF licenses this file   *
6d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * to you under the Apache License, Version 2.0 (the            *
7d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * "License"); you may not use this file except in compliance   *
8d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * with the License.  You may obtain a copy of the License at   *
9d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen *                                                              *
10d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen *   http://www.apache.org/licenses/LICENSE-2.0                 *
11d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen *                                                              *
12d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * Unless required by applicable law or agreed to in writing,   *
13d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * software distributed under the License is distributed on an  *
14d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
15d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * KIND, either express or implied.  See the License for the    *
16d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * specific language governing permissions and limitations      *
17d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * under the License.                                           *
18d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen ****************************************************************/
19d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
20d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chenpackage org.apache.james.mime4j.field;
21d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
22d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chenimport java.io.StringReader;
23d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chenimport java.util.ArrayList;
24d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chenimport java.util.Collections;
25d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chenimport java.util.HashMap;
26d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chenimport java.util.Map;
27d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
28d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen//BEGIN android-changed: Stubbing out logging
29d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chenimport org.apache.james.mime4j.Log;
30d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chenimport org.apache.james.mime4j.LogFactory;
31d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen//END android-changed
32d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chenimport org.apache.james.mime4j.field.contenttype.parser.ContentTypeParser;
33d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chenimport org.apache.james.mime4j.field.contenttype.parser.ParseException;
34d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chenimport org.apache.james.mime4j.field.contenttype.parser.TokenMgrError;
35d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
36d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen/**
37d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * Represents a <code>Content-Type</code> field.
38d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen *
39d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * <p>TODO: Remove dependency on Java 1.4 regexps</p>
40d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen *
41d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen *
42d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * @version $Id: ContentTypeField.java,v 1.6 2005/01/27 14:16:31 ntherning Exp $
43d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen */
44d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chenpublic class ContentTypeField extends Field {
45d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
46d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    /**
47d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * The prefix of all <code>multipart</code> MIME types.
48d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     */
49d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    public static final String TYPE_MULTIPART_PREFIX = "multipart/";
50d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    /**
51d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * The <code>multipart/digest</code> MIME type.
52d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     */
53d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    public static final String TYPE_MULTIPART_DIGEST = "multipart/digest";
54d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    /**
55d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * The <code>text/plain</code> MIME type.
56d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     */
57d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    public static final String TYPE_TEXT_PLAIN = "text/plain";
58d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    /**
59d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * The <code>message/rfc822</code> MIME type.
60d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     */
61d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    public static final String TYPE_MESSAGE_RFC822 = "message/rfc822";
62d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    /**
63d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * The name of the <code>boundary</code> parameter.
64d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     */
65d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    public static final String PARAM_BOUNDARY = "boundary";
66d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    /**
67d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * The name of the <code>charset</code> parameter.
68d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     */
69d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    public static final String PARAM_CHARSET = "charset";
70d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
71d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    private String mimeType = "";
72d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    private Map<String, String> parameters = null;
73d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    private ParseException parseException;
74d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
75d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    protected ContentTypeField(String name, String body, String raw, String mimeType, Map<String, String> parameters, ParseException parseException) {
76d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen        super(name, body, raw);
77d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen        this.mimeType = mimeType;
78d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen        this.parameters = parameters;
79d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen        this.parseException = parseException;
80d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    }
81d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
82d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    /**
83d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * Gets the exception that was raised during parsing of
84d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * the field value, if any; otherwise, null.
85d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     */
86d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    public ParseException getParseException() {
87d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen        return parseException;
88d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    }
89d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
90d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    /**
91d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * Gets the MIME type defined in this Content-Type field.
92d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     *
93d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * @return the MIME type or an empty string if not set.
94d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     */
95d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    public String getMimeType() {
96d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen        return mimeType;
97d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    }
98d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
99d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    /**
100d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * Gets the MIME type defined in the child's
101d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * Content-Type field or derives a MIME type from the parent
102d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * if child is <code>null</code> or hasn't got a MIME type value set.
103d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * If child's MIME type is multipart but no boundary
104d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * has been set the MIME type of child will be derived from
105d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * the parent.
106d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     *
107d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * @param child the child.
108d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * @param parent the parent.
109d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * @return the MIME type.
110d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     */
111d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    public static String getMimeType(ContentTypeField child,
112d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                                     ContentTypeField parent) {
113d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
114d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen        if (child == null || child.getMimeType().length() == 0
115d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                || child.isMultipart() && child.getBoundary() == null) {
116d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
117d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen            if (parent != null && parent.isMimeType(TYPE_MULTIPART_DIGEST)) {
118d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                return TYPE_MESSAGE_RFC822;
119d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen            } else {
120d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                return TYPE_TEXT_PLAIN;
121d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen            }
122d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen        }
123d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
124d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen        return child.getMimeType();
125d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    }
126d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
127d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    /**
128d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * Gets the value of a parameter. Parameter names are case-insensitive.
129d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     *
130d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * @param name the name of the parameter to get.
131d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * @return the parameter value or <code>null</code> if not set.
132d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     */
133d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    public String getParameter(String name) {
134d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen        return parameters != null
135d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                    ? parameters.get(name.toLowerCase())
136d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                    : null;
137d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    }
138d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
139d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    /**
140d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * Gets all parameters.
141d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     *
142d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * @return the parameters.
143d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     */
144d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    public Map<String, String> getParameters() {
145d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen        if (parameters != null) {
146d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen            return Collections.unmodifiableMap(parameters);
147d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen        }
148d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen        return Collections.emptyMap();
149d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    }
150d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
151d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    /**
152d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * Gets the value of the <code>boundary</code> parameter if set.
153d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     *
154d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * @return the <code>boundary</code> parameter value or <code>null</code>
155d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     *             if not set.
156d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     */
157d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    public String getBoundary() {
158d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen        return getParameter(PARAM_BOUNDARY);
159d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    }
160d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
161d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    /**
162d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * Gets the value of the <code>charset</code> parameter if set.
163d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     *
164d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * @return the <code>charset</code> parameter value or <code>null</code>
165d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     *         if not set.
166d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     */
167d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    public String getCharset() {
168d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen        return getParameter(PARAM_CHARSET);
169d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    }
170d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
171d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    /**
172d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * Gets the value of the <code>charset</code> parameter if set for the
173d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * given field. Returns the default <code>us-ascii</code> if not set or if
174d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * <code>f</code> is <code>null</code>.
175d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     *
176d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * @return the <code>charset</code> parameter value.
177d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     */
178d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    public static String getCharset(ContentTypeField f) {
179d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen        if (f != null) {
180d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen            if (f.getCharset() != null && f.getCharset().length() > 0) {
181d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                return f.getCharset();
182d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen            }
183d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen        }
184d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen        return "us-ascii";
185d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    }
186d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
187d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    /**
188d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * Determines if the MIME type of this field matches the given one.
189d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     *
190d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * @param mimeType the MIME type to match against.
191d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * @return <code>true</code> if the MIME type of this field matches,
192d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     *         <code>false</code> otherwise.
193d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     */
194d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    public boolean isMimeType(String mimeType) {
195d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen        return this.mimeType.equalsIgnoreCase(mimeType);
196d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    }
197d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
198d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    /**
199d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * Determines if the MIME type of this field is <code>multipart/*</code>.
200d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     *
201d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     * @return <code>true</code> if this field is has a <code>multipart/*</code>
202d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     *         MIME type, <code>false</code> otherwise.
203d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen     */
204d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    public boolean isMultipart() {
205d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen        return mimeType.startsWith(TYPE_MULTIPART_PREFIX);
206d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    }
207d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
208d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    public static class Parser implements FieldParser {
209d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen        private static Log log = LogFactory.getLog(Parser.class);
210d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
211d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen        public Field parse(final String name, final String body, final String raw) {
212d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen            ParseException parseException = null;
213d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen            String mimeType = "";
214d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen            Map<String, String> parameters = null;
215d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
216d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen            ContentTypeParser parser = new ContentTypeParser(new StringReader(body));
217d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen            try {
218d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                parser.parseAll();
219d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen            }
220d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen            catch (ParseException e) {
221d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                if (log.isDebugEnabled()) {
222d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                    log.debug("Parsing value '" + body + "': "+ e.getMessage());
223d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                }
224d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                parseException = e;
225d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen            }
226d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen            catch (TokenMgrError e) {
227d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                if (log.isDebugEnabled()) {
228d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                    log.debug("Parsing value '" + body + "': "+ e.getMessage());
229d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                }
230d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                parseException = new ParseException(e.getMessage());
231d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen            }
232d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
233d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen            try {
234d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                final String type = parser.getType();
235d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                final String subType = parser.getSubType();
236d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
237d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                if (type != null && subType != null) {
238d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                    mimeType = (type + "/" + parser.getSubType()).toLowerCase();
239d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
240d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                    ArrayList<String> paramNames = parser.getParamNames();
241d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                    ArrayList<String> paramValues = parser.getParamValues();
242d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen
243d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                    if (paramNames != null && paramValues != null) {
244d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                        for (int i = 0; i < paramNames.size() && i < paramValues.size(); i++) {
245d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                            if (parameters == null)
246d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                                parameters = new HashMap<String, String>((int)(paramNames.size() * 1.3 + 1));
247d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                            String paramName = paramNames.get(i).toLowerCase();
248d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                            String paramValue = paramValues.get(i);
249d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                            parameters.put(paramName, paramValue);
250d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                        }
251d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                    }
252d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen                }
253d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen            }
254d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen            catch (NullPointerException npe) {
255d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen            }
256d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen            return new ContentTypeField(name, body, raw, mimeType, parameters, parseException);
257d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen        }
258d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen    }
259d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen}
260