From ef16d72fb91b9f45c4283897d1267fc1ef2b08a4 Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Thu, 5 Oct 2023 18:09:08 +0200
Subject: [PATCH] OZG-3931 migrate mail-service

---
 mail-service/pom.xml                          | 15 +++++-----
 .../de/itvsh/ozg/mail/email/EMailService.java |  5 ++--
 .../itvsh/ozg/mail/email/MailSendRequest.java |  3 +-
 .../ozg/mail/postfach/PostfachNachricht.java  |  3 +-
 .../ozg/mail/postfach/PostfachService.java    |  3 +-
 .../ozg/mail/postfach/bayernid/Absender.java  |  8 ++---
 .../bayernid/BayernIdConfiguration.java       | 30 +++++++++++++------
 .../BayernIdPostfachRemoteService.java        |  5 ++--
 .../postfach/bayernid/BayernIdProperties.java |  3 +-
 .../mail/postfach/bayernid/Zertifikat.java    |  2 --
 .../osi/OsiPostfachRemoteService.java         |  3 +-
 .../postfach/osi/PostfachConfiguration.java   | 18 ++++++-----
 .../ozg/mail/email/EMailServiceTest.java      | 10 +++----
 .../email/MailSendRequestTestFactory.java     |  3 +-
 .../BayernIdPostfachRemoteServiceTest.java    |  3 +-
 15 files changed, 55 insertions(+), 59 deletions(-)

diff --git a/mail-service/pom.xml b/mail-service/pom.xml
index 7de82b12b..f14d9f652 100644
--- a/mail-service/pom.xml
+++ b/mail-service/pom.xml
@@ -30,7 +30,7 @@
 	<parent>
 		<groupId>de.itvsh.kop.common</groupId>
 		<artifactId>kop-common-parent</artifactId>
-		<version>1.7.0</version>
+		<version>2.3.1</version>
 		<relativePath/>
 	</parent>
 
@@ -45,8 +45,7 @@
 		<shedlock.version>4.25.0</shedlock.version>
 		<logcaptor.version>2.7.10</logcaptor.version>
 		<kop.license.version>1.3.0</kop.license.version>
-		<maven-jaxb2-plugin.version>0.15.2</maven-jaxb2-plugin.version>
-		<javax.xml.soap.version>1.4.0</javax.xml.soap.version>
+		<jaxb-maven-plugin.version>3.0.1</jaxb-maven-plugin.version>
 	</properties>
 
 	<dependencies>
@@ -134,8 +133,8 @@
 			<artifactId>commons-lang3</artifactId>
 		</dependency>
 		<dependency>
-			<groupId>org.apache.httpcomponents</groupId>
-			<artifactId>httpclient</artifactId>
+			<groupId>org.apache.httpcomponents.client5</groupId>
+			<artifactId>httpclient5</artifactId>
 		</dependency>
 		<dependency>
 			<groupId>commons-beanutils</groupId>
@@ -205,9 +204,9 @@
 			</plugin>
 
 			<plugin>
-				<groupId>org.jvnet.jaxb2.maven2</groupId>
-				<artifactId>maven-jaxb2-plugin</artifactId>
-				<version>${maven-jaxb2-plugin.version}</version>
+				<groupId>org.jvnet.jaxb</groupId>
+				<artifactId>jaxb-maven-plugin</artifactId>
+				<version>${jaxb-maven-plugin.version}</version>
 				<configuration>
 					<schemas>
 						<schema>
diff --git a/mail-service/src/main/java/de/itvsh/ozg/mail/email/EMailService.java b/mail-service/src/main/java/de/itvsh/ozg/mail/email/EMailService.java
index 63f0afbb5..c49dba596 100644
--- a/mail-service/src/main/java/de/itvsh/ozg/mail/email/EMailService.java
+++ b/mail-service/src/main/java/de/itvsh/ozg/mail/email/EMailService.java
@@ -25,9 +25,6 @@ package de.itvsh.ozg.mail.email;
 
 import java.util.Objects;
 
