dataschema-json.js revision c0464f9735ebc6b18978bc11f7a16beea7df84df
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmarkYUI.add('dataschema-json', function(Y) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark/**
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * The DataSchema utility provides a common configurable interface for widgets to
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * apply a given schema to a variety of data.
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark *
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @module dataschema
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark */
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmarkvar LANG = Y.Lang,
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark/**
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * JSON subclass for the YUI DataSchema utility.
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @class DataSchema.JSON
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @extends DataSchema.Base
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @static
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark */
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmarkSchemaJSON = {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark /////////////////////////////////////////////////////////////////////////////
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark //
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark // DataSchema.JSON static methods
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark //
853b0c92d71faeef0571c294fc386ca3eb29cb44mark /////////////////////////////////////////////////////////////////////////////
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark /**
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * Returns string name.
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark *
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @method toString
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @return {String} String representation for this object.
853b0c92d71faeef0571c294fc386ca3eb29cb44mark */
853b0c92d71faeef0571c294fc386ca3eb29cb44mark toString: function() {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark return "DataSchema.JSON";
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark },
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark /**
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * Utility function converts JSON locator strings into walkable paths
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark *
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @method DataSchema.JSON.getPath
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @param locator {String} JSON value locator.
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @return {String[]} Walkable path to data value.
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @static
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark */
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark getPath: function(locator) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark var path = null,
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark keys = [],
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark i = 0;
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark if (locator) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark // Strip the ["string keys"] and [1] array indexes
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark locator = locator.
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark replace(/\[(['"])(.*?)\1\]/g,
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark function (x,$1,$2) {keys[i]=$2;return '.@'+(i++);}).
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark replace(/\[(\d+)\]/g,
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark function (x,$1) {keys[i]=parseInt($1,10)|0;return '.@'+(i++);}).
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark replace(/^\./,''); // remove leading dot
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark // Validate against problematic characters.
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark if (!/[^\w\.\$@]/.test(locator)) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark path = locator.split('.');
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark for (i=path.length-1; i >= 0; --i) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark if (path[i].charAt(0) === '@') {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark path[i] = keys[parseInt(path[i].substr(1),10)];
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark else {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark return path;
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark },
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark /**
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * Utility function to walk a path and return the value located there.
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark *
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @method DataSchema.JSON.getLocationValue
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @param path {String[]} Locator path.
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @param data {String} Data to traverse.
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @return {Object} Data value at location.
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @static
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark */
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark getLocationValue: function (path, data) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark var i = 0,
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark len = path.length;
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark for (;i<len;i++) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark data = data[path[i]];
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark return data;
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark },
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark /**
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * Applies a given schema to given JSON data.
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark *
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @method apply
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @param schema {Object} Schema to apply.
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @param data {Object} JSON data.
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @return {Object} Schema-parsed data.
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @static
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark */
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark apply: function(schema, data) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark var data_in = data,
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark data_out = {results:[],meta:{}};
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark // Convert incoming JSON strings
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark if(!LANG.isObject(data)) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark try {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark data_in = Y.JSON.parse(data);
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark catch(e) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark data_out.error = e;
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark return data_out;
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark if(LANG.isObject(data_in) && schema) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark // Parse results data
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark if(!LANG.isUndefined(schema.resultListLocator)) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark data_out = SchemaJSON._parseResults(schema, data_in, data_out);
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark // Parse meta data
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark if(!LANG.isUndefined(schema.metaFields)) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark data_out = SchemaJSON._parseMeta(schema.metaFields, data_in, data_out);
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark else {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark data_out.error = new Error(this.toString() + " Schema parse failure");
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark return data_out;
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark },
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark /**
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * Schema-parsed list of results from full data
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark *
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @method _parseResults
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @param schema {Object} Schema to parse against.
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @param json_in {Object} JSON to parse.
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @param data_out {Object} In-progress parsed data to update.
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @return {Object} Parsed data object.
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @static
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @protected
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark */
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark _parseResults: function(schema, json_in, data_out) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark var results = [],
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark path,
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark error;
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark if(schema.resultListLocator) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark path = SchemaJSON.getPath(schema.resultListLocator);
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark if(path) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark results = SchemaJSON.getLocationValue(path, json_in);
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark if (results === undefined) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark data_out.results = [];
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark error = new Error(this.toString() + " Results retrieval failure");
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark if(LANG.isArray(schema.resultFields) && LANG.isArray(results)) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark data_out = SchemaJSON._getFieldValues(schema.resultFields, results, data_out);
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark else {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark data_out.results = [];
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark error = new Error(this.toString() + " Fields retrieval failure");
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark else {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark error = new Error(this.toString() + " Results locator failure");
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark if (error) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark data_out.error = error;
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark return data_out;
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark },
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark /**
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * Get field data values out of list of full results
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark *
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @method _getFieldValues
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @param fields {Array} Fields to find.
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @param array_in {Array} Results to parse.
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @param data_out {Object} In-progress parsed data to update.
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @return {Object} Parsed data object.
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @static
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @protected
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark */
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark _getFieldValues: function(fields, array_in, data_out) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark var results = [],
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark len = fields.length,
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark i, j,
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark field, key, path, parser,
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark simplePaths = [], complexPaths = [], fieldParsers = [],
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark result, record;
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark // First collect hashes of simple paths, complex paths, and parsers
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark for (i=0; i<len; i++) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark field = fields[i]; // A field can be a simple string or a hash
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark key = field.key || field; // Find the key
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark // Validate and store locators for later
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark path = SchemaJSON.getPath(key);
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark if (path) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark if (path.length === 1) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark simplePaths[simplePaths.length] = {key:key, path:path[0]};
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark } else {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark complexPaths[complexPaths.length] = {key:key, path:path};
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark } else {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark // Validate and store parsers for later
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark //TODO: use Y.DataSchema.parse?
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark parser = (LANG.isFunction(field.parser)) ? field.parser : Y.Parsers[field.parser+''];
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark if (parser) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark fieldParsers[fieldParsers.length] = {key:key, parser:parser};
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark // Traverse list of array_in, creating records of simple fields,
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark // complex fields, and applying parsers as necessary
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark for (i=array_in.length-1; i>=0; --i) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark record = {};
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark result = array_in[i];
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark if(result) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark // Cycle through simpleLocators
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark for (j=simplePaths.length-1; j>=0; --j) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark // Bug 1777850: The result might be an array instead of object
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark record[simplePaths[j].key] = Y.DataSchema.Base.parse(
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark (LANG.isUndefined(result[simplePaths[j].path]) ?
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark result[j] : result[simplePaths[j].path]), simplePaths[j]);
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark // Cycle through complexLocators
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark for (j=complexPaths.length - 1; j>=0; --j) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark record[complexPaths[j].key] = Y.DataSchema.Base.parse(
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark (SchemaJSON.getLocationValue(complexPaths[j].path, result)), complexPaths[j] );
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark // Cycle through fieldParsers
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark for (j=fieldParsers.length-1; j>=0; --j) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark key = fieldParsers[j].key;
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark record[key] = fieldParsers[j].parser(record[key]);
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark // Safety net
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark if (LANG.isUndefined(record[key])) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark record[key] = null;
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark results[i] = record;
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark data_out.results = results;
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark return data_out;
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark },
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark /**
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * Parses results data according to schema
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark *
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @method _parseMeta
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @param metaFields {Object} Metafields definitions.
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @param json_in {Object} JSON to parse.
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @param data_out {Object} In-progress parsed data to update.
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @return {Object} Schema-parsed meta data.
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @static
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @protected
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark */
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark _parseMeta: function(metaFields, json_in, data_out) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark if(LANG.isObject(metaFields)) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark var key, path;
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark for(key in metaFields) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark if (metaFields.hasOwnProperty(key)) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark path = SchemaJSON.getPath(metaFields[key]);
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark if (path && json_in) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark data_out.meta[key] = SchemaJSON.getLocationValue(path, json_in);
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark else {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark data_out.error = new Error(this.toString() + " Meta retrieval failure");
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark return data_out;
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark};
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmarkY.DataSchema.JSON = Y.mix(SchemaJSON, Y.DataSchema.Base);
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark}, '@VERSION@' ,{requires:['dataschema-base']});
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark