Files
Facilitor/APPL/API/api_mldsoap.asp
Jos Groot Lipman 01f97383d3 AARW#25379 Logging van de XML mogelijk maken
svn path=/Website/branches/v5.2.3/; revision=16524
2013-01-15 08:43:24 +00:00

449 lines
21 KiB
Plaintext

<%@ language = "JavaScript" %>
<% /*
$Revision$
$Id$
File: api_mld_soap.asp
Description: API voor mld-soap berichten
Interpreteert melding-bericht zodanig dat een melding wordt
aangemaakt.
Parameters: Een xml
Status:
Context:
Notes:
*/
DOCTYPE_Disable = 1;
THIS_FILE = "appl/api/api_mldsoap.asp";
%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/xml_converter.inc" -->
<!-- #include file="../Shared/save2db.inc" -->
<!-- #include file="../Shared/flexfiles.inc" -->
<!-- #include file="../Shared/upload.inc" -->
<!-- #include file="../api/api.inc" -->
<!-- #include file="../mld/mld.inc" -->
<%
// We sturen het antwoord in UTF-8.
Session.Codepage = 65001;
Response.Charset = 'utf-8';
// Zet de loglevel in de API op 1 om de xml te loggen naar de TEMP folder
function XML2TEMP(xml, postfix)
{
if (!API.apidata.loglevel) return;
var in_file = Server.MapPath("./temp") + "/" + customerId + "_" + APIname + "_" + postfix + "_";
var jsDate = new Date();
var s = String(jsDate.getFullYear()) + padout(jsDate.getMonth() + 1) + padout(jsDate.getDate())
+ padout(jsDate.getHours()) + padout(jsDate.getMinutes()) + padout(jsDate.getSeconds())
in_file = in_file + s + ".xml";
//Response.Write(in_file);Response.End;
var fs = Server.CreateObject("Scripting.FileSystemObject");
var ts = fs.CreateTextFile(in_file, true, -1); // -1 voor de Unicode
ts.WriteLine (xml); // Anders hier Invalid procedure call or argument
ts.Close();
}
// CreateFullPath moet hier weg bij overnemen naar trunk 531!
function CreateFullPath(sPath)
{
var oFS = Server.CreateObject("Scripting.FileSystemObject");
if (!oFS.FolderExists(sPath))
{
while (!oFS.FolderExists(sPath))
{
var sParent = sPath;
while (!oFS.FolderExists(sParent))
{
var sChild = sParent;
var sParent = oFS.GetParentFolderName(sChild);
}
oFolder = oFS.CreateFolder(sChild)
}
}
oFS = null;
}
var APIname = getQParam("API");
var APIKEY = getQParam("APIKEY");
var API = new API_func(APIname, APIKEY);
var tsql = "-"; // Voor tijdelijke statement(s)
var sql = "-"; // De uiteindelijke insert/update-sql
var resultcode = -1; /* Zolang deze -1 is, is het nog goed. Uiteindelijk eindigt het met 0 (als goed). */
var resulttekst = "";
var xmlReq = Server.CreateObject("MSXML2.DOMDocument.4.0");
xmlReq.load(Request);
XML2TEMP(xmlReq.xml, "IN");
var xmlResp = new ActiveXObject("MSXML2.DOMDocument.4.0");
xmlResp.appendChild(xmlResp.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"utf-8\""))
// The response.
var FCLTElement = xmlResp.createElement("facilitor");
// The response header.
var now = new Date();
var nowtxt = now.getFullYear()+'-'+padout(now.getMonth()+1) +'-'+padout(now.getDate()) +' '
+padout(now.getHours()) +':'+padout(now.getMinutes())+':'+padout(now.getSeconds());
var FCLTHeader = xmlResp.createElement("header");
var headerinfo = {
// file: String(Request.ServerVariables("SCRIPT_NAME")).toLowerCase(),
datum: nowtxt,
naam: user.naam(),
custId: customerId,
language: user.lang()
}
for (param in headerinfo)
{
var FCLTdata = xmlResp.createElement(param);
FCLTdata.appendChild(xmlResp.createTextNode(headerinfo[param]));
FCLTHeader.appendChild(FCLTdata);
}
FCLTElement.appendChild(FCLTHeader);
// Luie oplossing: Oracle kan dit simpeler dan JavaScript.
function XMLtoJsDate(xmlDate)
{
var sql = "SELECT TO_DATE("+safe.quoted_sql(xmlDate)+", 'YYYY-MM-DD HH24:MI:SS') FROM DUAL";
var oRs = Oracle.Execute(sql);
var dt = new Date(oRs(0).Value);
oRs.Close();
return dt;
}
function XMLval(xml, tag)
{
if (!xml)
return null;
var xx = xml.getElementsByTagName(tag);
if (!xx || !xx.length)
return null;
xx = xx[0].childNodes
if (!xx || !xx.length)
return null;
return xx[0].nodeValue;
}
// Hier zou het echte werk moeten gebeuren nav. xmlReq
// en FCLTElement moeten we uitbreiden met antwoorden.
var detected ="?";
// xmlReq.setProperty("SelectionLanguage", "XPath"); // Weet niet of noodzakelijk
// Dit is de meldingenloop (mochten er ooit nog anderen gaan volgen).
var meldingen = xmlReq.getElementsByTagName("melding");
for (i=0; i < meldingen.length; i++)
{
// Lees per node de (optionele) tags en waarden.
var fields = []; // Bij te werken velden.
var ext_id = meldingen[i].getAttribute("key");
var meldaction = meldingen[i].getAttribute("type").toLowerCase();
var melddatum = XMLval(meldingen[i], "datum");
//var melderemail = XMLval(meldingen[i], "melder"); // Unsupported yet
var stdmld_key = parseInt(XMLval(meldingen[i], "stdmelding"), 10); // Numeriek
var stdmld_sla = -1; // Normale uitvoertijd (prio door melder nog unsupported)
//var meldprio = XMLval(meldingen[i], "prioriteit"); // Unsupported yet
//var meldobj_id = XMLval(meldingen[i], "object"); // Unsupported yet
var meldloc = XMLval(meldingen[i], "locatiecode");
var meldgeb = XMLval(meldingen[i], "gebouwcode");
var meldver = XMLval(meldingen[i], "verdiepingcode");
var meldrnr = XMLval(meldingen[i], "ruimtecode");
var locatie_key = -1; // Bepaald op basis van meldloc
var plaats_key = -1; // Bepaald op basis van meldgeb/meldver/meldrnr
var meld_oms = XMLval(meldingen[i], "omschrijving");
//var meldkenmerken = (meldingen[i].getElementsByTagName("kenmerk"))[0].childNodes[0].nodeValue; // Unsupported yet
var mldkenmerken = meldingen[i].getElementsByTagName("kenmerk");
var mld_key = -1; // Bepaald na insert
user.checkAutorisation("WEB_MLDUSE"); // Dit is nog ongeacht de melding
if (ext_id == null) {
resultcode = 1;
resulttekst = "Undefined external ID (key)";
} else if (meldaction != 'insert') {
resultcode = 2;
resulttekst = "Undefined operation (type)";
} else {
tsql = "SELECT mld_stdmelding_uitvoertijd "
+ " FROM mld_stdmelding"
+ " WHERE mld_stdmelding_key="+ stdmld_key
+ " AND mld_stdmelding_verwijder IS NULL";
var oRs = Oracle.Execute(tsql);
if (oRs.eof) {
resultcode = 3;
resulttekst = "Undefined stdmelding";
} else {
// Hier heb ik een geldige mld_stdmelding_key.
stdmld_sla = oRs("mld_stdmelding_uitvoertijd").value;
fields.push({ dbs: "mld_stdmelding_key", typ: "key", val: stdmld_key });
fields.push({ dbs: "mld_melding_uitvoertijd", typ: "number", val: stdmld_sla });
if (melddatum != null) {
try {
var meldaanmaakdate = XMLtoJsDate(melddatum);
fields.push({ dbs: "mld_melding_datum", typ: "datetime", val: meldaanmaakdate });
}
catch (e) {
__DoLog("Formaat ontvangen XML-datum incorrect: "+ melddatum, "#00FF00");
// Verkeerde datum-formaat, volgens spec. dan now gebruiken!
fields.push({ dbs: "mld_melding_datum", typ: "datetime", val: now });
}
} else {
fields.push({ dbs: "mld_melding_datum", typ: "datetime", val: now });
}
tsql = "SELECT alg_locatie_key "
+ " FROM alg_v_aanweziglocatie"
+ " WHERE alg_locatie_code="+ safe.quoted_sql(meldloc);
var oRs = Oracle.Execute(tsql);
if (!oRs.eof) {
locatie_key = oRs("alg_locatie_key").value;
fields.push({ dbs: "mld_alg_locatie_key", typ: "key", val: locatie_key });
tsql = "SELECT alg_gebouw_key "
+ " FROM alg_v_aanweziggebouw"
+ " WHERE alg_locatie_key ="+ locatie_key
+ " AND alg_gebouw_code="+ safe.quoted_sql(meldgeb);
var oRs = Oracle.Execute(tsql);
if (!oRs.eof) {
plaats_key = oRs("alg_gebouw_key").value;
tsql = "SELECT alg_verdieping_key "
+ " FROM alg_v_aanwezigverdieping"
+ " WHERE alg_gebouw_key ="+ plaats_key
+ " AND alg_verdieping_code="+ safe.quoted_sql(meldver);
var oRs = Oracle.Execute(tsql);
if (!oRs.eof) {
plaats_key = oRs("alg_verdieping_key").value;
tsql = "SELECT alg_ruimte_key "
+ " FROM alg_v_aanwezigruimte"
+ " WHERE alg_verdieping_key ="+ plaats_key
+ " AND alg_ruimte_nr="+ safe.quoted_sql(meldrnr);
var oRs = Oracle.Execute(tsql);
if (!oRs.eof) {
plaats_key = oRs("alg_ruimte_key").value;
}
}
}
if (plaats_key != -1) {
fields.push({ dbs: "mld_alg_onroerendgoed_keys", typ: "key", val: plaats_key });
}
}
fields = fields.concat(
[ { dbs: "mld_melding_key", typ: "key", seq: "mld_s_mld_melding_key" },
{ dbs: "mld_melding_module", typ: "varchar", val: "MLD" },
{ dbs: "mld_meldbron_key", typ: "key", val: 6 }, // system
{ dbs: "mld_melding_omschrijving", typ: "varchar", val: meld_oms, len: 4000 },
{ dbs: "prs_kostenplaats_key", typ: "key", val: user.afdeling().prs_kostenplaats_key() },
{ dbs: "prs_perslid_key", typ: "key", val: user_key },
{ dbs: "prs_perslid_key_voor", typ: "key", val: user_key },
{ dbs: "mld_melding_spoed", typ: "key", val: 3 }, // default (frontend) = 3
{ dbs: "mld_melding_externnr", typ: "varchar", val: ext_id, len: 30 }
]);
// We weten wat te inserten, nu nog uitvoeren; rechten voldoende afgedekt via MLDUSE-check hierboven?
if (resultcode == -1) { // nog steeds geen fouten
var mldIns = buildInsert("mld_melding", fields);
mld_key = mldIns.sequences["mld_melding_key"];
sql = mldIns.sql;
oRs = Oracle.Execute(sql);
// Zetten van de status op ingevoerd en afhandelen van de tracking.
mld.setmeldingstatus(mld_key, 2); // Zorgt ook voor tracking & daarmee notificatie.
// De kenmerken.
for (j=0; j < mldkenmerken.length; j++)
{
var kenmerk_naam = mldkenmerken[j].getAttribute("naam");
if (mldkenmerken[j].childNodes.length > 0)
var kenmerk_waarde = mldkenmerken[j].childNodes[0].nodeValue;
else
var kenmerk_waarde = "";
//Response.Write(kenmerk_naam);
//Response.Write(kenmerk_waarde);
// Zoek het kenmerk op naam terug
ksql = "SELECT k.mld_kenmerk_key, sk.mld_srtkenmerk_kenmerktype, sk.mld_srtkenmerk_lengte "
+ " FROM mld_kenmerk k"
+ " , mld_srtkenmerk sk"
+ " , mld_stdmelding s"
+ " , mld_discipline d"
+ " WHERE s.mld_ins_discipline_key = d.ins_discipline_key"
+ " AND k.mld_srtkenmerk_key = sk.mld_srtkenmerk_key "
+ " AND sk.mld_srtkenmerk_upper = " + safe.quoted_sql_upper(kenmerk_naam)
+ " AND s.mld_ins_discipline_key = d.ins_discipline_key"
+ " AND s.mld_stdmelding_key = " + stdmld_key
+ " AND ((k.mld_stdmelding_key = s.mld_stdmelding_key AND k.mld_kenmerk_niveau = 'S')"
+ " OR (k.mld_stdmelding_key = s.mld_ins_discipline_key AND k.mld_kenmerk_niveau = 'D')"
+ " OR (k.mld_stdmelding_key = d.ins_srtdiscipline_key AND k.mld_kenmerk_niveau = 'T'))";
var oRs = Oracle.Execute(ksql);
if (!oRs.eof)
{
var kenmerk_key = oRs("mld_kenmerk_key").value;
var kenmerk_type = oRs("mld_srtkenmerk_kenmerktype").value;
var kenmerk_lengte = oRs("mld_srtkenmerk_lengte").value;
ksql = "SELECT km.mld_kenmerkmelding_key "
+ " FROM mld_kenmerkmelding km "
+ " WHERE km.mld_melding_key = " + mld_key
+ " AND km.mld_kenmerk_key = " + kenmerk_key;
var oRs = Oracle.Execute(ksql);
switch (kenmerk_type)
{
case 'C':
{
// we ondersteunen alleen nog maar karakter velden.
if (!oRs.eof)
{
var kenmerkmelding_key = oRs("mld_kenmerkmelding_key").value;
ksql = "UPDATE mld_kenmerkmelding"
+ " SET mld_kenmerkmelding_waarde = " + safe.quoted_sql(kenmerk_waarde)
+ " WHERE mld_kenmerkmelding_key = " + kenmerkmelding_key;
}
else
{
ksql = "INSERT INTO mld_kenmerkmelding (mld_kenmerk_key, mld_melding_key, mld_kenmerkopdr_waarde) "
+ "VALUES (" + kenmerk_key + ", " + mld_key + ", " + safe.quoted_sql(kenmerk_waarde) + ")";
}
Oracle.Execute(ksql);
break;
}
case "M": // Folder met bijlagen
{
//Response.Write(kenmerk_naam);
var bijlagen = mldkenmerken[j].getElementsByTagName("bijlage");
var bi;
for (bi = 0; bi < bijlagen.length; bi++)
{
var Attachment = XMLval(bijlagen[bi], "attachment");
var Name = XMLval(bijlagen[bi], "name");
var Size = XMLval(bijlagen[bi], "size");
//Response.Write("Name: " + Name + " size: " + Size);
if (Attachment && Name && Size)
{
var SafeName = safe.filename(Name);
var params = flexProps("MLD", mld_key, String(kenmerk_key), "M");
if (params.extFilter)
{
var regFilter = params.extFilter;
regFilter = regFilter.replace(/( |,|;)/g,"|"); // Altijd | karakter
regFilter = ".*\\." + "(" + regFilter + ")$"; // er moet een punt voor en extensie is aan het einde
}
else
regFilter = ".*";
if (!new RegExp(S("flexAllowedExt"), "ig").test(SafeName) ||
!new RegExp(regFilter, "ig").test(SafeName))
{
__DoLog("Unsafe SOAP file '{0}' ignored.".format(SafeName), "#FFFF00");
}
else
{
__Log("Start saving: " + params.AttachPath + SafeName);
CreateFullPath(params.AttachPath);
VB_SaveFile(params.AttachPath + SafeName, Attachment)
__Log("Done saving: " + params.AttachPath + SafeName);
}
}
}
}
}
oRs.Close();
}
}
resultcode = 0; // Ik heb gedaan wat ik moest en mocht doen voor deze melding.
// En nog maar even de aanname dat een extern systeem niet aan workflows/ktos doet?
}
} // end geldige stdmld_key
} // end geldige ext_id
var binfo = {
returncode: resultcode,
returntekst: resulttekst,
// executed:sql, // debug
datum: nowtxt,
meldingnr: mld_key
}
var FCLTBody = xmlResp.createElement("melding"); // type=response
FCLTBody.setAttribute('key', ext_id); // Let op: key van de aanroeper!
FCLTBody.setAttribute('type', 'response');
for (param in binfo)
{
var FCLTdata = xmlResp.createElement(param);
FCLTdata.appendChild(xmlResp.createTextNode(binfo[param]));
FCLTBody.appendChild(FCLTdata);
}
FCLTElement.appendChild(FCLTBody);
} // end for
// Alle melding-nodes zijn behandeld.
xmlResp.appendChild(FCLTElement);
Response.ContentType = "text/xml";
Response.Write(xmlResp.xml)
%>
<script language="VBScript" runat="Server">
' JavaScript is erg slecht in binary data, dat doen we dan maar met VBScript.
Function HexDecode(ByVal vCode)
Dim oXML, oNode
Set oXML = CreateObject("MSXML2.DOMDocument.4.0")
Set oNode = oXML.CreateElement("hex")
oNode.dataType = "bin.hex" ' Zeer snelle oplossing
oNode.text = vCode
Set HexDecode = Stream_BinaryToStream(oNode.nodeTypedValue)
Set oNode = Nothing
Set oXML = Nothing
End Function
'Stream_BinaryToStream Function
'2003 Antonin Foller, http://www.motobit.com
'Binary - VT_UI1 | VT_ARRAY data To convert To a string
Function Stream_BinaryToStream(Binary)
Const adTypeText = 2
Const adTypeBinary = 1
'Create Stream object
Dim BinaryStream 'As New Stream
Set BinaryStream = CreateObject("ADODB.Stream")
'Specify stream type - we want To save binary data.
BinaryStream.Type = adTypeBinary
'Open the stream And write binary data To the object
BinaryStream.Open
BinaryStream.Write Binary
'Change stream type To text/string
BinaryStream.Position = 0
BinaryStream.Type = adTypeText
'Specify charset For the output text (unicode) data.
BinaryStream.CharSet = "us-ascii"
'Open the stream And get text/string data from the object
Set Stream_BinaryToStream = BinaryStream
End Function
Function VB_SaveFile(safefullname, attachment)
Set BinaryStream = HexDecode(attachment)
'' on error resume next
'Save binary data To disk
BinaryStream.SaveToFile safefullname, 2 ' adSaveCreateOverWrite
myErr = Err.Description
'' on error goto 0
End Function
</script>