Skip to content

Commit 5b42c28

Browse files
artembilangaryrussell
authored andcommitted
Refactor AbstractMailReceiver for proper locking
According Sonar we can't just leave lock unlocked in th method, so apply refactoring for the `AbstractMailReceiver.receive()` where we don't have uncontrolled `lock()` in the separate method
1 parent 690a2c3 commit 5b42c28

File tree

1 file changed

+31
-32
lines changed

1 file changed

+31
-32
lines changed

spring-integration-mail/src/main/java/org/springframework/integration/mail/AbstractMailReceiver.java

Lines changed: 31 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -343,25 +343,19 @@ public Object[] receive() throws javax.mail.MessagingException {
343343
this.folderReadLock.lock();
344344
try {
345345
try {
346-
obtainFolder();
347-
MimeMessage[] filteredMessages = searchAndFilterMessages();
348-
if (this.headerMapper != null) {
349-
org.springframework.messaging.Message<?>[] converted =
350-
new org.springframework.messaging.Message<?>[filteredMessages.length];
351-
int n = 0;
352-
for (MimeMessage message : filteredMessages) {
353-
Map<String, Object> headers = this.headerMapper.toHeaders(message);
354-
converted[n++] =
355-
getMessageBuilderFactory()
356-
.withPayload(extractContent(message, headers))
357-
.copyHeaders(headers)
358-
.build();
346+
Folder folderToCheck = getFolder();
347+
if (folderToCheck == null || !folderToCheck.isOpen()) {
348+
this.folderReadLock.unlock();
349+
this.folderWriteLock.lock();
350+
try {
351+
openFolder();
352+
this.folderReadLock.lock();
353+
}
354+
finally {
355+
this.folderWriteLock.unlock();
359356
}
360-
return converted;
361-
}
362-
else {
363-
return filteredMessages;
364357
}
358+
return convertMessagesIfNecessary(searchAndFilterMessages());
365359
}
366360
finally {
367361
MailTransportUtils.closeFolder(this.folder, this.shouldDeleteMessages);
@@ -372,21 +366,6 @@ public Object[] receive() throws javax.mail.MessagingException {
372366
}
373367
}
374368

375-
private void obtainFolder() throws MessagingException {
376-
Folder folder = getFolder();
377-
if (folder == null || !folder.isOpen()) {
378-
this.folderReadLock.unlock();
379-
this.folderWriteLock.lock();
380-
try {
381-
openFolder();
382-
this.folderReadLock.lock();
383-
}
384-
finally {
385-
this.folderWriteLock.unlock();
386-
}
387-
}
388-
}
389-
390369
private MimeMessage[] searchAndFilterMessages() throws MessagingException {
391370
if (this.logger.isInfoEnabled()) {
392371
this.logger.info("attempting to receive mail from folder [" + this.folder.getFullName() + "]");
@@ -414,6 +393,26 @@ private MimeMessage[] searchAndFilterMessages() throws MessagingException {
414393
return filteredMessages;
415394
}
416395

396+
private Object[] convertMessagesIfNecessary(MimeMessage[] filteredMessages) {
397+
if (this.headerMapper != null) {
398+
org.springframework.messaging.Message<?>[] converted =
399+
new org.springframework.messaging.Message<?>[filteredMessages.length];
400+
int n = 0;
401+
for (MimeMessage message : filteredMessages) {
402+
Map<String, Object> headers = this.headerMapper.toHeaders(message);
403+
converted[n++] =
404+
getMessageBuilderFactory()
405+
.withPayload(extractContent(message, headers))
406+
.copyHeaders(headers)
407+
.build();
408+
}
409+
return converted;
410+
}
411+
else {
412+
return filteredMessages;
413+
}
414+
}
415+
417416
private Object extractContent(MimeMessage message, Map<String, Object> headers) {
418417
Object content;
419418
try {

0 commit comments

Comments
 (0)