2014-04-01 00:47:41 -06:00

80 lines
2.4 KiB
JavaScript

var AWS = require('../core');
var builder = require('xmlbuilder');
var inherit = AWS.util.inherit;
/**
* @api private
*/
AWS.XML.Builder = inherit({
constructor: function XMLBuilder(root, rules, options) {
this.root = root;
this.rules = rules;
this.xmlns = options.xmlnamespace;
this.timestampFormat = options.timestampFormat;
},
toXML: function toXML(params) {
var xml = builder.create(this.root);
if (this.xmlns) xml.att('xmlns', this.xmlns);
this.serializeStructure(this.rules, params, xml);
return xml.root().toString();
},
serializeStructure: function serializeStructure(rules, params, xml) {
AWS.util.each.call(this, rules || {}, function (memberName, memberRules) {
var value = params[memberName];
if (value !== undefined) {
if (memberRules.attribute) {
xml.att(memberRules.name, value);
} else {
this.serializeMember(memberName, memberRules, value, xml);
}
}
});
},
serializeList: function serializeList(name, rules, list, xml) {
if (rules.flattened) {
AWS.util.arrayEach.call(this, list, function (value) {
this.serializeMember(rules.name || name, rules.members, value, xml);
});
} else {
xml = xml.ele(rules.name || name);
AWS.util.arrayEach.call(this, list, function (value) {
var memberName = rules.members.name || 'member';
this.serializeMember(memberName, rules.members, value, xml);
});
}
},
serializeMember: function serializeMember(memberName, rules, params, xml) {
if (params === null || params === undefined) return;
var name = memberName;
if (rules.type === 'structure') {
xml = xml.ele(name);
this.serializeStructure(rules.members, params, xml);
} else if (rules.type === 'list') {
this.serializeList(name, rules, params, xml);
} else if (rules.type === 'timestamp') {
var timestampFormat = rules.format || this.timestampFormat;
var date = AWS.util.date.format(params, timestampFormat);
xml = xml.ele(name, String(date));
} else {
xml = xml.ele(name, String(params));
}
this.applyNamespaces(xml, rules);
},
applyNamespaces: function applyNamespaces(xml, rules) {
if (rules.xmlns) {
var attr = 'xmlns';
if (rules.xmlns.prefix) attr += ':' + rules.xmlns.prefix;
xml.att(attr, rules.xmlns.uri);
}
}
});