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