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();