public ParameterList()

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();
    }