1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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 }