package com.nortal.jroad.client.tarn;
import java.io.IOException;
import java.util.List;
import javax.activation.DataHandler;
import javax.annotation.Resource;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
import javax.xml.transform.TransformerException;
import org.apache.xmlbeans.XmlBoolean;
import org.apache.xmlbeans.XmlCursor;
import org.apache.xmlbeans.XmlDateTime;
import org.apache.xmlbeans.XmlDecimal;
import org.apache.xmlbeans.XmlLong;
import org.apache.xmlbeans.XmlObject;
import org.apache.xmlbeans.XmlString;
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.tarn.database.TarnXRoadDatabase;
import com.nortal.jroad.client.tarn.types.ee.riik.xtee.etoimik.producers.producer.etoimik.Aadress;
import com.nortal.jroad.client.tarn.types.ee.riik.xtee.etoimik.producers.producer.etoimik.Ametnik;
import com.nortal.jroad.client.tarn.types.ee.riik.xtee.etoimik.producers.producer.etoimik.Fail;
import com.nortal.jroad.client.tarn.types.ee.riik.xtee.etoimik.producers.producer.etoimik.FyysilineIsik;
import com.nortal.jroad.client.tarn.types.ee.riik.xtee.etoimik.producers.producer.etoimik.Isik;
import com.nortal.jroad.client.tarn.types.ee.riik.xtee.etoimik.producers.producer.etoimik.Kohustis;
import com.nortal.jroad.client.tarn.types.ee.riik.xtee.etoimik.producers.producer.etoimik.Kontakt;
import com.nortal.jroad.client.tarn.types.ee.riik.xtee.etoimik.producers.producer.etoimik.MakseRekvisiidid;
import com.nortal.jroad.client.tarn.types.ee.riik.xtee.etoimik.producers.producer.etoimik.Menetlus;
import com.nortal.jroad.client.tarn.types.ee.riik.xtee.etoimik.producers.producer.etoimik.NoudeOsa;
import com.nortal.jroad.client.tarn.types.ee.riik.xtee.etoimik.producers.producer.etoimik.Noue;
import com.nortal.jroad.client.tarn.types.ee.riik.xtee.etoimik.producers.producer.etoimik.Olek;
import com.nortal.jroad.client.tarn.types.ee.riik.xtee.etoimik.producers.producer.etoimik.OsaMakse;
import com.nortal.jroad.client.tarn.types.ee.riik.xtee.etoimik.producers.producer.etoimik.OsaNoue;
import com.nortal.jroad.client.tarn.types.ee.riik.xtee.etoimik.producers.producer.etoimik.Osaline;
import com.nortal.jroad.client.tarn.types.ee.riik.xtee.etoimik.producers.producer.etoimik.SeaduseSate;
import com.nortal.jroad.client.tarn.types.ee.riik.xtee.etoimik.producers.producer.etoimik.TarnToiming;
import com.nortal.jroad.client.tarn.types.ee.riik.xtee.etoimik.producers.producer.etoimik.Toiming;
import com.nortal.jroad.client.tarn.types.ee.riik.xtee.etoimik.producers.producer.etoimik.ToiminguOsaline;
import com.nortal.jroad.client.tarn.types.ee.riik.xtee.etoimik.producers.producer.etoimik.Isik.Kontaktid;
import com.nortal.jroad.client.tarn.types.ee.riik.xtee.etoimik.producers.producer.etoimik.Osaline.Esindajad;
import com.nortal.jroad.client.tarn.types.ee.riik.xtee.etoimik.producers.producer.etoimik.Toiming.Alus;
import com.nortal.jroad.client.tarn.types.ee.riik.xtee.etoimik.producers.producer.etoimik.Toiming.SeotudToimingud;
import com.nortal.jroad.client.tarn.types.ee.riik.xtee.etoimik.producers.producer.etoimik.Toiming.StaatusedKL;
import com.nortal.jroad.client.tarn.types.ee.riik.xtee.etoimik.producers.producer.etoimik.Toiming.ToiminguMenetlejad;
import com.nortal.jroad.client.tarn.types.ee.riik.xtee.etoimik.producers.producer.etoimik.Toiming.Toiminguosalised;
import com.nortal.jroad.client.tarn.types.ee.riik.xtee.etoimik.producers.producer.etoimik.ToiminguOsaline.OsaMaksed;
import com.nortal.jroad.client.tarn.types.ee.riik.xtee.tarn.producers.producer.tarn.TaitemenetluseMuutmineTaSisend;
import com.nortal.jroad.client.tarn.types.ee.riik.xtee.tarn.producers.producer.tarn.TaitemenetluseMuutmineTaVastus;
import com.nortal.jroad.client.tarn.types.ee.riik.xtee.tarn.producers.producer.tarn.TaitmisavalduseEsitamineParing;
import com.nortal.jroad.client.tarn.types.ee.riik.xtee.tarn.producers.producer.tarn.TaitmisavalduseEsitamineVastus;
import com.nortal.jroad.client.tarn.types.ee.riik.xtee.tarn.producers.producer.tarn.ToiminguTeavitus;
import com.nortal.jroad.client.tarn.types.org.xmlsoap.schemas.soap.encoding.Base64Binary;
import com.nortal.jroad.client.util.XmlBeansUtil;
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>TARN</code> X-tee service<br>
*
* @author Romet Piho
*/
@Service("tarnXTeeService")
public class TarnXTeeServiceImpl extends XRoadDatabaseService implements TarnXTeeService {
@Resource
private TarnXRoadDatabase tarnXRoadDatabase;
public TaitemenetluseMuutmineTaVastus taitemenetluseMuutmine(
TaitemenetluseMuutmineTaSisend input)
throws XRoadServiceConsumptionException {
return tarnXRoadDatabase.taitemenetluseMuutmineTaV1(input);
}
public TaitmisavalduseEsitamineVastus taitmisavalduseEsitamine(
TaitmisavalduseEsitamineParing input, DataHandler toimingudFail,
DataHandler seotudToimingudFail) throws XRoadServiceConsumptionException {
XmlCursor cursor = input.newCursor();
while (cursor.hasNextToken()) {
cursor.toNextToken();
XmlObject object = cursor.getObject();
boolean isStart = cursor.isStart();
if (isStart && object instanceof XmlString) {
insertTypeAttribute(cursor, "xsd:string");
}
else if (isStart && object instanceof XmlLong) {
insertTypeAttribute(cursor, "xsd:long");
}
else if (isStart && object instanceof XmlDateTime) {
insertTypeAttribute(cursor, "xsd:dateTime");
}
else if (isStart && object instanceof XmlBoolean) {
insertTypeAttribute(cursor, "xsd:boolean");
}
else if (isStart && object instanceof XmlDecimal) {
insertTypeAttribute(cursor, "xsd:decimal");
}
else if (isStart && object instanceof Aadress) {
insertTypeAttribute(cursor, "eto:Aadress");
cursor.toPrevToken();
}
else if (isStart && object instanceof Fail) {
insertTypeAttribute(cursor, "eto:Fail");
cursor.toPrevToken();
}
else if (isStart && object instanceof FyysilineIsik) {
insertTypeAttribute(cursor, "eto:FyysilineIsik");
}
else if (isStart && object instanceof Ametnik) {
insertTypeAttribute(cursor, "eto:Ametnik");
cursor.toPrevToken();
}
else if (isStart && object instanceof Isik) {
insertTypeAttribute(cursor, "eto:JuriidilineIsik");
cursor.toPrevToken();
}
else if (isStart && object instanceof Kontaktid) {
insertArrayTypeAttribute(cursor, "eto:Kontakt[]");
insertTypeAttribute(cursor, "eto:Kontakt");
cursor.toPrevToken();
}
else if (isStart && object instanceof Kontakt) {
insertTypeAttribute(cursor, "eto:Kontakt");
cursor.toPrevToken();
}
else if (isStart && object instanceof MakseRekvisiidid) {
cursor.toPrevToken();
insertArrayTypeAttribute(cursor, "eto:MakseRekvisiidid[]");
insertTypeAttribute(cursor, "eto:MakseRekvisiidid");
cursor.toPrevToken();
}
else if (isStart && object instanceof Menetlus) {
insertTypeAttribute(cursor, "eto:Menetlus");
cursor.toPrevToken();
}
else if (isStart && object instanceof NoudeOsa) {
insertTypeAttribute(cursor, "eto:NoudeOsa");
cursor.toPrevToken();
}
else if (isStart && object instanceof Noue) {
insertTypeAttribute(cursor, "eto:Noue");
cursor.toPrevToken();
}
else if (isStart && object instanceof Olek) {
insertTypeAttribute(cursor, "eto:Olek");
}
else if (isStart && object instanceof OsaMakse) {
insertTypeAttribute(cursor, "eto:OsaMakse");
}
else if (isStart && object instanceof OsaNoue) {
insertTypeAttribute(cursor, "eto:OsaNoue");
}
else if (isStart && object instanceof Esindajad) {
insertArrayTypeAttribute(cursor, "eto:ToiminguOsaline[]");
insertTypeAttribute(cursor, "eto:ToiminguOsaline");
cursor.toPrevToken();
}
else if (isStart && object instanceof SeaduseSate) {
insertTypeAttribute(cursor, "eto:SeaduseSate");
}
else if (isStart && object instanceof TarnToiming) {
insertTypeAttribute(cursor, "eto:TarnToiming");
}
else if (isStart && object instanceof Alus) {
insertArrayTypeAttribute(cursor, "eto:SeaduseSate[]");
insertTypeAttribute(cursor, "eto:SeaduseSate");
cursor.toPrevToken();
}
else if (isStart && object instanceof StaatusedKL) {
insertArrayTypeAttribute(cursor, "eto:Olek[]");
insertTypeAttribute(cursor, "eto:Olek");
cursor.toPrevToken();
}
else if (isStart && object instanceof ToiminguMenetlejad) {
insertArrayTypeAttribute(cursor, "eto:ToiminguOsaline[]");
insertTypeAttribute(cursor, "eto:ToiminguOsaline");
cursor.toPrevToken();
}
else if (isStart && object instanceof Toiminguosalised) {
insertArrayTypeAttribute(cursor, "eto:ToiminguOsaline[]");
insertTypeAttribute(cursor, "eto:ToiminguOsaline");
cursor.toPrevToken();
}
else if (isStart && object instanceof ToiminguOsaline) {
insertTypeAttribute(cursor, "eto:ToiminguOsaline");
cursor.toPrevToken();
}
else if (isStart && object instanceof OsaMaksed) {
insertArrayTypeAttribute(cursor, "eto:OsaMakse[]");
insertTypeAttribute(cursor, "eto:OsaMakse");
cursor.toPrevToken();
}
else if (isStart && object instanceof Osaline) {
insertTypeAttribute(cursor, "eto:Osaline");
}
else if (isStart && object instanceof Kohustis) {
insertTypeAttribute(cursor, "eto:Kohustis");
}
else if (isStart && object instanceof Base64Binary) {
insertTypeAttribute(cursor, "xsd:base64Binary");
}
else if (isStart && object instanceof ToiminguTeavitus) {
insertTypeAttribute(cursor, "eto:ToiminguTeavitus");
cursor.toPrevToken();
}
else if (isStart && object instanceof Toiming) {
insertTypeAttribute(cursor, "eto:Toiming");
cursor.toPrevToken();
}
else if (isStart && object instanceof SeotudToimingud) {
insertArrayTypeAttribute(cursor, "eto:Toiming[]");
insertTypeAttribute(cursor, "eto:Toiming");
cursor.toPrevToken();
}
}
cursor.dispose();
XmlBeansXRoadMessage<TaitmisavalduseEsitamineParing> XRoadMessage = new XmlBeansXRoadMessage<TaitmisavalduseEsitamineParing>(input);
List<XRoadAttachment> attachments = XRoadMessage.getAttachments();
String toimingudFailCid = AttachmentUtil.getUniqueCid();
input.getTeavitus().getToiming().getPohiFail().getSisu().setHref("cid:"+toimingudFailCid);
attachments.add(new XRoadAttachment(toimingudFailCid, toimingudFail));
String seotudToimingudFailCid = AttachmentUtil.getUniqueCid();
input.getTeavitus().getToiming().getSeotudToimingud().getItemArray(0).getPohiFail().getSisu().setHref("cid:"+seotudToimingudFailCid);
attachments.add(new XRoadAttachment(seotudToimingudFailCid, seotudToimingudFail));
XRoadMessage<TaitmisavalduseEsitamineVastus> response =
send(XRoadMessage,
"TaitmisavalduseEsitamine",
"v1",
new TarnCallback(),
null);
return response.getContent();
}
private void insertArrayTypeAttribute(XmlCursor cursor, String type) {
insertTypeAttribute(cursor, "SOAP-ENC:Array");
insertTypeAttribute(cursor,
"http://schemas.xmlsoap.org/soap/encoding/",
"arrayType",
"SOAP-ENC",
type);
}
private void insertTypeAttribute(XmlCursor cursor, String type) {
insertTypeAttribute(cursor, type, true);
}
private void insertTypeAttribute(XmlCursor cursor, String type, boolean toNext) {
if (toNext) {
cursor.toNextToken();
}
insertTypeAttribute(cursor, "http://www.w3.org/2001/XMLSchema-instance", "type", "xsi", type);
}
private void insertTypeAttribute(XmlCursor cursor, String uri, String localPart, String prefix, String type) {
cursor.insertAttributeWithValue(new QName(uri, localPart, prefix), type);
}
private static class TarnCallback extends CustomCallback {
public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException {
try {
SaajSoapMessage saajMessage = (SaajSoapMessage) message;
SOAPMessage soapmess = saajMessage.getSaajMessage();
SOAPEnvelope env = soapmess.getSOAPPart().getEnvelope();
env.addNamespaceDeclaration("eto", "http://producers.etoimik.xtee.riik.ee/producer/etoimik");
} catch (SOAPException e) {
throw new RuntimeException(e);
}
callback.doWithMessage(message);
}
}
}