1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.net.nntp;
19
20 import java.util.ArrayList;
21 import java.util.StringTokenizer;
22
23
24
25
26
27
28
29 public class Article implements Threadable {
30 private int articleNumber;
31 private String subject;
32 private String date;
33 private String articleId;
34 private String simplifiedSubject;
35 private String from;
36 private StringBuffer header;
37 private StringBuffer references;
38 private boolean isReply = false;
39
40 public Article kid, next;
41
42 public Article() {
43 header = new StringBuffer();
44 }
45
46
47
48
49
50
51 public void addHeaderField(String name, String val) {
52 header.append(name);
53 header.append(": ");
54 header.append(val);
55 header.append('\n');
56 }
57
58
59
60
61
62 public void addReference(String msgId) {
63 if (references == null) {
64 references = new StringBuffer();
65 references.append("References: ");
66 }
67 references.append(msgId);
68 references.append("\t");
69 }
70
71
72
73
74
75 public String[] getReferences() {
76 if (references == null)
77 return new String[0];
78 ArrayList<String> list = new ArrayList<String>();
79 int terminator = references.toString().indexOf(':');
80 StringTokenizer st =
81 new StringTokenizer(references.substring(terminator), "\t");
82 while (st.hasMoreTokens()) {
83 list.add(st.nextToken());
84 }
85 return list.toArray(new String[list.size()]);
86 }
87
88
89
90
91
92 private void simplifySubject() {
93 int start = 0;
94 String subject = getSubject();
95 int len = subject.length();
96
97 boolean done = false;
98
99 while (!done) {
100 done = true;
101
102
103
104 while (start < len && subject.charAt(start) == ' ') {
105 start++;
106 }
107
108 if (start < (len - 2)
109 && (subject.charAt(start) == 'r' || subject.charAt(start) == 'R')
110 && (subject.charAt(start + 1) == 'e' || subject.charAt(start + 1) == 'E')) {
111
112 if (subject.charAt(start + 2) == ':') {
113 start += 3;
114 isReply = true;
115 done = false;
116 } else if (
117 start < (len - 2)
118 &&
119 (subject.charAt(start + 2) == '[' || subject.charAt(start + 2) == '(')) {
120
121 int i = start + 3;
122
123 while (i < len && subject.charAt(i) >= '0' && subject.charAt(i) <= '9')
124 i++;
125
126 if (i < (len - 1)
127 && (subject.charAt(i) == ']' || subject.charAt(i) == ')')
128 && subject.charAt(i + 1) == ':') {
129 start = i + 2;
130 isReply = true;
131 done = false;
132 }
133 }
134 }
135
136 if (simplifiedSubject == "(no subject)")
137 simplifiedSubject = "";
138
139 int end = len;
140
141 while (end > start && subject.charAt(end - 1) < ' ')
142 end--;
143
144 if (start == 0 && end == len)
145 simplifiedSubject = subject;
146 else
147 simplifiedSubject = subject.substring(start, end);
148 }
149 }
150
151
152
153
154
155
156
157 public static void printThread(Article article, int depth) {
158 for (int i = 0; i < depth; ++i)
159 System.out.print("==>");
160 System.out.println(article.getSubject() + "\t" + article.getFrom());
161 if (article.kid != null)
162 printThread(article.kid, depth + 1);
163 if (article.next != null)
164 printThread(article.next, depth);
165 }
166
167 public String getArticleId() {
168 return articleId;
169 }
170
171 public int getArticleNumber() {
172 return articleNumber;
173 }
174
175 public String getDate() {
176 return date;
177 }
178
179 public String getFrom() {
180 return from;
181 }
182
183 public String getSubject() {
184 return subject;
185 }
186
187 public void setArticleId(String string) {
188 articleId = string;
189 }
190
191 public void setArticleNumber(int i) {
192 articleNumber = i;
193 }
194
195 public void setDate(String string) {
196 date = string;
197 }
198
199 public void setFrom(String string) {
200 from = string;
201 }
202
203 public void setSubject(String string) {
204 subject = string;
205 }
206
207
208 public boolean isDummy() {
209 return (getSubject() == null);
210 }
211
212 public String messageThreadId() {
213 return articleId;
214 }
215
216 public String[] messageThreadReferences() {
217 return getReferences();
218 }
219
220 public String simplifiedSubject() {
221 if(simplifiedSubject == null)
222 simplifySubject();
223 return simplifiedSubject;
224 }
225
226
227 public boolean subjectIsReply() {
228 if(simplifiedSubject == null)
229 simplifySubject();
230 return isReply;
231 }
232
233
234 public void setChild(Threadable child) {
235 this.kid = (Article) child;
236 flushSubjectCache();
237 }
238
239 private void flushSubjectCache() {
240 simplifiedSubject = null;
241 }
242
243
244 public void setNext(Threadable next) {
245 this.next = (Article)next;
246 flushSubjectCache();
247 }
248
249
250 public Threadable makeDummy() {
251 return new Article();
252 }
253 }