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 }