var xmlserializer = require('xml2js'); var SerializerManager = function(){ var registry={}, defaultSerializer = null; var _private={ "validate":function(serializer){ function validateProperties(serializer, props){ var result = true; for (var propIndex in props){ var propType = props[propIndex].split(":"); if (!serializer.hasOwnProperty([propType[0]]) || typeof serializer[propType[0]] !== propType[1]){ result = false; break; } } return result; } result = validateProperties(serializer,["name:string","serialize:function","isDefault:boolean"]); // valid serializer, check if its not default request serializer, to validate non // default serializer props if (result && !serializer.isDefault) result = validateProperties(serializer,["match:function"]); return result; } }; this.add = function(serializer){ if (!_private.validate(serializer)) throw "serializer cannot be added: invalid serializer definition"; if (serializer.isDefault){ defaultSerializer = serializer; }else{ registry[serializer.name] = serializer; } }; this.remove = function(serializerName){ var result = registry[serializerName]; if (!result) throw "cannot remove serializer: " + serializerName +" doesn't exists"; delete registry[serializerName]; }; this.find = function(serializerName){ var result = registry[serializerName]; if (!result) throw "cannot find serializer: " + serializerName +" doesn't exists"; return result; }; this.clean = function(){ registry={}; }; this.get = function(request){ var result = null; for (var serializerName in registry){ if (registry[serializerName].match(request)){ result = registry[serializerName]; break; } } // if serializer not found return default serializer, else serializer found return (result === null)?defaultSerializer:result; }; this.getAll=function(){ var result = []; for (var serializerName in registry){ result.push(registry[serializerName]); } return result; }; this.getDefault = function(){ return defaultSerializer; }; }; module.exports = function(){ var serializerManager = new SerializerManager(); var BaseSerializer ={ "isDefault":false, "match":function(request){ var result = false, contentType = request.headers["Content-Type"] && request.headers["Content-Type"].replace(/ /g, ''); if (!contentType) return result; for (var i=0; i