package com.nortal.jroad.client.kir;
import com.nortal.jroad.client.exception.XRoadServiceConsumptionException;
import com.nortal.jroad.client.kir.types.ee.x_road.kir.producer.AnnaArvelolekuAndmedDocument.AnnaArvelolekuAndmed;
import com.nortal.jroad.client.kir.types.ee.x_road.kir.producer.AnnaArvelolekuAndmedRequest;
import com.nortal.jroad.client.kir.types.ee.x_road.kir.producer.AnnaArvelolekuAndmedResponseDocument.AnnaArvelolekuAndmedResponse;
import com.nortal.jroad.client.kir.types.ee.x_road.kir.producer.IsikuStaatus;
import com.nortal.jroad.client.kir.types.ee.x_road.kir.producer.LeiaMuudetudAndmetegaKinnipeetavadDocument.LeiaMuudetudAndmetegaKinnipeetavad;
import com.nortal.jroad.client.kir.types.ee.x_road.kir.producer.LeiaMuudetudAndmetegaKinnipeetavadRequest;
import com.nortal.jroad.client.kir.types.ee.x_road.kir.producer.LeiaMuudetudAndmetegaKinnipeetavadResponseDocument.LeiaMuudetudAndmetegaKinnipeetavadResponse;
import com.nortal.jroad.client.service.callback.CustomCallback;
import com.nortal.jroad.client.service.XRoadDatabaseService;
import com.nortal.jroad.enums.XRoadProtocolVersion;
import com.nortal.jroad.model.XRoadMessage;
import com.nortal.jroad.model.XmlBeansXRoadMessage;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.ws.WebServiceMessage;
import org.springframework.ws.soap.saaj.SaajSoapMessage;
import org.springframework.xml.transform.StringResult;
import org.springframework.xml.transform.StringSource;
import javax.xml.namespace.QName;
import javax.xml.soap.*;
import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.Set;
/**
* @author Marti Laast
*/
@Service("kirXTeeService")
public class KirXTeeServiceImpl extends XRoadDatabaseService implements KirXTeeService {
public AnnaArvelolekuAndmedResponse annaArvelolekuAndmedV1(Date start, Date end, Set<IsikuStaatus.Enum> requestTypes, Set<String> idCodes) throws XRoadServiceConsumptionException {
AnnaArvelolekuAndmed requestWrapper = AnnaArvelolekuAndmed.Factory.newInstance();
AnnaArvelolekuAndmedRequest request = requestWrapper.addNewRequest();
request.setPerioodiAlgusKP(toCalendar(start));
request.setPerioodiLoppKP(toCalendar(end));
request.setParinguLiikArray(requestTypes.toArray(new IsikuStaatus.Enum[requestTypes.size()]));
request.setIsikukoodArray(idCodes.toArray(new String[idCodes.size()]));
XmlBeansXRoadMessage<AnnaArvelolekuAndmed> xRoadMsg =
new XmlBeansXRoadMessage<AnnaArvelolekuAndmed>(requestWrapper);
XRoadMessage<AnnaArvelolekuAndmedResponse> response =
send(xRoadMsg, "AnnaArvelolekuAndmed", "v1", new KirCallback(start, end), null);
return response.getContent();
}
public LeiaMuudetudAndmetegaKinnipeetavadResponse leiaMuudetudAndmetegaKinnipeetavadV1(Date start, Date end) throws XRoadServiceConsumptionException {
LeiaMuudetudAndmetegaKinnipeetavad requestWrapper = LeiaMuudetudAndmetegaKinnipeetavad.Factory.newInstance();
LeiaMuudetudAndmetegaKinnipeetavadRequest request = requestWrapper.addNewRequest();
request.setPerioodiAlgusKP(toCalendar(start));
request.setPerioodiLoppKP(toCalendar(end));
XmlBeansXRoadMessage<LeiaMuudetudAndmetegaKinnipeetavadRequest> xRoadMsg =
new XmlBeansXRoadMessage<LeiaMuudetudAndmetegaKinnipeetavadRequest>(request);
XRoadMessage<LeiaMuudetudAndmetegaKinnipeetavadResponse> response =
send(xRoadMsg, "LeiaMuudetudAndmetegaKinnipeetavad", "v1", new KirCallback(), null);
return response.getContent();
}
private Calendar toCalendar(Date date) {
if (date == null) {
return null;
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar;
}
private static class KirCallback extends CustomCallback {
private static final String ns = "xro";
private static final String nsV30Uri = XRoadProtocolVersion.V3_0.getNamespaceUri();
private static final String nsV31Uri = XRoadProtocolVersion.V3_1.getNamespaceUri();
private final Date startDate;
private final Date endDate;
private SimpleDateFormat dateWithTimezone = new SimpleDateFormat("yyyy-MM-ddXXX");
private SimpleDateFormat dateWithoutTimezone = new SimpleDateFormat("yyyy-MM-dd");
private KirCallback() {
this(null, null);
}
private KirCallback(Date startDate, Date endDate) {
this.startDate = startDate;
this.endDate = endDate;
}
public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException {
callback.doWithMessage(message);
try {
SaajSoapMessage saajMsg = (SaajSoapMessage) message;
SOAPMessage soapMsg = saajMsg.getSaajMessage();
SOAPEnvelope env = soapMsg.getSOAPPart().getEnvelope();
env.addNamespaceDeclaration(ns, nsV31Uri);
Iterator headers = env.getHeader().getChildElements();
while (headers.hasNext()) {
SOAPElement header = (SOAPElement) headers.next();
if (header.getNamespaceURI().equalsIgnoreCase(nsV30Uri)) {
QName qName = new QName(nsV31Uri, header.getLocalName(), ns);
header.setElementQName(qName);
}
}
formatDate(saajMsg, startDate);
formatDate(saajMsg, endDate);
} catch (SOAPException e) {
throw new RuntimeException(e);
}
}
private void formatDate(SaajSoapMessage saajMsg, Date date) throws TransformerException {
if (date == null) {
return;
}
SOAPPart soapPart = saajMsg.getSaajMessage().getSOAPPart();
Source source = new DOMSource(soapPart);
StringResult stringResult = new StringResult();
TransformerFactory.newInstance().newTransformer().transform(source, stringResult);
try {
String from = dateWithTimezone.format(date);
String to = dateWithoutTimezone.format(date);
String content = StringUtils.replace(stringResult.toString(), from, to);
soapPart.setContent(new StringSource(content));
} catch (Exception e) {
throw new TransformerException(e);
}
}
}
}