1 package org.columba.mail.pop3.command; 17 18 import java.io.IOException ; 19 import java.net.SocketException ; 20 import java.text.MessageFormat ; 21 import java.util.Iterator ; 22 import java.util.List ; 23 import java.util.logging.Logger ; 24 25 import javax.swing.Action ; 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 49 public class FetchNewMessagesCommand extends Command { 50 51 52 private static final Logger LOG = Logger 53 .getLogger("org.columba.mail.pop3.command"); 54 55 POP3Server server; 56 57 int totalMessageCount; 58 59 int newMessageCount; 60 61 Action action; 62 63 69 public FetchNewMessagesCommand(Action 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 85 public void execute(IWorkerStatusController worker) throws Exception { 86 POP3CommandReference r = (POP3CommandReference) getReference(); 87 88 server = r.getServer(); 89 90 ((StatusObservableImpl) server.getObservable()).setWorker(worker); 92 93 log(MailResourceLoader.getString("statusbar", "message", 94 "authenticating")); 95 96 try { 97 totalMessageCount = server.getMessageCount(); 99 100 if (worker.cancelled()) 101 throw new CommandCancelledException(); 102 103 List 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 downloadNewMessages(newMessagesUidList, worker); 117 118 server.cleanUpServer(); 120 121 logout(); 123 124 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 [] { new Integer (newMessageCount) })); 132 } 133 134 IMailbox inboxFolder = server.getFolder(); 136 137 IMailFolderCommandReference ref = new MailFolderCommandReference(inboxFolder, newMessagesUidList.toArray()); 139 MailCheckingManager.getInstance().fireNewMessageArrived(ref); 140 141 } catch (CommandCancelledException e) { 142 server.logout(); 143 144 server.getObservable().clearMessage(); 146 } catch (Exception e) { 147 server.getObservable().clearMessage(); 149 throw e; 150 } 151 157 finally { 158 162 } 163 } 164 165 protected void log(String message) { 166 server.getObservable().setMessage( 167 server.getFolderName() + ": " + message); 168 } 169 170 public void downloadMessage(Object serverUID, IWorkerStatusController worker) 171 throws Exception { 172 IWorkerStatusChangeListener listener = new IWorkerStatusChangeListener() { 176 public void workerStatusChanged(WorkerStatusChangedEvent e) { 177 if (e.getSource().cancelled()) { 178 try { 179 server.dropConnection(); 180 } catch (IOException e1) { 181 } 182 } 183 184 } 185 }; 186 187 worker.addWorkerStatusChangeListener(listener); 189 190 ColumbaMessage message; 192 try { 193 message = server.getMessage(serverUID, worker); 194 } catch (SocketException e) { 195 if (!worker.cancelled()) 196 throw e; 197 else 198 throw new CommandCancelledException(); 199 } 200 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 IMailbox inboxFolder = server.getFolder(); 214 215 IMailFolderCommandReference r = new MailFolderCommandReference( 218 inboxFolder, message); 219 220 CommandProcessor.getInstance().addOp(new AddPOP3MessageCommand(r)); 221 } 222 223 protected int calculateTotalSize(List uidList) throws Exception { 224 int totalSize = 0; 225 226 Iterator 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 newMessagesUIDList, 236 IWorkerStatusController worker) throws Exception { 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 Object 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 [] { 258 new Integer (i + 1), new Integer (newMessageCount) })); 259 260 int size = server.getMessageSize(serverUID); 261 262 if (server.getAccountItem().getPopItem().getBoolean("enable_limit")) { 263 int maxSize = server.getAccountItem().getPopItem().getInteger( 265 "limit"); 266 267 if (size > maxSize) { 269 LOG.fine("skipping download of message, too big"); 270 271 continue; 272 } 273 } 274 275 downloadMessage(serverUID, worker); 277 278 if (!server.getAccountItem().getPopItem().getBoolean( 279 "leave_messages_on_server")) { 280 server.deleteMessage(serverUID); 282 283 LOG.fine("deleted message with uid=" + serverUID); 284 } 285 } 286 } 287 288 public List synchronize() throws Exception { 289 log(MailResourceLoader.getString("statusbar", "message", 290 "fetch_uid_list")); 291 292 LOG.fine("synchronize local UID-list with remote UID-list"); 293 294 List newMessagesUIDList = server.synchronize(); 296 297 return newMessagesUIDList; 298 } 299 300 public void logout() throws Exception { 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 316 public void updateGUI() throws Exception { 317 if (action != null) { 318 action.setEnabled(true); 319 } 320 } 321 } | Popular Tags |