KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > columba > mail > pop3 > command > FetchNewMessagesCommand


1 //The contents of this file are subject to the Mozilla Public License Version 1.1
2
//(the "License"); you may not use this file except in compliance with the
3
//License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
4
//
5
//Software distributed under the License is distributed on an "AS IS" basis,
6
//WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
7
//for the specific language governing rights and
8
//limitations under the License.
9
//
10
//The Original Code is "The Columba Project"
11
//
12
//The Initial Developers of the Original Code are Frederik Dietz and Timo Stich.
13
//Portions created by Frederik Dietz and Timo Stich are Copyright (C) 2003.
14
//
15
//All Rights Reserved.
16
package org.columba.mail.pop3.command;
17
18 import java.io.IOException JavaDoc;
19 import java.net.SocketException JavaDoc;
20 import java.text.MessageFormat JavaDoc;
21 import java.util.Iterator JavaDoc;
22 import java.util.List JavaDoc;
23 import java.util.logging.Logger JavaDoc;
24
25 import javax.swing.Action JavaDoc;
26
27 import org.columba.api.command.IWorkerStatusChangeListener;
28 import org.columba.api.command.IWorkerStatusController;
29 import org.columba.api.command.WorkerStatusChangedEvent;
30 import org.columba.core.command.Command;
31 import org.columba.core.command.CommandCancelledException;
32 import org.columba.core.command.CommandProcessor;
33 import org.columba.core.command.DefaultCommandReference;
34 import org.columba.core.command.StatusObservableImpl;
35 import org.columba.core.command.Worker;
36 import org.columba.core.logging.Logging;
37 import org.columba.mail.command.IMailFolderCommandReference;
38 import org.columba.mail.command.MailFolderCommandReference;
39 import org.columba.mail.command.POP3CommandReference;
40 import org.columba.mail.folder.IMailbox;
41 import org.columba.mail.mailchecking.MailCheckingManager;
42 import org.columba.mail.message.ColumbaMessage;
43 import org.columba.mail.pop3.POP3Server;
44 import org.columba.mail.util.MailResourceLoader;
45
46 /**
47  * @author freddy
48  */

