From aed1250912476f47fd772b0cedd20c850cdcff6e Mon Sep 17 00:00:00 2001 From: Christof Rabensteiner Date: Thu, 18 Apr 2019 11:05:31 +0200 Subject: Change App2mzs Interface and Init Delivery Pipeline - Change app2mzs interface: output message from app2mzs:DeliveryRequest was app2mzs:DeliveryResponse, now its msg:DeliveryRequestStatus. Reason: ZD returns msg:DeliveryRequestStatus which is signed. Moazs does not convert msg:DeliveryRequestStatus into app2mzs:DeliveryResponse because the conversion woudl break the signature. - App2MzsService: Make beans final and inject them with constructor; Refactor DeliveryRequestHandler into App2MZSService. - DeliveryPipeline: Add Interface and a "SameThreadImplementation" that executes the pipeline in the same threat and can be used in single mode. - DeliveryRepository: Augment interface for storing and retrieving request status objects; Add in-memory-implementation for status objects. - Utils: Add helper function for coalescing multiple values --- src/main/java/at/gv/egiz/moazs/App2MzsService.java | 89 +++++++++++++++------- 1 file changed, 61 insertions(+), 28 deletions(-) (limited to 'src/main/java/at/gv/egiz/moazs/App2MzsService.java') diff --git a/src/main/java/at/gv/egiz/moazs/App2MzsService.java b/src/main/java/at/gv/egiz/moazs/App2MzsService.java index f8c00fc..8626c24 100644 --- a/src/main/java/at/gv/egiz/moazs/App2MzsService.java +++ b/src/main/java/at/gv/egiz/moazs/App2MzsService.java @@ -1,18 +1,21 @@ package at.gv.egiz.moazs; +import at.gv.e_government.reference.namespace.zustellung.msg.phase2._20181206_.DeliveryRequestStatusType; +import at.gv.e_government.reference.namespace.zustellung.msg.phase2._20181206_.ObjectFactory; import at.gv.e_government.reference.namespace.zustellung.mzs.app2mzs.App2MzsPortType; -import at.gv.e_government.reference.namespace.zustellung.mzs.app2mzs_.*; +import at.gv.e_government.reference.namespace.zustellung.mzs.app2mzs_.DeliveryRequestType; +import at.gv.egiz.moazs.pipeline.DeliveryPipeline; +import at.gv.egiz.moazs.repository.DeliveryRepository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.jws.WebParam; -import java.math.BigInteger; -import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import static java.text.MessageFormat.format; import static java.util.concurrent.CompletableFuture.supplyAsync; @Service @@ -20,63 +23,93 @@ public class App2MzsService implements App2MzsPortType { private static final Logger logger = LoggerFactory.getLogger(App2MzsService.class); - //TODO move timeout to config - private final int timeoutForAnwser = 10; - private final String MZSTNS = "http://reference.e-government.gv.at/namespace/zustellung/mzs/app2mzs#"; + //TODO move timeout and namespaces to config + private static final int TIMEOUT_FOR_ANWSER = 10; + private static final String MZSTNS = "http://reference.e-government.gv.at/namespace/zustellung/mzs/app2mzs#"; - @Autowired - private DeliveryRequestHandler deliveryRequestHandler; + private final DeliveryRepository repository; + private final DeliveryPipeline pipeline; + private final Mzs2AppClient appClient; + private final ObjectFactory objectFactory = new ObjectFactory(); - @Autowired - private Mzs2AppClient appClient; - - @Autowired - private ObjectFactory objectFactory; + public App2MzsService(@Autowired DeliveryRepository repository, @Autowired DeliveryPipeline pipeline, @Autowired Mzs2AppClient appClient) { + this.repository = repository; + this.pipeline = pipeline; + this.appClient = appClient; + } @Override - public DeliveryResponseType app2Mzs( + public DeliveryRequestStatusType app2Mzs( @WebParam(partName = "DeliveryRequest", name = "DeliveryRequest", targetNamespace = MZSTNS) DeliveryRequestType deliveryRequest) { - var future = supplyAsync(() -> deliveryRequestHandler.apply(deliveryRequest)); + final var appDeliveryID = deliveryRequest.getMetaData().getAppDeliveryID(); + + var future = supplyAsync(() -> process(deliveryRequest)); try { - return future.get(timeoutForAnwser, TimeUnit.SECONDS); + return future.get(TIMEOUT_FOR_ANWSER, TimeUnit.SECONDS); } catch (TimeoutException e) { future.thenAccept(appClient::sendNotification); - logger.warn("Answer Timed Out", e); - return generatePartialSuccessResponse(deliveryRequest); + logger.info("Answer Timed Out", e); + return generatePartialSuccessResponse(appDeliveryID, "Your request timed out; Wait until X for receiving a notification."); } catch (Exception e ) { logger.error("Could not deliver request.", e); - return generateErrorResponse(); + final var message = format("An error occured while delivering request: {}", e.getMessage()); + return generateErrorResponse(appDeliveryID, message); } } - private DeliveryResponseType generatePartialSuccessResponse(DeliveryRequestType deliveryRequest) { + private DeliveryRequestStatusType generatePartialSuccessResponse(String appDeliveryId, String message) { - var partialSuccess = objectFactory.createPartialSuccessType(); - partialSuccess.setAppDeliveryID(deliveryRequest.getMetaData().getAppDeliveryID()); + var partialSuccess = objectFactory.createDeliveryAnswerType(); + partialSuccess.setAppDeliveryID(appDeliveryId); - var response = objectFactory.createDeliveryResponseType(); + var response = objectFactory.createDeliveryRequestStatusType(); response.setPartialSuccess(partialSuccess); + response.setSignature(null); + return response; } - private DeliveryResponseType generateErrorResponse() { + private DeliveryRequestStatusType generateErrorResponse(String appDeliveryId, String message) { - var error = objectFactory.createErrorType(); - error.setText("Error Occurred"); - error.setCode(BigInteger.valueOf(500)); + var error = objectFactory.createDeliveryRequestStatusTypeError(); + error.setAppDeliveryID(appDeliveryId); - var response = objectFactory.createDeliveryResponseType(); + var info = objectFactory.createErrorInfoType(); + info.setCode("500"); + info.setText(message); + error.setErrorInfo(info); + + var response = objectFactory.createDeliveryRequestStatusType(); response.setError(error); + response.setSignature(null); return response; } + private DeliveryRequestStatusType process(DeliveryRequestType deliveryRequest) throws RuntimeException { + + var appDeliveryID = deliveryRequest.getMetaData().getAppDeliveryID(); + logger.info("Receive request with appDeliveryID = {}.", appDeliveryID); + + repository.add(deliveryRequest); + pipeline.processRequest(appDeliveryID); + + var status = repository.getDeliveryRequestStatus(appDeliveryID); + + if (status.isEmpty()) { + throw new RuntimeException(format("Could not get a response for request with appDeliveryId = {}", appDeliveryID)); + } + + return status.get(); + + } + } \ No newline at end of file -- cgit v1.2.3