UNPKG

@qooxdoo/framework

Version:

The JS Framework for Coders

375 lines (320 loc) 11.8 kB
/* *********************************************************************** qooxdoo - the new era of web development http://qooxdoo.org Copyright: 2004-2009 1&1 Internet AG, Germany, http://www.1und1.de License: MIT: https://opensource.org/licenses/MIT See the LICENSE file in the project's top-level directory for details. Authors: * Martin Wittemann (martinwittemann) ************************************************************************ */ /** * This is an util class responsible for serializing qooxdoo objects. * * @ignore(qx.data, qx.data.IListData) * @ignore(qx.locale, qx.locale.LocalizedString) */ qx.Class.define("qx.util.Serializer", { statics : { /** * Serializes the properties of the given qooxdoo object. To get the * serialization working, every property needs to have a string * representation because the value of the property will be concatenated to the * serialized string. * * @param object {qx.core.Object} Any qooxdoo object * @param qxSerializer {Function?} Function used for serializing qooxdoo * objects stored in the properties of the object. Check for the type of * classes <ou want to serialize and return the serialized value. In all * other cases, just return nothing. * @param dateFormat {qx.util.format.DateFormat?} If a date formater is given, * the format method of this given formater is used to convert date * objects into strings. * @return {String} The serialized object. */ toUriParameter : function(object, qxSerializer, dateFormat) { var result = ""; var properties = qx.util.PropertyUtil.getAllProperties(object.constructor); for (var name in properties) { // ignore property groups if (properties[name].group != undefined) { continue; } var value = object["get" + qx.lang.String.firstUp(name)](); // handle arrays if (qx.lang.Type.isArray(value)) { var isdataArray = qx.data && qx.data.IListData && qx.Class.hasInterface(value && value.constructor, qx.data.IListData); for (var i = 0; i < value.length; i++) { var valueAtI = isdataArray ? value.getItem(i) : value[i]; result += this.__toUriParameter(name, valueAtI, qxSerializer); } } else if (qx.lang.Type.isDate(value) && dateFormat != null) { result += this.__toUriParameter( name, dateFormat.format(value), qxSerializer ); } else { result += this.__toUriParameter(name, value, qxSerializer); } } return result.substring(0, result.length - 1); }, /** * Helper method for {@link #toUriParameter}. Check for qooxdoo objects * and returns the serialized name value pair for the given parameter. * * @param name {String} The name of the value * @param value {var} The value itself * @param qxSerializer {Function?} The serializer for qooxdoo objects. * @return {String} The serialized name value pair. */ __toUriParameter : function(name, value, qxSerializer) { if (value && value.$$type == "Class") { value = value.classname; } if (value && (value.$$type == "Interface" || value.$$type == "Mixin")) { value = value.name; } if (value instanceof qx.core.Object && qxSerializer != null) { var encValue = encodeURIComponent(qxSerializer(value)); if (encValue === undefined) { var encValue = encodeURIComponent(value); } } else { var encValue = encodeURIComponent(value); } return encodeURIComponent(name) + "=" + encValue + "&"; }, /** * Serializes the properties of the given qooxdoo object into a native * object. * * @param object {qx.core.Object} * Any qooxdoo object * * @param qxSerializer {Function?} * Function used for serializing qooxdoo objects stored in the properties * of the object. Check for the type of classes you want to serialize * and return the serialized value. In all other cases, just return * nothing. * @param dateFormat {qx.util.format.DateFormat?} If a date formater is given, * the format method of this given formater is used to convert date * objects into strings. * @return {null|Array|String|Object} * The serialized object. Depending on the input qooxdoo object, the returning * type will vary. */ toNativeObject : function(object, qxSerializer, dateFormat) { var result; // null or undefined if (object == null) { return null; } // data array if (qx.data && qx.data.IListData && qx.Class.hasInterface(object.constructor, qx.data.IListData)) { result = []; for (var i = 0; i < object.getLength(); i++) { result.push(qx.util.Serializer.toNativeObject( object.getItem(i), qxSerializer, dateFormat) ); } return result; } // other arrays if (qx.lang.Type.isArray(object)) { result = []; for (var i = 0; i < object.length; i++) { result.push(qx.util.Serializer.toNativeObject( object[i], qxSerializer, dateFormat) ); } return result; } // return names for qooxdoo classes if (object.$$type == "Class") { return object.classname; } // return names for qooxdoo interfaces and mixins if (object.$$type == "Interface" || object.$$type == "Mixin") { return object.name; } // qooxdoo object if (object instanceof qx.core.Object) { if (qxSerializer != null) { var returnValue = qxSerializer(object); // if we have something returned, return that if (returnValue != undefined) { return returnValue; } // continue otherwise } result = {}; var properties = qx.util.PropertyUtil.getAllProperties(object.constructor); for (var name in properties) { // ignore property groups if (properties[name].group != undefined) { continue; } var value = object["get" + qx.lang.String.firstUp(name)](); result[name] = qx.util.Serializer.toNativeObject( value, qxSerializer, dateFormat ); } return result; } // date objects with date format if (qx.lang.Type.isDate(object) && dateFormat != null) { return dateFormat.format(object); } // localized strings if (qx.locale && qx.locale.LocalizedString && object instanceof qx.locale.LocalizedString) { return object.toString(); } // JavaScript objects if (qx.lang.Type.isObject(object)) { result = {}; for (var key in object) { result[key] = qx.util.Serializer.toNativeObject( object[key], qxSerializer, dateFormat ); } return result; } // all other stuff, including String, Date, RegExp return object; }, /** * Serializes the properties of the given qooxdoo object into a json object. * * @param object {qx.core.Object} Any qooxdoo object * @param qxSerializer {Function?} Function used for serializing qooxdoo * objects stored in the properties of the object. Check for the type of * classes <ou want to serialize and return the serialized value. In all * other cases, just return nothing. * @param dateFormat {qx.util.format.DateFormat?} If a date formater is given, * the format method of this given formater is used to convert date * objects into strings. * @return {String} The serialized object. */ toJson : function(object, qxSerializer, dateFormat) { var result = ""; // null or undefined if (object == null) { return "null"; } // data array if (qx.data && qx.data.IListData && qx.Class.hasInterface(object.constructor, qx.data.IListData)) { result += "["; for (var i = 0; i < object.getLength(); i++) { result += qx.util.Serializer.toJson(object.getItem(i), qxSerializer, dateFormat) + ","; } if (result != "[") { result = result.substring(0, result.length - 1); } return result + "]"; } // other arrays if (qx.lang.Type.isArray(object)) { result += "["; for (var i = 0; i < object.length; i++) { result += qx.util.Serializer.toJson(object[i], qxSerializer, dateFormat) + ","; } if (result != "[") { result = result.substring(0, result.length - 1); } return result + "]"; } // return names for qooxdoo classes if (object.$$type == "Class") { return '"' + object.classname + '"'; } // return names for qooxdoo interfaces and mixins if (object.$$type == "Interface" || object.$$type == "Mixin") { return '"' + object.name + '"'; } // qooxdoo object if (object instanceof qx.core.Object) { if (qxSerializer != null) { var returnValue = qxSerializer(object); // if we have something returned, return that if (returnValue != undefined) { return '"' + returnValue + '"'; } // continue otherwise } result += "{"; var properties = qx.util.PropertyUtil.getAllProperties(object.constructor); for (var name in properties) { // ignore property groups if (properties[name].group != undefined) { continue; } var value = object["get" + qx.lang.String.firstUp(name)](); result += '"' + name + '":' + qx.util.Serializer.toJson(value, qxSerializer, dateFormat) + ","; } if (result != "{") { result = result.substring(0, result.length - 1); } return result + "}"; } // localized strings if (qx.locale && qx.locale.LocalizedString && object instanceof qx.locale.LocalizedString) { object = object.toString(); // no return here because we want to have the string checks as well! } // date objects with formater if (qx.lang.Type.isDate(object) && dateFormat != null) { return '"' + dateFormat.format(object) + '"'; } // javascript objects if (qx.lang.Type.isObject(object)) { result += "{"; for (var key in object) { result += '"' + key + '":' + qx.util.Serializer.toJson(object[key], qxSerializer, dateFormat) + ","; } if (result != "{") { result = result.substring(0, result.length - 1); } return result + "}"; } // strings if (qx.lang.Type.isString(object)) { // escape object = object.replace(/([\\])/g, '\\\\'); object = object.replace(/(["])/g, '\\"'); object = object.replace(/([\r])/g, '\\r'); object = object.replace(/([\f])/g, '\\f'); object = object.replace(/([\n])/g, '\\n'); object = object.replace(/([\t])/g, '\\t'); object = object.replace(/([\b])/g, '\\b'); return '"' + object + '"'; } // Date and RegExp if (qx.lang.Type.isDate(object) || qx.lang.Type.isRegExp(object)) { return '"' + object + '"'; } // all other stuff return object + ""; } } });