Update Imap handling fixing not closing stores, which produced dangling imap connections
diff --git a/src/main/java/org/eclipse/openk/statementpublicaffairs/service/mail/MailContext.java b/src/main/java/org/eclipse/openk/statementpublicaffairs/service/mail/MailContext.java
index 66521a3..fad89fa 100644
--- a/src/main/java/org/eclipse/openk/statementpublicaffairs/service/mail/MailContext.java
+++ b/src/main/java/org/eclipse/openk/statementpublicaffairs/service/mail/MailContext.java
@@ -73,7 +73,7 @@
private static final String IMAP_FOLDER_PROCESSED_STATEMENTS = "Processed Statements";
private static final String IMAP_FOLDER_TRASH = "Trash";
- private Object syncobject = new Object();
+ private final Object syncobject = new Object();
private MailSession session;
private MailUtil mailUtil;
@@ -95,65 +95,69 @@
return getSession().newMessage();
}
- public Folder getFolder(String folderPath) throws MessagingException {
+ public Store getStore() throws MessagingException {
Store store = session.getStore(IMAP);
if (!store.isConnected()) {
store.connect();
}
- return store.getFolder(folderPath);
+ return store;
}
- public Folder getInbox() throws MessagingException {
- return getFolder(IMAP_FOLDER_INBOX);
+ public Folder getInbox(Store store) throws MessagingException {
+ return store.getFolder(IMAP_FOLDER_INBOX);
}
- public Folder getTrash() throws MessagingException {
- return getFolder(IMAP_FOLDER_TRASH);
+ public Folder getTrash(Store store) throws MessagingException {
+ return store.getFolder(IMAP_FOLDER_TRASH);
}
- public Folder getProcessedStatementBox() throws MessagingException {
- return getFolder(IMAP_FOLDER_PROCESSED_STATEMENTS);
+ public Folder getProcessedStatementBox(Store store) throws MessagingException {
+ return store.getFolder(IMAP_FOLDER_PROCESSED_STATEMENTS);
}
public List<String> getInboxMessageIds(String filterMailToAddress) throws MessagingException {
- Folder inbox = getInbox();
- inbox.open(Folder.READ_ONLY);
- List<String> messageIds = new ArrayList<>();
- for (Message m : inbox.getMessages()) {
- if (filterMailToAddress != null) {
- List<InternetAddress> to = Stream.of(m.getAllRecipients()).filter(InternetAddress.class::isInstance)
- .map(InternetAddress.class::cast).collect(Collectors.toList());
- boolean found = false;
- for (InternetAddress addr : to) {
- if (filterMailToAddress.equals(addr.getAddress())) {
- found = true;
- break;
+ try (Store store = getStore()) {
+ Folder inbox = getInbox(store);
+ inbox.open(Folder.READ_ONLY);
+ List<String> messageIds = new ArrayList<>();
+ for (Message m : inbox.getMessages()) {
+ if (filterMailToAddress != null) {
+ List<InternetAddress> to = Stream.of(m.getAllRecipients()).filter(InternetAddress.class::isInstance)
+ .map(InternetAddress.class::cast).collect(Collectors.toList());
+ boolean found = false;
+ for (InternetAddress addr : to) {
+ if (filterMailToAddress.equals(addr.getAddress())) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ continue;
}
}
- if (!found) {
- continue;
+ String[] s = m.getHeader(MESSAGE_ID);
+ if (s.length > 0) {
+ messageIds.add(s[0]);
}
}
- String[] s = m.getHeader(MESSAGE_ID);
- if (s.length > 0) {
- messageIds.add(s[0]);
- }
+ inbox.close();
+ return messageIds;
}
- inbox.close();
- return messageIds;
}
public List<MailEntry> getInboxMessages(String filterMailToAddress) throws MessagingException {
- Folder inbox = getInbox();
- inbox.open(Folder.READ_ONLY);
- List<MailEntry> mails = new ArrayList<>();
- for (Message m : inbox.getMessages()) {
- if (toAddressMatches(m, filterMailToAddress)) {
- parseMail(m).ifPresent(mails::add);
+ try (Store store = getStore()) {
+ Folder inbox = getInbox(store);
+ inbox.open(Folder.READ_ONLY);
+ List<MailEntry> mails = new ArrayList<>();
+ for (Message m : inbox.getMessages()) {
+ if (toAddressMatches(m, filterMailToAddress)) {
+ parseMail(m).ifPresent(mails::add);
+ }
}
+ inbox.close();
+ return mails;
}
- inbox.close();
- return mails;
}
private String parseFrom(Message m) throws MessagingException {
@@ -208,27 +212,33 @@
String folderPath) {
Optional<Map<String, AttachmentFile>> result = Optional.empty();
- Folder folder = null;
- try {
- folder = getFolder(folderPath);
- folder.open(Folder.READ_ONLY);
- SearchTerm messageIdSearch = new MessageIDTerm(messageId);
- Message[] messages = folder.search(messageIdSearch);
- if (messages.length > 0) {
- Message m = messages[0];
- result = Optional.of(getAttachmentFilesFromMessage(m, fileNames));
- }
- folder.close();
- } catch (MessagingException e) {
- log.warning(CLOSING_INBOX_FAILED + e.getMessage());
- }
- if (folder.isOpen()) {
+ try (Store store = getStore()) {
+ Folder folder = null;
try {
+ folder = store.getFolder(folderPath);
+ folder.open(Folder.READ_ONLY);
+ SearchTerm messageIdSearch = new MessageIDTerm(messageId);
+ Message[] messages = folder.search(messageIdSearch);
+ if (messages.length > 0) {
+ Message m = messages[0];
+ result = Optional.of(getAttachmentFilesFromMessage(m, fileNames));
+ }
folder.close();
} catch (MessagingException e) {
log.warning(CLOSING_INBOX_FAILED + e.getMessage());
}
+ if (folder.isOpen()) {
+ try {
+ folder.close();
+ } catch (MessagingException e) {
+ log.warning(CLOSING_INBOX_FAILED + e.getMessage());
+ }
+ }
+
+ } catch (MessagingException e) {
+ log.warning(CLOSING_INBOX_FAILED + e.getMessage());
}
+
return result;
}
@@ -360,10 +370,10 @@
synchronized (syncobject) {
Folder sourceFolder = null;
Folder dstFolder = null;
- try {
- sourceFolder = getFolder(sourceFolderPath);
+ try (Store store = getStore()) {
+ sourceFolder = store.getFolder(sourceFolderPath);
sourceFolder.open(Folder.READ_WRITE);
- dstFolder = getFolder(destFolderPath);
+ dstFolder = store.getFolder(destFolderPath);
dstFolder.open(Folder.READ_WRITE);
SearchTerm messageIdSearch = new MessageIDTerm(messageId);
@@ -424,8 +434,8 @@
private Optional<MailEntry> findMail(String messageId, String folderPath) {
Optional<MailEntry> oMail = Optional.empty();
Folder folder = null;
- try {
- folder = getFolder(folderPath);
+ try (Store store = getStore()) {
+ folder = store.getFolder(folderPath);
folder.open(Folder.READ_ONLY);
SearchTerm messageIdSearch = new MessageIDTerm(messageId);
Message[] messages = folder.search(messageIdSearch);
diff --git a/src/test/java/org/eclipse/openk/statementpublicaffairs/service/mail/MailContextTest.java b/src/test/java/org/eclipse/openk/statementpublicaffairs/service/mail/MailContextTest.java
index a561ca4..857cadb 100644
--- a/src/test/java/org/eclipse/openk/statementpublicaffairs/service/mail/MailContextTest.java
+++ b/src/test/java/org/eclipse/openk/statementpublicaffairs/service/mail/MailContextTest.java
@@ -93,7 +93,8 @@
Mockito.when(store.getFolder(folderPath)).thenReturn(folder);
MailContext mailContext = new MailContext(mailUtil, propertiesPath);
- Folder responseFolder = mailContext.getFolder(folderPath);
+ Store store = mailContext.getStore();
+ Folder responseFolder = store.getFolder(folderPath);
assertEquals(folder, responseFolder);
Mockito.verify(store).isConnected();
Mockito.verify(store).connect();
@@ -109,7 +110,8 @@
Mockito.when(store.getFolder(folderPath)).thenReturn(folder);
MailContext mailContext = new MailContext(mailUtil, propertiesPath);
- Folder responseFolder = mailContext.getInbox();
+ Store store = mailContext.getStore();
+ Folder responseFolder = mailContext.getInbox(store);
assertEquals(folder, responseFolder);
Mockito.verify(store).isConnected();
Mockito.verify(store).connect();
@@ -125,7 +127,8 @@
Mockito.when(store.getFolder(folderPath)).thenReturn(folder);
MailContext mailContext = new MailContext(mailUtil, propertiesPath);
- Folder responseFolder = mailContext.getTrash();
+ Store store = mailContext.getStore();
+ Folder responseFolder = mailContext.getTrash(store);
assertEquals(folder, responseFolder);
Mockito.verify(store).isConnected();
Mockito.verify(store).connect();
@@ -141,7 +144,8 @@
Mockito.when(store.getFolder(folderPath)).thenReturn(folder);
MailContext mailContext = new MailContext(mailUtil, propertiesPath);
- Folder responseFolder = mailContext.getProcessedStatementBox();
+ Store store = mailContext.getStore();
+ Folder responseFolder = mailContext.getProcessedStatementBox(store);
assertEquals(folder, responseFolder);
Mockito.verify(store).isConnected();
Mockito.verify(store).connect();