-import javax.mail.MessagingException;
-import javax.mail.internet.MimeMessage;
-
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationEventPublisher;
@@ -38,6 +35,8 @@ import org.springframework.stereotype.Service;
 
 import de.itvsh.kop.common.errorhandling.TechnicalException;
 import de.itvsh.ozg.mail.email.MailSendRequest.MailAttachment;
+import jakarta.mail.MessagingException;
+import jakarta.mail.internet.MimeMessage;
 import lombok.extern.log4j.Log4j2;
 
 @Service
diff --git a/mail-service/src/main/java/de/itvsh/ozg/mail/email/MailSendRequest.java b/mail-service/src/main/java/de/itvsh/ozg/mail/email/MailSendRequest.java
index 12e29155c..d690e84d1 100644
--- a/mail-service/src/main/java/de/itvsh/ozg/mail/email/MailSendRequest.java
+++ b/mail-service/src/main/java/de/itvsh/ozg/mail/email/MailSendRequest.java
@@ -25,8 +25,7 @@ package de.itvsh.ozg.mail.email;
 
 import java.util.Collection;
 
-import javax.activation.DataSource;
-
+import jakarta.activation.DataSource;
 import lombok.Builder;
 import lombok.Getter;
 import lombok.Singular;
diff --git a/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/PostfachNachricht.java b/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/PostfachNachricht.java
index 37a0f527f..d103e02cd 100644
--- a/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/PostfachNachricht.java
+++ b/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/PostfachNachricht.java
@@ -27,8 +27,7 @@ import java.time.ZonedDateTime;
 import java.util.Collections;
 import java.util.List;
 
-import javax.validation.constraints.NotNull;
-
+import jakarta.validation.constraints.NotNull;
 import lombok.Builder;
 import lombok.Getter;
 
diff --git a/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/PostfachService.java b/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/PostfachService.java
index 71d4ab8ef..491d56927 100644
--- a/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/PostfachService.java
+++ b/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/PostfachService.java
@@ -29,8 +29,6 @@ import java.util.Optional;
 import java.util.function.Predicate;
 import java.util.stream.Stream;
 
-import javax.validation.Valid;
-
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationEventPublisher;
@@ -41,6 +39,7 @@ import de.itvsh.ozg.mail.attributes.ClientAttributeService;
 import de.itvsh.ozg.mail.postfach.PostfachNachricht.Direction;
 import de.itvsh.ozg.mail.postfach.osi.OsiPostfachServerProcessException;
 import de.itvsh.ozg.pluto.common.callcontext.CurrentUserService;
+import jakarta.validation.Valid;
 import lombok.NonNull;
 import lombok.extern.log4j.Log4j2;
 
diff --git a/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/bayernid/Absender.java b/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/bayernid/Absender.java
index e6e05510d..72f3fba8a 100644
--- a/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/bayernid/Absender.java
+++ b/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/bayernid/Absender.java
@@ -1,10 +1,7 @@
 package de.itvsh.ozg.mail.postfach.bayernid;
 
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.Pattern;
-
-import org.springframework.boot.context.properties.ConstructorBinding;
-
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Pattern;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Getter;
@@ -12,7 +9,6 @@ import lombok.Getter;
 @Getter
 @Builder
 @AllArgsConstructor
-@ConstructorBinding
 class Absender {
 	@Pattern(regexp = "[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}")
 	private String postkorbId;
diff --git a/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/bayernid/BayernIdConfiguration.java b/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/bayernid/BayernIdConfiguration.java
index ad9f4be70..a082aa822 100644
--- a/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/bayernid/BayernIdConfiguration.java
+++ b/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/bayernid/BayernIdConfiguration.java
@@ -9,16 +9,21 @@ import java.security.NoSuchAlgorithmException;
 import java.security.UnrecoverableKeyException;
 import java.security.cert.CertificateException;
 
-import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
-import org.apache.http.impl.client.HttpClientBuilder;
-import org.apache.http.ssl.SSLContextBuilder;
+import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
+import org.apache.hc.client5.http.impl.io.BasicHttpClientConnectionManager;
+import org.apache.hc.client5.http.io.HttpClientConnectionManager;
+import org.apache.hc.client5.http.socket.ConnectionSocketFactory;
+import org.apache.hc.client5.http.socket.PlainConnectionSocketFactory;
+import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
+import org.apache.hc.core5.http.config.RegistryBuilder;
+import org.apache.hc.core5.ssl.SSLContextBuilder;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.oxm.jaxb.Jaxb2Marshaller;
-import org.springframework.ws.transport.http.HttpComponentsMessageSender;
-import org.springframework.ws.transport.http.HttpComponentsMessageSender.RemoveSoapHeadersInterceptor;
+import org.springframework.ws.transport.http.HttpComponents5MessageSender;
+import org.springframework.ws.transport.http.HttpComponents5MessageSender.RemoveSoapHeadersInterceptor;
 
 @Configuration
 @ConditionalOnProperty(prefix = "ozgcloud.bayernid", name = { "server" })
@@ -48,14 +53,21 @@ class BayernIdConfiguration {
 		return remoteService;
 	}
 
-	HttpComponentsMessageSender initMessageSender()
+	HttpComponents5MessageSender initMessageSender()
 			throws CertificateException, KeyStoreException, NoSuchAlgorithmException, IOException, UnrecoverableKeyException, KeyManagementException {
 
 		var httpClient = HttpClientBuilder.create()
-				.setSSLSocketFactory(createSslConnectionSocketFactory())
-				.addInterceptorFirst(new RemoveSoapHeadersInterceptor())
+				.setConnectionManager(createConnectionManager())
+				.addRequestInterceptorFirst(new RemoveSoapHeadersInterceptor())
 				.build();
-		return new HttpComponentsMessageSender(httpClient);
+		return new HttpComponents5MessageSender(httpClient);
+	}
+
+	private HttpClientConnectionManager createConnectionManager()
+			throws UnrecoverableKeyException, CertificateException, NoSuchAlgorithmException, KeyStoreException, IOException, KeyManagementException {
+		var socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create().register("https", createSslConnectionSocketFactory())
+				.register("http", new PlainConnectionSocketFactory()).build();
+		return new BasicHttpClientConnectionManager(socketFactoryRegistry);
 	}
 
 	private SSLConnectionSocketFactory createSslConnectionSocketFactory()
diff --git a/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/bayernid/BayernIdPostfachRemoteService.java b/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/bayernid/BayernIdPostfachRemoteService.java
index 667a96e72..5c0378643 100644
--- a/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/bayernid/BayernIdPostfachRemoteService.java
+++ b/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/bayernid/BayernIdPostfachRemoteService.java
@@ -2,9 +2,6 @@ package de.itvsh.ozg.mail.postfach.bayernid;
 
 import java.util.stream.Stream;
 
-import javax.annotation.PostConstruct;
-import javax.xml.bind.JAXBElement;
-
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.oxm.jaxb.Jaxb2Marshaller;
@@ -20,6 +17,8 @@ import de.akdb.egov.bsp.nachrichten.BspQuittung;
 import de.itvsh.ozg.mail.postfach.PostfachNachricht;
 import de.itvsh.ozg.mail.postfach.PostfachRemoteService;
 import de.itvsh.ozg.mail.postfach.PostfachRuntimeException;
+import jakarta.annotation.PostConstruct;
+import jakarta.xml.bind.JAXBElement;
 import lombok.extern.log4j.Log4j2;
 
 @Log4j2
diff --git a/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/bayernid/BayernIdProperties.java b/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/bayernid/BayernIdProperties.java
index 3debbdd2a..b6a6b28ab 100644
--- a/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/bayernid/BayernIdProperties.java
+++ b/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/bayernid/BayernIdProperties.java
@@ -1,13 +1,12 @@
 package de.itvsh.ozg.mail.postfach.bayernid;
 
-import javax.validation.constraints.NotEmpty;
-
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.validation.annotation.Validated;
 
+import jakarta.validation.constraints.NotEmpty;
 import lombok.Getter;
 import lombok.Setter;
 
diff --git a/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/bayernid/Zertifikat.java b/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/bayernid/Zertifikat.java
index 54a0cd2c8..051567776 100644
--- a/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/bayernid/Zertifikat.java
+++ b/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/bayernid/Zertifikat.java
@@ -1,6 +1,5 @@
 package de.itvsh.ozg.mail.postfach.bayernid;
 
-import org.springframework.boot.context.properties.ConstructorBinding;
 import org.springframework.core.io.Resource;
 
 import lombok.AllArgsConstructor;
@@ -10,7 +9,6 @@ import lombok.Getter;
 @Getter
 @Builder
 @AllArgsConstructor
-@ConstructorBinding
 class Zertifikat {
 	private Resource keystore;
 	private String password;
diff --git a/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/osi/OsiPostfachRemoteService.java b/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/osi/OsiPostfachRemoteService.java
index c198740de..9625d099d 100644
--- a/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/osi/OsiPostfachRemoteService.java
+++ b/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/osi/OsiPostfachRemoteService.java
@@ -28,8 +28,6 @@ import java.util.Objects;
 import java.util.function.Supplier;
 import java.util.stream.Stream;
 
-import javax.annotation.PostConstruct;
-
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -46,6 +44,7 @@ import de.itvsh.ozg.mail.postfach.PostfachBadRequestException;
 import de.itvsh.ozg.mail.postfach.PostfachNachricht;
 import de.itvsh.ozg.mail.postfach.PostfachRemoteService;
 import de.itvsh.ozg.mail.postfach.PostfachRuntimeException;
+import jakarta.annotation.PostConstruct;
 import lombok.extern.log4j.Log4j2;
 
 @Service
diff --git a/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/osi/PostfachConfiguration.java b/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/osi/PostfachConfiguration.java
index e86b93e99..c16330f63 100644
--- a/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/osi/PostfachConfiguration.java
+++ b/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/osi/PostfachConfiguration.java
@@ -26,12 +26,13 @@ package de.itvsh.ozg.mail.postfach.osi;
 import java.util.Objects;
 
 import org.apache.commons.lang3.StringUtils;
-import org.apache.http.HttpHost;
-import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.UsernamePasswordCredentials;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.impl.client.BasicCredentialsProvider;
-import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.hc.client5.http.auth.AuthScope;
+import org.apache.hc.client5.http.auth.CredentialsProvider;
+import org.apache.hc.client5.http.auth.UsernamePasswordCredentials;
+import org.apache.hc.client5.http.impl.auth.BasicCredentialsProvider;
+import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
+import org.apache.hc.client5.http.impl.classic.HttpClients;
+import org.apache.hc.core5.http.HttpHost;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.boot.web.client.RestTemplateBuilder;
@@ -77,6 +78,7 @@ public class PostfachConfiguration implements RestTemplateCustomizer {
 				.setProxy(proxy).setDefaultCredentialsProvider(buildCredentialsProvider(proxy))
 				.build();
 
+		HttpClients.custom().build();
 		restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory(httpClient));
 	}
 
@@ -87,10 +89,10 @@ public class PostfachConfiguration implements RestTemplateCustomizer {
 			return null;
 		}
 
-		CredentialsProvider credsProvider = new BasicCredentialsProvider();
+		var credsProvider = new BasicCredentialsProvider();
 		credsProvider.setCredentials(
 				new AuthScope(proxyHost),
-				new UsernamePasswordCredentials(proxyConfig.getUsername(), proxyConfig.getPassword()));
+				new UsernamePasswordCredentials(proxyConfig.getUsername(), proxyConfig.getPassword().toCharArray()));
 		return credsProvider;
 	}
 
