001/****************************************************************
002 * Licensed to the Apache Software Foundation (ASF) under one   *
003 * or more contributor license agreements.  See the NOTICE file *
004 * distributed with this work for additional information        *
005 * regarding copyright ownership.  The ASF licenses this file   *
006 * to you under the Apache License, Version 2.0 (the            *
007 * "License"); you may not use this file except in compliance   *
008 * with the License.  You may obtain a copy of the License at   *
009 *                                                              *
010 *   http://www.apache.org/licenses/LICENSE-2.0                 *
011 *                                                              *
012 * Unless required by applicable law or agreed to in writing,   *
013 * software distributed under the License is distributed on an  *
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
015 * KIND, either express or implied.  See the License for the    *
016 * specific language governing permissions and limitations      *
017 * under the License.                                           *
018 ****************************************************************/
019
020package org.apache.james.mime4j.field;
021
022import java.util.HashMap;
023import java.util.Map;
024
025import org.apache.james.mime4j.codec.DecodeMonitor;
026import org.apache.james.mime4j.dom.FieldParser;
027import org.apache.james.mime4j.dom.field.ParsedField;
028import org.apache.james.mime4j.stream.Field;
029
030public class DelegatingFieldParser implements FieldParser<ParsedField> {
031
032    private final FieldParser<? extends ParsedField> defaultParser;
033    private final Map<String, FieldParser<? extends ParsedField>> parsers;
034
035    public DelegatingFieldParser(final FieldParser<? extends ParsedField> defaultParser) {
036        super();
037        this.defaultParser = defaultParser;
038        this.parsers = new HashMap<String, FieldParser<? extends ParsedField>>();
039    }
040
041    /**
042     * Sets the parser used for the field named <code>name</code>.
043     * @param name the name of the field
044     * @param parser the parser for fields named <code>name</code>
045     */
046    public void setFieldParser(final String name, final FieldParser<? extends ParsedField> parser) {
047        parsers.put(name.toLowerCase(), parser);
048    }
049
050    public FieldParser<? extends ParsedField> getParser(final String name) {
051        final FieldParser<? extends ParsedField> field = parsers.get(name.toLowerCase());
052        if (field == null) {
053            return defaultParser;
054        }
055        return field;
056    }
057
058    public ParsedField parse(final Field rawField, final DecodeMonitor monitor) {
059        final FieldParser<? extends ParsedField> parser = getParser(rawField.getName());
060        return parser.parse(rawField, monitor);
061    }
062}