1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.james.jdkim.impl;
21
22 import java.io.IOException;
23 import java.io.InputStream;
24 import java.util.Collections;
25 import java.util.HashMap;
26 import java.util.Iterator;
27 import java.util.LinkedList;
28 import java.util.List;
29 import java.util.Map;
30
31 import org.apache.james.jdkim.api.Headers;
32 import org.apache.james.mime4j.MimeException;
33 import org.apache.james.mime4j.io.EOLConvertingInputStream;
34 import org.apache.james.mime4j.parser.MimeEntityConfig;
35 import org.apache.james.mime4j.parser.MimeTokenStream;
36
37
38
39
40 public class Message implements Headers {
41
42 private List fields = new LinkedList();
43 private Map fieldMap = new HashMap();
44 private InputStream bodyIs = null;
45
46
47
48
49 public Message() {
50 }
51
52
53
54
55
56
57
58
59
60
61
62
63 public Message(InputStream is) throws IOException, MimeException {
64 MimeEntityConfig mec = new MimeEntityConfig();
65 mec.setMaxLineLen(10000);
66 MimeTokenStream stream = new ExtendedMimeTokenStream(mec);
67 stream.setRecursionMode(MimeTokenStream.M_FLAT);
68
69 stream.parse(new EOLConvertingInputStream(is));
70 for (int state = stream.getState(); state != MimeTokenStream.T_END_OF_STREAM; state = stream
71 .next()) {
72 switch (state) {
73
74 case MimeTokenStream.T_FIELD:
75 addField(stream.getFieldName(), stream.getField());
76 break;
77
78
79 case MimeTokenStream.T_START_MESSAGE:
80 case MimeTokenStream.T_END_MESSAGE:
81 case MimeTokenStream.T_START_HEADER:
82 case MimeTokenStream.T_END_HEADER:
83 break;
84
85
86 case MimeTokenStream.T_BODY:
87 this.bodyIs = stream.getInputStream();
88 break;
89
90 default:
91 throw new IllegalStateException("Unexpected stream message: "
92 + state);
93 }
94
95 if (bodyIs != null)
96 break;
97 }
98
99 }
100
101 public InputStream getBodyInputStream() {
102 return bodyIs;
103 }
104
105 public void setBodyInputStream(InputStream is) {
106 bodyIs = is;
107 }
108
109
110
111
112
113
114
115 public void addField(String fieldName, String field) {
116 List values = (List) fieldMap.get(fieldName.toLowerCase());
117 if (values == null) {
118 values = new LinkedList();
119 fieldMap.put(fieldName.toLowerCase(), values);
120 }
121 values.add(field);
122 fields.add(field);
123 }
124
125
126
127
128 public List getFields() {
129 return Collections.unmodifiableList(fields);
130 }
131
132
133
134
135 public List getFields(final String name) {
136 final String lowerCaseName = name.toLowerCase();
137 final List l = (List) fieldMap.get(lowerCaseName);
138 final List results;
139 if (l == null || l.isEmpty()) {
140 results = null;
141 } else {
142 results = Collections.unmodifiableList(l);
143 }
144 return results;
145 }
146
147
148
149
150
151
152
153 public String toString() {
154 StringBuffer str = new StringBuffer(128);
155 for (Iterator i = fields.iterator(); i.hasNext();) {
156 String field = (String) i.next();
157 str.append(field);
158 }
159 InputStream is = getBodyInputStream();
160 if (is != null) {
161 str.append("\r\n");
162 byte[] buff = new byte[128];
163 int read;
164 try {
165 while ((read = is.read(buff)) > 0) {
166 str.append(new String(buff, 0, read));
167 }
168 } catch (IOException e) {
169 }
170 }
171 return str.toString();
172 }
173
174
175
176
177 private final class ExtendedMimeTokenStream extends MimeTokenStream {
178
179 public ExtendedMimeTokenStream(MimeEntityConfig mec) {
180 super(mec);
181 }
182 }
183
184 }