"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var DataTable_1 = require("./DataTable"); var XmlEncode_1 = require("./XmlEncode"); var XMLWriter = require("xml-writer"); var et = require("elementtree"); /** Default constructor * @class DataTableXmlSerializer * @classdesc Saves and loads a {@link DataTable} object to and from an Xml file. */ var DataTableXmlSerializer = (function () { function DataTableXmlSerializer() { this.extension = 'xml'; } /** Serializes the specified {@link DataTable} object into a Buffer data. * @method DataTableXmlSerializer#serialize */ DataTableXmlSerializer.prototype.serialize = function (dataTable) { var returnValue; if (dataTable != null) { var xw = new XMLWriter(true); xw.startElement('DataTable'); if (dataTable.name) xw.writeAttribute("name", dataTable.name); for (var i = 0; i < dataTable.rows.length; i++) { xw.startElement('row'); var rowItem = dataTable.rows[i]; for (var propName in rowItem) { var propValue = rowItem[propName]; if (propValue != null) { var strValue = null, propType = null; if (typeof propValue == "object" && !(propValue instanceof Date) && propValue.type !== null && propValue.type !== undefined) { // this value must contain typeinfo propType = propValue.type; strValue = this.serializeValue(propValue.value); } else { strValue = this.serializeValue(propValue); } if (strValue !== null) { xw.startElement(XmlEncode_1.XmlEncode.encodeName(propName)); if (propType !== null && propType !== undefined) { xw.writeAttribute("type", propValue.type); } xw.text(strValue); xw.endElement(); } } } xw.endElement(); // row } xw.endElement(); // DataTable returnValue = xw.toString(); } return new Buffer(returnValue, 'utf8'); }; /** Deserializes the specified buffer data into a {@link DataTable} object * @method DataTableXmlSerializer#deserialize */ DataTableXmlSerializer.prototype.deserialize = function (xmlContent) { var dt = new DataTable_1.DataTable(); var etree = et.parse(xmlContent.toString('utf8')); var rootElement = etree.getroot(); var attrName = rootElement.attrib["name"]; if (attrName) dt.name = attrName; var rowElements = rootElement.getchildren(); for (var i = 0; i < rowElements.length; i++) { var rowElement = rowElements[i]; var rowItem = {}; var rowFieldElements = rowElement.getchildren(); for (var j = 0; j < rowFieldElements.length; j++) { var rowFieldElement = rowFieldElements[j]; var fieldName = XmlEncode_1.XmlEncode.decodeName(rowFieldElement.tag); var fieldValue = rowFieldElement.text; var fieldType = rowFieldElement.attrib["type"]; var parsedValue = this.parseXmlValue(fieldValue); if (fieldType) { parsedValue = { type: fieldType, value: parsedValue }; } rowItem[fieldName] = parsedValue; } dt.rows.push(rowItem); } return dt; }; DataTableXmlSerializer.prototype.serializeValue = function (value) { var result = null; if (value !== null && value !== undefined) { if (value instanceof Date) { result = JSON.stringify(value).replace(/\"/g, ""); } else { result = value.toString(); } } return result; }; DataTableXmlSerializer.prototype.parseXmlValue = function (strValue) { var result = strValue; var parsedValue = this.parseBooleans(strValue); if (parsedValue === null) { parsedValue = this.parseNumbers(strValue); } if (parsedValue === null) { parsedValue = this.parseDates(strValue); } if (parsedValue !== null) { result = parsedValue; } return result; }; DataTableXmlSerializer.prototype.parseNumbers = function (str) { var result = null; // http://stackoverflow.com/questions/18082/validate-decimal-numbers-in-javascript-isnumeric var isNumber = !Array.isArray(str) && (+str - parseFloat(str) + 1) >= 0; if (isNumber) { result = +str; } return result; }; ; DataTableXmlSerializer.prototype.parseBooleans = function (str) { var result = null; if (/^(?:true|false)$/i.test(str)) { result = str.toLowerCase() === 'true'; } return result; }; ; DataTableXmlSerializer.prototype.parseDates = function (str) { var result = null; var dateParts = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})\.*(\d*)Z$/.exec(str); if (dateParts !== null) { result = new Date(Date.UTC(+dateParts[1], +dateParts[2] - 1, +dateParts[3], +dateParts[4], +dateParts[5], +dateParts[6], +dateParts[7])); } return result; }; return DataTableXmlSerializer; }()); exports.DataTableXmlSerializer = DataTableXmlSerializer; //# sourceMappingURL=DataTableXmlSerializer.js.map