package com.nortal.jroad.client.tor; 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.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.exception.XRoadServiceConsumptionException; import com.nortal.jroad.client.service.XRoadDatabaseService; import com.nortal.jroad.client.service.callback.CustomCallback; import com.nortal.jroad.client.tor.types.ee.x_road.emtav5.producer.DownloadMimeDocument; import com.nortal.jroad.client.tor.types.ee.x_road.emtav5.producer.DownloadMimeDocument.DownloadMime; import com.nortal.jroad.client.tor.types.ee.x_road.emtav5.producer.DownloadMimeResponseDocument.DownloadMimeResponse; import com.nortal.jroad.client.tor.types.ee.x_road.emtav5.producer.DownloadMimeType; import com.nortal.jroad.client.tor.types.ee.x_road.emtav5.producer.TORIKDocument; import com.nortal.jroad.client.tor.types.ee.x_road.emtav5.producer.TORIKDocument.TORIK; import com.nortal.jroad.client.tor.types.ee.x_road.emtav5.producer.TORIKResponseDocument; import com.nortal.jroad.client.tor.types.ee.x_road.emtav5.producer.TORIKResponseDocument.TORIKResponse; import com.nortal.jroad.client.tor.types.ee.x_road.emtav5.producer.TorikRequestType; import com.nortal.jroad.client.tor.types.ee.x_road.emtav5.producer.TorikRequestType.ParinguLiik; import com.nortal.jroad.client.tor.types.ee.x_road.emtav5.producer.UploadMimeDocument; import com.nortal.jroad.client.tor.types.ee.x_road.emtav5.producer.UploadMimeDocument.UploadMime; import com.nortal.jroad.client.tor.types.ee.x_road.emtav5.producer.UploadMimeResponseDocument.UploadMimeResponse; import com.nortal.jroad.client.tor.types.ee.x_road.emtav5.producer.UploadMimeType; import com.nortal.jroad.client.tor.types.ee.x_road.emtav5.producer.UploadMimeType.Props; import com.nortal.jroad.client.tor.types.ee.x_road.emtav5.producer.UploadMimeType.Props.Prop; import com.nortal.jroad.model.XRoadAttachment; import com.nortal.jroad.model.XRoadMessage; import com.nortal.jroad.model.XmlBeansXRoadMessage; import com.nortal.jroad.util.AttachmentUtil; /** * <code>TOR</code> database X-tee service implementation<br> * * @author Eneli Reimets */ @Service("torXTeeServiceImpl") public class TorXTeeServiceImpl extends XRoadDatabaseService implements TorXTeeService { private static final String UPLOAD_ID = "UPLOAD_ID"; private static final String METHOD_TORIK = "TORIK"; private static final String METHOD_UPLOAD_MIME = "uploadMime"; private static final String METHOD_DOWNLOAD_MIME = "downloadMime"; private static final String V1 = "v1"; @Override public void init() { super.init(); setDatabase("emtav5"); } @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), METHOD_DOWNLOAD_MIME, V1, new TorCallback(), null); return response; } @Override public UploadMimeResponse uploadMime(String target, String operation, String id, DataHandler fail) throws XRoadServiceConsumptionException { UploadMime uploadMimeDocument = UploadMimeDocument.UploadMime.Factory.newInstance(); UploadMimeType request = uploadMimeDocument.addNewRequest(); request.setTarget(target); request.setOperation(operation); 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, METHOD_UPLOAD_MIME, V1, new TorCallback(), null); return response.getContent(); } @Override public TORIKResponse findTorik(String paringuLiik, Date tootAlgusKp, Date tootLoppKp, Date muutAlgKp, Date muutLoppKp, String isikukood) throws XRoadServiceConsumptionException { TorikRequestType torik = getTorikRequest(paringuLiik, tootAlgusKp, tootLoppKp, muutAlgKp, muutLoppKp, isikukood).getTORIK().getRequest(); XRoadMessage<TORIKResponseDocument.TORIKResponse> vastus = send(new XmlBeansXRoadMessage<TorikRequestType>(torik), METHOD_TORIK, V1, new TorCallback(), null); return vastus.getContent(); } @Override public TORIKDocument getTorikRequest(String paringuLiik, Date tootAlgusKp, Date tootLoppKp, Date muutAlgKp, Date muutLoppKp, String isikukood) { TORIKDocument torikDocument = TORIKDocument.Factory.newInstance(); TORIK torik = torikDocument.addNewTORIK(); TorikRequestType request = torik.addNewRequest(); request.setParinguLiik(ParinguLiik.Enum.forString(paringuLiik)); request.setTootAlgus(getCalendar(tootAlgusKp)); request.setTootLopp(getCalendar(tootLoppKp)); if (ParinguLiik.Enum.forString(paringuLiik).equals(ParinguLiik.PM)) { request.setMuutAlg(getCalendar(muutAlgKp)); request.setMuutLopp(getCalendar(muutLoppKp)); } request.setIsikukoodid(isikukood); return torikDocument; } private Calendar getCalendar(Date kuup) { if (kuup == null) { return null; } Calendar cal = Calendar.getInstance(); cal.setTime(kuup); return cal; } private static class TorCallback 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); } } } }