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:
committed by
Gary Russell
parent
690a2c3c3e
commit
5b42c28f40
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user