diff --git a/spring-integration-mail/src/main/java/org/springframework/integration/mail/ImapIdleChannelAdapter.java b/spring-integration-mail/src/main/java/org/springframework/integration/mail/ImapIdleChannelAdapter.java index 6a710495da..a14924c1ac 100755 --- a/spring-integration-mail/src/main/java/org/springframework/integration/mail/ImapIdleChannelAdapter.java +++ b/spring-integration-mail/src/main/java/org/springframework/integration/mail/ImapIdleChannelAdapter.java @@ -256,9 +256,12 @@ public class ImapIdleChannelAdapter extends MessageProducerSupport implements Be } } catch (Exception e) { //run again after a delay - logger.warn("Failed to execute IDLE task. Will attempt to resubmit in " + ImapIdleChannelAdapter.this.reconnectDelay + " milliseconds.", e); + if (logger.isWarnEnabled()) { + logger.warn("Failed to execute IDLE task. Will attempt to resubmit in " + + ImapIdleChannelAdapter.this.reconnectDelay + " milliseconds.", e); + } ImapIdleChannelAdapter.this.receivingTaskTrigger.delayNextExecution(); - ImapIdleChannelAdapter.this.publishException(e); + publishException(e); } } } @@ -312,6 +315,7 @@ public class ImapIdleChannelAdapter extends MessageProducerSupport implements Be } } } + } private class ExceptionAwarePeriodicTrigger implements Trigger { @@ -334,18 +338,20 @@ public class ImapIdleChannelAdapter extends MessageProducerSupport implements Be } } - public void delayNextExecution() { + void delayNextExecution() { this.delayNextExecution = true; } + } public class ImapIdleExceptionEvent extends MailIntegrationEvent { private static final long serialVersionUID = -5875388810251967741L; - public ImapIdleExceptionEvent(Exception e) { + ImapIdleExceptionEvent(Exception e) { super(ImapIdleChannelAdapter.this, e); } } + } diff --git a/spring-integration-mail/src/main/java/org/springframework/integration/mail/ImapMailReceiver.java b/spring-integration-mail/src/main/java/org/springframework/integration/mail/ImapMailReceiver.java index 4c0b8b8f4b..a207caea6f 100755 --- a/spring-integration-mail/src/main/java/org/springframework/integration/mail/ImapMailReceiver.java +++ b/spring-integration-mail/src/main/java/org/springframework/integration/mail/ImapMailReceiver.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2016 the original author or authors. + * Copyright 2002-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,9 +16,9 @@ package org.springframework.integration.mail; -import java.util.ArrayList; +import java.util.Arrays; import java.util.Date; -import java.util.List; +import java.util.Objects; import java.util.Properties; import java.util.concurrent.ScheduledFuture; @@ -63,13 +63,15 @@ public class ImapMailReceiver extends AbstractMailReceiver { private final IdleCanceler idleCanceler = new IdleCanceler(); - private volatile boolean shouldMarkMessagesAsRead = true; + private boolean shouldMarkMessagesAsRead = true; - private volatile SearchTermStrategy searchTermStrategy = new DefaultSearchTermStrategy(); + private SearchTermStrategy searchTermStrategy = new DefaultSearchTermStrategy(); - private volatile long cancelIdleInterval = DEFAULT_CANCEL_IDLE_INTERVAL; + private long cancelIdleInterval = DEFAULT_CANCEL_IDLE_INTERVAL; - private volatile TaskScheduler scheduler; + private TaskScheduler scheduler; + + private boolean isInternalScheduler; private volatile ScheduledFuture pingTask; @@ -92,7 +94,6 @@ public class ImapMailReceiver extends AbstractMailReceiver { /** * Check if messages should be marked as read. - * * @return true if messages should be marked as read. */ public Boolean isShouldMarkMessagesAsRead() { @@ -102,7 +103,6 @@ public class ImapMailReceiver extends AbstractMailReceiver { /** * Provides a way to set custom {@link SearchTermStrategy} to compile a {@link SearchTerm} * to be applied when retrieving mail - * * @param searchTermStrategy The search term strategy implementation. */ public void setSearchTermStrategy(SearchTermStrategy searchTermStrategy) { @@ -112,7 +112,6 @@ public class ImapMailReceiver extends AbstractMailReceiver { /** * Specify if messages should be marked as read. - * * @param shouldMarkMessagesAsRead true if messages should be marked as read. */ public void setShouldMarkMessagesAsRead(Boolean shouldMarkMessagesAsRead) { @@ -138,6 +137,7 @@ public class ImapMailReceiver extends AbstractMailReceiver { ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); scheduler.initialize(); this.scheduler = scheduler; + this.isInternalScheduler = true; } Properties javaMailProperties = getJavaMailProperties(); for (String name : new String[]{"imap", "imaps"}) { @@ -148,10 +148,17 @@ public class ImapMailReceiver extends AbstractMailReceiver { } } + @Override + public void destroy() throws Exception { + super.destroy(); + if (this.isInternalScheduler) { + ((ThreadPoolTaskScheduler) this.scheduler).shutdown(); + } + } + /** * This method is unique to the IMAP receiver and only works if IMAP IDLE * is supported (see RFC 2177 for more detail). - * * @throws MessagingException Any MessagingException. */ public void waitForNewMessages() throws MessagingException { @@ -189,7 +196,6 @@ public class ImapMailReceiver extends AbstractMailReceiver { * {@link javax.mail.Flags.Flag#ANSWERED ANSWERED}, and not * {@link javax.mail.Flags.Flag#DELETED DELETED}. The search term is used * to {@link Folder#search(SearchTerm) search} for new messages. - * * @return the new messages * @throws MessagingException in case of JavaMail errors */ @@ -204,7 +210,6 @@ public class ImapMailReceiver extends AbstractMailReceiver { throw new MessagingException("Folder is closed"); } - // INT-3859 private Message[] nullSafeMessages(Message[] messageArray) { boolean hasNulls = false; for (Message message : messageArray) { @@ -217,13 +222,9 @@ public class ImapMailReceiver extends AbstractMailReceiver { return messageArray; } else { - List messages = new ArrayList(); - for (Message message : messageArray) { - if (message != null) { - messages.add(message); - } - } - return messages.toArray(new Message[messages.size()]); + return Arrays.stream(messageArray) + .filter(Objects::nonNull) + .toArray(Message[]::new); } } @@ -276,6 +277,7 @@ public class ImapMailReceiver extends AbstractMailReceiver { messages[0].getFolder().isOpen(); } } + } private class DefaultSearchTermStrategy implements SearchTermStrategy { diff --git a/spring-integration-mail/src/test/java/org/springframework/integration/mail/ImapMailReceiverTests.java b/spring-integration-mail/src/test/java/org/springframework/integration/mail/ImapMailReceiverTests.java index 98eb01ea4c..9f24f78cc7 100644 --- a/spring-integration-mail/src/test/java/org/springframework/integration/mail/ImapMailReceiverTests.java +++ b/spring-integration-mail/src/test/java/org/springframework/integration/mail/ImapMailReceiverTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,8 +16,11 @@ package org.springframework.integration.mail; +import static org.hamcrest.Matchers.emptyArray; +import static org.hamcrest.Matchers.endsWith; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.not; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; @@ -69,12 +72,13 @@ import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; +import org.junit.runner.RunWith; import org.mockito.Mockito; import org.springframework.beans.DirectFieldAccessor; import org.springframework.beans.factory.BeanFactory; -import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; import org.springframework.core.io.ClassPathResource; import org.springframework.expression.Expression; import org.springframework.expression.spel.standard.SpelExpressionParser; @@ -83,7 +87,6 @@ import org.springframework.integration.channel.QueueChannel; import org.springframework.integration.handler.AbstractReplyProducingMessageHandler; import org.springframework.integration.history.MessageHistory; import org.springframework.integration.mail.ImapIdleChannelAdapter.ImapIdleExceptionEvent; -import org.springframework.integration.mail.config.ImapIdleChannelAdapterParserTests; import org.springframework.integration.mail.support.DefaultMailHeaderMapper; import org.springframework.integration.test.mail.TestMailServer; import org.springframework.integration.test.mail.TestMailServer.ImapServer; @@ -93,6 +96,9 @@ import org.springframework.messaging.MessageHeaders; import org.springframework.messaging.PollableChannel; import org.springframework.scheduling.TaskScheduler; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; import com.sun.mail.imap.IMAPFolder; @@ -101,6 +107,10 @@ import com.sun.mail.imap.IMAPFolder; * @author Gary Russell * @author Artem Bilan */ +@RunWith(SpringRunner.class) +@ContextConfiguration( + "classpath:org/springframework/integration/mail/config/ImapIdleChannelAdapterParserTests-context.xml") +@DirtiesContext public class ImapMailReceiverTests { @Rule @@ -111,6 +121,9 @@ public class ImapMailReceiverTests { private final static ImapServer imapIdleServer = TestMailServer.imap(0); + @Autowired + private ApplicationContext context; + @BeforeClass public static void setup() throws InterruptedException { int n = 0; @@ -127,8 +140,8 @@ public class ImapMailReceiverTests { @Test public void testIdleWithServerCustomSearch() throws Exception { - ImapMailReceiver receiver = new ImapMailReceiver("imap://user:pw@localhost:" + imapIdleServer.getPort() - + "/INBOX"); + ImapMailReceiver receiver = + new ImapMailReceiver("imap://user:pw@localhost:" + imapIdleServer.getPort() + "/INBOX"); receiver.setSearchTermStrategy((supportedFlags, folder) -> { try { FromTerm fromTerm = new FromTerm(new InternetAddress("bar@baz")); @@ -143,24 +156,24 @@ public class ImapMailReceiverTests { @Test public void testIdleWithServerDefaultSearch() throws Exception { - ImapMailReceiver receiver = new ImapMailReceiver("imap://user:pw@localhost:" + imapIdleServer.getPort() - + "/INBOX"); + ImapMailReceiver receiver = + new ImapMailReceiver("imap://user:pw@localhost:" + imapIdleServer.getPort() + "/INBOX"); testIdleWithServerGuts(receiver, false); assertTrue(imapIdleServer.assertReceived("searchWithUserFlag")); } @Test public void testIdleWithMessageMapping() throws Exception { - ImapMailReceiver receiver = new ImapMailReceiver("imap://user:pw@localhost:" + imapIdleServer.getPort() - + "/INBOX"); + ImapMailReceiver receiver = + new ImapMailReceiver("imap://user:pw@localhost:" + imapIdleServer.getPort() + "/INBOX"); receiver.setHeaderMapper(new DefaultMailHeaderMapper()); testIdleWithServerGuts(receiver, true); } @Test public void testIdleWithServerDefaultSearchSimple() throws Exception { - ImapMailReceiver receiver = new ImapMailReceiver("imap://user:pw@localhost:" + imapIdleServer.getPort() - + "/INBOX"); + ImapMailReceiver receiver = + new ImapMailReceiver("imap://user:pw@localhost:" + imapIdleServer.getPort() + "/INBOX"); receiver.setSimpleContent(true); testIdleWithServerGuts(receiver, false, true); assertTrue(imapIdleServer.assertReceived("searchWithUserFlag")); @@ -168,8 +181,8 @@ public class ImapMailReceiverTests { @Test public void testIdleWithMessageMappingSimple() throws Exception { - ImapMailReceiver receiver = new ImapMailReceiver("imap://user:pw@localhost:" + imapIdleServer.getPort() - + "/INBOX"); + ImapMailReceiver receiver = + new ImapMailReceiver("imap://user:pw@localhost:" + imapIdleServer.getPort() + "/INBOX"); receiver.setSimpleContent(true); receiver.setHeaderMapper(new DefaultMailHeaderMapper()); testIdleWithServerGuts(receiver, true, true); @@ -188,7 +201,7 @@ public class ImapMailReceiverTests { receiver.setMaxFetchSize(1); receiver.setShouldDeleteMessages(false); receiver.setShouldMarkMessagesAsRead(true); - receiver.setCancelIdleInterval(8); + receiver.setCancelIdleInterval(1); ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); setUpScheduler(receiver, taskScheduler); receiver.setUserFlag("testSIUserFlag"); @@ -199,6 +212,7 @@ public class ImapMailReceiverTests { QueueChannel channel = new QueueChannel(); adapter.setOutputChannel(channel); adapter.setTaskScheduler(taskScheduler); + adapter.setReconnectDelay(1); adapter.start(); if (!mapped) { @SuppressWarnings("unchecked") @@ -224,7 +238,9 @@ public class ImapMailReceiverTests { assertThat(headers.get(MailHeaders.CONTENT_TYPE), equalTo("TEXT/PLAIN; charset=ISO-8859-1")); assertThat(headers.get(MessageHeaders.CONTENT_TYPE), equalTo("TEXT/PLAIN; charset=ISO-8859-1")); assertThat(headers.get(MailHeaders.FROM), equalTo("Bar ")); - assertThat((headers.get(MailHeaders.TO, String[].class))[0], equalTo("Foo ")); + String[] toHeader = headers.get(MailHeaders.TO, String[].class); + assertThat(toHeader, not(emptyArray())); + assertThat(toHeader[0], equalTo("Foo ")); assertThat(Arrays.toString(headers.get(MailHeaders.CC, String[].class)), equalTo("[a@b, c@d]")); assertThat(Arrays.toString(headers.get(MailHeaders.BCC, String[].class)), equalTo("[e@f, g@h]")); assertThat(headers.get(MailHeaders.SUBJECT), equalTo("Test Email")); @@ -236,7 +252,7 @@ public class ImapMailReceiverTests { } } assertNotNull(channel.receive(10000)); // new message after idle - assertNull(channel.receive(10000)); // no new message after second and third idle + assertNull(channel.receive(100)); // no new message after second and third idle verify(logger).debug("Canceling IDLE"); taskScheduler.shutdown(); assertTrue(imapIdleServer.assertReceived("storeUserFlag")); @@ -250,7 +266,7 @@ public class ImapMailReceiverTests { receiver = receiveAndMarkAsReadDontDeleteGuts(receiver, msg1, msg2); verify(msg1, times(1)).setFlag(Flag.SEEN, true); verify(msg2, times(1)).setFlag(Flag.SEEN, true); - verify(receiver, times(0)).deleteMessages((Message[]) Mockito.any()); + verify(receiver, times(0)).deleteMessages(Mockito.any()); } private AbstractMailReceiver receiveAndMarkAsReadDontDeleteGuts(AbstractMailReceiver receiver, Message msg1, @@ -269,7 +285,7 @@ public class ImapMailReceiverTests { willAnswer(invocation -> { DirectFieldAccessor accessor = new DirectFieldAccessor(invocation.getMock()); - int folderOpenMode = (Integer) accessor.getPropertyValue("folderOpenMode"); + int folderOpenMode = (int) accessor.getPropertyValue("folderOpenMode"); if (folderOpenMode != Folder.READ_WRITE) { throw new IllegalArgumentException("Folder had to be open in READ_WRITE mode"); } @@ -294,7 +310,7 @@ public class ImapMailReceiverTests { receiver = receiveAndMarkAsReadDontDeleteGuts(receiver, msg1, msg2); verify(msg1, times(1)).setFlag(Flag.SEEN, true); verify(msg2, times(1)).setFlag(Flag.SEEN, true); - verify(receiver, times(0)).deleteMessages((Message[]) Mockito.any()); + verify(receiver, times(0)).deleteMessages(Mockito.any()); } @Test // INT-2991 filtered messages were marked SEEN @@ -309,7 +325,7 @@ public class ImapMailReceiverTests { receiver = receiveAndMarkAsReadDontDeleteGuts(receiver, msg1, msg2); verify(msg1, times(1)).setFlag(Flag.SEEN, true); verify(msg2, never()).setFlag(Flag.SEEN, true); - verify(receiver, times(0)).deleteMessages((Message[]) Mockito.any()); + verify(receiver, times(0)).deleteMessages(Mockito.any()); } @@ -333,7 +349,7 @@ public class ImapMailReceiverTests { final Message[] messages = new Message[] { msg1, msg2 }; willAnswer(invocation -> { DirectFieldAccessor accessor = new DirectFieldAccessor(invocation.getMock()); - int folderOpenMode = (Integer) accessor.getPropertyValue("folderOpenMode"); + int folderOpenMode = (int) accessor.getPropertyValue("folderOpenMode"); if (folderOpenMode != Folder.READ_WRITE) { throw new IllegalArgumentException("Folder had to be open in READ_WRITE mode"); } @@ -346,7 +362,7 @@ public class ImapMailReceiverTests { receiver.receive(); verify(msg1, times(1)).setFlag(Flag.SEEN, true); verify(msg2, times(1)).setFlag(Flag.SEEN, true); - verify(receiver, times(1)).deleteMessages((Message[]) Mockito.any()); + verify(receiver, times(1)).deleteMessages(Mockito.any()); } @Test @@ -398,7 +414,7 @@ public class ImapMailReceiverTests { final Message[] messages = new Message[] { msg1, msg2 }; willAnswer(invocation -> { DirectFieldAccessor accessor = new DirectFieldAccessor(invocation.getMock()); - int folderOpenMode = (Integer) accessor.getPropertyValue("folderOpenMode"); + int folderOpenMode = (int) accessor.getPropertyValue("folderOpenMode"); if (folderOpenMode != Folder.READ_WRITE) { throw new IllegalArgumentException("Folder had to be open in READ_WRITE mode"); } @@ -434,7 +450,7 @@ public class ImapMailReceiverTests { final Message[] messages = new Message[] { msg1, msg2 }; willAnswer(invocation -> { DirectFieldAccessor accessor = new DirectFieldAccessor(invocation.getMock()); - int folderOpenMode = (Integer) accessor.getPropertyValue("folderOpenMode"); + int folderOpenMode = (int) accessor.getPropertyValue("folderOpenMode"); if (folderOpenMode != Folder.READ_WRITE) { throw new IllegalArgumentException("Folder had to be open in READ_WRITE mode"); } @@ -447,15 +463,13 @@ public class ImapMailReceiverTests { receiver.receive(); verify(msg1, times(1)).setFlag(Flag.SEEN, true); verify(msg2, times(1)).setFlag(Flag.SEEN, true); - verify(receiver, times(0)).deleteMessages((Message[]) Mockito.any()); + verify(receiver, times(0)).deleteMessages(Mockito.any()); } @Test @Ignore public void testMessageHistory() throws Exception { - ConfigurableApplicationContext context = - new ClassPathXmlApplicationContext("ImapIdleChannelAdapterParserTests-context.xml", ImapIdleChannelAdapterParserTests.class); - ImapIdleChannelAdapter adapter = context.getBean("simpleAdapter", ImapIdleChannelAdapter.class); + ImapIdleChannelAdapter adapter = this.context.getBean("simpleAdapter", ImapIdleChannelAdapter.class); AbstractMailReceiver receiver = new ImapMailReceiver(); receiver = spy(receiver); @@ -482,7 +496,7 @@ public class ImapMailReceiverTests { willAnswer(invocation -> null).given(receiver).fetchMessages(messages); - PollableChannel channel = context.getBean("channel", PollableChannel.class); + PollableChannel channel = this.context.getBean("channel", PollableChannel.class); adapter.start(); org.springframework.messaging.Message replMessage = channel.receive(10000); @@ -492,14 +506,11 @@ public class ImapMailReceiverTests { assertNotNull(componentHistoryRecord); assertEquals("mail:imap-idle-channel-adapter", componentHistoryRecord.get("type")); adapter.stop(); - context.close(); } @Test public void testIdleChannelAdapterException() throws Exception { - ConfigurableApplicationContext context = - new ClassPathXmlApplicationContext("ImapIdleChannelAdapterParserTests-context.xml", ImapIdleChannelAdapterParserTests.class); - ImapIdleChannelAdapter adapter = context.getBean("simpleAdapter", ImapIdleChannelAdapter.class); + ImapIdleChannelAdapter adapter = this.context.getBean("simpleAdapter", ImapIdleChannelAdapter.class); //ImapMailReceiver receiver = (ImapMailReceiver) TestUtils.getPropertyValue(adapter, "mailReceiver"); @@ -548,15 +559,12 @@ public class ImapMailReceiverTests { assertNotNull(replMessage); assertEquals("Failed", ((Exception) replMessage.getPayload()).getCause().getMessage()); adapter.stop(); - context.close(); } @SuppressWarnings("resource") @Test public void testNoInitialIdleDelayWhenRecentNotSupported() throws Exception { - ConfigurableApplicationContext context = - new ClassPathXmlApplicationContext("ImapIdleChannelAdapterParserTests-context.xml", ImapIdleChannelAdapterParserTests.class); - ImapIdleChannelAdapter adapter = context.getBean("simpleAdapter", ImapIdleChannelAdapter.class); + ImapIdleChannelAdapter adapter = this.context.getBean("simpleAdapter", ImapIdleChannelAdapter.class); QueueChannel channel = new QueueChannel(); adapter.setOutputChannel(channel); @@ -607,7 +615,7 @@ public class ImapMailReceiverTests { willAnswer(invocation -> null).given(receiver).fetchMessages(messages); willAnswer(invocation -> { - Thread.sleep(5000); + Thread.sleep(300); shouldFindMessagesCounter.set(1); return null; }).given(folder).idle(); @@ -620,23 +628,21 @@ public class ImapMailReceiverTests { */ assertNotNull(channel.receive(3000)); // We should not receive any more until the next idle elapses - assertNull(channel.receive(3000)); + assertNull(channel.receive(100)); assertNotNull(channel.receive(6000)); adapter.stop(); - context.close(); } - @SuppressWarnings("resource") @Test public void testInitialIdleDelayWhenRecentIsSupported() throws Exception { - ConfigurableApplicationContext context = - new ClassPathXmlApplicationContext("ImapIdleChannelAdapterParserTests-context.xml", ImapIdleChannelAdapterParserTests.class); - ImapIdleChannelAdapter adapter = context.getBean("simpleAdapter", ImapIdleChannelAdapter.class); + ImapIdleChannelAdapter adapter = this.context.getBean("simpleAdapter", ImapIdleChannelAdapter.class); QueueChannel channel = new QueueChannel(); adapter.setOutputChannel(channel); + adapter.setReconnectDelay(1); ImapMailReceiver receiver = new ImapMailReceiver("imap:foo"); + receiver.setCancelIdleInterval(1); receiver = spy(receiver); receiver.setBeanFactory(mock(BeanFactory.class)); receiver.afterPropertiesSet(); @@ -670,7 +676,7 @@ public class ImapMailReceiverTests { final CountDownLatch idles = new CountDownLatch(2); willAnswer(invocation -> { idles.countDown(); - Thread.sleep(5000); + Thread.sleep(1000); return null; }).given(folder).idle(); @@ -680,18 +686,17 @@ public class ImapMailReceiverTests { * Idle takes 5 seconds; since this server supports RECENT, we should * not receive any early messages. */ - assertNull(channel.receive(3000)); + assertNull(channel.receive(100)); assertNotNull(channel.receive(5000)); assertTrue(idles.await(5, TimeUnit.SECONDS)); adapter.stop(); - context.close(); } @Test public void testConnectionException() throws Exception { ImapMailReceiver mailReceiver = new ImapMailReceiver("imap:foo"); ImapIdleChannelAdapter adapter = new ImapIdleChannelAdapter(mailReceiver); - final AtomicReference theEvent = new AtomicReference(); + final AtomicReference theEvent = new AtomicReference<>(); final CountDownLatch latch = new CountDownLatch(1); adapter.setApplicationEventPublisher(event -> { assertNull("only one event expected", theEvent.get()); @@ -703,7 +708,8 @@ public class ImapMailReceiverTests { adapter.setTaskScheduler(taskScheduler); adapter.start(); assertTrue(latch.await(10, TimeUnit.SECONDS)); - assertTrue(theEvent.get().toString().endsWith("cause=java.lang.IllegalStateException: Failure in 'idle' task. Will resubmit.]")); + assertThat(theEvent.get().toString(), + endsWith("cause=java.lang.IllegalStateException: Failure in 'idle' task. Will resubmit.]")); } @Test // see INT-1801 @@ -715,7 +721,7 @@ public class ImapMailReceiverTests { Folder folder = mock(Folder.class); given(folder.exists()).willReturn(true); given(folder.isOpen()).willReturn(true); - given(folder.search((SearchTerm) Mockito.any())).willReturn(new Message[] { }); + given(folder.search(Mockito.any())).willReturn(new Message[] { }); given(store.getFolder(Mockito.any(URLName.class))).willReturn(folder); given(folder.getPermanentFlags()).willReturn(new Flags(Flags.Flag.USER)); @@ -823,6 +829,8 @@ public class ImapMailReceiverTests { exec = TestUtils.getPropertyValue(adapter, "sendingTaskExecutor", ExecutorService.class); adapter.stop(); assertTrue(exec.isShutdown()); + + taskScheduler.shutdown(); } @Test @@ -836,7 +844,7 @@ public class ImapMailReceiverTests { private boolean firstDone; - TestReceiver() { + private TestReceiver() { setSearchTermStrategy(searchTermStrategy); } @@ -848,7 +856,7 @@ public class ImapMailReceiverTests { given(folder.getMessages()) .willReturn(!this.firstDone ? messages1 : messages2); } - catch (MessagingException e) { + catch (MessagingException ignored) { } return folder; } diff --git a/spring-integration-test-support/src/main/java/org/springframework/integration/test/mail/TestMailServer.java b/spring-integration-test-support/src/main/java/org/springframework/integration/test/mail/TestMailServer.java index 8b23d3221e..705c2f052c 100644 --- a/spring-integration-test-support/src/main/java/org/springframework/integration/test/mail/TestMailServer.java +++ b/spring-integration-test-support/src/main/java/org/springframework/integration/test/mail/TestMailServer.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2017 the original author or authors. + * Copyright 2014-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -41,6 +41,7 @@ import org.springframework.util.Base64Utils; * the pertinent data so it can be verified by a test case. * * @author Gary Russell + * @author Artem Bilan * * @since 5.0 * @@ -76,7 +77,7 @@ public class TestMailServer { public static class SmtpServer extends MailServer { - public SmtpServer(int port) throws IOException { + SmtpServer(int port) throws IOException { super(port); } @@ -85,9 +86,9 @@ public class TestMailServer { return new SmtpHandler(socket); } - public class SmtpHandler extends MailHandler { + class SmtpHandler extends MailHandler { - public SmtpHandler(Socket socket) { + SmtpHandler(Socket socket) { super(socket); } @@ -154,7 +155,7 @@ public class TestMailServer { public static class Pop3Server extends MailServer { - public Pop3Server(int port) throws IOException { + Pop3Server(int port) throws IOException { super(port); } @@ -163,9 +164,9 @@ public class TestMailServer { return new Pop3Handler(socket); } - public class Pop3Handler extends MailHandler { + class Pop3Handler extends MailHandler { - public Pop3Handler(Socket socket) { + Pop3Handler(Socket socket) { super(socket); } @@ -218,7 +219,7 @@ public class TestMailServer { private boolean idled; - public ImapServer(int port) throws IOException { + ImapServer(int port) throws IOException { super(port); } @@ -234,9 +235,9 @@ public class TestMailServer { return new ImapHandler(socket); } - public class ImapHandler extends MailHandler { + class ImapHandler extends MailHandler { - public ImapHandler(Socket socket) { + ImapHandler(Socket socket) { super(socket); } @@ -347,7 +348,7 @@ public class TestMailServer { idleTag = tag; if (!idled) { try { - Thread.sleep(3000); + Thread.sleep(1000); write("* 2 EXISTS"); seen = false; } @@ -371,7 +372,7 @@ public class TestMailServer { } } - public void searchReply(String tag) throws IOException { + void searchReply(String tag) throws IOException { if (seen) { write("* SEARCH"); } @@ -391,13 +392,13 @@ public class TestMailServer { private final ExecutorService exec = Executors.newCachedThreadPool(); - protected final Set assertions = new HashSet(); + protected final Set assertions = new HashSet<>(); - protected final List messages = new ArrayList(); + protected final List messages = new ArrayList<>(); private volatile boolean listening; - public MailServer(int port) throws IOException { + MailServer(int port) throws IOException { this.socket = ServerSocketFactory.getDefault().createServerSocket(port); this.listening = true; exec.execute(this); @@ -464,11 +465,11 @@ public class TestMailServer { private BufferedWriter writer; - protected StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); protected BufferedReader reader; - public MailHandler(Socket socket) { + MailHandler(Socket socket) { this.socket = socket; }