49 public class FetchNewMessagesCommand extends Command {
50
51     /** JDK 1.4+ logging framework logger, used for logging. */
52     private static final Logger JavaDoc LOG = Logger
53             .getLogger("org.columba.mail.pop3.command");
54
55     POP3Server server;
56
57     int totalMessageCount;
58
59     int newMessageCount;
60
61     Action JavaDoc action;
62
63     /**
64      * Constructor for FetchNewMessages.
65      *
66      * @param frameMediator
67      * @param references
68      */

69     public FetchNewMessagesCommand(Action JavaDoc action,
70             DefaultCommandReference reference) {
71         super(reference);
72
73         POP3CommandReference r = (POP3CommandReference) getReference();
74
75         server = r.getServer();
76
77         priority = Command.DAEMON_PRIORITY;
78
79         this.action = action;
80     }
81
82     /**
83      * @see org.columba.api.command.Command#execute(Worker)
84      */

85     public void execute(IWorkerStatusController worker) throws Exception JavaDoc {
86         POP3CommandReference r = (POP3CommandReference) getReference();
87
88         server = r.getServer();
89
90         // register interest on status bar information
91
((StatusObservableImpl) server.getObservable()).setWorker(worker);
92
93         log(MailResourceLoader.getString("statusbar", "message",
94                 "authenticating"));
95
96         try {
97             // login and get # of messages on server
98
totalMessageCount = server.getMessageCount();
99
100             if (worker.cancelled())
101                 throw new CommandCancelledException();
102
103             // synchronize local UID list with server UID list
104
List JavaDoc newMessagesUidList = synchronize();
105
106             if (worker.cancelled())
107                 throw new CommandCancelledException();
108
109             if (Logging.DEBUG) {
110                 LOG.fine(newMessagesUidList.toString());
111             }
112
113             if (worker.cancelled())
114                 throw new CommandCancelledException();
115             // only download new messages
116
downloadNewMessages(newMessagesUidList, worker);
117
118             // Delete old message from server if the feature is enabled
119
server.cleanUpServer();
120
121             // logout cleanly
122
logout();
123
124             // display downloaded message count in statusbar
125
if (newMessageCount == 0) {
126                 log(MailResourceLoader.getString("statusbar", "message",
127                         "no_new_messages"));
128             } else {
129                 log(MessageFormat.format(MailResourceLoader.getString(
130                         "statusbar", "message", "fetched_count"),
131                         new Object JavaDoc[] { new Integer JavaDoc(newMessageCount) }));
132             }
133             
134             // get inbox-folder from pop3-server preferences
135
IMailbox inboxFolder = server.getFolder();
136             
137             // notify listeners
138
IMailFolderCommandReference ref = new MailFolderCommandReference(inboxFolder, newMessagesUidList.toArray());
139             MailCheckingManager.getInstance().fireNewMessageArrived(ref);
140             
141         } catch (CommandCancelledException e) {
142             server.logout();
143
144             // clear statusbar message
145
server.getObservable().clearMessage();
146         } catch (Exception JavaDoc e) {
147             // clear statusbar message
148
server.getObservable().clearMessage();
149             throw e;
150         }
151         /*
152          * catch (IOException e) { String name = e.getClass().getName();
153          * JOptionPane.showMessageDialog(null, e.getLocalizedMessage(),
154          * name.substring(name.lastIndexOf(".")), JOptionPane.ERROR_MESSAGE); //
155          * clear statusbar message server.getObservable().clearMessage(); }
156          */

157         finally {
158             /*
159              * // always enable the menuitem again
160              * r[0].getPOP3ServerController().enableActions(true);
161              */

162         }
163     }
164
165     protected void log(String JavaDoc message) {
166         server.getObservable().setMessage(
167                 server.getFolderName() + ": " + message);
168     }
169
170     public void downloadMessage(Object JavaDoc serverUID, IWorkerStatusController worker)
171             throws Exception JavaDoc {
172         // server message numbers start with 1
173
// whereas List numbers start with 0
174
// -> always increase fetch number
175
IWorkerStatusChangeListener listener = new IWorkerStatusChangeListener() {
176             public void workerStatusChanged(WorkerStatusChangedEvent e) {
177                 if (e.getSource().cancelled()) {
178                     try {
179                         server.dropConnection();
180                     } catch (IOException JavaDoc e1) {
181                     }
182                 }
183
184             }
185         };
186
187         // important for cancel
188
worker.addWorkerStatusChangeListener(listener);
189
190         // download message
191
ColumbaMessage message;
192         try {
193             message = server.getMessage(serverUID, worker);
194         } catch (SocketException JavaDoc e) {
195             if (!worker.cancelled())
196                 throw e;
197             else
198                 throw new CommandCancelledException();
199         }
200         // not needed anymore
201
worker.removeWorkerStatusChangeListener(listener);
202
203         if (message == null) {
204             LOG.severe("Message with UID=" + serverUID
205                     + " isn't on the server.");
206
207             return;
208         }
209
210         message.getHeader().getFlags().setSeen(false);
211
212         // get inbox-folder from pop3-server preferences
213
IMailbox inboxFolder = server.getFolder();
214
215         // start command which adds message to folder
216
// and calls apply-filter on this specific message
217
IMailFolderCommandReference r = new MailFolderCommandReference(
218                 inboxFolder, message);
219
220         CommandProcessor.getInstance().addOp(new AddPOP3MessageCommand(r));
221     }
222
223     protected int calculateTotalSize(List JavaDoc uidList) throws Exception JavaDoc {
224         int totalSize = 0;
225
226         Iterator JavaDoc it = uidList.iterator();
227
228         while (it.hasNext()) {
229             totalSize += server.getMessageSize(it.next());
230         }
231
232         return totalSize;
233     }
234
235     public void downloadNewMessages(List JavaDoc newMessagesUIDList,
236             IWorkerStatusController worker) throws Exception JavaDoc {
237         LOG.fine("need to fetch " + newMessagesUIDList.size() + " messages.");
238
239         int totalSize = calculateTotalSize(newMessagesUIDList);
240
241         worker.setProgressBarMaximum(totalSize);
242         worker.setProgressBarValue(0);
243
244         newMessageCount = newMessagesUIDList.size();
245
246         for (int i = 0; i < newMessageCount; i++) {
247
248             if (worker.cancelled())
249                 throw new CommandCancelledException();
250
251             // which UID should be downloaded next
252
Object JavaDoc serverUID = newMessagesUIDList.get(i);
253
254             LOG.fine("fetch message with UID=" + serverUID);
255
256             log(MessageFormat.format(MailResourceLoader.getString("statusbar",
257                     "message", "fetch_messages"), new Object JavaDoc[] {
258                     new Integer JavaDoc(i + 1), new Integer JavaDoc(newMessageCount) }));
259
260             int size = server.getMessageSize(serverUID);
261
262             if (server.getAccountItem().getPopItem().getBoolean("enable_limit")) {
263                 // check if message isn't too big to download
264
int maxSize = server.getAccountItem().getPopItem().getInteger(
265                         "limit");
266
267                 // if message-size is bigger skip download of this message
268
if (size > maxSize) {
269                     LOG.fine("skipping download of message, too big");
270
271                     continue;
272                 }
273             }
274
275             // now download the message
276
downloadMessage(serverUID, worker);
277
278             if (!server.getAccountItem().getPopItem().getBoolean(
279                     "leave_messages_on_server")) {
280                 // delete message from server
281
server.deleteMessage(serverUID);
282
283                 LOG.fine("deleted message with uid=" + serverUID);
284             }
285         }
286     }
287
288     public List JavaDoc synchronize() throws Exception JavaDoc {
289         log(MailResourceLoader.getString("statusbar", "message",
290                 "fetch_uid_list"));
291
292         LOG.fine("synchronize local UID-list with remote UID-list");
293
294         // synchronize local UID-list with server
295
List JavaDoc newMessagesUIDList = server.synchronize();
296
297         return newMessagesUIDList;
298     }
299
300     public void logout() throws Exception JavaDoc {
301         server.logout();
302
303         LOG.fine("logout");
304
305         log(MailResourceLoader.getString("statusbar", "message", "logout"));
306
307         if (newMessageCount == 0) {
308             log(MailResourceLoader.getString("statusbar", "message",
309                     "no_new_messages"));
310         }
311     }
312
313     /**
314      * @see org.columba.api.command.Command#updateGUI()
315      */

316     public void updateGUI() throws Exception JavaDoc {
317         if (action != null) {
318             action.setEnabled(true);
319         }
320     }
321 }
Popular Tags