src/cm/media/js/lib/yui/yui_3.0.0b1/build/dataschema/dataschema-debug.js
author raph
Mon, 23 Nov 2009 15:14:29 +0100
changeset 0 40c8f766c9b8
permissions -rw-r--r--
import from internal svn r 4007
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     1
/*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     2
Copyright (c) 2009, Yahoo! Inc. All rights reserved.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     3
Code licensed under the BSD License:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     4
http://developer.yahoo.net/yui/license.txt
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     5
version: 3.0.0b1
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     6
build: 1163
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     7
*/
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     8
YUI.add('dataschema-base', function(Y) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     9
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    10
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    11
 * The DataSchema utility provides a common configurable interface for widgets to
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    12
 * apply a given schema to a variety of data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    13
 *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    14
 * @module dataschema
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    15
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    16
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    17
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    18
 * Provides the base DataSchema implementation, which can be extended to 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    19
 * create DataSchemas for specific data formats, such XML, JSON, text and
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    20
 * arrays.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    21
 *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    22
 * @module dataschema
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    23
 * @submodule dataschema-base
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    24
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    25
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    26
var LANG = Y.Lang,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    27
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    28
 * Base class for the YUI DataSchema Utility.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    29
 * @class DataSchema.Base
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    30
 * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    31
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    32
    SchemaBase = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    33
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    34
     * Overridable method returns data as-is.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    35
     *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    36
     * @method apply
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    37
     * @param schema {Object} Schema to apply.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    38
     * @param data {Object} Data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    39
     * @return {Object} Schema-parsed data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    40
     * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    41
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    42
    apply: function(schema, data) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    43
        return data;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    44
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    45
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    46
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    47
     * Applies field parser, if defined
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    48
     *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    49
     * @method parse
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    50
     * @param value {Object} Original value.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    51
     * @param field {Object} Field.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    52
     * @return {Object} Type-converted value.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    53
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    54
    parse: function(value, field) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    55
        if(field.parser) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    56
            var parser = (LANG.isFunction(field.parser)) ?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    57
            field.parser : Y.Parsers[field.parser+''];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    58
            if(parser) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    59
                value = parser.call(this, value);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    60
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    61
            else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    62
                Y.log("Could not find parser for field " + Y.dump(field), "warn", "dataschema-json");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    63
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    64
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    65
        return value;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    66
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    67
};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    68
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    69
Y.namespace("DataSchema").Base = SchemaBase;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    70
Y.namespace("Parsers");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    71
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    72
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    73
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    74
}, '3.0.0b1' ,{requires:['base']});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    75
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    76
YUI.add('dataschema-json', function(Y) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    77
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    78
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    79
 * Provides a DataSchema implementation which can be used to work with JSON data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    80
 *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    81
 * @module dataschema
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    82
 * @submodule dataschema-json
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    83
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    84
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    85
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    86
 * JSON subclass for the DataSchema Utility.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    87
 * @class DataSchema.JSON
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    88
 * @extends DataSchema.Base
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    89
 * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    90
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    91
var LANG = Y.Lang,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    92
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    93
    SchemaJSON = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    94
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    95
        /////////////////////////////////////////////////////////////////////////////
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    96
        //
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    97
        // DataSchema.JSON static methods
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    98
        //
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    99
        /////////////////////////////////////////////////////////////////////////////
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   100
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   101
         * Utility function converts JSON locator strings into walkable paths
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   102
         *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   103
         * @method DataSchema.JSON.getPath
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   104
         * @param locator {String} JSON value locator.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   105
         * @return {String[]} Walkable path to data value.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   106
         * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   107
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   108
        getPath: function(locator) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   109
            var path = null,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   110
                keys = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   111
                i = 0;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   112
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   113
            if (locator) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   114
                // Strip the ["string keys"] and [1] array indexes
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   115
                locator = locator.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   116
                    replace(/\[(['"])(.*?)\1\]/g,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   117
                    function (x,$1,$2) {keys[i]=$2;return '.@'+(i++);}).
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   118
                    replace(/\[(\d+)\]/g,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   119
                    function (x,$1) {keys[i]=parseInt($1,10)|0;return '.@'+(i++);}).
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   120
                    replace(/^\./,''); // remove leading dot
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   121
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   122
                // Validate against problematic characters.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   123
                if (!/[^\w\.\$@]/.test(locator)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   124
                    path = locator.split('.');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   125
                    for (i=path.length-1; i >= 0; --i) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   126
                        if (path[i].charAt(0) === '@') {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   127
                            path[i] = keys[parseInt(path[i].substr(1),10)];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   128
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   129
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   130
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   131
                else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   132
                    Y.log("Invalid locator: " + locator, "error", "dataschema-json");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   133
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   134
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   135
            return path;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   136
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   137
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   138
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   139
         * Utility function to walk a path and return the value located there.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   140
         *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   141
         * @method DataSchema.JSON.getLocationValue
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   142
         * @param path {String[]} Locator path.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   143
         * @param data {String} Data to traverse.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   144
         * @return {Object} Data value at location.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   145
         * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   146
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   147
        getLocationValue: function (path, data) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   148
            var i = 0,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   149
                len = path.length;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   150
            for (;i<len;i++) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   151
                if(!LANG.isUndefined(data[path[i]])) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   152
                    data = data[path[i]];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   153
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   154
                else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   155
                    data = undefined;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   156
                    break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   157
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   158
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   159
            return data;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   160
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   161
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   162
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   163
         * Applies a given schema to given JSON data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   164
         *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   165
         * @method apply
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   166
         * @param schema {Object} Schema to apply.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   167
         * @param data {Object} JSON data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   168
         * @return {Object} Schema-parsed data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   169
         * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   170
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   171
        apply: function(schema, data) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   172
            var data_in = data,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   173
                data_out = {results:[],meta:{}};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   174
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   175
            // Convert incoming JSON strings
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   176
            if(!LANG.isObject(data)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   177
                try {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   178
                    data_in = Y.JSON.parse(data);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   179
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   180
                catch(e) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   181
                    data_out.error = e;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   182
                    return data_out;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   183
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   184
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   185
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   186
            if(LANG.isObject(data_in) && schema) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   187
                // Parse results data
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   188
                if(!LANG.isUndefined(schema.resultListLocator)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   189
                    data_out = SchemaJSON._parseResults(schema, data_in, data_out);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   190
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   191
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   192
                // Parse meta data
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   193
                if(!LANG.isUndefined(schema.metaFields)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   194
                    data_out = SchemaJSON._parseMeta(schema.metaFields, data_in, data_out);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   195
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   196
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   197
            else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   198
                Y.log("JSON data could not be schema-parsed: " + Y.dump(data) + " " + Y.dump(data), "error", "dataschema-json");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   199
                data_out.error = new Error("JSON schema parse failure");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   200
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   201
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   202
            return data_out;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   203
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   204
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   205
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   206
         * Schema-parsed list of results from full data
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   207
         *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   208
         * @method _parseResults
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   209
         * @param schema {Object} Schema to parse against.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   210
         * @param json_in {Object} JSON to parse.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   211
         * @param data_out {Object} In-progress parsed data to update.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   212
         * @return {Object} Parsed data object.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   213
         * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   214
         * @protected
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   215
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   216
        _parseResults: function(schema, json_in, data_out) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   217
            var results = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   218
                path,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   219
                error;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   220
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   221
            if(schema.resultListLocator) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   222
                path = SchemaJSON.getPath(schema.resultListLocator);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   223
                if(path) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   224
                    results = SchemaJSON.getLocationValue(path, json_in);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   225
                    if (results === undefined) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   226
                        data_out.results = [];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   227
                        error = new Error("JSON results retrieval failure");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   228
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   229
                    else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   230
                        if(LANG.isArray(schema.resultFields) && LANG.isArray(results)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   231
                            data_out = SchemaJSON._getFieldValues(schema.resultFields, results, data_out);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   232
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   233
                        else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   234
                            data_out.results = [];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   235
                            error = new Error("JSON Schema fields retrieval failure");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   236
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   237
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   238
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   239
                else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   240
                    error = new Error("JSON Schema results locator failure");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   241
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   242
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   243
                if (error) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   244
                    Y.log("JSON data could not be parsed: " + Y.dump(json_in), "error", "dataschema-json");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   245
                    data_out.error = error;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   246
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   247
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   248
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   249
            return data_out;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   250
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   251
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   252
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   253
         * Get field data values out of list of full results
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   254
         *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   255
         * @method _getFieldValues
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   256
         * @param fields {Array} Fields to find.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   257
         * @param array_in {Array} Results to parse.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   258
         * @param data_out {Object} In-progress parsed data to update.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   259
         * @return {Object} Parsed data object.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   260
         * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   261
         * @protected
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   262
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   263
        _getFieldValues: function(fields, array_in, data_out) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   264
            var results = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   265
                len = fields.length,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   266
                i, j,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   267
                field, key, path, parser,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   268
                simplePaths = [], complexPaths = [], fieldParsers = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   269
                result, record;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   270
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   271
            // First collect hashes of simple paths, complex paths, and parsers
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   272
            for (i=0; i<len; i++) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   273
                field = fields[i]; // A field can be a simple string or a hash
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   274
                key = field.key || field; // Find the key
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   275
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   276
                // Validate and store locators for later
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   277
                path = SchemaJSON.getPath(key);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   278
                if (path) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   279
                    if (path.length === 1) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   280
                        simplePaths[simplePaths.length] = {key:key, path:path[0]};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   281
                    } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   282
                        complexPaths[complexPaths.length] = {key:key, path:path};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   283
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   284
                } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   285
                    Y.log("Invalid key syntax: " + key, "warn", "dataschema-json");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   286
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   287
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   288
                // Validate and store parsers for later
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   289
                //TODO: use Y.DataSchema.parse?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   290
                parser = (LANG.isFunction(field.parser)) ? field.parser : Y.Parsers[field.parser+''];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   291
                if (parser) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   292
                    fieldParsers[fieldParsers.length] = {key:key, parser:parser};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   293
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   294
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   295
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   296
            // Traverse list of array_in, creating records of simple fields,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   297
            // complex fields, and applying parsers as necessary
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   298
            for (i=array_in.length-1; i>=0; --i) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   299
                record = {};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   300
                result = array_in[i];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   301
                if(result) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   302
                    // Cycle through simpleLocators
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   303
                    for (j=simplePaths.length-1; j>=0; --j) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   304
                        // Bug 1777850: The result might be an array instead of object
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   305
                        record[simplePaths[j].key] = Y.DataSchema.Base.parse(
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   306
                                (LANG.isUndefined(result[simplePaths[j].path]) ?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   307
                                result[j] : result[simplePaths[j].path]), simplePaths[j]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   308
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   309
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   310
                    // Cycle through complexLocators
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   311
                    for (j=complexPaths.length - 1; j>=0; --j) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   312
                        record[complexPaths[j].key] = Y.DataSchema.Base.parse(
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   313
                            (SchemaJSON.getLocationValue(complexPaths[j].path, result)), complexPaths[j] );
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   314
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   315
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   316
                    // Cycle through fieldParsers
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   317
                    for (j=fieldParsers.length-1; j>=0; --j) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   318
                        key = fieldParsers[j].key;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   319
                        record[key] = fieldParsers[j].parser(record[key]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   320
                        // Safety net
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   321
                        if (LANG.isUndefined(record[key])) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   322
                            record[key] = null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   323
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   324
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   325
                    results[i] = record;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   326
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   327
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   328
            data_out.results = results;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   329
            return data_out;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   330
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   331
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   332
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   333
         * Parses results data according to schema
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   334
         *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   335
         * @method _parseMeta
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   336
         * @param metaFields {Object} Metafields definitions.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   337
         * @param json_in {Object} JSON to parse.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   338
         * @param data_out {Object} In-progress parsed data to update.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   339
         * @return {Object} Schema-parsed meta data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   340
         * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   341
         * @protected
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   342
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   343
        _parseMeta: function(metaFields, json_in, data_out) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   344
            if(LANG.isObject(metaFields)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   345
                var key, path;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   346
                for(key in metaFields) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   347
                    if (metaFields.hasOwnProperty(key)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   348
                        path = SchemaJSON.getPath(metaFields[key]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   349
                        if (path && json_in) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   350
                            data_out.meta[key] = SchemaJSON.getLocationValue(path, json_in);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   351
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   352
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   353
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   354
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   355
            else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   356
                data_out.error = new Error("JSON meta data retrieval failure");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   357
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   358
            return data_out;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   359
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   360
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   361
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   362
Y.DataSchema.JSON = Y.mix(SchemaJSON, Y.DataSchema.Base);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   363
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   364
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   365
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   366
}, '3.0.0b1' ,{requires:['json', 'dataschema-base']});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   367
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   368
YUI.add('dataschema-xml', function(Y) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   369
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   370
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   371
 * Provides a DataSchema implementation which can be used to work with XML data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   372
 *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   373
 * @module dataschema
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   374
 * @submodule dataschema-xml
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   375
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   376
var LANG = Y.Lang,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   377
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   378
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   379
     * XML subclass for the DataSchema Utility.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   380
     * @class DataSchema.XML
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   381
     * @extends DataSchema.Base
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   382
     * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   383
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   384
    SchemaXML = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   385
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   386
        /////////////////////////////////////////////////////////////////////////////
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   387
        //
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   388
        // DataSchema.XML static methods
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   389
        //
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   390
        /////////////////////////////////////////////////////////////////////////////
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   391
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   392
         * Applies a given schema to given XML data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   393
         *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   394
         * @method apply
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   395
         * @param schema {Object} Schema to apply.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   396
         * @param data {XMLDoc} XML document.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   397
         * @return {Object} Schema-parsed data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   398
         * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   399
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   400
        apply: function(schema, data) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   401
            var xmldoc = data,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   402
                data_out = {results:[],meta:{}};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   403
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   404
            if(xmldoc && xmldoc.nodeType && xmldoc.nodeType === 9 && schema) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   405
                // Parse results data
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   406
                data_out = SchemaXML._parseResults(schema, xmldoc, data_out);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   407
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   408
                // Parse meta data
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   409
                data_out = SchemaXML._parseMeta(schema.metaFields, xmldoc, data_out);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   410
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   411
            else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   412
                Y.log("XML data could not be schema-parsed: " + Y.dump(data) + " " + Y.dump(data), "error", "dataschema-xml");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   413
                data_out.error = new Error("XML schema parse failure");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   414
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   415
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   416
            return data_out;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   417
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   418
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   419
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   420
         * Get an XPath-specified value for a given field from an XML node or document.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   421
         *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   422
         * @method _getLocationValue
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   423
         * @param field {String | Object} Field definition.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   424
         * @param context {Object} XML node or document to search within.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   425
         * @return {Object} Data value or null.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   426
         * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   427
         * @protected
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   428
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   429
        _getLocationValue: function(field, context) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   430
            var locator = field.locator || field.key || field,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   431
                xmldoc = context.ownerDocument || context,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   432
                result, res, value = null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   433
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   434
            try {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   435
                // Standards mode
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   436
                if(!LANG.isUndefined(xmldoc.evaluate)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   437
                    result = xmldoc.evaluate(locator, context, xmldoc.createNSResolver(!context.ownerDocument ? context.documentElement : context.ownerDocument.documentElement), 0, null);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   438
                    while(res = result.iterateNext()) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   439
                        value = res.textContent;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   440
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   441
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   442
                // IE mode
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   443
                else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   444
                    xmldoc.setProperty("SelectionLanguage", "XPath");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   445
                    result = context.selectNodes(locator)[0];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   446
                    value = result.value || result.text || null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   447
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   448
                return Y.DataSchema.Base.parse(value, field);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   449
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   450
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   451
            catch(e) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   452
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   453
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   454
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   455
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   456
         * Parses results data according to schema
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   457
         *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   458
         * @method _parseMeta
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   459
         * @param xmldoc_in {Object} XML document parse.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   460
         * @param data_out {Object} In-progress schema-parsed data to update.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   461
         * @return {Object} Schema-parsed data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   462
         * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   463
         * @protected
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   464
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   465
        _parseMeta: function(metaFields, xmldoc_in, data_out) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   466
            if(LANG.isObject(metaFields)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   467
                var key,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   468
                    xmldoc = xmldoc_in.ownerDocument || xmldoc_in;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   469
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   470
                for(key in metaFields) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   471
                    if (metaFields.hasOwnProperty(key)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   472
                        data_out.meta[key] = SchemaXML._getLocationValue(metaFields[key], xmldoc);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   473
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   474
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   475
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   476
            return data_out;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   477
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   478
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   479
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   480
         * Schema-parsed list of results from full data
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   481
         *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   482
         * @method _parseResults
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   483
         * @param schema {Object} Schema to parse against.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   484
         * @param xmldoc_in {Object} XML document parse.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   485
         * @param data_out {Object} In-progress schema-parsed data to update.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   486
         * @return {Object} Schema-parsed data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   487
         * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   488
         * @protected
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   489
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   490
        _parseResults: function(schema, xmldoc_in, data_out) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   491
            if(schema.resultListLocator && LANG.isArray(schema.resultFields)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   492
                var nodeList = xmldoc_in.getElementsByTagName(schema.resultListLocator),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   493
                    fields = schema.resultFields,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   494
                    results = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   495
                    node, field, result, i, j;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   496
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   497
                if(nodeList.length) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   498
                    // Loop through each result node
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   499
                    for(i=nodeList.length-1; i>= 0; i--) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   500
                        result = {};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   501
                        node = nodeList[i];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   502
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   503
                        // Find each field value
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   504
                        for(j=fields.length-1; j>= 0; j--) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   505
                            field = fields[j];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   506
                            result[field.key || field] = SchemaXML._getLocationValue(field, node);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   507
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   508
                        results[i] = result;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   509
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   510
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   511
                    data_out.results = results;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   512
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   513
                else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   514
                    data_out.error = new Error("XML schema result nodes retrieval failure");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   515
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   516
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   517
            return data_out;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   518
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   519
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   520
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   521
Y.DataSchema.XML = Y.mix(SchemaXML, Y.DataSchema.Base);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   522
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   523
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   524
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   525
}, '3.0.0b1' ,{requires:['dataschema-base']});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   526
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   527
YUI.add('dataschema-array', function(Y) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   528
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   529
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   530
 * Provides a DataSchema implementation which can be used to work with data stored in arrays.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   531
 *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   532
 * @module dataschema
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   533
 * @submodule dataschema-array
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   534
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   535
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   536
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   537
 * Array subclass for the DataSchema Utility.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   538
 * @class DataSchema.Array
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   539
 * @extends DataSchema.Base
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   540
 * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   541
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   542
var LANG = Y.Lang,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   543
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   544
    SchemaArray = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   545
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   546
        /////////////////////////////////////////////////////////////////////////////
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   547
        //
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   548
        // DataSchema.Array static methods
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   549
        //
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   550
        /////////////////////////////////////////////////////////////////////////////
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   551
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   552
         * Applies a given schema to given Array data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   553
         *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   554
         * @method apply
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   555
         * @param schema {Object} Schema to apply.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   556
         * @param data {Object} Array data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   557
         * @return {Object} Schema-parsed data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   558
         * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   559
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   560
        apply: function(schema, data) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   561
            var data_in = data,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   562
                data_out = {results:[],meta:{}};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   563
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   564
            if(LANG.isArray(data_in)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   565
                if(LANG.isArray(schema.resultFields)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   566
                    // Parse results data
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   567
                    data_out = SchemaArray._parseResults(schema.resultFields, data_in, data_out);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   568
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   569
                else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   570
                    data_out.results = data_in;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   571
                    Y.log("Schema resultFields property not found: " + Y.dump(schema), "warn", "dataschema-array");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   572
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   573
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   574
            else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   575
                Y.log("Array data could not be schema-parsed: " + Y.dump(data) + " " + Y.dump(data), "error", "dataschema-array");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   576
                data_out.error = new Error("Array schema parse failure");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   577
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   578
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   579
            return data_out;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   580
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   581
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   582
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   583
         * Schema-parsed list of results from full data
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   584
         *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   585
         * @method _parseResults
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   586
         * @param fields {Array} Schema to parse against.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   587
         * @param array_in {Array} Array to parse.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   588
         * @param data_out {Object} In-progress parsed data to update.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   589
         * @return {Object} Parsed data object.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   590
         * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   591
         * @protected
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   592
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   593
        _parseResults: function(fields, array_in, data_out) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   594
            var results = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   595
                result, item, type, field, key, value, i, j;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   596
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   597
            for(i=array_in.length-1; i>-1; i--) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   598
                result = {};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   599
                item = array_in[i];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   600
                type = (LANG.isObject(item) && !LANG.isFunction(item)) ? 2 : (LANG.isArray(item)) ? 1 : (LANG.isString(item)) ? 0 : -1;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   601
                if(type > 0) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   602
                    for(j=fields.length-1; j>-1; j--) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   603
                        field = fields[j];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   604
                        key = (!LANG.isUndefined(field.key)) ? field.key : field;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   605
                        value = (!LANG.isUndefined(item[key])) ? item[key] : item[j];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   606
                        result[key] = Y.DataSchema.Base.parse(value, field);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   607
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   608
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   609
                else if(type === 0) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   610
                    result = item;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   611
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   612
                else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   613
                    //TODO: null or {}?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   614
                    result = null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   615
                    Y.log("Unexpected type while parsing array: " + Y.dump(item), "warn", "dataschema-array");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   616
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   617
                results[i] = result;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   618
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   619
            data_out.results = results;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   620
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   621
            return data_out;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   622
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   623
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   624
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   625
Y.DataSchema.Array = Y.mix(SchemaArray, Y.DataSchema.Base);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   626
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   627
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   628
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   629
}, '3.0.0b1' ,{requires:['dataschema-base']});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   630
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   631
YUI.add('dataschema-text', function(Y) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   632
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   633
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   634
 * Provides a DataSchema implementation which can be used to work with delimited text data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   635
 *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   636
 * @module dataschema
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   637
 * @submodule dataschema-text
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   638
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   639
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   640
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   641
 * Text subclass for the DataSchema Utility.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   642
 * @class DataSchema.Text
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   643
 * @extends DataSchema.Base
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   644
 * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   645
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   646
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   647
var LANG = Y.Lang,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   648
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   649
    SchemaText = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   650
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   651
        /////////////////////////////////////////////////////////////////////////////
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   652
        //
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   653
        // DataSchema.Text static methods
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   654
        //
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   655
        /////////////////////////////////////////////////////////////////////////////
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   656
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   657
         * Applies a given schema to given delimited text data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   658
         *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   659
         * @method apply
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   660
         * @param schema {Object} Schema to apply.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   661
         * @param data {Object} Text data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   662
         * @return {Object} Schema-parsed data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   663
         * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   664
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   665
        apply: function(schema, data) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   666
            var data_in = data,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   667
                data_out = {results:[],meta:{}};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   668
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   669
            if(LANG.isString(data_in) && LANG.isString(schema.resultDelimiter)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   670
                // Parse results data
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   671
                data_out = SchemaText._parseResults(schema, data_in, data_out);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   672
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   673
            else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   674
                Y.log("Text data could not be schema-parsed: " + Y.dump(data) + " " + Y.dump(data), "error", "dataschema-text");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   675
                data_out.error = new Error("Text schema parse failure");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   676
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   677
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   678
            return data_out;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   679
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   680
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   681
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   682
         * Schema-parsed list of results from full data
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   683
         *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   684
         * @method _parseResults
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   685
         * @param schema {Array} Schema to parse against.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   686
         * @param text_in {String} Text to parse.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   687
         * @param data_out {Object} In-progress parsed data to update.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   688
         * @return {Object} Parsed data object.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   689
         * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   690
         * @protected
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   691
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   692
        _parseResults: function(schema, text_in, data_out) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   693
            var resultDelim = schema.resultDelimiter,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   694
                results = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   695
                results_in, fields_in, result, item, fields, field, key, value, i, j,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   696
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   697
            // Delete final delimiter at end of string if there
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   698
            tmpLength = text_in.length-resultDelim.length;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   699
            if(text_in.substr(tmpLength) == resultDelim) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   700
                text_in = text_in.substr(0, tmpLength);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   701
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   702
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   703
            // Split into results
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   704
            results_in = text_in.split(schema.resultDelimiter);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   705
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   706
            for(i=results_in.length-1; i>-1; i--) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   707
                result = {};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   708
                item = results_in[i];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   709
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   710
                if(LANG.isString(schema.fieldDelimiter)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   711
                    fields_in = item.split(schema.fieldDelimiter);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   712
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   713
                    if(LANG.isArray(schema.resultFields)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   714
                        fields = schema.resultFields;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   715
                        for(j=fields.length-1; j>-1; j--) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   716
                            field = fields[j];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   717
                            key = (!LANG.isUndefined(field.key)) ? field.key : field;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   718
                            value = (!LANG.isUndefined(fields_in[key])) ? fields_in[key] : fields_in[j];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   719
                            result[key] = Y.DataSchema.Base.parse(value, field);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   720
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   721
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   722
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   723
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   724
                else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   725
                    result = item;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   726
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   727
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   728
                results[i] = result;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   729
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   730
            data_out.results = results;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   731
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   732
            return data_out;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   733
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   734
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   735
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   736
Y.DataSchema.Text = Y.mix(SchemaText, Y.DataSchema.Base);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   737
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   738
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   739
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   740
}, '3.0.0b1' ,{requires:['dataschema-base']});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   741
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   742
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   743
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   744
YUI.add('dataschema', function(Y){}, '3.0.0b1' ,{use:['dataschema-base','dataschema-json','dataschema-xml','dataschema-array','dataschema-text']});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   745