in geronimo-mail_2.1_spec/src/main/java/jakarta/mail/internet/ParameterList.java [124:210]
public ParameterList(final String list) throws ParseException {
// figure out how parameter handling is to be performed.
getInitialProperties();
// get a token parser for the type information
final HeaderTokenizer tokenizer = new HeaderTokenizer(list, HeaderTokenizer.MIME);
while (true) {
HeaderTokenizer.Token token = tokenizer.next();
if (token.getType() == HeaderTokenizer.Token.EOF) {
// the EOF token terminates parsing.
break;
} else if (token.getType() == ';') {
// each new parameter is separated by a semicolon, including the
// first, which separates
// the parameters from the main part of the header.
// the next token needs to be a parameter name
token = tokenizer.next();
// allow a trailing semicolon on the parameters.
if (token.getType() == HeaderTokenizer.Token.EOF) {
break;
}
if (token.getType() != HeaderTokenizer.Token.ATOM) {
throw new ParseException("Invalid parameter name: " + token.getValue());
}
// get the parameter name as a lower case version for better
// mapping.
String name = token.getValue().toLowerCase();
token = tokenizer.next();
// parameters are name=value, so we must have the "=" here.
if (token.getType() != '=') {
throw new ParseException("Missing '='");
}
// now the value, which may be an atom or a literal
token = tokenizer.next();
if (token.getType() != HeaderTokenizer.Token.ATOM && token.getType() != HeaderTokenizer.Token.QUOTEDSTRING) {
throw new ParseException("Invalid parameter value: " + token.getValue());
}
final String value = token.getValue();
String decodedValue = null;
// we might have to do some additional decoding. A name that
// ends with "*"
// is marked as being encoded, so if requested, we decode the
// value.
if (decodeParameters && name.endsWith("*") && !isMultiSegmentName(name)) {
// the name needs to be pruned of the marker, and we need to
// decode the value.
name = name.substring(0, name.length() - 1);
// get a new decoder
final RFC2231Encoder decoder = new RFC2231Encoder(HeaderTokenizer.MIME);
try {
// decode the value
decodedValue = decoder.decode(value);
} catch (final Exception e) {
// if we're doing things strictly, then raise a parsing
// exception for errors.
// otherwise, leave the value in its current state.
if (decodeParametersStrict) {
throw new ParseException("Invalid RFC2231 encoded parameter");
}
}
_parameters.put(name, new ParameterValue(name, decodedValue, value));
} else if (isMultiSegmentName(name)) {
// multisegment parameter
_multiSegmentParameters.put(new MultiSegmentEntry(name), new ParameterValue(name, value));
} else {
_parameters.put(name, new ParameterValue(name, value));
}
} else {
throw new ParseException("Missing ';'");
}
}
combineSegments();
}