// Here's the basic API: // var UR = new URInterface('http://server/api_root'); // var gsc_pse = UR.get_class('GSC::PSE'); // var pse_obj = gsc_pse.get(10001); function construct_xmlhttp() { var xmlhttp = null; if (window.XMLHttpRequest) { xmlhttp = new XMLHttpRequest(); if ( typeof xmlhttp.overrideMimeType != 'undefined') { xmlhttp.overrideMimeType('text/xml'); } } else if (window.ActiveXObject) { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } else { alert('Perhaps your browser does not support xmlhttprequests?'); } return xmlhttp; } // a URInterface holds the info to connect to the server function URInterface(base_url) { this.base_url = base_url; this.get_class = function(class_name) { return new URClassInterface(this.base_url, class_name); } this.commit = function() { var url = this.base_url + '/class/UR/Context'; do_rpc(url, 'commit', []); } } function do_rpc(url, method,arglist) { // There must be some strange scoping rules going on here. // To get the struct encoded properly, I need to copy the passed-in // array to a local one. var params = new Array; for (var i = 0; i < arglist.length; i++) { params.push(arglist[i]); } var json_rpc = { "method":method,"params":params }; //var json_rpc = { "method":method, "params":arglist }; xmlhttp = construct_xmlhttp(); xmlhttp.open('POST', url, false); post_data = json_rpc.toJSONString(); xmlhttp.send(post_data); var resultstring = xmlhttp.responseText; var resultobj = resultstring.parseJSON(); if (resultobj.error) { alert(resultobj.error); return null; } return resultobj.result; } // a URClassInterface holds the info necessary for getting instances of a class from the server function URClassInterface(base_url,class_name) { this.class_name = class_name; var path_parts = new Array; path_parts = class_name.split('::'); this.url = base_url + '/class/' + path_parts.join('/'); var result = do_rpc(this.url, '_get_class_info', []); this.id_properties = result[0]["id_properties"]; this.properties = result[0]["properties"]; this.methods = result[0]["methods"]; this.get = function() { var returned_list = do_rpc(this.url, 'get', arguments); var retval = new Array; for(var i = 0; i < returned_list.length; i++) { delete returned_list[i].db_committed; delete returned_list[i].toJSONString; var obj_url = base_url + '/obj/' + path_parts.join('/') + '/' + returned_list[i].id; var theobj = new URObject(returned_list[i], obj_url); theobj.add_methods(this.properties); theobj.add_methods(this.methods); retval.push(theobj); } return retval; }; } // Yer basic object instance from the server. For now it holds all the attributes // of an object. But we'll move it to only holding ID properties soonly function URObject(thing,url) { for (var i in thing) { this[i] = thing[i]; } this.url = url; this.tableize = function(display_location) { var table = ''; for (var i in this) { if (typeof(this[i]) == 'function') { continue; } table += ''; } table += '
' + this.object_type + '
KeyValue
' + i + '' + this[i] + '
'; var orig_data = document.getElementById(display_location).innerHTML; document.getElementById(display_location).innerHTML = orig_data + table; }; this.add_methods = function(method_names) { for (var i = 0; i < method_names.length; i++) { var method_name = method_names[i]; this[method_name] = function() { do_rpc(this.url, method_name, arguments); } } }; this.call = function(method,arglist) { //var arglist = new Array; //for (var i = 1; i < arguments.length; i++) { // arglist.push(arguments[i]); //} var returned_list = do_rpc(this.url, method, arglist); return returned_list; }; }