1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package org.apache.james.nntpserver.repository;
23
24 import org.apache.james.core.MailHeaders;
25 import org.apache.james.nntpserver.NNTPException;
26 import org.apache.james.util.io.IOUtil;
27
28 import javax.mail.internet.InternetHeaders;
29 import java.io.BufferedReader;
30 import java.io.File;
31 import java.io.FileInputStream;
32 import java.io.FileReader;
33 import java.io.IOException;
34 import java.io.OutputStream;
35
36
37
38
39 class NNTPArticleImpl implements NNTPArticle {
40
41
42
43
44 private final File articleFile;
45
46
47
48
49 private final NNTPGroup group;
50
51
52
53
54
55
56
57 NNTPArticleImpl(NNTPGroup group, File f) {
58 articleFile = f;
59 this.group = group;
60 }
61
62
63
64
65 public NNTPGroup getGroup() {
66 return group;
67 }
68
69
70
71
72 public int getArticleNumber() {
73 return Integer.parseInt(articleFile.getName());
74 }
75
76
77
78
79 public String getUniqueID() {
80 FileInputStream fin = null;
81 try {
82 fin = new FileInputStream(articleFile);
83 InternetHeaders headers = new InternetHeaders(fin);
84 String[] idheader = headers.getHeader("Message-Id");
85 fin.close();
86 return ( idheader.length > 0 ) ? idheader[0] : null;
87 } catch(Exception ex) {
88 throw new NNTPException(ex);
89 } finally {
90 IOUtil.shutdownStream(fin);
91 }
92 }
93
94
95
96
97 public void writeArticle(OutputStream out) {
98 FileInputStream fileStream = null;
99 try {
100 fileStream = new FileInputStream(articleFile);
101 byte[] readBuffer = new byte[1024];
102 int read = 0;
103 while ((read = fileStream.read(readBuffer)) > 0) {
104 out.write(readBuffer, 0, read);
105 }
106 } catch(IOException ex) {
107 throw new NNTPException(ex);
108 } finally {
109 if (fileStream != null) {
110 try {
111 fileStream.close();
112 } catch (IOException ioe) {
113
114 }
115 }
116 }
117 }
118
119
120
121
122 public void writeHead(OutputStream out) {
123 FileInputStream fileStream = null;
124 try {
125 fileStream = new FileInputStream(articleFile);
126 MailHeaders headers = new MailHeaders(fileStream);
127 byte[] headerBuffer = headers.toByteArray();
128 int headerBufferLength = headerBuffer.length;
129
130 if (headerBufferLength > 2) {
131 out.write(headerBuffer, 0, (headerBufferLength - 2));
132 }
133 } catch(Exception ex) {
134 throw new NNTPException(ex);
135 } finally {
136 if (fileStream != null) {
137 try {
138 fileStream.close();
139 } catch (IOException ioe) {
140
141 }
142 }
143 }
144 }
145
146
147
148
149 public void writeBody(OutputStream out) {
150 FileInputStream fileStream = null;
151 try {
152 fileStream = new FileInputStream(articleFile);
153 MailHeaders headers = new MailHeaders(fileStream);
154 byte[] readBuffer = new byte[1024];
155 int read = 0;
156 while ((read = fileStream.read(readBuffer)) > 0) {
157 out.write(readBuffer, 0, read);
158 }
159 } catch(Exception ex) {
160 throw new NNTPException(ex);
161 } finally {
162 if (fileStream != null) {
163 try {
164 fileStream.close();
165 } catch (IOException ioe) {
166
167 }
168 }
169 }
170 }
171
172
173
174
175 public void writeOverview(OutputStream out) {
176 FileInputStream fileStream = null;
177 try {
178 fileStream = new FileInputStream(articleFile);
179 InternetHeaders hdr = new InternetHeaders(fileStream);
180 String subject = hdr.getHeader("Subject",null);
181 String author = hdr.getHeader("From",null);
182 String date = hdr.getHeader("Date",null);
183 String msgId = hdr.getHeader("Message-Id",null);
184 String references = hdr.getHeader("References",null);
185 long byteCount = articleFile.length();
186
187
188 String lineCount = hdr.getHeader("Lines",null);
189 if (lineCount == null) {
190 BufferedReader rdr = new BufferedReader(new FileReader(fileStream.getFD()));
191 int lines = 0;
192 while (rdr.readLine() != null) {
193 lines++;
194 }
195
196 lineCount = Integer.toString(lines);
197 rdr.close();
198 }
199
200 StringBuffer line=new StringBuffer(256)
201 .append(getArticleNumber()) .append("\t")
202 .append(cleanHeader(subject)) .append("\t")
203 .append(cleanHeader(author)) .append("\t")
204 .append(cleanHeader(date)) .append("\t")
205 .append(cleanHeader(msgId)) .append("\t")
206 .append(cleanHeader(references)) .append("\t")
207 .append(byteCount) .append("\t")
208 .append(lineCount).append("\r\n");
209 String lineString = line.toString();
210 out.write(lineString.getBytes("ASCII"));
211 } catch(Exception ex) {
212 throw new NNTPException(ex);
213 } finally {
214 if (fileStream != null) {
215 try {
216 fileStream.close();
217 } catch (IOException ioe) {
218
219 }
220 }
221 }
222 }
223
224
225
226
227 public String getHeader(String header) {
228 try {
229 FileInputStream fin = new FileInputStream(articleFile);
230 InternetHeaders hdr = new InternetHeaders(fin);
231 fin.close();
232 return hdr.getHeader(header,null);
233 } catch(Exception ex) {
234 throw new NNTPException(ex);
235 }
236 }
237
238
239
240
241
242
243
244
245
246 private String cleanHeader(String field) {
247 if ( field == null )
248 field = "";
249 StringBuffer sb = new StringBuffer(field);
250 for( int i=0 ; i<sb.length() ; i++ ) {
251 char c = sb.charAt(i);
252 if( (c=='\n') || (c=='\t') || (c=='\r')) {
253 sb.setCharAt(i, ' ');
254 }
255 }
256 return sb.toString();
257 }
258 }