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

Merge branch 'master' into ozg-2956-mongodb-tls

parents 51f363c3 ba9fcb62
Branches
Tags
No related merge requests found
Showing
with 0 additions and 1383 deletions
/*
* 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);
}
}
}
/*
* 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.akdb;
import java.io.IOException;
import jakarta.xml.bind.JAXBElement;
import org.springframework.ws.client.core.support.WebServiceGatewaySupport;
import org.springframework.xml.transform.StringResult;
import org.springframework.xml.transform.StringSource;
import akdb.bsp.postkorb.komm.webservice.ObjectFactory;
import akdb.bsp.postkorb.komm.webservice.SendBspNachrichtNative;
import akdb.bsp.postkorb.komm.webservice.SendBspNachrichtNativeOutput;
import de.akdb.egov.bsp.nachrichten.BspNachricht;
import de.akdb.egov.bsp.nachrichten.BspQuittung;
import de.ozgcloud.common.errorhandling.TechnicalException;
import de.ozgcloud.nachrichten.postfach.bayernid.proxy.message.BayernIdMessage;
import de.ozgcloud.nachrichten.postfach.bayernid.proxy.message.BayernIdMessageMapper;
import de.ozgcloud.nachrichten.postfach.bayernid.proxy.message.BayernIdResponse;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
public class BayernIdRemoteService extends WebServiceGatewaySupport {
private final BayernIdMessageMapper messageMapper;
private final ObjectFactory objectFactory;
public BayernIdResponse sendPostfachNachricht(BayernIdMessage message) {
var sendNachricht = createSendNachricht(message);
var sendBspNachrichtResponse = sendBspNachricht(sendNachricht);
var bspQuittung = createBspQuitung(sendBspNachrichtResponse);
return messageMapper.toBayernIdResponse(bspQuittung);
}
SendBspNachrichtNative createSendNachricht(BayernIdMessage message) {
var bspNachricht = messageMapper.toBspNachricht(message);
var sendBspNachricht = new SendBspNachrichtNative();
sendBspNachricht.setBspNachricht(buildBspNachrichtXml(bspNachricht));
return sendBspNachricht;
}
String buildBspNachrichtXml(BspNachricht message) {
try {
var result = new StringResult();
getMarshaller().marshal(message, result);
return result.toString();
} catch (IOException e) {
throw new TechnicalException("Error while marshalling BspNachricht", e);
}
}
SendBspNachrichtNativeOutput sendBspNachricht(SendBspNachrichtNative request) {
return send(objectFactory.createSendBspNachrichtNative(request)).getValue();
}
@SuppressWarnings("unchecked")
JAXBElement<SendBspNachrichtNativeOutput> send(JAXBElement<SendBspNachrichtNative> jaxbSendBspNachrichtNative) {
return (JAXBElement<SendBspNachrichtNativeOutput>) getWebServiceTemplate().marshalSendAndReceive(jaxbSendBspNachrichtNative);
}
BspQuittung createBspQuitung(SendBspNachrichtNativeOutput bspNachrichtResponse) {
try {
return (BspQuittung) getUnmarshaller().unmarshal(new StringSource(bspNachrichtResponse.getBspQuittung()));
} catch (IOException e) {
throw new TechnicalException("Error while unmarshalling BspQuittung", e);
}
}
}
/*
* 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.errorhandling;
import java.util.UUID;
import de.ozgcloud.common.errorhandling.ExceptionUtil;
import de.ozgcloud.common.errorhandling.TechnicalException;
import de.ozgcloud.common.grpc.GrpcUtil;
import io.grpc.Metadata;
import io.grpc.Status;
import io.grpc.StatusException;
import lombok.extern.log4j.Log4j2;
import net.devh.boot.grpc.server.advice.GrpcAdvice;
import net.devh.boot.grpc.server.advice.GrpcExceptionHandler;
@GrpcAdvice
@Log4j2
public class ExceptionHandler {
static final String KEY_EXCEPTION_ID = "EXCEPTION_ID";
@GrpcExceptionHandler
public StatusException handleTechnicalException(TechnicalException e) {
LOG.error("Technical exception occurred", e);
return createStatusException(buildInternalStatus(e), buildMetadata(e.getExceptionId()));
}
@GrpcExceptionHandler
public StatusException handleRuntimeException(RuntimeException e) {
var exceptionId = createExceptionId();
LOG.error(ExceptionUtil.formatMessageWithExceptionId("gRPC internal exception.",exceptionId), e);
return createStatusException(buildInternalStatus(e), buildMetadata(exceptionId));
}
Status buildInternalStatus(RuntimeException e) {
return Status.INTERNAL.withDescription(e.getMessage()).withCause(e.getCause());
}
String createExceptionId() {
return UUID.randomUUID().toString();
}
Metadata buildMetadata(String exceptionId) {
var metadata = new Metadata();
metadata.put(GrpcUtil.keyOfString(KEY_EXCEPTION_ID), exceptionId);
return metadata;
}
StatusException createStatusException(Status status, Metadata metadata) {
return new StatusException(status, metadata);
}
}
/*
* 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.message;
import lombok.Builder;
import lombok.Getter;
@Builder
@Getter
public class Absender {
private String postkorbId;
private String name;
private String anschrift;
private String email;
private String telefon;
private String hyperlink;
private String dienst;
private String mandant;
private String gemeindeschluessel;
}
/*
* 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.message;
import java.io.InputStream;
import lombok.Builder;
import lombok.Getter;
@Builder
@Getter
public class Attachment {
private String name;
private String type;
private InputStream content;
}
/*
* 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.message;
import java.util.List;
import lombok.Builder;
import lombok.Getter;
import lombok.Singular;
@Builder
@Getter
public class BayernIdMessage {
private String messageId;
private String createdAt;
private String vorgangId;
private Absender absender;
private Empfaenger empfaenger;
private String subject;
private String storkQaaLevel;
private String text;
@Singular
private List<Attachment> attachments;
}
/*
* 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.message;
import java.io.IOException;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.NullValueCheckStrategy;
import org.mapstruct.NullValuePropertyMappingStrategy;
import de.akdb.egov.bsp.nachrichten.AbsenderType;
import de.akdb.egov.bsp.nachrichten.BspNachricht;
import de.akdb.egov.bsp.nachrichten.BspQuittung;
import de.akdb.egov.bsp.nachrichten.DataContainerType;
import de.akdb.egov.bsp.nachrichten.SchluesseltabelleType;
import de.ozgcloud.common.errorhandling.TechnicalException;
import de.ozgcloud.nachrichten.postfach.bayernid.proxy.GrpcAbsender;
import de.ozgcloud.nachrichten.postfach.bayernid.proxy.GrpcBayernIdMessageMetadata;
import de.ozgcloud.nachrichten.postfach.bayernid.proxy.GrpcSendBayernIdMessageResponse;
import de.ozgcloud.nachrichten.postfach.bayernid.proxy.message.BayernIdMessage.BayernIdMessageBuilder;
@Mapper(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE, nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
public interface BayernIdMessageMapper {
String TABELLE_NUMMER_TEXT_ENCODING = "9004";
String TABELLE_NUMMER_MIME_TYPE = "9005";
String TABELLE_NUMMER_GEMEINDE_SCHLUESSEL = "36";
String TEXT_ENCODING_PLAIN_TEXT = "text/plain";
@Mapping(target = "attachments", ignore = true)
BayernIdMessageBuilder toBayernIdMessage(GrpcBayernIdMessageMetadata grpcMessage);
@Mapping(target = "gemeindeschluessel.tabelle", constant = TABELLE_NUMMER_GEMEINDE_SCHLUESSEL)
@Mapping(target = "gemeindeschluessel.schluessel", source = "gemeindeschluessel")
AbsenderType toAbsenderType(GrpcAbsender absender);
@Mapping(target = "unknownFields", ignore = true)
@Mapping(target = "statusBytes", ignore = true)
@Mapping(target = "messageBytes", ignore = true)
@Mapping(target = "mergeUnknownFields", ignore = true)
@Mapping(target = "mergeFrom", ignore = true)
@Mapping(target = "clearOneof", ignore = true)
@Mapping(target = "clearField", ignore = true)
GrpcSendBayernIdMessageResponse fromBayernIdResponse(BayernIdResponse message);
@Mapping(target = "nachrichtenKopf.identifikationNachricht.nachrichtenId", source = "messageId")
@Mapping(target = "nachrichtenKopf.identifikationNachricht.erstellungszeitpunkt", source = "createdAt")
@Mapping(target = "nachrichtenKopf.empfaenger.postkorbId", source = "empfaenger.postkorbId")
@Mapping(target = "nachrichtenKopf.empfaenger.name", source = "empfaenger.name")
@Mapping(target = "nachrichtenKopf.empfaenger.anschrift", source = "empfaenger.anschrift")
@Mapping(target = "nachrichtenKopf.absender", source = "absender")
@Mapping(target = "nachrichtenInhalt.betreff", source = "subject")
@Mapping(target = "nachrichtenInhalt.storkQaaLevel", source = "storkQaaLevel")
@Mapping(target = "nachrichtenInhalt.zuVorgang.vorgangsId", source = "vorgangId")
@Mapping(target = "nachrichtenInhalt.freiText.encoding.schluessel", constant = TEXT_ENCODING_PLAIN_TEXT)
@Mapping(target = "nachrichtenInhalt.freiText.encoding.tabelle", constant = TABELLE_NUMMER_TEXT_ENCODING)
@Mapping(target = "nachrichtenInhalt.freiText.text", source = "text")
@Mapping(target = "nachrichtenInhalt.dataContainer", source = "attachments")
BspNachricht toBspNachricht(BayernIdMessage message);
@Mapping(target = "gemeindeschluessel.tabelle", constant = TABELLE_NUMMER_GEMEINDE_SCHLUESSEL)
@Mapping(target = "gemeindeschluessel.schluessel", source = "gemeindeschluessel")
AbsenderType toAbsenderType(Absender absender);
default DataContainerType toDataContainerType(Attachment attachment) {
var dataContainer = new DataContainerType();
dataContainer.setFileType(toSchluesseltabelleType(attachment));
dataContainer.setFileName(attachment.getName());
try {
var content = attachment.getContent();
try {
dataContainer.setInhalt(content.readAllBytes());
} finally {
content.close();
}
} catch (IOException e) {
throw new TechnicalException("Error reading attachment content", e);
}
return dataContainer;
}
default SchluesseltabelleType toSchluesseltabelleType(Attachment attachment) {
var schluesseltabelle = new SchluesseltabelleType();
schluesseltabelle.setSchluessel(attachment.getType());
schluesseltabelle.setTabelle(TABELLE_NUMMER_MIME_TYPE);
return schluesseltabelle;
}
@Mapping(target = "status", source = "ergebnisStatus.schluessel")
@Mapping(target = "message", source = "ergaenzendeHinweise")
@Mapping(target = "success", source = "annahmeErfolgreich")
BayernIdResponse toBayernIdResponse(BspQuittung quittung);
}
net.devh.boot.grpc.common.autoconfigure.GrpcCommonCodecAutoConfiguration
net.devh.boot.grpc.common.autoconfigure.GrpcCommonTraceAutoConfiguration
net.devh.boot.grpc.server.autoconfigure.GrpcAdviceAutoConfiguration
net.devh.boot.grpc.server.autoconfigure.GrpcHealthServiceAutoConfiguration
net.devh.boot.grpc.server.autoconfigure.GrpcMetadataConsulConfiguration
net.devh.boot.grpc.server.autoconfigure.GrpcMetadataEurekaConfiguration
net.devh.boot.grpc.server.autoconfigure.GrpcMetadataNacosConfiguration
net.devh.boot.grpc.server.autoconfigure.GrpcMetadataZookeeperConfiguration
net.devh.boot.grpc.server.autoconfigure.GrpcReflectionServiceAutoConfiguration
net.devh.boot.grpc.server.autoconfigure.GrpcServerAutoConfiguration
net.devh.boot.grpc.server.autoconfigure.GrpcServerFactoryAutoConfiguration
net.devh.boot.grpc.server.autoconfigure.GrpcServerMetricAutoConfiguration
net.devh.boot.grpc.server.autoconfigure.GrpcServerSecurityAutoConfiguration
net.devh.boot.grpc.server.autoconfigure.GrpcServerTraceAutoConfiguration
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment