Skip to content
Snippets Groups Projects
Commit f3aedf7d authored by OZGCloud's avatar OZGCloud
Browse files

Merge branch 'refs/heads/master' into OZG-5402-NachrichtenManager-in-eigenes-Repo

# Conflicts:
#	Jenkinsfile
#	notification-manager/pom.xml
parents d262e96c 7158c1f4
No related branches found
No related tags found
No related merge requests found
Showing
with 218 additions and 822 deletions
...@@ -41,22 +41,6 @@ pipeline { ...@@ -41,22 +41,6 @@ pipeline {
if( !(rootVersion == serverVersion && rootVersion == interfaceVersion )){ if( !(rootVersion == serverVersion && rootVersion == interfaceVersion )){
error("Versionen sind nicht identisch") error("Versionen sind nicht identisch")
} }
def bayernIdProxyParent = getPomVersion('nachrichten-bayernid-proxy/pom.xml')
def bayernIdProxyInterface = getPomVersion('nachrichten-bayernid-proxy/bayernid-proxy-interface/pom.xml')
if(isReleaseBranch()){
if ( !(bayernIdProxyParent ==~ RELEASE_REGEX) || !(bayernIdProxyInterface ==~ RELEASE_REGEX)) {
error("Keine Release Version für BayernIdProxy Branch ${env.BRANCH_NAME}.")
}
} else {
if ( !(bayernIdProxyParent ==~ SNAPSHOT_REGEX) || !(bayernIdProxyInterface ==~ SNAPSHOT_REGEX)) {
error("Keine Snapshot Version für BayernIdProxy Branch ${env.BRANCH_NAME}.")
}
}
if( !(bayernIdProxyParent == bayernIdProxyInterface)){
error("Versionen BayernIdProxy sind nicht identisch")
}
} }
} }
} }
...@@ -104,20 +88,6 @@ pipeline { ...@@ -104,20 +88,6 @@ pipeline {
} }
} }
stage('Build Docker image nachrichten-bayernid-proxy') {
steps {
script {
FAILED_STAGE=env.STAGE_NAME
}
configFileProvider([configFile(fileId: 'maven-settings', variable: 'MAVEN_SETTINGS')]) {
dir('nachrichten-bayernid-proxy/bayernid-proxy-impl') {
sh 'mvn --no-transfer-progress -s $MAVEN_SETTINGS spring-boot:build-image -DskipTests -Dmaven.wagon.http.retryHandler.count=3'
}
}
}
}
stage('Tag and Push Docker image vorgang-manager') { stage('Tag and Push Docker image vorgang-manager') {
steps { steps {
script { script {
...@@ -137,25 +107,6 @@ pipeline { ...@@ -137,25 +107,6 @@ pipeline {
} }
} }
stage('Tag and Push Docker image nachrichten-bayernid-proxy') {
steps {
script {
FAILED_STAGE=env.STAGE_NAME
IMAGE_TAG_BAYERN_ID_PROXY = generateImageTag('nachrichten-bayernid-proxy/pom.xml')
tagAndPushDockerImage('bayernid-proxy', IMAGE_TAG_BAYERN_ID_PROXY)
if (env.BRANCH_NAME == 'master') {
tagAndPushDockerImage('bayernid-proxy', 'snapshot-latest')
tagAndPushDockerImage('bayernid-proxy', 'e2e-test')
}
else if (env.BRANCH_NAME == 'release') {
tagAndPushDockerImage('bayernid-proxy', 'latest')
}
}
}
}
stage('Test, build and deploy Helm Chart vorgang-manager') { stage('Test, build and deploy Helm Chart vorgang-manager') {
steps { steps {
script { script {
...@@ -174,26 +125,6 @@ pipeline { ...@@ -174,26 +125,6 @@ pipeline {
} }
} }
stage('Test, build and deploy Helm Chart bayernid-proxy') {
steps {
script {
FAILED_STAGE=env.STAGE_NAME
HELM_CHART_VERSION_BAYERN_ID_PROXY = generateHelmChartVersion("nachrichten-bayernid-proxy/pom.xml")
dir('nachrichten-bayernid-proxy') {
sh "./run_helm_test.sh"
}
dir('nachrichten-bayernid-proxy/src/main/helm') {
sh "helm package --version=${HELM_CHART_VERSION_BAYERN_ID_PROXY} ."
deployHelmChart("bayernid-proxy", HELM_CHART_VERSION_BAYERN_ID_PROXY)
}
}
}
}
stage('Trigger Dev rollout') { stage('Trigger Dev rollout') {
when { when {
branch 'master' branch 'master'
...@@ -205,7 +136,6 @@ pipeline { ...@@ -205,7 +136,6 @@ pipeline {
cloneGitopsRepo() cloneGitopsRepo()
setNewVorgangManagerGitopsVersion("dev") setNewVorgangManagerGitopsVersion("dev")
setNewNachrichtenBayernIdProxyGitopsVersion("dev")
pushDevGitopsRepo() pushDevGitopsRepo()
} }
} }
...@@ -222,7 +152,6 @@ pipeline { ...@@ -222,7 +152,6 @@ pipeline {
cloneGitopsRepo() cloneGitopsRepo()
setNewVorgangManagerGitopsVersion("test") setNewVorgangManagerGitopsVersion("test")
setNewNachrichtenBayernIdProxyGitopsVersion("test")
pushTestGitopsRepo() pushTestGitopsRepo()
} }
...@@ -274,26 +203,6 @@ pipeline { ...@@ -274,26 +203,6 @@ pipeline {
unstable("SonarQube failed") unstable("SonarQube failed")
} }
} }
dir('notification-manager') {
try {
withSonarQubeEnv('sonarqube-ozg-sh'){
sh 'mvn -s $MAVEN_SETTINGS sonar:sonar'
}
} catch (Exception e) {
unstable("SonarQube failed")
}
}
dir('nachrichten-bayernid-proxy') {
try {
withSonarQubeEnv('sonarqube-ozg-sh'){
sh 'mvn -s $MAVEN_SETTINGS sonar:sonar'
}
} catch (Exception e) {
unstable("SonarQube BayernIdProxy failed")
}
}
} }
} }
} }
...@@ -403,18 +312,6 @@ Void setNewVorgangManagerGitopsVersion(String environment) { ...@@ -403,18 +312,6 @@ Void setNewVorgangManagerGitopsVersion(String environment) {
} }
} }
Void setNewNachrichtenBayernIdProxyGitopsVersion(String environment) {
dir("gitops") {
def envFile = "${environment}/application/values/bayernid-proxy-values.yaml"
def envVersions = readYaml file: envFile
envVersions.bayernid_proxy.image.tag = IMAGE_TAG_BAYERN_ID_PROXY
envVersions.bayernid_proxy.helm.version = HELM_CHART_VERSION_BAYERN_ID_PROXY
writeYaml file: envFile, data: envVersions, overwrite: true
}
}
Void pushDevGitopsRepo() { Void pushDevGitopsRepo() {
pushNewGitopsVersion('dev') pushNewGitopsVersion('dev')
} }
...@@ -432,7 +329,7 @@ Void pushNewGitopsVersion(String environment) { ...@@ -432,7 +329,7 @@ Void pushNewGitopsVersion(String environment) {
withCredentials([usernamePassword(credentialsId: 'jenkins-gitea-access-token', passwordVariable: 'TOKEN', usernameVariable: 'USER')]) { withCredentials([usernamePassword(credentialsId: 'jenkins-gitea-access-token', passwordVariable: 'TOKEN', usernameVariable: 'USER')]) {
sh "git add ${environment}/application/values/*-values.yaml" sh "git add ${environment}/application/values/*-values.yaml"
sh "git commit -m 'jenkins rollout ${environment} vorgang-manager version ${IMAGE_TAG} bayern-id version ${IMAGE_TAG_BAYERN_ID_PROXY}'" sh "git commit -m 'jenkins rollout ${environment} vorgang-manager version ${IMAGE_TAG}'"
sh 'git push https://${USER}:${TOKEN}@git.ozg-sh.de/ozgcloud-devops/gitops.git' sh 'git push https://${USER}:${TOKEN}@git.ozg-sh.de/ozgcloud-devops/gitops.git'
} }
} }
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
<version>1.11.0-SNAPSHOT</version> <version>1.11.0-SNAPSHOT</version>
<properties> <properties>
<vorgang-manager.version>2.6.0</vorgang-manager.version> <vorgang-manager.version>2.7.0-SNAPSHOT</vorgang-manager.version>
<api-lib.version>0.7.0</api-lib.version> <api-lib.version>0.7.0</api-lib.version>
</properties> </properties>
......
...@@ -14,6 +14,8 @@ class BescheidGrpcService extends BescheidServiceImplBase { ...@@ -14,6 +14,8 @@ class BescheidGrpcService extends BescheidServiceImplBase {
private final AttachedItemService attachedItemService; private final AttachedItemService attachedItemService;
private final BescheidItemMapper bescheidMapper; private final BescheidItemMapper bescheidMapper;
private final BescheidService bescheidService;
private final GrpcBescheidMapper grpcBescheidMapper;
@Override @Override
public void getBescheidDraft(GrpcGetBescheidDraftRequest request, StreamObserver<GrpcGetBescheidDraftResponse> responseObserver) { public void getBescheidDraft(GrpcGetBescheidDraftRequest request, StreamObserver<GrpcGetBescheidDraftResponse> responseObserver) {
...@@ -31,4 +33,10 @@ class BescheidGrpcService extends BescheidServiceImplBase { ...@@ -31,4 +33,10 @@ class BescheidGrpcService extends BescheidServiceImplBase {
.setBescheid(bescheidMapper.toBescheid(bescheidItem)) .setBescheid(bescheidMapper.toBescheid(bescheidItem))
.build(); .build();
} }
@Override
public void getConfig(GrpcBescheidManagerConfigRequest request, StreamObserver<GrpcBescheidManagerConfigResponse> responseObserver) {
responseObserver.onNext(grpcBescheidMapper.fromBescheidManagerConfig(bescheidService.getConfig()));
responseObserver.onCompleted();
}
} }
...@@ -21,17 +21,23 @@ ...@@ -21,17 +21,23 @@
* Die sprachspezifischen Genehmigungen und Beschränkungen * Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen. * unter der Lizenz sind dem Lizenztext zu entnehmen.
*/ */
package de.ozgcloud.nachrichten.postfach.bayernid.proxy.message; package de.ozgcloud.bescheid;
import lombok.Builder; import lombok.Builder;
import lombok.Getter; import lombok.Getter;
@Builder @Builder
@Getter @Getter
public class BayernIdResponse { public class BescheidManagerConfig {
private boolean success; private String version;
private String status; private String javaVersion;
private String message; private Features features;
@Builder
@Getter
static class Features {
private boolean canCreateBescheidDocument;
}
} }
...@@ -7,6 +7,7 @@ import jakarta.annotation.PostConstruct; ...@@ -7,6 +7,7 @@ import jakarta.annotation.PostConstruct;
import org.apache.commons.collections.MapUtils; import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.boot.info.BuildProperties;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import de.ozgcloud.bescheid.attacheditem.AttachedItem; import de.ozgcloud.bescheid.attacheditem.AttachedItem;
...@@ -34,6 +35,7 @@ class BescheidService { ...@@ -34,6 +35,7 @@ class BescheidService {
private final NachrichtService nachrichtService; private final NachrichtService nachrichtService;
private final CurrentUserService currentUserService; private final CurrentUserService currentUserService;
private final ClientAttributeService bescheidClientAttributeService; private final ClientAttributeService bescheidClientAttributeService;
private final BuildProperties buildProperties;
private final Optional<BescheidRemoteService> remoteService; private final Optional<BescheidRemoteService> remoteService;
@PostConstruct @PostConstruct
...@@ -155,4 +157,22 @@ class BescheidService { ...@@ -155,4 +157,22 @@ class BescheidService {
AttachedItem setBescheidDraftStatus(AttachedItem bescheidItem) { AttachedItem setBescheidDraftStatus(AttachedItem bescheidItem) {
return bescheidItem.toBuilder().item(Map.of(Bescheid.FIELD_STATUS, Bescheid.Status.DRAFT.name())).build(); return bescheidItem.toBuilder().item(Map.of(Bescheid.FIELD_STATUS, Bescheid.Status.DRAFT.name())).build();
} }
public BescheidManagerConfig getConfig() {
return BescheidManagerConfig.builder()
.version(buildProperties.getVersion())
.javaVersion(getJavaVersion())
.features(buildFeatures())
.build();
}
String getJavaVersion() {
return System.getProperty("java.version");
}
BescheidManagerConfig.Features buildFeatures() {
return BescheidManagerConfig.Features.builder()
.canCreateBescheidDocument(remoteService.isPresent())
.build();
}
} }
...@@ -33,4 +33,14 @@ public interface GrpcBescheidMapper { ...@@ -33,4 +33,14 @@ public interface GrpcBescheidMapper {
default String fromOptional(Optional<String> optionalString) { default String fromOptional(Optional<String> optionalString) {
return optionalString.orElse(StringUtils.EMPTY); return optionalString.orElse(StringUtils.EMPTY);
} }
@Mapping(target = "versionBytes", ignore = true)
@Mapping(target = "unknownFields", ignore = true)
@Mapping(target = "mergeUnknownFields", ignore = true)
@Mapping(target = "mergeFrom", ignore = true)
@Mapping(target = "mergeFeatures", ignore = true)
@Mapping(target = "javaVersionBytes", ignore = true)
@Mapping(target = "clearOneof", ignore = true)
@Mapping(target = "clearField", ignore = true)
GrpcBescheidManagerConfigResponse fromBescheidManagerConfig(BescheidManagerConfig bescheidManagerConfig);
} }
...@@ -29,6 +29,10 @@ class BescheidGrpcServiceTest { ...@@ -29,6 +29,10 @@ class BescheidGrpcServiceTest {
private AttachedItemService attachedItemService; private AttachedItemService attachedItemService;
@Mock @Mock
private BescheidItemMapper mapper; private BescheidItemMapper mapper;
@Mock
private BescheidService bescheidService;
@Mock
private GrpcBescheidMapper grpcBescheidMapper;
@Nested @Nested
class TestGetBescheidDraft { class TestGetBescheidDraft {
...@@ -104,4 +108,53 @@ class BescheidGrpcServiceTest { ...@@ -104,4 +108,53 @@ class BescheidGrpcServiceTest {
} }
} }
@Nested
class TestGetConfig {
private static final GrpcBescheidManagerConfigResponse RESPONSE = GrpcBescheidManagerConfigResponse.newBuilder().build();
@Mock
private GrpcBescheidManagerConfigRequest request;
@Mock
private StreamObserver<GrpcBescheidManagerConfigResponse> responseObserver;
@Captor
private ArgumentCaptor<GrpcBescheidManagerConfigResponse> responseCaptor;
@Test
void shouldCallBescheidService() {
getConfig();
verify(bescheidService).getConfig();
}
@Test
void shouldCallGrpcBescheidMapper() {
var config = BescheidManagerConfigTestFactory.create();
when(bescheidService.getConfig()).thenReturn(config);
getConfig();
verify(grpcBescheidMapper).fromBescheidManagerConfig(config);
}
@Test
void shouldCallNext() {
when(grpcBescheidMapper.fromBescheidManagerConfig(any())).thenReturn(RESPONSE);
getConfig();
verify(responseObserver).onNext(RESPONSE);
}
@Test
void shouldCallCompleted() {
getConfig();
verify(responseObserver).onCompleted();
}
private void getConfig() {
service.getConfig(request, responseObserver);
}
}
} }
...@@ -21,22 +21,24 @@ ...@@ -21,22 +21,24 @@
* Die sprachspezifischen Genehmigungen und Beschränkungen * Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen. * unter der Lizenz sind dem Lizenztext zu entnehmen.
*/ */
package de.ozgcloud.nachrichten.postfach.bayernid.proxy.message; package de.ozgcloud.bescheid;
public class EmpfaengerTestFactory { import de.ozgcloud.bescheid.BescheidManagerConfig.BescheidManagerConfigBuilder;
import de.ozgcloud.bescheid.BescheidManagerConfig.Features;
public static final String POSTKORB_ID = "postfachId"; public class BescheidManagerConfigTestFactory {
public static final String NAME = "name";
public static final String ANSCHRIFT = "anschrift";
public static Empfaenger create() { public static final String VERSION = "1.0.0";
public static final String JAVA_VERSION = "21";
public static BescheidManagerConfig create() {
return createBuilder().build(); return createBuilder().build();
} }
public static Empfaenger.EmpfaengerBuilder createBuilder() { public static BescheidManagerConfigBuilder createBuilder() {
return Empfaenger.builder() return BescheidManagerConfig.builder()
.postkorbId(POSTKORB_ID) .version(VERSION)
.name(NAME) .javaVersion(JAVA_VERSION)
.anschrift(ANSCHRIFT); .features(Features.builder().canCreateBescheidDocument(true).build());
} }
} }
...@@ -20,6 +20,7 @@ import org.mockito.Captor; ...@@ -20,6 +20,7 @@ import org.mockito.Captor;
import org.mockito.InjectMocks; import org.mockito.InjectMocks;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.Spy; import org.mockito.Spy;
import org.springframework.boot.info.BuildProperties;
import org.springframework.test.util.ReflectionTestUtils; import org.springframework.test.util.ReflectionTestUtils;
import de.ozgcloud.bescheid.attacheditem.AttachedItem; import de.ozgcloud.bescheid.attacheditem.AttachedItem;
...@@ -57,6 +58,8 @@ class BescheidServiceTest { ...@@ -57,6 +58,8 @@ class BescheidServiceTest {
private UserProfile callContextUser; private UserProfile callContextUser;
@Mock @Mock
private ClientAttributeService clientAttributeService; private ClientAttributeService clientAttributeService;
@Mock
private BuildProperties buildProperties;
@BeforeEach @BeforeEach
void init() { void init() {
...@@ -594,4 +597,79 @@ class BescheidServiceTest { ...@@ -594,4 +597,79 @@ class BescheidServiceTest {
assertThat(result.getItem()).containsEntry(Bescheid.FIELD_STATUS, Bescheid.Status.DRAFT.name()); assertThat(result.getItem()).containsEntry(Bescheid.FIELD_STATUS, Bescheid.Status.DRAFT.name());
} }
} }
@Nested
class TestGetConfig {
@Test
void shouldCallGetVersion() {
service.getConfig();
verify(buildProperties).getVersion();
}
@Test
void shouldSetBescheidManagerVersion() {
when(buildProperties.getVersion()).thenReturn(BescheidManagerConfigTestFactory.VERSION);
var result = service.getConfig();
assertThat(result.getVersion()).isEqualTo(BescheidManagerConfigTestFactory.VERSION);
}
@Test
void shouldCallGetJavaVersion() {
service.getConfig();
verify(service).getJavaVersion();
}
@Test
void shouldSetJavaVersion() {
when(service.getJavaVersion()).thenReturn(BescheidManagerConfigTestFactory.JAVA_VERSION);
var result = service.getConfig();
assertThat(result.getJavaVersion()).isEqualTo(BescheidManagerConfigTestFactory.JAVA_VERSION);
}
@Test
void shouldCallBuildFeatures() {
service.getConfig();
verify(service).buildFeatures();
}
@Test
void shouldSetFeatures() {
var features = BescheidManagerConfig.Features.builder().build();
when(service.buildFeatures()).thenReturn(features);
var result = service.getConfig();
assertThat(result.getFeatures()).isSameAs(features);
}
}
@Nested
class TestBuildFeatures {
@Test
void shouldSetCannotCreateBescheidDocument() {
ReflectionTestUtils.setField(service, "remoteService", Optional.empty());
var result = service.buildFeatures();
assertThat(result.isCanCreateBescheidDocument()).isFalse();
}
@Test
void shouldSetCanCreateBescheidDocument() {
var result = service.buildFeatures();
assertThat(result.isCanCreateBescheidDocument()).isTrue();
}
}
} }
...@@ -8,7 +8,7 @@ import org.mapstruct.factory.Mappers; ...@@ -8,7 +8,7 @@ import org.mapstruct.factory.Mappers;
class GrpcBescheidItemMapperTest { class GrpcBescheidItemMapperTest {
private GrpcBescheidMapper mapper = Mappers.getMapper(GrpcBescheidMapper.class); private final GrpcBescheidMapper mapper = Mappers.getMapper(GrpcBescheidMapper.class);
@Nested @Nested
class TestFromBescheid { class TestFromBescheid {
...@@ -21,4 +21,15 @@ class GrpcBescheidItemMapperTest { ...@@ -21,4 +21,15 @@ class GrpcBescheidItemMapperTest {
} }
} }
@Nested
class TestFromBescheidManagerConfig {
@Test
void shouldMapAllFields() {
var result = mapper.fromBescheidManagerConfig(BescheidManagerConfigTestFactory.create());
assertThat(result).usingRecursiveComparison().isEqualTo(GrpcBescheidManagerConfigResponseTestFactory.create());
}
}
} }
...@@ -21,20 +21,18 @@ ...@@ -21,20 +21,18 @@
* Die sprachspezifischen Genehmigungen und Beschränkungen * Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen. * unter der Lizenz sind dem Lizenztext zu entnehmen.
*/ */
package de.ozgcloud.nachrichten.postfach.bayernid.proxy; package de.ozgcloud.bescheid;
public class GrpcAttachmentMetadataTestFactory { public class GrpcBescheidManagerConfigResponseTestFactory {
public static final String FILE_TYPE = "plain/text"; public static GrpcBescheidManagerConfigResponse create() {
public static final String FILE_NAME = "test.txt";
public static GrpcAttachmentMetadata create() {
return createBuilder().build(); return createBuilder().build();
} }
public static GrpcAttachmentMetadata.Builder createBuilder() { public static GrpcBescheidManagerConfigResponse.Builder createBuilder() {
return GrpcAttachmentMetadata.newBuilder() return GrpcBescheidManagerConfigResponse.newBuilder()
.setFileType(FILE_TYPE) .setVersion(BescheidManagerConfigTestFactory.VERSION)
.setFileName(FILE_NAME); .setJavaVersion(BescheidManagerConfigTestFactory.JAVA_VERSION)
.setFeatures(GrpcBescheidManagerFeatures.newBuilder().setCanCreateBescheidDocument(true).build());
} }
} }
...@@ -7,6 +7,7 @@ import java.util.Optional; ...@@ -7,6 +7,7 @@ import java.util.Optional;
import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.info.BuildProperties;
import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.boot.test.mock.mockito.MockBean;
import de.ozgcloud.apilib.common.command.OzgCloudCommandService; import de.ozgcloud.apilib.common.command.OzgCloudCommandService;
...@@ -23,6 +24,8 @@ class NachrichtServiceITCase { ...@@ -23,6 +24,8 @@ class NachrichtServiceITCase {
private OzgCloudCommandService commandService; private OzgCloudCommandService commandService;
@MockBean @MockBean
private CommandMapper commandMapper; private CommandMapper commandMapper;
@MockBean
private BuildProperties buildProperties;
@Nested @Nested
class TestBuildMessage { class TestBuildMessage {
......
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
Ministerpräsidenten des Landes Schleswig-Holstein
Staatskanzlei
Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
Lizenziert unter der EUPL, Version 1.2 oder - sobald
diese von der Europäischen Kommission genehmigt wurden -
Folgeversionen der EUPL ("Lizenz");
Sie dürfen dieses Werk ausschließlich gemäß
dieser Lizenz nutzen.
Eine Kopie der Lizenz finden Sie hier:
https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
Sofern nicht durch anwendbare Rechtsvorschriften
gefordert oder in schriftlicher Form vereinbart, wird
die unter der Lizenz verbreitete Software "so wie sie
ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
ausdrücklich oder stillschweigend - verbreitet.
Die sprachspezifischen Genehmigungen und Beschränkungen
unter der Lizenz sind dem Lizenztext zu entnehmen.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>de.ozgcloud.nachrichten</groupId>
<artifactId>nachrichten-bayernid-proxy</artifactId>
<version>0.4.0-SNAPSHOT</version>
<relativePath>../</relativePath>
</parent>
<artifactId>bayernid-proxy-impl</artifactId>
<name>OZG Cloud BayernID Proxy Implementation</name>
<properties>
<jaxb-maven-plugin.version>4.0.0</jaxb-maven-plugin.version>
<spring-boot.build-image.imageName>docker.ozg-sh.de/bayernid-proxy:build-latest</spring-boot.build-image.imageName>
</properties>
<dependencies>
<dependency>
<groupId>de.ozgcloud.nachrichten</groupId>
<artifactId>bayernid-proxy-interface</artifactId>
<version>${project.version}</version>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-xml</artifactId>
</dependency>
<!-- commons -->
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
</dependency>
<!-- grpc -->
<dependency>
<groupId>net.devh</groupId>
<artifactId>grpc-server-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-inprocess</artifactId>
</dependency>
<!-- aspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
</dependency>
<!-- Tools -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
<!-- Dev -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
<scope>provided</scope>
</dependency>
<!-- Test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.wiremock</groupId>
<artifactId>wiremock-standalone</artifactId>
<version>${wiremock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>net.devh</groupId>
<artifactId>grpc-client-spring-boot-starter</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.jvnet.jaxb</groupId>
<artifactId>jaxb-maven-plugin</artifactId>
<version>${jaxb-maven-plugin.version}</version>
<configuration>
<schemas>
<schema>
<fileset>
<directory>${basedir}/src/main/resources/bayernid</directory>
<includes>
<include>*.wsdl</include>
</includes>
</fileset>
</schema>
<schema>
<fileset>
<directory>${basedir}/src/main/resources/bayernid</directory>
<includes>
<include>*.xsd</include>
</includes>
</fileset>
</schema>
</schemas>
<episode>false</episode>
</configuration>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
/*
* Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.nachrichten.postfach.bayernid.proxy;
import jakarta.validation.constraints.NotBlank;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.annotation.Validated;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Validated
@Configuration
@ConfigurationProperties(prefix = "ozgcloud.bayernid")
public class BayernIdProperties {
@NotBlank
private String server;
private boolean useSsl = true;
}
/*
* Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.nachrichten.postfach.bayernid.proxy;
import java.util.TimeZone;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.scheduling.annotation.EnableAsync;
@SpringBootApplication
@EnableAsync(proxyTargetClass = true)
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class BayernIdProxyApplication {
public static void main(String[] args) {
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
SpringApplication.run(BayernIdProxyApplication.class, args);
}
}
/*
* Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.nachrichten.postfach.bayernid.proxy;
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.springframework.boot.ssl.SslBundles;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.oxm.jaxb.Jaxb2Marshaller;
import org.springframework.ws.transport.http.HttpComponents5MessageSender;
import akdb.bsp.postkorb.komm.webservice.ObjectFactory;
import de.ozgcloud.nachrichten.postfach.bayernid.proxy.akdb.BayernIdRemoteService;
import de.ozgcloud.nachrichten.postfach.bayernid.proxy.message.BayernIdMessageMapper;
import lombok.RequiredArgsConstructor;
@Configuration
@RequiredArgsConstructor
class BayernIdProxyConfiguration {
private final SslBundles sslBundles;
private final BayernIdProperties properties;
@Bean
Jaxb2Marshaller createJaxb2Marshaller() {
var marshaller = new Jaxb2Marshaller();
marshaller.setContextPaths("akdb.bsp.postkorb.komm.webservice", "de.akdb.egov.bsp.nachrichten");
return marshaller;
}
@Bean
BayernIdRemoteService soapHttpClient(BayernIdMessageMapper messageMapper, Jaxb2Marshaller marshaller) {
var bayernIdRemoteService = new BayernIdRemoteService(messageMapper, new ObjectFactory());
bayernIdRemoteService.setMarshaller(marshaller);
bayernIdRemoteService.setUnmarshaller(marshaller);
bayernIdRemoteService.setDefaultUri(properties.getServer());
bayernIdRemoteService.setMessageSender(createMessageSender());
return bayernIdRemoteService;
}
HttpComponents5MessageSender createMessageSender() {
var httpClient = HttpClientBuilder.create()
.setConnectionManager(createConnectionManager())
.addRequestInterceptorFirst(new HttpComponents5MessageSender.RemoveSoapHeadersInterceptor())
.build();
return new HttpComponents5MessageSender(httpClient);
}
private HttpClientConnectionManager createConnectionManager() {
var socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create().register("http", new PlainConnectionSocketFactory());
if (properties.isUseSsl()) {
socketFactoryRegistry.register("https", createSslConnectionSocketFactory());
}
return new BasicHttpClientConnectionManager(socketFactoryRegistry.build());
}
private SSLConnectionSocketFactory createSslConnectionSocketFactory() {
return new SSLConnectionSocketFactory(sslBundles.getBundle("bayern-id-ca").createSslContext());
}
}
/*
* Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.nachrichten.postfach.bayernid.proxy;
import de.ozgcloud.nachrichten.postfach.bayernid.proxy.BayernIdProxyServiceGrpc.BayernIdProxyServiceImplBase;
import de.ozgcloud.nachrichten.postfach.bayernid.proxy.message.BayernIdMessageMapper;
import io.grpc.stub.StreamObserver;
import lombok.RequiredArgsConstructor;
import net.devh.boot.grpc.server.service.GrpcService;
@GrpcService
@RequiredArgsConstructor
public class BayernIdProxyGrpcService extends BayernIdProxyServiceImplBase {
private final BayernIdProxyService proxyService;
private final BayernIdMessageMapper messageMapper;
@Override
public StreamObserver<GrpcSendBayernIdMessageRequest> sendMessageAsStream(StreamObserver<GrpcSendBayernIdMessageResponse> responseObserver) {
return new UploadStreamObserver(responseObserver, proxyService, messageMapper);
}
}
/*
* Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.nachrichten.postfach.bayernid.proxy;
import org.springframework.stereotype.Service;
import de.ozgcloud.nachrichten.postfach.bayernid.proxy.akdb.BayernIdRemoteService;
import de.ozgcloud.nachrichten.postfach.bayernid.proxy.message.BayernIdMessage;
import de.ozgcloud.nachrichten.postfach.bayernid.proxy.message.BayernIdResponse;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class BayernIdProxyService {
private final BayernIdRemoteService bayernIdRemoteService;
public BayernIdResponse sendPostfachNachricht(BayernIdMessage message) {
return bayernIdRemoteService.sendPostfachNachricht(message);
}
}
/*
* Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.nachrichten.postfach.bayernid.proxy;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.Files;
public class DeleteOnCloseInputStream extends FileInputStream {
private final File file;
public DeleteOnCloseInputStream(File file) throws FileNotFoundException {
super(file);
this.file = file;
}
@Override
public void close() throws IOException {
super.close();
Files.deleteIfExists(file.toPath());
}
}
/*
* Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.nachrichten.postfach.bayernid.proxy;
import static java.util.Objects.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.concurrent.atomic.AtomicReference;
import com.google.protobuf.ByteString;
import de.ozgcloud.common.errorhandling.TechnicalException;
import de.ozgcloud.nachrichten.postfach.bayernid.proxy.message.Attachment;
import de.ozgcloud.nachrichten.postfach.bayernid.proxy.message.BayernIdMessage.BayernIdMessageBuilder;
import de.ozgcloud.nachrichten.postfach.bayernid.proxy.message.BayernIdMessageMapper;
import io.grpc.stub.StreamObserver;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
@Log4j2
@RequiredArgsConstructor
public class UploadStreamObserver implements StreamObserver<GrpcSendBayernIdMessageRequest> {
static final String ATTACHMENT_FILE_SUFFIX = ".ozg-cloud.tmp";
private final StreamObserver<GrpcSendBayernIdMessageResponse> responseObserver;
private final BayernIdProxyService proxyService;
private final BayernIdMessageMapper messageMapper;
private final AtomicReference<BayernIdMessageBuilder> messageBuilder = new AtomicReference<>();
private OutputStream attachmentWriter;
@Override
public synchronized void onNext(GrpcSendBayernIdMessageRequest sendRequest) {
if (sendRequest.hasMessageMetadata()) {
readMessageMetadata(sendRequest.getMessageMetadata());
return;
}
readAttachments(sendRequest.getAttachments());
}
void readMessageMetadata(GrpcBayernIdMessageMetadata sendRequest) {
messageBuilder.set(messageMapper.toBayernIdMessage(sendRequest));
}
void readAttachments(GrpcAttachments attachments) {
if (attachments.hasAttachmentMetadata()) {
addDataContainer(attachments.getAttachmentMetadata());
return;
}
writeAttachment(attachments.getContent());
}
void addDataContainer(GrpcAttachmentMetadata attachmentMetadata) {
messageBuilder.get().attachment(buildAttachment(attachmentMetadata));
}
Attachment buildAttachment(GrpcAttachmentMetadata attachmentMetadata) {
var attachmentFile = createTemporallyFile(attachmentMetadata.getFileName());
return Attachment.builder()
.name(attachmentMetadata.getFileName())
.type(attachmentMetadata.getFileType())
.content(attachmentFile)
.build();
}
InputStream createTemporallyFile(String fileName) {
try {
closeTemporallyWriter();
var tempFilePath = createFile(fileName);
attachmentWriter = newOutputStream(tempFilePath);
return newInputStream(tempFilePath);
} catch (IOException e) {
throw new TechnicalException("Can not create temporary file for attachment " + fileName, e);
}
}
Path createFile(String fileName) throws IOException {
var tmpFile = Files.createTempFile(fileName, ATTACHMENT_FILE_SUFFIX);
tmpFile.toFile().deleteOnExit();
return tmpFile;
}
OutputStream newOutputStream(Path filePath) throws IOException {
return Files.newOutputStream(filePath);
}
InputStream newInputStream(Path filePath) throws IOException {
return new DeleteOnCloseInputStream(filePath.toFile());
}
void closeTemporallyWriter() {
try {
if (nonNull(attachmentWriter)) {
attachmentWriter.close();
}
} catch (IOException e) {
throw new TechnicalException("Can not close attachment file", e);
}
}
void writeAttachment(ByteString content) {
try {
attachmentWriter.write(content.toByteArray());
attachmentWriter.flush();
} catch (IOException e) {
throw new TechnicalException("Can not save attachment content", e);
}
}
@Override
public void onError(Throwable t) {
closeTemporallyWriter();
throw new TechnicalException("Error while sending postfach message", t);
}
@Override
public void onCompleted() {
closeTemporallyWriter();
try {
var bayernIdResponse = proxyService.sendPostfachNachricht(messageBuilder.get().build());
responseObserver.onNext(messageMapper.fromBayernIdResponse(bayernIdResponse));
responseObserver.onCompleted();
} catch (Exception e) {
throw new TechnicalException("Error while sending postfach message", e);
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment