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.fetchmail;
23
24 import javax.mail.Flags;
25 import javax.mail.Folder;
26 import javax.mail.MessagingException;
27 import javax.mail.internet.MimeMessage;
28
29
30
31
32
33
34
35
36
37
38
39 public class FolderProcessor extends ProcessorAbstract
40 {
41
42
43
44 private Folder fieldFolder;
45
46 private Boolean fieldMarkSeenPermanent;
47
48
49
50
51
52
53 protected FolderProcessor(Folder folder, Account account)
54 {
55 super(account);
56 setFolder(folder);
57 }
58
59
60
61
62
63
64
65
66 public void process() throws MessagingException
67 {
68 int messagesProcessed = 0;
69 int messageCount = 0;
70 try
71 {
72
73 try
74 {
75 open();
76 }
77 catch (MessagingException ex)
78 {
79 getLogger().error(
80 getFetchTaskName() + " Failed to open folder!");
81 throw ex;
82 }
83
84
85 synchronized (getFolder())
86 {
87 messageCount = getFolder().getMessageCount();
88 for (int i = 1; i <= messageCount; i++)
89 {
90 MimeMessage message =
91 (MimeMessage) getFolder().getMessage(i);
92 if (isFetchAll() || !isSeen(message))
93 {
94 try
95 {
96 new MessageProcessor(message, getAccount())
97 .process();
98 messagesProcessed++;
99 }
100
101
102 catch (Exception ex)
103 {
104 StringBuffer logMessageBuffer =
105 new StringBuffer("Exception processing message ID: ");
106 logMessageBuffer.append(message.getMessageID());
107 getLogger().error(logMessageBuffer.toString(), ex);
108 }
109 }
110 }
111 }
112 }
113 catch (MessagingException mex)
114 {
115 getLogger().error(
116 "A MessagingException has terminated fetching messages for this folder",
117 mex);
118 }
119 finally
120 {
121
122 try
123 {
124 close();
125 }
126 catch (MessagingException ex)
127 {
128
129 }
130 StringBuffer logMessageBuffer = new StringBuffer("Processed ");
131 logMessageBuffer.append(messagesProcessed);
132 logMessageBuffer.append(" messages of ");
133 logMessageBuffer.append(messageCount);
134 logMessageBuffer.append(" in folder '");
135 logMessageBuffer.append(getFolder().getName());
136 logMessageBuffer.append("'");
137 getLogger().info(logMessageBuffer.toString());
138 }
139
140
141 try
142 {
143 if (isRecurse())
144 recurse();
145 }
146 catch (MessagingException mex)
147 {
148 getLogger().error(
149 "A MessagingException has terminated recursing through sub-folders",
150 mex);
151 }
152
153 return;
154 }
155
156
157
158
159
160 protected void close() throws MessagingException
161 {
162 if (null != getFolder() && getFolder().isOpen())
163 getFolder().close(true);
164 }
165
166
167
168
169
170 protected void recurse() throws MessagingException
171 {
172 if ((getFolder().getType() & Folder.HOLDS_FOLDERS)
173 == Folder.HOLDS_FOLDERS)
174 {
175
176 Folder folders[] = getFolder().list();
177
178 for (int i = 0; i < folders.length; i++)
179 {
180 new FolderProcessor(folders[i], getAccount()).process();
181 }
182
183 }
184 }
185
186
187
188
189
190 protected void open() throws MessagingException
191 {
192 int openFlag = Folder.READ_WRITE;
193
194 if (isOpenReadOnly())
195 openFlag = Folder.READ_ONLY;
196
197 getFolder().open(openFlag);
198 }
199
200
201
202
203
204 protected Folder getFolder()
205 {
206 return fieldFolder;
207 }
208
209
210
211
212
213
214
215 protected boolean isSeen(MimeMessage aMessage) throws MessagingException
216 {
217 boolean isSeen = false;
218 if (isMarkSeenPermanent().booleanValue())
219 isSeen = aMessage.isSet(Flags.Flag.SEEN);
220 else
221 isSeen = handleMarkSeenNotPermanent(aMessage);
222 return isSeen;
223 }
224
225
226
227
228
229 protected Boolean computeMarkSeenPermanent()
230 {
231 return new Boolean(
232 getFolder().getPermanentFlags().contains(Flags.Flag.SEEN));
233 }
234
235
236
237
238
239
240
241
242
243
244
245
246
247 protected boolean handleMarkSeenNotPermanent(MimeMessage aMessage)
248 throws MessagingException
249 {
250 return aMessage.isSet(Flags.Flag.SEEN);
251 }
252
253
254
255
256
257 protected void setFolder(Folder folder)
258 {
259 fieldFolder = folder;
260 }
261
262
263
264
265
266 protected Boolean isMarkSeenPermanent()
267 {
268 Boolean markSeenPermanent = null;
269 if (null == (markSeenPermanent = isMarkSeenPermanentBasic()))
270 {
271 updateMarkSeenPermanent();
272 return isMarkSeenPermanent();
273 }
274 return markSeenPermanent;
275 }
276
277
278
279
280
281 private Boolean isMarkSeenPermanentBasic()
282 {
283 return fieldMarkSeenPermanent;
284 }
285
286
287
288
289
290 protected void setMarkSeenPermanent(Boolean markSeenPermanent)
291 {
292 fieldMarkSeenPermanent = markSeenPermanent;
293 }
294
295
296
297
298 protected void updateMarkSeenPermanent()
299 {
300 setMarkSeenPermanent(computeMarkSeenPermanent());
301 }
302
303 }