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    
020    package org.apache.james.mime4j.message;
021    
022    import org.apache.james.mime4j.MimeException;
023    import org.apache.james.mime4j.codec.DecodeMonitor;
024    import org.apache.james.mime4j.dom.FieldParser;
025    import org.apache.james.mime4j.dom.Header;
026    import org.apache.james.mime4j.dom.field.ParsedField;
027    import org.apache.james.mime4j.field.LenientFieldParser;
028    import org.apache.james.mime4j.parser.AbstractContentHandler;
029    import org.apache.james.mime4j.stream.Field;
030    
031    /**
032     * Abstract implementation of ContentHandler that automates common
033     * tasks. Currently performs header parsing.
034     *
035     * Older versions of this class performed decoding of content streams.
036     * This can be now easily achieved by calling setContentDecoding(true) on the MimeStreamParser.
037     */
038    public abstract class SimpleContentHandler extends AbstractContentHandler {
039    
040        private final FieldParser<? extends ParsedField> fieldParser;
041        private final DecodeMonitor monitor;
042    
043        public SimpleContentHandler(
044                final FieldParser<? extends ParsedField> fieldParser,
045                final DecodeMonitor monitor) {
046            super();
047            this.fieldParser = fieldParser != null ? fieldParser : LenientFieldParser.getParser();
048            this.monitor = monitor != null ? monitor : DecodeMonitor.SILENT;
049        }
050    
051        public SimpleContentHandler() {
052            this(null, null);
053        }
054    
055        /**
056         * Called after headers are parsed.
057         */
058        public abstract void headers(Header header);
059    
060        /* Implement introduced callbacks. */
061    
062        private Header currHeader;
063    
064        /**
065         * @see org.apache.james.mime4j.parser.AbstractContentHandler#startHeader()
066         */
067        @Override
068        public final void startHeader() {
069            currHeader = new HeaderImpl();
070        }
071    
072        /**
073         * @see org.apache.james.mime4j.parser.AbstractContentHandler#field(Field)
074         */
075        @Override
076        public final void field(Field field) throws MimeException {
077            ParsedField parsedField;
078            if (field instanceof ParsedField) {
079                parsedField = (ParsedField) field;
080            } else {
081                parsedField = fieldParser.parse(field, monitor);
082            }
083            currHeader.addField(parsedField);
084        }
085    
086        /**
087         * @see org.apache.james.mime4j.parser.AbstractContentHandler#endHeader()
088         */
089        @Override
090        public final void endHeader() {
091            Header tmp = currHeader;
092            currHeader = null;
093            headers(tmp);
094        }
095    
096    }