package at.gv.egiz.moazs.msg; import at.gv.zustellung.msg.xsd.App2ZusePort; import at.gv.zustellung.msg.xsd.App2ZusePortService; import at.gv.zustellung.msg.xsd.DeliveryRequestStatusType; import at.gv.zustellung.msg.xsd.DeliveryRequestType; import org.apache.cxf.configuration.jsse.TLSClientParameters; import org.apache.cxf.endpoint.Client; import org.apache.cxf.frontend.ClientProxy; 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.apache.cxf.transport.http.HTTPConduit; import org.apache.cxf.transports.http.configuration.HTTPClientPolicy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.lang.Nullable; import javax.net.ssl.SSLContext; //TODO: Rethink design. could this entire class be replaced? // Because everything the send() method does could be initialized in // the MsgClientFactory as well. public class MsgClient { private static final Logger log = LoggerFactory.getLogger(MsgClient.class); private final PhaseInterceptor interceptor; private final String address; //TODO: make configurable private final int connectionTimeout = 60; private final int receiveTimeout = 60; @Nullable private final SSLContext sslContext; public MsgClient(PhaseInterceptor interceptor, String address, @Nullable SSLContext sslContext) { this.interceptor = interceptor; this.address = address; this.sslContext = sslContext; } /** * Send {@code msgRequest} to {@code Config/Server/ZUSEUrlID} and run {@code interceptor} on response. * @return */ public DeliveryRequestStatusType send(DeliveryRequestType msgRequest) { var factory = new JaxWsClientFactoryBean(); factory.setServiceClass(App2ZusePort.class); factory.setAddress(address); factory.getInInterceptors().add(interceptor); var proxy = new JaxWsProxyFactoryBean(factory).create(); Client client = ClientProxy.getClient(proxy); HTTPConduit http = (HTTPConduit) client.getConduit(); var httpClientPolicy = new HTTPClientPolicy(); httpClientPolicy.setConnectionTimeout(connectionTimeout); httpClientPolicy.setReceiveTimeout(receiveTimeout); http.setClient(httpClientPolicy); if (sslContext != null) { var tlsParams = new TLSClientParameters(); tlsParams.setSSLSocketFactory(sslContext.getSocketFactory()); http.setTlsClientParameters(tlsParams); log.info("SSLContext initialized. "); } return ((App2ZusePort)proxy).delivery(msgRequest); } }