package com.nortal.jroad.client.emtav5; import java.io.IOException; import java.util.Calendar; import java.util.Date; import java.util.Iterator; import java.util.List; import javax.activation.DataHandler; import javax.annotation.Resource; 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.emtav5.database.Emtav5XRoadDatabase; import com.nortal.jroad.client.emtav5.types.net.x_rd.ee.emtav5.producer.DownloadMimeDocument; import com.nortal.jroad.client.emtav5.types.net.x_rd.ee.emtav5.producer.DownloadMimeDocument.DownloadMime; import com.nortal.jroad.client.emtav5.types.net.x_rd.ee.emtav5.producer.DownloadMimeResponseDocument.DownloadMimeResponse; import com.nortal.jroad.client.emtav5.types.net.x_rd.ee.emtav5.producer.DownloadMimeType; import com.nortal.jroad.client.emtav5.types.net.x_rd.ee.emtav5.producer.SkaMitteresidentDocument.SkaMitteresident; import com.nortal.jroad.client.emtav5.types.net.x_rd.ee.emtav5.producer.SkaMitteresidentRequestType; import com.nortal.jroad.client.emtav5.types.net.x_rd.ee.emtav5.producer.SkaMitteresidentResponseDocument.SkaMitteresidentResponse; import com.nortal.jroad.client.emtav5.types.net.x_rd.ee.emtav5.producer.SkaMitteresidentResponseType; import com.nortal.jroad.client.emtav5.types.net.x_rd.ee.emtav5.producer.SmMaksustatavadAndmedDocument.SmMaksustatavadAndmed; import com.nortal.jroad.client.emtav5.types.net.x_rd.ee.emtav5.producer.SmMaksustatavadAndmedResponseDocument.SmMaksustatavadAndmedResponse; import com.nortal.jroad.client.emtav5.types.net.x_rd.ee.emtav5.producer.SmMaksustatavadAndmedResponseType; import com.nortal.jroad.client.emtav5.types.net.x_rd.ee.emtav5.producer.SmMaksustatavadAndmedType; import com.nortal.jroad.client.emtav5.types.net.x_rd.ee.emtav5.producer.SpouseCheckCommonRequestType; import com.nortal.jroad.client.emtav5.types.net.x_rd.ee.emtav5.producer.SpouseCheckRequestType; import com.nortal.jroad.client.emtav5.types.net.x_rd.ee.emtav5.producer.SpouseCheckResponseType; import com.nortal.jroad.client.emtav5.types.net.x_rd.ee.emtav5.producer.SpouseCheckResponseType.Response; import com.nortal.jroad.client.emtav5.types.net.x_rd.ee.emtav5.producer.SpouseCheckResponseType.Response.Period; import com.nortal.jroad.client.emtav5.types.net.x_rd.ee.emtav5.producer.UploadMimeDocument; import com.nortal.jroad.client.emtav5.types.net.x_rd.ee.emtav5.producer.UploadMimeDocument.UploadMime; import com.nortal.jroad.client.emtav5.types.net.x_rd.ee.emtav5.producer.UploadMimeResponseDocument.UploadMimeResponse; import com.nortal.jroad.client.emtav5.types.net.x_rd.ee.emtav5.producer.UploadMimeType; import com.nortal.jroad.client.emtav5.types.net.x_rd.ee.emtav5.producer.UploadMimeType.Props; import com.nortal.jroad.client.emtav5.types.net.x_rd.ee.emtav5.producer.UploadMimeType.Props.Prop; import com.nortal.jroad.client.exception.XRoadServiceConsumptionException; import com.nortal.jroad.client.service.XRoadDatabaseService; import com.nortal.jroad.client.service.callback.CustomCallback; import com.nortal.jroad.model.XRoadAttachment; import com.nortal.jroad.model.XRoadMessage; import com.nortal.jroad.model.XmlBeansXRoadMessage; import com.nortal.jroad.util.AttachmentUtil; /** * @author Kait Kasak (kait.kasak@nortal.com) */ @Service("emtav5XTeeService") public class Emtav5XTeeServiceImpl extends XRoadDatabaseService implements Emtav5XTeeService { private static final String XTEE_FIEAK = "xteeFIEAK"; private static final String SKA_MITTERESIDENT = "skaMitteresident"; private static final String SM_MAKSUSTATAVAD_ANDMED = "smMaksustatavadAndmed"; private static final String UPLOAD_ID = "UPLOAD_ID"; private static final String UPLOAD_MIME = "uploadMime"; private static final String DOWNLOAD_MIME = "downloadMime"; private static final String V1 = "v1"; @Resource private Emtav5XRoadDatabase emtav5XRoadDatabase; public List<Period> xteeFIEAKV1(String id, Date start, Date end) throws XRoadServiceConsumptionException { SpouseCheckRequestType request = SpouseCheckRequestType.Factory.newInstance(); SpouseCheckCommonRequestType commonRequest = request.addNewRequest(); commonRequest.setId(id); commonRequest.setStart(getCalendar(start)); commonRequest.setEnd(getCalendar(end)); XRoadMessage<SpouseCheckResponseType> xteeFIEAKV1 = send(new XmlBeansXRoadMessage<SpouseCheckRequestType>(request), XTEE_FIEAK, V1); Response response = xteeFIEAKV1.getContent().getResponse(); return response.getPeriodList(); } private Calendar getCalendar(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return calendar; } public SkaMitteresidentResponseType skaMitteresident(String registreerimiskood) throws XRoadServiceConsumptionException { SkaMitteresident input = SkaMitteresident.Factory.newInstance(); SkaMitteresidentRequestType request = input.addNewRequest(); request.setRegistreerimiskood(registreerimiskood); XRoadMessage<SkaMitteresidentResponse> skaMitteresident = send(new XmlBeansXRoadMessage<SkaMitteresident>(input), SKA_MITTERESIDENT, V1, new Emtav5Callback(), null); return skaMitteresident.getContent().getResponse(); } @Override public SmMaksustatavadAndmedResponseType smMaksustatavadAndmed(String isikukood, String perioodiAlgus, String perioodiLopp) throws XRoadServiceConsumptionException { SmMaksustatavadAndmed input = SmMaksustatavadAndmed.Factory.newInstance(); SmMaksustatavadAndmedType request = input.addNewRequest(); request.setIsikukood(isikukood); request.setPerioodiAlgus(perioodiAlgus); request.setPerioodiLopp(perioodiLopp); XRoadMessage<SmMaksustatavadAndmedResponse> skaMitteresident = send(new XmlBeansXRoadMessage<SmMaksustatavadAndmed>(input), SM_MAKSUSTATAVAD_ANDMED, V1, new Emtav5Callback(), null); return skaMitteresident.getContent().getResponse(); } @Override public XRoadMessage<DownloadMimeResponse> downloadMime(String target) throws XRoadServiceConsumptionException { DownloadMime downloadMimeDocument = DownloadMimeDocument.DownloadMime.Factory.newInstance(); DownloadMimeType request = downloadMimeDocument.addNewRequest(); request.setTarget(target); XRoadMessage<DownloadMimeResponse> response = send(new XmlBeansXRoadMessage<DownloadMimeDocument.DownloadMime>(downloadMimeDocument), DOWNLOAD_MIME, V1, new Emtav5Callback(), null); return response; } @Override public UploadMimeResponse uploadMime(String target, String id, DataHandler fail) throws XRoadServiceConsumptionException { UploadMime uploadMimeDocument = UploadMimeDocument.UploadMime.Factory.newInstance(); UploadMimeType request = uploadMimeDocument.addNewRequest(); request.setTarget(target); Props props = request.addNewProps(); Prop prop = props.addNewProp(); prop.setKey(UPLOAD_ID); prop.setStringValue(id); XmlBeansXRoadMessage<UploadMimeDocument.UploadMime> XRoadMessage = new XmlBeansXRoadMessage<UploadMimeDocument.UploadMime>(uploadMimeDocument); List<XRoadAttachment> attachments = XRoadMessage.getAttachments(); String failCid = AttachmentUtil.getUniqueCid(); request.addNewFile().setHref("cid:" + failCid); attachments.add(new XRoadAttachment(failCid, fail)); XRoadMessage<UploadMimeResponse> response = send(XRoadMessage, UPLOAD_MIME, V1, new Emtav5Callback(), null); return response.getContent(); } private static class Emtav5Callback 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("ns5", "http://emtav5.x-road.ee/producer/"); env.addNamespaceDeclaration("xro", "http://x-road.ee/xsd/x-road.xsd"); Iterator elements = env.getBody().getChildElements(); while (elements.hasNext()) { SOAPElement element = (SOAPElement) elements.next(); if (element.getNamespaceURI().equalsIgnoreCase("http://emtav5.ee.x-rd.net/producer/")) { String localHeaderName = element.getLocalName(); QName qName = new QName("http://emtav5.x-road.ee/producer/", localHeaderName, "ns5"); element.setElementQName(qName); } } 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); } } } }