package at.gv.egiz.moazs; import at.gv.e_government.reference.namespace.zustellung.mzs.app2mzs.App2MzsPortType; import at.gv.e_government.reference.namespace.zustellung.mzs.app2mzs_.*; 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.util.concurrent.CompletableFuture.supplyAsync; @Service 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#"; @Autowired private DeliveryRequestHandler deliveryRequestHandler; @Autowired private Mzs2AppClient appClient; @Autowired private ObjectFactory objectFactory; @Override public DeliveryResponseType app2Mzs( @WebParam(partName = "DeliveryRequest", name = "DeliveryRequest", targetNamespace = MZSTNS) DeliveryRequestType deliveryRequest) { var future = supplyAsync(() -> deliveryRequestHandler.apply(deliveryRequest)); try { return future.get(timeoutForAnwser, TimeUnit.SECONDS); } catch (TimeoutException e) { future.thenAccept(appClient::sendNotification); logger.warn("Answer Timed Out", e); return generatePartialSuccessResponse(deliveryRequest); } catch (Exception e ) { logger.error("Could not deliver request.", e); return generateErrorResponse(); } } private DeliveryResponseType generatePartialSuccessResponse(DeliveryRequestType deliveryRequest) { var partialSuccess = objectFactory.createPartialSuccessType(); partialSuccess.setAppDeliveryID(deliveryRequest.getMetaData().getAppDeliveryID()); var response = objectFactory.createDeliveryResponseType(); response.setPartialSuccess(partialSuccess); return response; } private DeliveryResponseType generateErrorResponse() { var error = objectFactory.createErrorType(); error.setText("Error Occurred"); error.setCode(BigInteger.valueOf(500)); var response = objectFactory.createDeliveryResponseType(); response.setError(error); return response; } }