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
This commit is contained in:
Artem Bilan
2019-01-23 10:34:54 -05:00
committed by Gary Russell
parent 690a2c3c3e
commit 5b42c28f40

View File

@@ -343,25 +343,19 @@ public abstract class AbstractMailReceiver extends IntegrationObjectSupport impl
this.folderReadLock.lock();
try {
try {
obtainFolder();
MimeMessage[] filteredMessages = searchAndFilterMessages();
if (this.headerMapper != null) {
org.springframework.messaging.Message<?>[] converted =
new org.springframework.messaging.Message<?>[filteredMessages.length];
int n = 0;
for (MimeMessage message : filteredMessages) {
Map<String, Object> headers = this.headerMapper.toHeaders(message);
converted[n++] =
getMessageBuilderFactory()
.withPayload(extractContent(message, headers))
.copyHeaders(headers)
.build();
Folder folderToCheck = getFolder();
if (folderToCheck == null || !folderToCheck.isOpen()) {
this.folderReadLock.unlock();
this.folderWriteLock.lock();
try {
openFolder();
this.folderReadLock.lock();
}
finally {
this.folderWriteLock.unlock();
}
return converted;
}
else {
return filteredMessages;
}
return convertMessagesIfNecessary(searchAndFilterMessages());
}
finally {
MailTransportUtils.closeFolder(this.folder, this.shouldDeleteMessages);
@@ -372,21 +366,6 @@ public abstract class AbstractMailReceiver extends IntegrationObjectSupport impl
}
}
private void obtainFolder() throws MessagingException {
Folder folder = getFolder();
if (folder == null || !folder.isOpen()) {
this.folderReadLock.unlock();
this.folderWriteLock.lock();
try {
openFolder();
this.folderReadLock.lock();
}
finally {
this.folderWriteLock.unlock();
}
}
}
private MimeMessage[] searchAndFilterMessages() throws MessagingException {
if (this.logger.isInfoEnabled()) {
this.logger.info("attempting to receive mail from folder [" + this.folder.getFullName() + "]");
@@ -414,6 +393,26 @@ public abstract class AbstractMailReceiver extends IntegrationObjectSupport impl
return filteredMessages;
}
private Object[] convertMessagesIfNecessary(MimeMessage[] filteredMessages) {
if (this.headerMapper != null) {
org.springframework.messaging.Message<?>[] converted =
new org.springframework.messaging.Message<?>[filteredMessages.length];
int n = 0;
for (MimeMessage message : filteredMessages) {
Map<String, Object> headers = this.headerMapper.toHeaders(message);
converted[n++] =
getMessageBuilderFactory()
.withPayload(extractContent(message, headers))
.copyHeaders(headers)
.build();
}
return converted;
}
else {
return filteredMessages;
}
}
private Object extractContent(MimeMessage message, Map<String, Object> headers) {
Object content;
try {