Home | History | Annotate | Download | only in message
      1 /****************************************************************
      2  * Licensed to the Apache Software Foundation (ASF) under one   *
      3  * or more contributor license agreements.  See the NOTICE file *
      4  * distributed with this work for additional information        *
      5  * regarding copyright ownership.  The ASF licenses this file   *
      6  * to you under the Apache License, Version 2.0 (the            *
      7  * "License"); you may not use this file except in compliance   *
      8  * with the License.  You may obtain a copy of the License at   *
      9  *                                                              *
     10  *   http://www.apache.org/licenses/LICENSE-2.0                 *
     11  *                                                              *
     12  * Unless required by applicable law or agreed to in writing,   *
     13  * software distributed under the License is distributed on an  *
     14  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
     15  * KIND, either express or implied.  See the License for the    *
     16  * specific language governing permissions and limitations      *
     17  * under the License.                                           *
     18  ****************************************************************/
     19 
     20 package org.apache.james.mime4j.message;
     21 
     22 import java.io.BufferedWriter;
     23 import java.io.IOException;
     24 import java.io.InputStream;
     25 import java.io.OutputStream;
     26 import java.io.OutputStreamWriter;
     27 import java.util.Collections;
     28 import java.util.HashMap;
     29 import java.util.Iterator;
     30 import java.util.LinkedList;
     31 import java.util.List;
     32 
     33 import org.apache.james.mime4j.AbstractContentHandler;
     34 import org.apache.james.mime4j.MimeStreamParser;
     35 import org.apache.james.mime4j.field.ContentTypeField;
     36 import org.apache.james.mime4j.field.Field;
     37 import org.apache.james.mime4j.util.CharsetUtil;
     38 
     39 
     40 /**
     41  * The header of an entity (see RFC 2045).
     42  *
     43  *
     44  * @version $Id: Header.java,v 1.3 2004/10/04 15:36:44 ntherning Exp $
     45  */
     46 public class Header {
     47     private List<Field> fields = new LinkedList<Field>();
     48     private HashMap<String, List<Field>> fieldMap = new HashMap<String, List<Field>>();
     49 
     50     /**
     51      * Creates a new empty <code>Header</code>.
     52      */
     53     public Header() {
     54     }
     55 
     56     /**
     57      * Creates a new <code>Header</code> from the specified stream.
     58      *
     59      * @param is the stream to read the header from.
     60      */
     61     public Header(InputStream is) throws IOException {
     62         final MimeStreamParser parser = new MimeStreamParser();
     63         parser.setContentHandler(new AbstractContentHandler() {
     64             @Override
     65             public void endHeader() {
     66                 parser.stop();
     67             }
     68             @Override
     69             public void field(String fieldData) {
     70                 addField(Field.parse(fieldData));
     71             }
     72         });
     73         parser.parse(is);
     74     }
     75 
     76     /**
     77      * Adds a field to the end of the list of fields.
     78      *
     79      * @param field the field to add.
     80      */
     81     public void addField(Field field) {
     82         List<Field> values = fieldMap.get(field.getName().toLowerCase());
     83         if (values == null) {
     84             values = new LinkedList<Field>();
     85             fieldMap.put(field.getName().toLowerCase(), values);
     86         }
     87         values.add(field);
     88         fields.add(field);
     89     }
     90 
     91     /**
     92      * Gets the fields of this header. The returned list will not be
     93      * modifiable.
     94      *
     95      * @return the list of <code>Field</code> objects.
     96      */
     97     public List<Field> getFields() {
     98         return Collections.unmodifiableList(fields);
     99     }
    100 
    101     /**
    102      * Gets a <code>Field</code> given a field name. If there are multiple
    103      * such fields defined in this header the first one will be returned.
    104      *
    105      * @param name the field name (e.g. From, Subject).
    106      * @return the field or <code>null</code> if none found.
    107      */
    108     public Field getField(String name) {
    109         List<Field> l = fieldMap.get(name.toLowerCase());
    110         if (l != null && !l.isEmpty()) {
    111             return l.get(0);
    112         }
    113         return null;
    114     }
    115 
    116     /**
    117      * Gets all <code>Field</code>s having the specified field name.
    118      *
    119      * @param name the field name (e.g. From, Subject).
    120      * @return the list of fields.
    121      */
    122     public List<Field> getFields(String name) {
    123         List<Field> l = fieldMap.get(name.toLowerCase());
    124         return Collections.unmodifiableList(l);
    125     }
    126 
    127     /**
    128      * Return Header Object as String representation. Each headerline is
    129      * seperated by "\r\n"
    130      *
    131      * @return headers
    132      */
    133     @Override
    134     public String toString() {
    135         StringBuffer str = new StringBuffer();
    136         for (Iterator<Field> it = fields.iterator(); it.hasNext();) {
    137             str.append(it.next().toString());
    138             str.append("\r\n");
    139         }
    140         return str.toString();
    141     }
    142 
    143 
    144     /**
    145      * Write the Header to the given OutputStream
    146      *
    147      * @param out the OutputStream to write to
    148      * @throws IOException
    149      */
    150     public void writeTo(OutputStream out) throws IOException {
    151         String charString = ((ContentTypeField) getField(Field.CONTENT_TYPE)).getCharset();
    152 
    153         BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out, CharsetUtil.getCharset(charString)),8192);
    154         writer.write(toString()+ "\r\n");
    155         writer.flush();
    156     }
    157 
    158 }
    159