git clone of logicmail with some fixes/features added
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Improved handling of mail client events occurring during folder refreshes.

git-svn-id: https://logicmail.svn.sourceforge.net/svnroot/logicmail/trunk@955 5c734088-3d25-0410-9155-b3c3832efda5

octorian 51f75161 bab7a6e6

+70 -44
+33 -22
LogicMail/src/org/logicprobe/LogicMail/mail/ImapFolderRefreshRequest.java
··· 48 48 private final Hashtable loadedMessageMap; 49 49 private int messageRetentionLimit; 50 50 private volatile boolean checkAllTokens; 51 + private volatile boolean recentMessageAvailable; 51 52 private Vector secondaryMessageTokensToFetch; 52 53 53 54 ImapFolderRefreshRequest(NetworkMailStore mailStore, FolderTreeItem folder, FolderMessage[] loadedMessages) { ··· 64 65 } 65 66 } 66 67 67 - private FolderListener folderListener = new FolderListener() { 68 - public void folderMessagesAvailable(FolderMessagesEvent e) { } 69 - public void folderStatusChanged(FolderEvent e) { } 70 - public void folderExpunged(FolderExpungedEvent e) { } 71 - public void folderRefreshRequired(FolderEvent e) { 72 - if(e.getFolder().equals(folder)){ 73 - checkAllTokens = true; 74 - } 75 - } 68 + public FolderTreeItem getFolder() { 69 + return folder; 70 + } 71 + 72 + /** 73 + * Called by the <code>IncomingMailConnectionHandler</code> if it receives 74 + * notification of recent messages during the processing of this request. 75 + * This will allow this request object to handle that situation, instead of 76 + * requiring a separate request to be enqueued with the connection handler. 77 + */ 78 + void notifyRecentMessagesAvailable() { 79 + recentMessageAvailable = true; 76 80 }; 77 81 78 82 protected String getInitialStatus() { 79 83 return statusMessage + "..."; 80 84 } 81 85 86 + protected void handleSetActiveFolder(IncomingMailClient incomingClient, FolderTreeItem folder) throws IOException, MailException { 87 + boolean isStateValid = incomingClient.setActiveFolder(folder, true); 88 + 89 + if(!isStateValid) { 90 + // Set a local flag, instead of firing an event 91 + checkAllTokens = true; 92 + } 93 + } 94 + 82 95 public void execute(MailClient client) throws IOException, MailException { 83 96 ImapClient incomingClient = (ImapClient)client; 84 - 85 - mailStore.addFolderListener(folderListener); 86 97 87 98 this.messageRetentionLimit = incomingClient.getAcctConfig().getMaximumFolderMessages(); 88 99 ··· 98 109 initialFlagsRefreshComplete(incomingClient, folderMessages); 99 110 } 100 111 101 - protected void fireMailStoreRequestComplete() { 102 - mailStore.removeFolderListener(folderListener); 103 - super.fireMailStoreRequestComplete(); 104 - } 105 - 106 - protected void fireMailStoreRequestFailed(Throwable exception, boolean isFinal) { 107 - mailStore.removeFolderListener(folderListener); 108 - super.fireMailStoreRequestFailed(exception, isFinal); 109 - } 110 - 111 112 private void initialFlagsRefreshComplete(ImapClient incomingClient, Vector pendingFlagUpdates) throws IOException, MailException { 112 113 secondaryMessageTokensToFetch = new Vector(); 113 114 MessageToken oldestFetchedToken = null; ··· 229 230 getProgressHandler(statusMessage)); 230 231 } 231 232 loadedMessageMap.clear(); 233 + 234 + // Handle the unlikely-but-possible case of an untagged new message 235 + // notification during the folder refresh process. 236 + if(recentMessageAvailable) { 237 + incomingClient.getNewFolderMessages( 238 + false, 239 + new GetFolderMessageCallback(false), 240 + getProgressHandler(statusMessage)); 241 + } 242 + 232 243 fireMailStoreRequestComplete(); 233 244 } 234 245 ··· 267 278 mailStore.fireFolderMessagesAvailable(folder, null, flagsOnly); 268 279 } 269 280 } 270 - }; 281 + } 271 282 }
+3 -1
LogicMail/src/org/logicprobe/LogicMail/mail/IncomingMailClientListener.java
··· 45 45 * The expected behavior is to follow this with a call to 46 46 * <code>getNewFolderMessages()</code> at the earliest convenience of the 47 47 * connection handler. 48 + * 49 + * @param folder The folder that was selected at the time of the event 48 50 */ 49 - void recentFolderMessagesAvailable(); 51 + void recentFolderMessagesAvailable(FolderTreeItem folder); 50 52 51 53 /** 52 54 * Called to indicate that a message's flags have changed.
+21 -10
LogicMail/src/org/logicprobe/LogicMail/mail/IncomingMailConnectionHandler.java
··· 92 92 * Listener to handle asynchronous notifications from the mail client. 93 93 */ 94 94 private IncomingMailClientListener mailClientListener = new IncomingMailClientListener() { 95 - public void recentFolderMessagesAvailable() { 96 - handleRecentFolderMessagesAvailable(); 95 + public void recentFolderMessagesAvailable(FolderTreeItem folder) { 96 + handleRecentFolderMessagesAvailable(folder); 97 97 } 98 98 public void folderMessageFlagsChanged(MessageToken token, MessageFlags messageFlags) { 99 99 handleFolderMessageFlagsChanged(token, messageFlags); ··· 129 129 super.handleRequest(request); 130 130 } 131 131 132 - private void handleRecentFolderMessagesAvailable() { 132 + private void handleRecentFolderMessagesAvailable(FolderTreeItem folder) { 133 133 if(getConnectionState() == STATE_IDLE) { 134 134 if(idleRecentMessagesRequested) { return; } 135 135 idleRecentMessagesRequested = true; 136 136 } 137 137 138 - // Make sure we ignore this event if it occurs during the setup portion 139 - // of the command normally enqueued as a result of this notification. 140 138 ConnectionHandlerRequest currentRequest = getRequestInProgress(); 141 - if(currentRequest instanceof FolderMessagesRequest 142 - && ((FolderMessagesRequest)currentRequest).getType() == FolderMessagesRequest.TYPE_RECENT) { 143 - return; 139 + if(currentRequest instanceof FolderMessagesRequest) { 140 + // Ignore this event if it occurs during the setup portion of the 141 + // command normally enqueued as a result of this notification. 142 + FolderMessagesRequest folderRequest = (FolderMessagesRequest)currentRequest; 143 + if(folderRequest.getType() == FolderMessagesRequest.TYPE_RECENT 144 + && folderRequest.getFolder().getPath().equals(folder.getPath())) { 145 + return; 146 + } 147 + } 148 + else if(currentRequest instanceof ImapFolderRefreshRequest) { 149 + // If this event occurs during a folder refresh, then notify the 150 + // in-progress refresh request instead of creating a new request. 151 + ImapFolderRefreshRequest refreshRequest = (ImapFolderRefreshRequest)currentRequest; 152 + if(refreshRequest.getFolder().getPath().equals(folder.getPath())) { 153 + refreshRequest.notifyRecentMessagesAvailable(); 154 + return; 155 + } 144 156 } 145 - 146 - FolderMessagesRequest request = mailStore.createFolderMessagesRecentRequest(incomingClient.getActiveFolder(), false); 157 + FolderMessagesRequest request = mailStore.createFolderMessagesRecentRequest(folder, false); 147 158 ((ConnectionHandlerRequest)request).setDeliberate(false); 148 159 mailStore.processRequest(request); 149 160 }
+1 -1
LogicMail/src/org/logicprobe/LogicMail/mail/NetworkMailStoreRequest.java
··· 88 88 } 89 89 } 90 90 91 - private void handleSetActiveFolder(IncomingMailClient incomingClient, FolderTreeItem folder) throws IOException, MailException { 91 + protected void handleSetActiveFolder(IncomingMailClient incomingClient, FolderTreeItem folder) throws IOException, MailException { 92 92 boolean isStateValid = incomingClient.setActiveFolder(folder, true); 93 93 94 94 if(!isStateValid) {
+3 -3
LogicMail/src/org/logicprobe/LogicMail/mail/imap/ImapClient.java
··· 698 698 699 699 if(mapValid && notifyAvailable && mailboxState.getExists() > previousExists) { 700 700 if(clientListener != null) { 701 - clientListener.recentFolderMessagesAvailable(); 701 + clientListener.recentFolderMessagesAvailable(mailbox); 702 702 } 703 703 } 704 704 ··· 1312 1312 if(mailboxState.getExists() < value) { 1313 1313 mailboxState.setExists(value); 1314 1314 if(clientListener != null) { 1315 - clientListener.recentFolderMessagesAvailable(); 1315 + clientListener.recentFolderMessagesAvailable(activeMailbox); 1316 1316 } 1317 1317 } 1318 1318 } 1319 1319 public void recentResponse(int value) { 1320 1320 if(clientListener != null) { 1321 - clientListener.recentFolderMessagesAvailable(); 1321 + clientListener.recentFolderMessagesAvailable(activeMailbox); 1322 1322 } 1323 1323 } 1324 1324 public void expungeResponse(int value) {
+7 -6
LogicMailTests/src/org/logicprobe/LogicMail/mail/MockIncomingMailClientListener.java
··· 73 73 } 74 74 } 75 75 76 - public static final MockMethod MTHD_RECENT_FOLDER_MESSAGES_AVAILABLE = new MockMethod( 76 + public static final MockMethod MTHD_RECENT_FOLDER_MESSAGES_AVAILABLE_$_FOLDERTREEITEM = new MockMethod( 77 77 MockIncomingMailClientListener.class, 78 - "MTHD_RECENT_FOLDER_MESSAGES_AVAILABLE", 79 - new Class[]{}, 78 + "MTHD_RECENT_FOLDER_MESSAGES_AVAILABLE_$_FOLDERTREEITEM", 79 + new Class[]{org.logicprobe.LogicMail.mail.FolderTreeItem.class}, 80 80 new Class[]{}, 81 81 null, 82 82 true); 83 - public void recentFolderMessagesAvailable() { 83 + public void recentFolderMessagesAvailable(org.logicprobe.LogicMail.mail.FolderTreeItem arg0) { 84 84 try { 85 - Object[] args = new Object[0]; 86 - MethodInvocation mi = new MethodInvocation(MTHD_RECENT_FOLDER_MESSAGES_AVAILABLE, this, args); 85 + Object[] args = new Object[1]; 86 + args[0] = arg0; 87 + MethodInvocation mi = new MethodInvocation(MTHD_RECENT_FOLDER_MESSAGES_AVAILABLE_$_FOLDERTREEITEM, this, args); 87 88 getInvocationHandler().invoke(mi); 88 89 mi.getReturnValue(); 89 90 } catch (Throwable t) {
+2 -1
LogicMailTests/src/org/logicprobe/LogicMail/mail/imap/ImapClientTest.java
··· 304 304 305 305 hammock.setExpectation(MockImapProtocol.MTHD_EXECUTE_IDLE_$_IMAPPROTOCOL$IDLELISTENER, 306 306 new Object[] { null }).setArgumentMatcher(0, new NotNullArgumentMatcher()); 307 - hammock.setExpectation(MockIncomingMailClientListener.MTHD_RECENT_FOLDER_MESSAGES_AVAILABLE); 307 + hammock.setExpectation(MockIncomingMailClientListener.MTHD_RECENT_FOLDER_MESSAGES_AVAILABLE_$_FOLDERTREEITEM, 308 + new Object[] { inboxFolder }); 308 309 hammock.setExpectation(MockImapProtocol.MTHD_EXECUTE_IDLE_DONE); 309 310 310 311 instance.idleModeBegin();