diff --git a/mail-service/src/test/java/de/itvsh/ozg/mail/email/EMailServiceTest.java b/mail-service/src/test/java/de/itvsh/ozg/mail/email/EMailServiceTest.java
index 2ef4b812b..2912e143e 100644
--- a/mail-service/src/test/java/de/itvsh/ozg/mail/email/EMailServiceTest.java
+++ b/mail-service/src/test/java/de/itvsh/ozg/mail/email/EMailServiceTest.java
@@ -27,11 +27,6 @@ import static de.itvsh.ozg.mail.email.MailSendRequestTestFactory.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
-import javax.activation.DataSource;
-import javax.mail.MessagingException;
-import javax.mail.internet.MimeMessage;
-
-import lombok.SneakyThrows;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
@@ -43,7 +38,10 @@ import org.springframework.mail.MailSendException;
 import org.springframework.mail.javamail.JavaMailSender;
 import org.springframework.mail.javamail.MimeMessageHelper;
 
-import java.util.Arrays;
+import jakarta.activation.DataSource;
+import jakarta.mail.MessagingException;
+import jakarta.mail.internet.MimeMessage;
+import lombok.SneakyThrows;
 
 class EMailServiceTest {
 
diff --git a/mail-service/src/test/java/de/itvsh/ozg/mail/email/MailSendRequestTestFactory.java b/mail-service/src/test/java/de/itvsh/ozg/mail/email/MailSendRequestTestFactory.java
index 9e2573785..9420e5019 100644
--- a/mail-service/src/test/java/de/itvsh/ozg/mail/email/MailSendRequestTestFactory.java
+++ b/mail-service/src/test/java/de/itvsh/ozg/mail/email/MailSendRequestTestFactory.java
@@ -25,9 +25,8 @@ package de.itvsh.ozg.mail.email;
 
 import java.util.UUID;
 
-import javax.mail.util.ByteArrayDataSource;
-
 import de.itvsh.ozg.mail.email.MailSendRequest.MailAttachment;
+import jakarta.mail.util.ByteArrayDataSource;
 
 class MailSendRequestTestFactory {
 
diff --git a/mail-service/src/test/java/de/itvsh/ozg/mail/postfach/bayernid/BayernIdPostfachRemoteServiceTest.java b/mail-service/src/test/java/de/itvsh/ozg/mail/postfach/bayernid/BayernIdPostfachRemoteServiceTest.java
index 3db294ce9..2e0e8678b 100644
--- a/mail-service/src/test/java/de/itvsh/ozg/mail/postfach/bayernid/BayernIdPostfachRemoteServiceTest.java
+++ b/mail-service/src/test/java/de/itvsh/ozg/mail/postfach/bayernid/BayernIdPostfachRemoteServiceTest.java
@@ -26,8 +26,6 @@ package de.itvsh.ozg.mail.postfach.bayernid;
 import static org.assertj.core.api.Assertions.*;
 import static org.mockito.Mockito.*;
 
-import javax.xml.bind.JAXBElement;
-
 import org.apache.commons.lang3.StringUtils;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
@@ -42,6 +40,7 @@ import org.springframework.ws.client.core.WebServiceTemplate;
 import akdb.bsp.postkorb.komm.webservice.SendBspNachrichtNativeOutput;
 import de.itvsh.ozg.mail.postfach.PostfachNachrichtTestFactory;
 import de.itvsh.ozg.mail.postfach.PostfachRuntimeException;
+import jakarta.xml.bind.JAXBElement;
 
 class BayernIdPostfachRemoteServiceTest {
 
-- 
GitLab