Skip to content

Commit 119db81

Browse files
artembilangaryrussell
authored andcommitted
* Fix new Sonar issue in the AbstractMailReceiver (#2709)
* * Fix new Sonar issue in the `AbstractMailReceiver` * * Move `unlock()` to its own `finally` * * Make `ImapMailReceiverTests.imapIdleServer` non-static to allow recreate the mail server for each test method https://build.spring.io/browse/INT-MASTERSPRING40-591/ * * Remove MongoDb download from Travis config * * Fix Checkstyle violation
1 parent d37e656 commit 119db81

File tree

3 files changed

+78
-75
lines changed

3 files changed

+78
-75
lines changed

.travis.yml

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,6 @@ services:
55
- mongodb
66
- rabbitmq
77
- redis-server
8-
addons:
9-
apt:
10-
sources:
11-
- mongodb-3.0-precise
12-
packages:
13-
- mongodb-org-server
148
before_cache:
159
- rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
1610
cache:

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

Lines changed: 59 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -341,66 +341,77 @@ private Folder obtainFolderInstance() throws MessagingException {
341341
@Override
342342
public Object[] receive() throws javax.mail.MessagingException {
343343
this.folderReadLock.lock();
344+
try {
345+
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();
359+
}
360+
return converted;
361+
}
362+
else {
363+
return filteredMessages;
364+
}
365+
}
366+
finally {
367+
MailTransportUtils.closeFolder(this.folder, this.shouldDeleteMessages);
368+
}
369+
}
370+
finally {
371+
this.folderReadLock.unlock();
372+
}
373+
}
374+
375+
private void obtainFolder() throws MessagingException {
344376
Folder folder = getFolder();
345377
if (folder == null || !folder.isOpen()) {
346378
this.folderReadLock.unlock();
347379
this.folderWriteLock.lock();
348380
try {
349381
openFolder();
350-
folder = getFolder();
351382
this.folderReadLock.lock();
352383
}
353384
finally {
354385
this.folderWriteLock.unlock();
355386
}
356387
}
357-
try {
358-
if (this.logger.isInfoEnabled()) {
359-
this.logger.info("attempting to receive mail from folder [" + folder.getFullName() + "]");
360-
}
361-
Message[] messages = searchForNewMessages();
362-
if (this.maxFetchSize > 0 && messages.length > this.maxFetchSize) {
363-
Message[] reducedMessages = new Message[this.maxFetchSize];
364-
System.arraycopy(messages, 0, reducedMessages, 0, this.maxFetchSize);
365-
messages = reducedMessages;
366-
}
367-
if (this.logger.isDebugEnabled()) {
368-
this.logger.debug("found " + messages.length + " new messages");
369-
}
370-
if (messages.length > 0) {
371-
fetchMessages(messages);
372-
}
373-
374-
if (this.logger.isDebugEnabled()) {
375-
this.logger.debug("Received " + messages.length + " messages");
376-
}
388+
}
377389

378-
MimeMessage[] filteredMessages = filterMessagesThruSelector(messages);
379-
380-
postProcessFilteredMessages(filteredMessages);
381-
382-
if (this.headerMapper != null) {
383-
org.springframework.messaging.Message<?>[] converted =
384-
new org.springframework.messaging.Message<?>[filteredMessages.length];
385-
int n = 0;
386-
for (MimeMessage message : filteredMessages) {
387-
Map<String, Object> headers = this.headerMapper.toHeaders(message);
388-
converted[n++] =
389-
getMessageBuilderFactory()
390-
.withPayload(extractContent(message, headers))
391-
.copyHeaders(headers)
392-
.build();
393-
}
394-
return converted;
395-
}
396-
else {
397-
return filteredMessages;
398-
}
390+
private MimeMessage[] searchAndFilterMessages() throws MessagingException {
391+
if (this.logger.isInfoEnabled()) {
392+
this.logger.info("attempting to receive mail from folder [" + this.folder.getFullName() + "]");
399393
}
400-
finally {
401-
MailTransportUtils.closeFolder(folder, this.shouldDeleteMessages);
402-
this.folderReadLock.unlock();
394+
Message[] messages = searchForNewMessages();
395+
if (this.maxFetchSize > 0 && messages.length > this.maxFetchSize) {
396+
Message[] reducedMessages = new Message[this.maxFetchSize];
397+
System.arraycopy(messages, 0, reducedMessages, 0, this.maxFetchSize);
398+
messages = reducedMessages;
399+
}
400+
if (this.logger.isDebugEnabled()) {
401+
this.logger.debug("found " + messages.length + " new messages");
402+
}
403+
if (messages.length > 0) {
404+
fetchMessages(messages);
403405
}
406+
407+
if (this.logger.isDebugEnabled()) {
408+
this.logger.debug("Received " + messages.length + " messages");
409+
}
410+
411+
MimeMessage[] filteredMessages = filterMessagesThruSelector(messages);
412+
413+
postProcessFilteredMessages(filteredMessages);
414+
return filteredMessages;
404415
}
405416

406417
private Object extractContent(MimeMessage message, Map<String, Object> headers) {
@@ -525,7 +536,6 @@ private MimeMessage[] filterMessagesThruSelector(Message[] messages) throws Mess
525536
* Fetches the specified messages from this receiver's folder. Default
526537
* implementation {@link Folder#fetch(Message[], FetchProfile) fetches}
527538
* every {@link javax.mail.FetchProfile.Item}.
528-
*
529539
* @param messages the messages to fetch
530540
* @throws MessagingException in case of JavaMail errors
531541
*/
@@ -539,7 +549,6 @@ protected void fetchMessages(Message[] messages) throws MessagingException {
539549

540550
/**
541551
* Deletes the given messages from this receiver's folder.
542-
*
543552
* @param messages the messages to delete
544553
* @throws MessagingException in case of JavaMail errors
545554
*/
@@ -552,7 +561,6 @@ protected void deleteMessages(Message[] messages) throws MessagingException {
552561
/**
553562
* Optional method allowing you to set additional flags.
554563
* Currently only implemented in IMapMailReceiver.
555-
*
556564
* @param message The message.
557565
* @throws MessagingException A MessagingException.
558566
*/
@@ -593,9 +601,10 @@ Store getStore() {
593601
* Since we copy the message to eagerly fetch the message, it has no folder.
594602
* However, we need to make a folder available in case the user wants to
595603
* perform operations on the message in the folder later in the flow.
604+
*
596605
* @author Gary Russell
597-
* @since 2.2
598606
*
607+
* @since 2.2
599608
*/
600609
private final class IntegrationMimeMessage extends MimeMessage {
601610

@@ -625,7 +634,7 @@ private final class IntegrationMimeMessage extends MimeMessage {
625634
@Override
626635
public Folder getFolder() {
627636
try {
628-
return AbstractMailReceiver.this.obtainFolderInstance();
637+
return obtainFolderInstance();
629638
}
630639
catch (MessagingException e) {
631640
throw new org.springframework.messaging.MessagingException("Unable to obtain the mail folder", e);

spring-integration-mail/src/test/java/org/springframework/integration/mail/ImapMailReceiverTests.java

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2018 the original author or authors.
2+
* Copyright 2002-2019 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -66,8 +66,8 @@
6666
import javax.mail.search.FromTerm;
6767

6868
import org.apache.commons.logging.Log;
69-
import org.junit.AfterClass;
70-
import org.junit.BeforeClass;
69+
import org.junit.After;
70+
import org.junit.Before;
7171
import org.junit.Ignore;
7272
import org.junit.Rule;
7373
import org.junit.Test;
@@ -112,7 +112,7 @@
112112
@DirtiesContext
113113
public class ImapMailReceiverTests {
114114

115-
private static final ImapServer imapIdleServer = TestMailServer.imap(0);
115+
private final ImapServer imapIdleServer = TestMailServer.imap(0);
116116

117117
@Rule
118118
public final LongRunningIntegrationTest longRunningIntegrationTest = new LongRunningIntegrationTest();
@@ -123,24 +123,24 @@ public class ImapMailReceiverTests {
123123
@Autowired
124124
private ApplicationContext context;
125125

126-
@BeforeClass
127-
public static void setup() throws InterruptedException {
126+
@Before
127+
public void setup() throws InterruptedException {
128128
int n = 0;
129-
while (n++ < 100 && (!imapIdleServer.isListening())) {
129+
while (n++ < 100 && (!this.imapIdleServer.isListening())) {
130130
Thread.sleep(100);
131131
}
132132
assertTrue(n < 100);
133133
}
134134

135-
@AfterClass
136-
public static void tearDown() {
137-
imapIdleServer.stop();
135+
@After
136+
public void tearDown() {
137+
this.imapIdleServer.stop();
138138
}
139139

140140
@Test
141141
public void testIdleWithServerCustomSearch() throws Exception {
142142
ImapMailReceiver receiver =
143-
new ImapMailReceiver("imap://user:pw@localhost:" + imapIdleServer.getPort() + "/INBOX");
143+
new ImapMailReceiver("imap://user:pw@localhost:" + this.imapIdleServer.getPort() + "/INBOX");
144144
receiver.setSearchTermStrategy((supportedFlags, folder) -> {
145145
try {
146146
FromTerm fromTerm = new FromTerm(new InternetAddress("bar@baz"));
@@ -156,32 +156,32 @@ public void testIdleWithServerCustomSearch() throws Exception {
156156
@Test
157157
public void testIdleWithServerDefaultSearch() throws Exception {
158158
ImapMailReceiver receiver =
159-
new ImapMailReceiver("imap://user:pw@localhost:" + imapIdleServer.getPort() + "/INBOX");
159+
new ImapMailReceiver("imap://user:pw@localhost:" + this.imapIdleServer.getPort() + "/INBOX");
160160
testIdleWithServerGuts(receiver, false);
161-
assertTrue(imapIdleServer.assertReceived("searchWithUserFlag"));
161+
assertTrue(this.imapIdleServer.assertReceived("searchWithUserFlag"));
162162
}
163163

164164
@Test
165165
public void testIdleWithMessageMapping() throws Exception {
166166
ImapMailReceiver receiver =
167-
new ImapMailReceiver("imap://user:pw@localhost:" + imapIdleServer.getPort() + "/INBOX");
167+
new ImapMailReceiver("imap://user:pw@localhost:" + this.imapIdleServer.getPort() + "/INBOX");
168168
receiver.setHeaderMapper(new DefaultMailHeaderMapper());
169169
testIdleWithServerGuts(receiver, true);
170170
}
171171

172172
@Test
173173
public void testIdleWithServerDefaultSearchSimple() throws Exception {
174174
ImapMailReceiver receiver =
175-
new ImapMailReceiver("imap://user:pw@localhost:" + imapIdleServer.getPort() + "/INBOX");
175+
new ImapMailReceiver("imap://user:pw@localhost:" + this.imapIdleServer.getPort() + "/INBOX");
176176
receiver.setSimpleContent(true);
177177
testIdleWithServerGuts(receiver, false, true);
178-
assertTrue(imapIdleServer.assertReceived("searchWithUserFlag"));
178+
assertTrue(this.imapIdleServer.assertReceived("searchWithUserFlag"));
179179
}
180180

181181
@Test
182182
public void testIdleWithMessageMappingSimple() throws Exception {
183183
ImapMailReceiver receiver =
184-
new ImapMailReceiver("imap://user:pw@localhost:" + imapIdleServer.getPort() + "/INBOX");
184+
new ImapMailReceiver("imap://user:pw@localhost:" + this.imapIdleServer.getPort() + "/INBOX");
185185
receiver.setSimpleContent(true);
186186
receiver.setHeaderMapper(new DefaultMailHeaderMapper());
187187
testIdleWithServerGuts(receiver, true, true);
@@ -192,7 +192,7 @@ public void testIdleWithServerGuts(ImapMailReceiver receiver, boolean mapped) th
192192
}
193193

194194
public void testIdleWithServerGuts(ImapMailReceiver receiver, boolean mapped, boolean simple) throws Exception {
195-
imapIdleServer.resetServer();
195+
this.imapIdleServer.resetServer();
196196
Properties mailProps = new Properties();
197197
mailProps.put("mail.debug", "true");
198198
mailProps.put("mail.imap.connectionpool.debug", "true");
@@ -256,7 +256,7 @@ public void testIdleWithServerGuts(ImapMailReceiver receiver, boolean mapped, bo
256256

257257
adapter.stop();
258258
taskScheduler.shutdown();
259-
assertTrue(imapIdleServer.assertReceived("storeUserFlag"));
259+
assertTrue(this.imapIdleServer.assertReceived("storeUserFlag"));
260260
}
261261

262262
@Test

0 commit comments

Comments
 (0)