package com.nortal.jroad.client.adsv5; import com.nortal.jroad.client.service.XRoadDatabaseService; import java.io.IOException; import java.util.Iterator; import javax.xml.namespace.QName; import javax.xml.soap.SOAPElement; import javax.xml.soap.SOAPEnvelope; import javax.xml.soap.SOAPException; import javax.xml.soap.SOAPMessage; import javax.xml.transform.TransformerException; import org.springframework.stereotype.Service; import org.springframework.ws.WebServiceMessage; import org.springframework.ws.soap.saaj.SaajSoapMessage; import com.nortal.jroad.client.adsv5.types.ee.x_road.adsv5.producer.ADSnormalDocument; import com.nortal.jroad.client.adsv5.types.ee.x_road.adsv5.producer.ADSnormalRequestType; import com.nortal.jroad.client.adsv5.types.ee.x_road.adsv5.producer.ADSnormalRequestType.NormalParam; import com.nortal.jroad.client.adsv5.types.ee.x_road.adsv5.producer.ADSnormalResponseDocument; import com.nortal.jroad.client.adsv5.types.ee.x_road.adsv5.producer.ADSnormalVastusType; import com.nortal.jroad.client.exception.XRoadServiceConsumptionException; import com.nortal.jroad.client.service.callback.CustomCallback; import com.nortal.jroad.model.XRoadMessage; import com.nortal.jroad.model.XmlBeansXRoadMessage; @Service("adsv5XTeeService") public class Adsv5XTeeServiceImpl extends XRoadDatabaseService implements Adsv5XTeeService { public ADSnormalVastusType adsNormal(NormalParamCallback callback) throws XRoadServiceConsumptionException { ADSnormalDocument.ADSnormal dok = ADSnormalDocument.ADSnormal.Factory.newInstance(); ADSnormalRequestType request = dok.addNewRequest(); NormalParam normalParam = request.addNewNormalParam(); callback.populate(normalParam); XRoadMessage<ADSnormalResponseDocument.ADSnormalResponse> vastus = send(new XmlBeansXRoadMessage<ADSnormalDocument.ADSnormal>(dok), "ADSnormal", "v2", new NamespaceReplaceCallback(), null); ADSnormalVastusType v = vastus.getContent().getResponse().getADSnormalResult(); return v; } // FIXME: Check {@link XRoadMessageCallbackNamespaceStrategy}. It currently uses deprecated namespace. Probably XRoad namespace strategy can be updated and this callback abandoned. private static class NamespaceReplaceCallback extends CustomCallback { public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException { callback.doWithMessage(message); try { SaajSoapMessage saajMessage = (SaajSoapMessage) message; SOAPMessage soapmess = saajMessage.getSaajMessage(); SOAPEnvelope env = soapmess.getSOAPPart().getEnvelope(); env.addNamespaceDeclaration("xro", "http://x-road.ee/xsd/x-road.xsd"); Iterator headers = env.getHeader().getChildElements(); while (headers.hasNext()) { SOAPElement header = (SOAPElement) headers.next(); if (header.getNamespaceURI().equalsIgnoreCase("http://x-rd.net/xsd/xroad.xsd")) { String localHeaderName = header.getLocalName(); QName qName = new QName("http://x-road.ee/xsd/x-road.xsd", localHeaderName, "xro"); header.setElementQName(qName); } } } catch (SOAPException e) { throw new RuntimeException(e); } } } }