1   /*
2    * Dumbster: a dummy SMTP server.
3    * Copyright (C) 2003, Jason Paul Kitchen
4    * lilnottsman@yahoo.com
5    *
6    * This library is free software; you can redistribute it and/or
7    * modify it under the terms of the GNU Lesser General Public
8    * License as published by the Free Software Foundation; either
9    * version 2.1 of the License, or (at your option) any later version.
10   *
11   * This library is distributed in the hope that it will be useful,
12   * but WITHOUT ANY WARRANTY; without even the implied warranty of
13   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14   * Lesser General Public License for more details.
15   *
16   * You should have received a copy of the GNU Lesser General Public
17   * License along with this library; if not, write to the Free Software
18   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19   */
20  package com.dumbster.smtp;
21  
22  import java.util.ArrayList;
23  import java.util.HashMap;
24  import java.util.Iterator;
25  import java.util.List;
26  import java.util.Map;
27  
28  /***
29   * Container for a complete SMTP message - headers and message body.
30   */
31  public class SmtpMessage {
32  
33  	/*** Headers: Map of List of String hashed on header name. */
34  	private Map headers;
35  
36  	/*** Message body. */
37  	private StringBuffer body;
38  
39  	/***
40  	 * Constructor. Initializes headers Map and body buffer.
41  	 */
42  	public SmtpMessage() {
43  		headers = new HashMap();
44  		body = new StringBuffer();
45  	}
46  
47  	/***
48  	 * Update the headers or body depending on the SmtpResponse object and line of input.
49  	 * @param response SmtpResponse object
50  	 * @param params remainder of input line after SMTP command has been removed
51  	 */
52  	public void store(SmtpResponse response, String params) {
53  		if (params != null) {
54  			if (SmtpState.DATA_HDR == response.getNextState()) {
55  				int headerNameEnd = params.indexOf(':');
56  				if (headerNameEnd >= 0) {
57  					String name = params.substring(0, headerNameEnd).trim();
58  					String value = params.substring(headerNameEnd + 1).trim();
59  					addHeader(name, value);
60  				}
61  			} else if (SmtpState.DATA_BODY == response.getNextState()) {
62  				body.append(params);
63  			}
64  		}
65  	}
66  
67  	/***
68  	 * Get an Iterator over the header names.
69  	 * @return an Iterator over the set of header names (String)
70  	 */
71  	public Iterator getHeaderNames() {
72  		return headers.keySet().iterator();
73  	}
74  
75  	/***
76  	 * Get the value(s) associated with the given header name.
77  	 * @param name header name
78  	 * @return value(s) associated with the header name
79  	 */
80  	public String[] getHeaderValues(String name) {
81  		List values = (List)headers.get(name);
82  		if (values == null) {
83  			return new String[0];
84  		} else {
85  			return (String[])values.toArray(new String[0]);
86  		}
87  	}
88  
89  	/***
90  	 * Get the first values associated with a given header name.
91  	 * @param name header name
92  	 * @return first value associated with the header name
93  	 */
94  	public String getHeaderValue(String name) {
95  		List values = (List)headers.get(name);
96  		if (values == null) {
97  			return null;
98  		} else {
99  			return (String)values.iterator().next();
100 		}
101 	}
102 
103 	/***
104 	 * Get the message body.
105 	 * @return message body
106 	 */
107 	public String getBody() {
108 		return body.toString();
109 	}
110 
111 	/***
112 	 * Adds a header to the Map.
113 	 * @param name header name
114 	 * @param value header value
115 	 */
116 	private void addHeader(String name, String value) {
117 		List valueList = (List)headers.get(name);
118 		if (valueList == null) {
119 			valueList = new ArrayList();
120 			headers.put(name, valueList);
121 		}
122 		valueList.add(value);
123 	}
124 
125 	/***
126 	 * String representation of the SmtpMessage.
127 	 * @return a String
128 	 */
129 	public String toString() {
130 		StringBuffer msg = new StringBuffer();
131 		for (Iterator i = headers.keySet().iterator(); i.hasNext();) {
132 			String name = (String)i.next();
133 			List values = (List)headers.get(name);
134 			for (Iterator j = values.iterator(); j.hasNext();) {
135 				String value = (String)j.next();
136 				msg.append(name);
137 				msg.append(": ");
138 				msg.append(value);
139 				msg.append('\n');
140 			}
141 		}
142 		msg.append('\n');
143 		msg.append(body);
144 		msg.append('\n');
145 		return msg.toString();
146 	}
147 }