From 695ab1f836160d40c4352a2c3127f4f687912817 Mon Sep 17 00:00:00 2001 From: Christof Rabensteiner Date: Mon, 27 May 2019 09:46:36 +0200 Subject: Intercept Incoming DeliveryRequestStatus and Store as byte[] - Add egovutils dependency (Reason: Need DomUtils to serialize / unserialize Soap Message via DOMParser) - Add Incerceptor to MsgClient / -Factory that stores the message content byte-by-byte in the DeliveryRepository. The format is required for successfully validating a DeliveryRequestStatus. - Add SoapUtils, which interacts with byte[] Soap message. - Add CXFMessageUtils, which interacts with CXF Messages from interceptor chains. - Refactor xsd namespaces: Move them out from the PrefixMapper and into a dedicated class. --- src/main/java/at/gv/egiz/moazs/msg/MsgClient.java | 43 +++++------------ .../at/gv/egiz/moazs/msg/MsgClientFactory.java | 10 +++- ...StoreSOAPBodyBinaryInRepositoryInterceptor.java | 55 ++++++++++++++++++++++ 3 files changed, 77 insertions(+), 31 deletions(-) create mode 100644 src/main/java/at/gv/egiz/moazs/msg/StoreSOAPBodyBinaryInRepositoryInterceptor.java (limited to 'src/main/java/at/gv/egiz/moazs/msg') diff --git a/src/main/java/at/gv/egiz/moazs/msg/MsgClient.java b/src/main/java/at/gv/egiz/moazs/msg/MsgClient.java index 6f0b1d9..fd36a92 100644 --- a/src/main/java/at/gv/egiz/moazs/msg/MsgClient.java +++ b/src/main/java/at/gv/egiz/moazs/msg/MsgClient.java @@ -6,6 +6,8 @@ import at.gv.zustellung.msg.xsd.DeliveryRequestStatusType; import at.gv.zustellung.msg.xsd.DeliveryRequestType; import org.apache.cxf.jaxws.JaxWsClientFactoryBean; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; +import org.apache.cxf.message.Message; +import org.apache.cxf.phase.PhaseInterceptor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -15,53 +17,34 @@ public class MsgClient { private final DeliveryRequestType msgRequest; private final ConfigType config; + private final PhaseInterceptor interceptor; - MsgClient(DeliveryRequestType msgRequest, ConfigType config) { + MsgClient(DeliveryRequestType msgRequest, ConfigType config, PhaseInterceptor interceptor) { this.msgRequest = msgRequest; this.config = config; + this.interceptor = interceptor; } + /** + * Send {@code msgRequest} to {@code Config/Server/ZUSEUrlID} and run {@code interceptor} on response. + * @return + */ public DeliveryRequestStatusType send() { - var proxy = connect(config); - return proxy.delivery(msgRequest); - } private App2ZusePort connect(ConfigType config) { - new JaxWsClientFactoryBean(); - var address = config.getServer().getZUSEUrlID(); - var factory = new JaxWsProxyFactoryBean(); + + var factory = new JaxWsClientFactoryBean(); factory.setServiceClass(App2ZusePort.class); factory.setAddress(address); + factory.getInInterceptors().add(interceptor); - var proxy = factory.create(); - -// var client = ClientProxy.getClient(proxy); -// var conduit = (HTTPConduit) client.getConduit(); -// -// if (addressIsHttps(address)) { -// var tlsParams = new TLSClientParameters(); -// tlsParams.setSSLSocketFactory(createSSLContext().getSocketFactory()); -// conduit.setTlsClientParameters(tlsParams); -// } + var proxy = new JaxWsProxyFactoryBean(factory).create(); return (App2ZusePort) proxy; } - -// private SSLContext createSSLContext() { -// java.util.Properties props = new Properties(); -// props.entrySet(); -// -// // return SSLUtils.getPropertiesSSLContext(this.props, this.configDir, this.propsPrefix, forceTrustAllManager); -// return null; -// } - - private boolean addressIsHttps(String address) { - return address.startsWith("https://"); - } - } diff --git a/src/main/java/at/gv/egiz/moazs/msg/MsgClientFactory.java b/src/main/java/at/gv/egiz/moazs/msg/MsgClientFactory.java index 9884bd5..82468bc 100644 --- a/src/main/java/at/gv/egiz/moazs/msg/MsgClientFactory.java +++ b/src/main/java/at/gv/egiz/moazs/msg/MsgClientFactory.java @@ -2,13 +2,21 @@ package at.gv.egiz.moazs.msg; import at.gv.zustellung.app2mzs.xsd.ConfigType; import at.gv.zustellung.msg.xsd.DeliveryRequestType; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class MsgClientFactory { + private final StoreSOAPBodyBinaryInRepositoryInterceptor storeResponseInterceptor; + + @Autowired + public MsgClientFactory(StoreSOAPBodyBinaryInRepositoryInterceptor storeResponseInterceptor) { + this.storeResponseInterceptor = storeResponseInterceptor; + } + public MsgClient create(DeliveryRequestType msgRequest, ConfigType config) { - return new MsgClient(msgRequest, config); + return new MsgClient(msgRequest, config, storeResponseInterceptor); } } diff --git a/src/main/java/at/gv/egiz/moazs/msg/StoreSOAPBodyBinaryInRepositoryInterceptor.java b/src/main/java/at/gv/egiz/moazs/msg/StoreSOAPBodyBinaryInRepositoryInterceptor.java new file mode 100644 index 0000000..4e023ac --- /dev/null +++ b/src/main/java/at/gv/egiz/moazs/msg/StoreSOAPBodyBinaryInRepositoryInterceptor.java @@ -0,0 +1,55 @@ +package at.gv.egiz.moazs.msg; + +import at.gv.egiz.moazs.MoaZSException; +import at.gv.egiz.moazs.repository.DeliveryRepository; +import at.gv.egiz.moazs.scheme.SOAPUtils; +import at.gv.egiz.moazs.util.CXFMessageUtils; +import org.apache.cxf.message.Message; +import org.apache.cxf.phase.AbstractPhaseInterceptor; +import org.apache.cxf.phase.Phase; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.w3c.dom.Element; +import org.xml.sax.SAXException; + +import javax.xml.parsers.ParserConfigurationException; +import java.io.IOException; + +@Component +public class StoreSOAPBodyBinaryInRepositoryInterceptor extends AbstractPhaseInterceptor { + + private static final Logger log = LoggerFactory.getLogger(StoreSOAPBodyBinaryInRepositoryInterceptor.class); + + private final CXFMessageUtils messageUtils; + private final SOAPUtils soapUtils; + private final DeliveryRepository repository; + + @Autowired + public StoreSOAPBodyBinaryInRepositoryInterceptor(CXFMessageUtils extractor, SOAPUtils soapUtils, + DeliveryRepository repository) { + super(Phase.RECEIVE); + this.messageUtils = extractor; + this.soapUtils = soapUtils; + this.repository = repository; + } + + public void handleMessage(Message message) { + + try { + byte[] content = messageUtils.copyContent(message); + + if(content.length > 0) { + Element document = soapUtils.toDOM(content); + byte[] status = soapUtils.unwrapSoapEnvelope(document); + String appDeliveryId = soapUtils.getAppDeliveryIDFrom(document); + repository.addSignedDeliveryRequestStatus(status, appDeliveryId); + log.info("Store binary DeliveryRequestStatus with AppDeliveryId={}", appDeliveryId); + } + } catch (ParserConfigurationException | SAXException | IOException | NullPointerException e) { + throw new MoaZSException("Could not extract signed data from message.", e); + } + } + +} -- cgit v1.2.3