View Javadoc

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  
21  
22  package org.apache.james.core;
23  
24  import javax.mail.MessagingException;
25  import javax.mail.internet.InternetHeaders;
26  
27  import java.io.ByteArrayOutputStream;
28  import java.io.InputStream;
29  import java.io.OutputStream;
30  import java.io.PrintStream;
31  import java.io.Serializable;
32  import java.util.Enumeration;
33  
34  import org.apache.mailet.base.RFC2822Headers;
35  
36  /**
37   * This interface defines a container for mail headers. Each header must use
38   * MIME format: <pre>name: value</pre>.
39   *
40   */
41  public class MailHeaders extends InternetHeaders implements Serializable, Cloneable {
42  
43      private static final long serialVersionUID = 238748126601L;
44  
45      /**
46       * No argument constructor
47       *
48       * @throws MessagingException if the super class cannot be properly instantiated
49       */
50      public MailHeaders() throws MessagingException {
51          super();
52      }
53  
54      /**
55       * Constructor that takes an InputStream containing the contents
56       * of the set of mail headers.
57       *
58       * @param in the InputStream containing the header data
59       *
60       * @throws MessagingException if the super class cannot be properly instantiated
61       *                            based on the stream
62       */
63      public MailHeaders(InputStream in) throws MessagingException {
64          super();
65          load(in);
66      }
67  
68      /**
69       * Write the headers to an output stream
70       *
71       * @param out the OutputStream to which to write the headers
72       */
73      public void writeTo(OutputStream out) {
74          PrintStream pout;
75          if (out instanceof PrintStream) {
76              pout = (PrintStream)out;
77          } else {
78              pout = new PrintStream(out);
79          }
80          for (Enumeration e = super.getAllHeaderLines(); e.hasMoreElements(); ) {
81              pout.print((String) e.nextElement());
82              pout.print("\r\n");
83          }
84          // Print trailing CRLF
85          pout.print("\r\n");
86      }
87  
88      /**
89       * Generate a representation of the headers as a series of bytes.
90       *
91       * @return the byte array containing the headers
92       */
93      public byte[] toByteArray() {
94          ByteArrayOutputStream headersBytes = new ByteArrayOutputStream();
95          writeTo(headersBytes);
96          return headersBytes.toByteArray();
97      }
98  
99      /**
100      * Check if a particular header is present.
101      *
102      * @return true if the header is present, false otherwise
103      */
104     public boolean isSet(String name) {
105         String[] value = super.getHeader(name);
106         return (value != null && value.length != 0);
107     }
108 
109     /**
110      * If the new header is a Return-Path we get sure that we add it to the top
111      * Javamail, at least until 1.4.0 does the wrong thing if it loaded a stream with 
112      * a return-path in the middle.
113      *
114      * @see javax.mail.internet.InternetHeaders#addHeader(java.lang.String, java.lang.String)
115      */
116     public void addHeader(String arg0, String arg1) {
117         if (RFC2822Headers.RETURN_PATH.equalsIgnoreCase(arg0)) {
118             headers.add(0, new InternetHeader(arg0, arg1));
119         } else {
120             super.addHeader(arg0, arg1);
121         }
122     }
123 
124     /**
125      * If the new header is a Return-Path we get sure that we add it to the top
126      * Javamail, at least until 1.4.0 does the wrong thing if it loaded a stream with 
127      * a return-path in the middle.
128      *
129      * @see javax.mail.internet.InternetHeaders#setHeader(java.lang.String, java.lang.String)
130      */
131     public void setHeader(String arg0, String arg1) {
132         if (RFC2822Headers.RETURN_PATH.equalsIgnoreCase(arg0)) {
133             super.removeHeader(arg0);
134         }
135         super.setHeader(arg0, arg1);
136     }
137 
138     protected Object clone() throws CloneNotSupportedException {
139         // TODO Auto-generated method stub
140         return super.clone();
141     }
142 
143     /**
144      * Check if all REQUIRED headers fields as specified in RFC 822
145      * are present.
146      *
147      * @return true if the headers are present, false otherwise
148      */
149     public boolean isValid() {
150         return (isSet(RFC2822Headers.DATE) && isSet(RFC2822Headers.TO) && isSet(RFC2822Headers.FROM));
151     }
152 }