@qooxdoo/framework
Version:
The JS Framework for Coders
375 lines (320 loc) • 11.8 kB
JavaScript
/* ***********************************************************************
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 + "";
}
}
});