From 60f453e9ff58c943ae95bb2131b24fa591e9e172 Mon Sep 17 00:00:00 2001 From: Artem Bilan Date: Mon, 7 Nov 2022 17:04:14 -0500 Subject: [PATCH] Upgrade to Jakarta EE 10 * Fix mail module to fit to the latest mail API requirements * Fix the last Sonar smell in the `SmbShare` * Remove redundant dependency for `hamcrest-core` in various modules --- build.gradle | 30 +++++------- .../mail/ImapMailReceiverTests.java | 48 +++++++++---------- .../mail/Pop3MailReceiverTests.java | 30 ++++++------ .../integration/smb/session/SmbShare.java | 22 +++++++++ 4 files changed, 73 insertions(+), 57 deletions(-) diff --git a/build.gradle b/build.gradle index 3b8e9b3fbc..65324efed6 100644 --- a/build.gradle +++ b/build.gradle @@ -70,15 +70,15 @@ ext { groovyVersion = '4.0.6' hamcrestVersion = '2.2' hazelcastVersion = '5.1.4' - hibernateVersion = '6.1.4.Final' + hibernateVersion = '6.1.5.Final' hsqldbVersion = '2.7.0' h2Version = '2.1.214' jacksonVersion = '2.14.0' - jaxbVersion = '3.0.2' + jaxbVersion = '4.0.1' jcifsVersion = '2.1.32' jeroMqVersion = '0.5.2' - jmsApiVersion = '3.0.0' - jpaApiVersion = '3.0.3' + jmsApiVersion = '3.1.0' + jpaApiVersion = '3.1.0' jrubyVersion = '9.3.8.0' jsonpathVersion = '2.7.0' junit4Version = '4.13.2' @@ -88,7 +88,7 @@ ext { kryoVersion = '5.3.0' lettuceVersion = '6.2.1.RELEASE' log4jVersion = '2.19.0' - mailVersion = '2.0.1' + mailVersion = '1.0.0' micrometerVersion = '1.10.0' micrometerTracingVersion = '1.0.0' mockitoVersion = '4.8.0' @@ -551,7 +551,6 @@ project('spring-integration-core') { optionalApi 'org.jetbrains.kotlinx:kotlinx-coroutines-reactor' testImplementation "org.aspectj:aspectjweaver:$aspectjVersion" - testImplementation "org.hamcrest:hamcrest-core:$hamcrestVersion" testImplementation 'io.micrometer:micrometer-observation-test' testImplementation ('io.micrometer:micrometer-tracing-integration-test') { exclude group: 'io.opentelemetry' @@ -621,7 +620,6 @@ project('spring-integration-ftp') { optionalApi "org.apache.ftpserver:ftpserver-core:$ftpServerVersion" testImplementation project(':spring-integration-file').sourceSets.test.output - testImplementation "org.hamcrest:hamcrest-core:$hamcrestVersion" } } @@ -698,7 +696,6 @@ project('spring-integration-ip') { api project(':spring-integration-core') testImplementation project(':spring-integration-stream') testImplementation project(':spring-integration-event') - testImplementation "org.hamcrest:hamcrest-core:$hamcrestVersion" testRuntimeOnly "com.esotericsoftware:kryo:$kryoVersion" testRuntimeOnly 'com.fasterxml.jackson.core:jackson-databind' @@ -761,14 +758,13 @@ project('spring-integration-jpa') { dependencies { api project(':spring-integration-core') api 'org.springframework:spring-orm' - optionalApi "org.eclipse.persistence:org.eclipse.persistence.jpa:$jpaApiVersion" + optionalApi "jakarta.persistence:jakarta.persistence-api:$jpaApiVersion" testImplementation('org.springframework.data:spring-data-jpa') { exclude group: 'org.springframework' } testImplementation "com.h2database:h2:$h2Version" testImplementation "org.hibernate.orm:hibernate-core:$hibernateVersion" - testImplementation "org.hamcrest:hamcrest-core:$hamcrestVersion" } } @@ -781,7 +777,6 @@ project('spring-integration-kafka') { } testImplementation "org.springframework.kafka:spring-kafka-test:$springKafkaVersion" - testImplementation "org.hamcrest:hamcrest-core:$hamcrestVersion" testImplementation 'com.fasterxml.jackson.core:jackson-databind' } } @@ -792,8 +787,10 @@ project('spring-integration-mail') { api project(':spring-integration-core') api 'org.springframework:spring-context-support' - providedImplementation "com.sun.mail:jakarta.mail:$mailVersion" + providedImplementation "org.eclipse.angus:jakarta.mail:$mailVersion" + testImplementation "com.icegreen:greenmail:$greenmailVersion" + testRuntimeOnly 'org.apache.logging.log4j:log4j-jul' } } @@ -820,8 +817,8 @@ project('spring-integration-r2dbc') { exclude group: 'org.springframework' } api 'org.springframework:spring-r2dbc' + testImplementation "io.r2dbc:r2dbc-h2:$r2dbch2Version" - testImplementation "org.hamcrest:hamcrest-core:$hamcrestVersion" } } @@ -846,7 +843,6 @@ project('spring-integration-redis') { } testImplementation "io.lettuce:lettuce-core:$lettuceVersion" - testImplementation "org.hamcrest:hamcrest-core:$hamcrestVersion" testImplementation 'com.fasterxml.jackson.core:jackson-databind' } @@ -1036,9 +1032,7 @@ project('spring-integration-ws') { testImplementation "jakarta.jms:jakarta.jms-api:$jmsApiVersion" testImplementation "org.igniterealtime.smack:smack-tcp:$smackVersion" testImplementation "org.igniterealtime.smack:smack-extensions:$smackVersion" - testImplementation "jakarta.mail:jakarta.mail-api:$mailVersion" - - testRuntimeOnly "com.sun.mail:jakarta.mail:$mailVersion" + testImplementation "org.eclipse.angus:angus-mail:$mailVersion" } } @@ -1083,8 +1077,6 @@ project('spring-integration-zeromq') { api "org.zeromq:jeromq:$jeroMqVersion" optionalApi 'com.fasterxml.jackson.core:jackson-databind' - - testImplementation "org.hamcrest:hamcrest-core:$hamcrestVersion" } } 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 b422136bc7..1872435b57 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-2021 the original author or authors. + * Copyright 2002-2022 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. @@ -270,8 +270,8 @@ public class ImapMailReceiverTests { user.deliver(GreenMailUtil.createTextEmail("user", "sender", "subject", "body", imapIdleServer.getImap().getServerSetup())); AbstractMailReceiver receiver = new ImapMailReceiver(); - Message msg1 = mock(MimeMessage.class); - Message msg2 = mock(MimeMessage.class); + Message msg1 = spy(GreenMailUtil.newMimeMessage("test1")); + Message msg2 = spy(GreenMailUtil.newMimeMessage("test2")); receiver = receiveAndMarkAsReadDontDeleteGuts(receiver, msg1, msg2); verify(msg1, times(1)).setFlag(Flag.SEEN, true); verify(msg2, times(1)).setFlag(Flag.SEEN, true); @@ -310,11 +310,11 @@ public class ImapMailReceiverTests { return receiver; } - @Test // INT-2991 Flag.SEEN was set twice when a filter is used + @Test public void receiveAndMarkAsReadDontDeletePassingFilter() throws Exception { AbstractMailReceiver receiver = new ImapMailReceiver(); - Message msg1 = mock(MimeMessage.class); - Message msg2 = mock(MimeMessage.class); + Message msg1 = spy(GreenMailUtil.newMimeMessage("test1")); + Message msg2 = spy(GreenMailUtil.newMimeMessage("test2")); Expression selectorExpression = new SpelExpressionParser().parseExpression("true"); receiver.setSelectorExpression(selectorExpression); receiver = receiveAndMarkAsReadDontDeleteGuts(receiver, msg1, msg2); @@ -323,11 +323,11 @@ public class ImapMailReceiverTests { verify(receiver, times(0)).deleteMessages(Mockito.any()); } - @Test // INT-2991 filtered messages were marked SEEN + @Test public void receiveAndMarkAsReadDontDeleteFiltered() throws Exception { AbstractMailReceiver receiver = new ImapMailReceiver(); - Message msg1 = mock(MimeMessage.class); - Message msg2 = mock(MimeMessage.class); + Message msg1 = spy(GreenMailUtil.newMimeMessage("test1")); + Message msg2 = spy(GreenMailUtil.newMimeMessage("test2")); given(msg2.getSubject()).willReturn("foo"); // should not be marked seen Expression selectorExpression = new SpelExpressionParser() .parseExpression("subject == null OR !subject.equals('foo')"); @@ -401,8 +401,8 @@ public class ImapMailReceiverTests { given(folder.getPermanentFlags()).willReturn(new Flags(Flags.Flag.USER)); folderField.set(receiver, folder); - Message msg1 = mock(MimeMessage.class); - Message msg2 = mock(MimeMessage.class); + Message msg1 = spy(GreenMailUtil.newMimeMessage("test1")); + Message msg2 = spy(GreenMailUtil.newMimeMessage("test2")); final Message[] messages = new Message[]{ msg1, msg2 }; willAnswer(invocation -> { DirectFieldAccessor accessor = new DirectFieldAccessor(invocation.getMock()); @@ -437,8 +437,8 @@ public class ImapMailReceiverTests { folderField.set(receiver, folder); - Message msg1 = mock(MimeMessage.class); - Message msg2 = mock(MimeMessage.class); + Message msg1 = spy(GreenMailUtil.newMimeMessage("test1")); + Message msg2 = spy(GreenMailUtil.newMimeMessage("test2")); final Message[] messages = new Message[]{ msg1, msg2 }; willAnswer(invocation -> null).given(receiver).openFolder(); @@ -466,8 +466,8 @@ public class ImapMailReceiverTests { given(folder.getPermanentFlags()).willReturn(new Flags(Flags.Flag.USER)); folderField.set(receiver, folder); - Message msg1 = mock(MimeMessage.class); - Message msg2 = mock(MimeMessage.class); + Message msg1 = spy(GreenMailUtil.newMimeMessage("test1")); + Message msg2 = spy(GreenMailUtil.newMimeMessage("test2")); final Message[] messages = new Message[]{ msg1, msg2 }; willAnswer(invocation -> { DirectFieldAccessor accessor = new DirectFieldAccessor(invocation.getMock()); @@ -502,8 +502,8 @@ public class ImapMailReceiverTests { given(folder.getPermanentFlags()).willReturn(new Flags(Flags.Flag.USER)); folderField.set(receiver, folder); - Message msg1 = mock(MimeMessage.class); - Message msg2 = mock(MimeMessage.class); + Message msg1 = spy(GreenMailUtil.newMimeMessage("test1")); + Message msg2 = spy(GreenMailUtil.newMimeMessage("test2")); final Message[] messages = new Message[]{ msg1, msg2 }; willAnswer(invocation -> { DirectFieldAccessor accessor = new DirectFieldAccessor(invocation.getMock()); @@ -536,7 +536,7 @@ public class ImapMailReceiverTests { DirectFieldAccessor adapterAccessor = new DirectFieldAccessor(adapter); adapterAccessor.setPropertyValue("mailReceiver", receiver); - MimeMessage mailMessage = mock(MimeMessage.class); + Message mailMessage = spy(GreenMailUtil.newMimeMessage("test1")); Flags flags = mock(Flags.class); given(mailMessage.getFlags()).willReturn(flags); final Message[] messages = new Message[]{ mailMessage }; @@ -604,7 +604,7 @@ public class ImapMailReceiverTests { DirectFieldAccessor adapterAccessor = new DirectFieldAccessor(adapter); adapterAccessor.setPropertyValue("mailReceiver", receiver); - MimeMessage mailMessage = mock(MimeMessage.class); + Message mailMessage = spy(GreenMailUtil.newMimeMessage("test1")); Flags flags = mock(Flags.class); given(mailMessage.getFlags()).willReturn(flags); final Message[] messages = new Message[]{ mailMessage }; @@ -651,7 +651,7 @@ public class ImapMailReceiverTests { willAnswer(invocation -> folder).given(receiver).getFolder(); - MimeMessage mailMessage = mock(MimeMessage.class); + Message mailMessage = spy(GreenMailUtil.newMimeMessage("test1")); Flags flags = mock(Flags.class); given(mailMessage.getFlags()).willReturn(flags); final Message[] messages = new Message[]{ mailMessage }; @@ -724,7 +724,7 @@ public class ImapMailReceiverTests { willAnswer(invocation -> folder).given(receiver).getFolder(); - MimeMessage mailMessage = mock(MimeMessage.class); + Message mailMessage = spy(GreenMailUtil.newMimeMessage("test1")); Flags flags = mock(Flags.class); given(mailMessage.getFlags()).willReturn(flags); final Message[] messages = new Message[]{ mailMessage }; @@ -864,7 +864,7 @@ public class ImapMailReceiverTests { given(folder.exists()).willReturn(true); given(folder.isOpen()).willReturn(true); - Message message = new MimeMessage(null, new ClassPathResource("test.mail").getInputStream()); + Message message = GreenMailUtil.newMimeMessage(new ClassPathResource("test.mail").getInputStream()); given(folder.search(Mockito.any())).willReturn(new Message[]{ message }); given(store.getFolder(Mockito.any(URLName.class))).willReturn(folder); given(folder.getPermanentFlags()).willReturn(new Flags(Flags.Flag.USER)); @@ -878,8 +878,8 @@ public class ImapMailReceiverTests { @Test public void testNullMessages() throws Exception { - Message message1 = mock(Message.class); - Message message2 = mock(Message.class); + Message message1 = spy(GreenMailUtil.newMimeMessage("test1")); + Message message2 = spy(GreenMailUtil.newMimeMessage("test2")); final Message[] messages1 = new Message[]{ null, null, message1 }; final Message[] messages2 = new Message[]{ message2 }; final SearchTermStrategy searchTermStrategy = mock(SearchTermStrategy.class); diff --git a/spring-integration-mail/src/test/java/org/springframework/integration/mail/Pop3MailReceiverTests.java b/spring-integration-mail/src/test/java/org/springframework/integration/mail/Pop3MailReceiverTests.java index 50e2ed6d09..0d1436f67c 100644 --- a/spring-integration-mail/src/test/java/org/springframework/integration/mail/Pop3MailReceiverTests.java +++ b/spring-integration-mail/src/test/java/org/springframework/integration/mail/Pop3MailReceiverTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2021 the original author or authors. + * Copyright 2002-2022 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. @@ -29,16 +29,18 @@ import jakarta.mail.Flags; import jakarta.mail.Flags.Flag; import jakarta.mail.Folder; import jakarta.mail.Message; -import jakarta.mail.internet.MimeMessage; import org.junit.jupiter.api.Test; import org.springframework.beans.DirectFieldAccessor; import org.springframework.beans.factory.BeanFactory; +import com.icegreen.greenmail.util.GreenMailUtil; + /** * @author Oleg Zhurakousky * @author Gary Russell + * @author Artem Bilan * */ public class Pop3MailReceiverTests { @@ -57,9 +59,9 @@ public class Pop3MailReceiverTests { when(folder.getPermanentFlags()).thenReturn(new Flags(Flags.Flag.USER)); folderField.set(receiver, folder); - Message msg1 = mock(MimeMessage.class); - Message msg2 = mock(MimeMessage.class); - final Message[] messages = new Message[] { msg1, msg2 }; + Message msg1 = spy(GreenMailUtil.newMimeMessage("test1")); + Message msg2 = spy(GreenMailUtil.newMimeMessage("test2")); + final Message[] messages = new Message[]{ msg1, msg2 }; doAnswer(invocation -> { DirectFieldAccessor accessor = new DirectFieldAccessor(invocation.getMock()); int folderOpenMode = (Integer) accessor.getPropertyValue("folderOpenMode"); @@ -92,9 +94,9 @@ public class Pop3MailReceiverTests { when(folder.getPermanentFlags()).thenReturn(new Flags(Flags.Flag.USER)); folderField.set(receiver, folder); - Message msg1 = mock(MimeMessage.class); - Message msg2 = mock(MimeMessage.class); - final Message[] messages = new Message[] { msg1, msg2 }; + Message msg1 = spy(GreenMailUtil.newMimeMessage("test1")); + Message msg2 = spy(GreenMailUtil.newMimeMessage("test2")); + final Message[] messages = new Message[]{ msg1, msg2 }; doAnswer(invocation -> null).when(receiver).openFolder(); doAnswer(invocation -> messages).when(receiver).searchForNewMessages(); @@ -119,9 +121,9 @@ public class Pop3MailReceiverTests { when(folder.getPermanentFlags()).thenReturn(new Flags(Flags.Flag.USER)); folderField.set(receiver, folder); - Message msg1 = mock(MimeMessage.class); - Message msg2 = mock(MimeMessage.class); - final Message[] messages = new Message[] { msg1, msg2 }; + Message msg1 = spy(GreenMailUtil.newMimeMessage("test1")); + Message msg2 = spy(GreenMailUtil.newMimeMessage("test2")); + final Message[] messages = new Message[]{ msg1, msg2 }; doAnswer(invocation -> null).when(receiver).openFolder(); doAnswer(invocation -> messages).when(receiver).searchForNewMessages(); @@ -146,9 +148,9 @@ public class Pop3MailReceiverTests { when(folder.getPermanentFlags()).thenReturn(new Flags(Flags.Flag.USER)); folderField.set(receiver, folder); - Message msg1 = mock(MimeMessage.class); - Message msg2 = mock(MimeMessage.class); - final Message[] messages = new Message[] { msg1, msg2 }; + Message msg1 = spy(GreenMailUtil.newMimeMessage("test1")); + Message msg2 = spy(GreenMailUtil.newMimeMessage("test2")); + final Message[] messages = new Message[]{ msg1, msg2 }; doAnswer(invocation -> null).when(receiver).openFolder(); doAnswer(invocation -> messages).when(receiver).searchForNewMessages(); diff --git a/spring-integration-smb/src/main/java/org/springframework/integration/smb/session/SmbShare.java b/spring-integration-smb/src/main/java/org/springframework/integration/smb/session/SmbShare.java index 68d7b1d618..f543589359 100644 --- a/spring-integration-smb/src/main/java/org/springframework/integration/smb/session/SmbShare.java +++ b/spring-integration-smb/src/main/java/org/springframework/integration/smb/session/SmbShare.java @@ -41,6 +41,7 @@ import jcifs.smb.SmbFile; * @author Markus Spann * @author Gregory Bragg * @author Adam Jones + * @author Artem Bilan * * @since 6.0 */ @@ -139,4 +140,25 @@ public class SmbShare extends SmbFile { super.close(); } + /** + * Tests to see if two {@link SmbShare} objects are equal. + * Relies on a super implementation. + * @param other another {@link SmbShare} object to compare for equality. + * @return equality result. + */ + @Override + public boolean equals(Object other) { // NOSONAR + return super.equals(other); + } + + + /** + * Return a cache code from the super class. + * @return A hashcode for this share + */ + @Override + public int hashCode() { // NOSONAR + return super.hashCode(); + } + }