aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/at/gv/egiz/moazs/pipeline/SingleThreadedDeliveryPipeline.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/at/gv/egiz/moazs/pipeline/SingleThreadedDeliveryPipeline.java')
-rw-r--r--src/main/java/at/gv/egiz/moazs/pipeline/SingleThreadedDeliveryPipeline.java146
1 files changed, 146 insertions, 0 deletions
diff --git a/src/main/java/at/gv/egiz/moazs/pipeline/SingleThreadedDeliveryPipeline.java b/src/main/java/at/gv/egiz/moazs/pipeline/SingleThreadedDeliveryPipeline.java
new file mode 100644
index 0000000..783df32
--- /dev/null
+++ b/src/main/java/at/gv/egiz/moazs/pipeline/SingleThreadedDeliveryPipeline.java
@@ -0,0 +1,146 @@
+package at.gv.egiz.moazs.pipeline;
+
+
+import at.gv.egiz.moazs.MoaZSException;
+import at.gv.egiz.moazs.util.ClientFactory;
+import at.gv.egiz.moazs.repository.DeliveryRepository;
+import at.gv.egiz.moazs.scheme.Mzs2MsgConverter;
+import at.gv.egiz.moazs.scheme.NameSpace;
+import at.gv.egiz.moazs.scheme.TnvzHelper;
+import at.gv.egiz.moazs.verify.SignatureVerifier;
+import at.gv.zustellung.app2mzs.xsd.DeliveryRequestType;
+import at.gv.zustellung.msg.xsd.App2ZusePort;
+import at.gv.zustellung.msg.xsd.DeliveryAnswerType;
+import at.gv.zustellung.msg.xsd.DeliveryRequestStatusType;
+import at.gv.zustellung.tnvz.xsd.TNVZServicePort;
+import org.apache.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Profile;
+import org.springframework.stereotype.Component;
+
+import static at.gv.egiz.moazs.MoaZSException.moaZSExceptionBuilder;
+import static at.gv.egiz.moazs.util.NullCoalesce.coalesce;
+import static at.gv.zustellung.msg.xsd.DeliveryRequestStatusType.Error.errorBuilder;
+import static at.gv.zustellung.msg.xsd.DeliveryRequestStatusType.deliveryRequestStatusTypeBuilder;
+import static at.gv.zustellung.msg.xsd.ErrorInfoType.errorInfoTypeBuilder;
+import static java.lang.String.format;
+
+@Component
+@Profile("!cluster")
+public class SingleThreadedDeliveryPipeline implements DeliveryPipeline {
+
+ private static final Logger log = Logger.getLogger(SingleThreadedDeliveryPipeline.class);
+
+ private final DeliveryRepository repository;
+ private final TnvzHelper tnvzHelper;
+ private final Mzs2MsgConverter converter;
+ private final ClientFactory clientFactory;
+ private final SignatureVerifier verifier;
+
+ @Autowired
+ public SingleThreadedDeliveryPipeline(DeliveryRepository repository,
+ TnvzHelper tnvzHelper,
+ Mzs2MsgConverter converter,
+ ClientFactory clientFactory,
+ SignatureVerifier verifier
+ ) {
+ this.repository = repository;
+ this.tnvzHelper = tnvzHelper;
+ this.converter = converter;
+ this.clientFactory = clientFactory;
+ this.verifier = verifier;
+ }
+
+ @Override
+ public void processRequest(String appDeliveryId) {
+
+ var exceptionBuilder = moaZSExceptionBuilder();
+
+ try {
+ var mzsRequest = repository.getDeliveryRequest(appDeliveryId).orElseThrow();
+ exceptionBuilder.withMzsRequest(mzsRequest);
+
+ at.gv.zustellung.msg.xsd.DeliveryRequestType msgRequest = buildMsgRequest(mzsRequest, exceptionBuilder);
+ exceptionBuilder.withMsgRequest(msgRequest);
+
+ var msgClientParams = mzsRequest.getConfig().getMSGClient();
+ App2ZusePort client = clientFactory.create(msgClientParams, App2ZusePort.class);
+ var status = client.delivery(msgRequest);
+ exceptionBuilder.withMsgResult(status);
+
+ verifySignedStatus(appDeliveryId, exceptionBuilder);
+ repository.add(status);
+
+ } catch (MoaZSException exception) {
+
+ log.error(format("An error occured while processing the DeliveryRequest with AppDeliveryID=%s. ",
+ appDeliveryId), exception);
+
+ var errorStatus = generateErrorStatus(exception, appDeliveryId);
+ repository.add(errorStatus);
+ }
+ }
+
+ private at.gv.zustellung.msg.xsd.DeliveryRequestType buildMsgRequest(DeliveryRequestType mzsRequest,
+ MoaZSException.Builder exceptionBuilder) {
+ if (mzsRequest.getConfig().isPerformQueryPersonRequest()) {
+ var tnvzClientParams = mzsRequest.getConfig().getTNVZClient();
+ TNVZServicePort tvnzPort = clientFactory.create(tnvzClientParams, TNVZServicePort.class);
+ var identification = tnvzHelper.performQueryPersonRequest(mzsRequest, tvnzPort, exceptionBuilder);
+ return converter.convert(mzsRequest, identification);
+ } else {
+ return converter.convert(mzsRequest);
+ }
+ }
+
+ private void verifySignedStatus(String appDeliveryId, MoaZSException.Builder exceptionBuilder) throws MoaZSException {
+
+ try {
+ var signedStatus = repository.getSignedDeliveryRequestStatus(appDeliveryId).get();
+ verifier.verify(signedStatus);
+ } catch (Exception ex) {
+ throw exceptionBuilder.withMessage(format("Signature of DeliveryRequestStatus with AppDeliveryID=%s " +
+ " is not valid.", appDeliveryId))
+ .withErrorCode(MoaZSException.ERROR_MOASP_SIGNATURE_INVALID)
+ .withCause(ex)
+ .build();
+ }
+ }
+
+ private DeliveryRequestStatusType generateErrorStatus(MoaZSException exception, String appDeliveryId) {
+
+ var infoBuilder = errorInfoTypeBuilder()
+ .withText(exception.getMessage())
+ .withCode(exception.getErrorCode());
+
+ var errorBuilder = errorBuilder()
+ .withErrorInfo(infoBuilder.build())
+ .withAppDeliveryID(appDeliveryId);
+
+ if (exception.getMzsRequest() != null) {
+ errorBuilder.withDeliverySystem(exception.getMzsRequest().getConfig().getMSGClient().getURL());
+ }
+
+ if (exception.getTnvzResult() != null && exception.getTnvzResult().getError() != null) {
+ errorBuilder.withPreAdviceNoteSent(exception.getTnvzResult().getError().getPreAdviceNoteSent());
+ }
+
+ if (exception.getMsgResult() != null) {
+ var answer = getAnswerFromResult(exception.getMsgResult());
+ errorBuilder.withGZ(answer.getGZ());
+ errorBuilder.withZSDeliveryID(answer.getZSDeliveryID());
+ }
+
+ return deliveryRequestStatusTypeBuilder()
+ .withError(errorBuilder.build())
+ .withVersion(NameSpace.MSG_VERSION)
+ .build();
+
+ }
+
+ private DeliveryAnswerType getAnswerFromResult(DeliveryRequestStatusType msgResult) {
+ return coalesce(msgResult.getSuccess(), msgResult.getPartialSuccess(), msgResult.getError()).get();
+ }
+
+
+}