summaryrefslogtreecommitdiffstats
path: root/sca-cpp/trunk/modules/js/htdocs/component.js
diff options
context:
space:
mode:
authorjsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68>2010-12-30 08:52:51 +0000
committerjsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68>2010-12-30 08:52:51 +0000
commit1b037113fa3f05890a0fd7dcd4851d2141701e16 (patch)
tree48c802c744ce7372c721c67d69708087d4e0ad13 /sca-cpp/trunk/modules/js/htdocs/component.js
parent220c8771ec8948ef80d115e828ccd7bf28126bcc (diff)
Simplify and cleanup HTTP binding client Javascript code, now portable across browsers.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1053824 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'sca-cpp/trunk/modules/js/htdocs/component.js')
-rw-r--r--sca-cpp/trunk/modules/js/htdocs/component.js664
1 files changed, 298 insertions, 366 deletions
diff --git a/sca-cpp/trunk/modules/js/htdocs/component.js b/sca-cpp/trunk/modules/js/htdocs/component.js
index 9ce6aa86e5..9907e955c9 100644
--- a/sca-cpp/trunk/modules/js/htdocs/component.js
+++ b/sca-cpp/trunk/modules/js/htdocs/component.js
@@ -38,37 +38,31 @@ var JSONClient = new Object();
JSONClient.escapeJSONChar = function(c) {
if(c == "\"" || c == "\\") return "\\" + c;
- else if (c == "\b") return "\\b";
- else if (c == "\f") return "\\f";
- else if (c == "\n") return "\\n";
- else if (c == "\r") return "\\r";
- else if (c == "\t") return "\\t";
+ if (c == "\b") return "\\b";
+ if (c == "\f") return "\\f";
+ if (c == "\n") return "\\n";
+ if (c == "\r") return "\\r";
+ if (c == "\t") return "\\t";
var hex = c.charCodeAt(0).toString(16);
if(hex.length == 1) return "\\u000" + hex;
- else if(hex.length == 2) return "\\u00" + hex;
- else if(hex.length == 3) return "\\u0" + hex;
- else return "\\u" + hex;
+ if(hex.length == 2) return "\\u00" + hex;
+ if(hex.length == 3) return "\\u0" + hex;
+ return "\\u" + hex;
};
/**
* Encode a string into JSON format.
*/
JSONClient.escapeJSONString = function(s) {
- /* The following should suffice but Safari's regex is broken
- (doesn't support callback substitutions)
- return "\"" + s.replace(/([^\u0020-\u007f]|[\\\"])/g,
- JSONClient.escapeJSONChar) + "\"";
- */
+ // The following should suffice but Safari's regex is broken (doesn't support callback substitutions)
+ // return "\"" + s.replace(/([^\u0020-\u007f]|[\\\"])/g, JSONClient.escapeJSONChar) + "\"";
- /* Rather inefficient way to do it */
+ // Rather inefficient way to do it
var parts = s.split("");
for(var i = 0; i < parts.length; i++) {
- var c = parts[i];
- if(c == '"' ||
- c == '\\' ||
- c.charCodeAt(0) < 32 ||
- c.charCodeAt(0) >= 128)
- parts[i] = JSONClient.escapeJSONChar(parts[i]);
+ var c = parts[i];
+ if(c == '"' || c == '\\' || c.charCodeAt(0) < 32 || c.charCodeAt(0) >= 128)
+ parts[i] = JSONClient.escapeJSONChar(parts[i]);
}
return "\"" + parts.join("") + "\"";
};
@@ -77,29 +71,32 @@ JSONClient.escapeJSONString = function(s) {
* Marshall objects to JSON format.
*/
JSONClient.toJSON = function(o) {
- if(o == null) {
+ if(o == null)
return "null";
- } else if(o.constructor == String) {
+ if(o.constructor == String)
return JSONClient.escapeJSONString(o);
- } else if(o.constructor == Number) {
+ if(o.constructor == Number)
return o.toString();
- } else if(o.constructor == Boolean) {
+ if(o.constructor == Boolean)
return o.toString();
- } else if(o.constructor == Date) {
+ if(o.constructor == Date)
return '{javaClass: "java.util.Date", time: ' + o.valueOf() +'}';
- } else if(o.constructor == Array) {
+ if(o.constructor == Array) {
var v = [];
- for(var i = 0; i < o.length; i++) v.push(JSONClient.toJSON(o[i]));
+ for(var i = 0; i < o.length; i++)
+ v.push(JSONClient.toJSON(o[i]));
return "[" + v.join(", ") + "]";
- } else {
- var v = [];
- for(attr in o) {
- if(o[attr] == null) v.push("\"" + attr + "\": null");
- else if(typeof o[attr] == "function"); /* skip */
- else v.push(JSONClient.escapeJSONString(attr) + ": " + JSONClient.toJSON(o[attr]));
- }
- return "{" + v.join(", ") + "}";
}
+ var v = [];
+ for(attr in o) {
+ if(o[attr] == null)
+ v.push("\"" + attr + "\": null");
+ else if(typeof o[attr] == "function")
+ ; // Skip
+ else
+ v.push(JSONClient.escapeJSONString(attr) + ": " + JSONClient.toJSON(o[attr]));
+ }
+ return "{" + v.join(", ") + "}";
};
/**
@@ -108,411 +105,346 @@ JSONClient.toJSON = function(o) {
function HTTPBindingClient(cname, uri, objectID) {
this.uri = "/references/" + cname + "/" + uri;
this.objectID = objectID;
- this.apply = this._createApplyMethod();
-
- if (typeof DOMParser == "undefined") {
- DOMParser = function () {}
-
- DOMParser.prototype.parseFromString = function (str, contentType) {
- if (typeof ActiveXObject != "undefined") {
- var d = new ActiveXObject("MSXML.DomDocument");
- d.loadXML(str);
- return d;
- } else if (typeof XMLHttpRequest != "undefined") {
- var req = new XMLHttpRequest;
- req.open("GET", "data:" + (contentType || "application/xml") +
- ";charset=utf-8," + encodeURIComponent(str), false);
- if (req.overrideMimeType) {
- req.overrideMimeType(contentType);
- }
- req.send(null);
- return req.responseXML;
- }
- }
- }
+ this.apply = this.createApplyMethod();
}
/**
- * HTTPBindingClient.Exception.
- */
-HTTPBindingClient.Exception = function(code, message, javaStack) {
- this.code = code;
- var name;
- if(javaStack) {
- this.javaStack = javaStack;
- var m = javaStack.match(/^([^:]*)/);
- if(m) name = m[0];
- }
- if(name) this.name = name;
- else this.name = "HTTPBindingClientException";
- this.message = message;
-};
-
-HTTPBindingClient.Exception.CODE_REMOTE_EXCEPTION = 490;
-HTTPBindingClient.Exception.CODE_ERR_CLIENT = 550;
-HTTPBindingClient.Exception.CODE_ERR_PARSE = 590;
-HTTPBindingClient.Exception.CODE_ERR_NOMETHOD = 591;
-HTTPBindingClient.Exception.CODE_ERR_UNMARSHALL = 592;
-HTTPBindingClient.Exception.CODE_ERR_MARSHALL = 593;
-
-HTTPBindingClient.Exception.prototype = new Error();
-HTTPBindingClient.Exception.prototype.toString = function(code, msg) {
- return this.name + ": " + this.message;
-};
-
-/**
- * Default top level exception handler.
+ * JSON-RPC request counter.
*/
-HTTPBindingClient.default_ex_handler = function(e) {
- alert(e);
-};
+HTTPBindingClient.jsonrpcID = 1;
/**
- * Client settable variables
+ * HTTPBindingClient implementation
*/
-HTTPBindingClient.toplevel_ex_handler = HTTPBindingClient.default_ex_handler;
-HTTPBindingClient.profile_async = false;
-HTTPBindingClient.max_req_active = 1;
-HTTPBindingClient.requestId = 1;
/**
- * HTTPBindingClient implementation
+ * Generate client proxy apply method.
*/
-HTTPBindingClient.prototype._createApplyMethod = function() {
+HTTPBindingClient.prototype.createApplyMethod = function() {
var fn = function() {
- var args = [];
- var callback = null;
var methodName = arguments[0];
- for(var i = 1; i < arguments.length; i++) args.push(arguments[i]);
+ var args = [];
+ for(var i = 1; i < arguments.length; i++)
+ args.push(arguments[i]);
- if(typeof args[args.length - 1] == "function") callback = args.pop();
+ var cb = null;
+ if (typeof args[args.length - 1] == "function")
+ cb = args.pop();
- var req = fn.client._makeRequest.call(fn.client, methodName, args, callback);
- if(callback == null) {
- return fn.client._sendRequest.call(fn.client, req);
- } else {
- HTTPBindingClient.async_requests.push(req);
- HTTPBindingClient.kick_async();
- return req.requestId;
- }
+ var req = HTTPBindingClient.makeJSONRequest(methodName, args, cb);
+ return fn.client.jsonApply(req);
};
fn.client = this;
return fn;
};
-HTTPBindingClient._getCharsetFromHeaders = function(http) {
- try {
- var contentType = http.getResponseHeader("Content-type");
- var parts = contentType.split(/\s*;\s*/);
- for(var i = 0; i < parts.length; i++) {
- if(parts[i].substring(0, 8) == "charset=")
- return parts[i].substring(8, parts[i].length);
- }
- } catch (e) {}
- return "UTF-8";
+/**
+ * Make a JSON-RPC request.
+ */
+HTTPBindingClient.makeJSONRequest = function(methodName, args, cb) {
+ var req = {};
+ req.id = HTTPBindingClient.jsonrpcID++;
+ if (cb)
+ req.cb = cb;
+ var obj = {};
+ obj.id = req.id;
+ obj.method = methodName;
+ obj.params = args;
+ req.data = JSONClient.toJSON(obj);
+ return req;
};
/**
- * Async queue globals
+ * Return the JSON result from an XMLHttpRequest.
*/
-HTTPBindingClient.async_requests = [];
-HTTPBindingClient.async_inflight = {};
-HTTPBindingClient.async_responses = [];
-HTTPBindingClient.async_timeout = null;
-HTTPBindingClient.num_req_active = 0;
-
-HTTPBindingClient._async_handler = function() {
- HTTPBindingClient.async_timeout = null;
-
- while(HTTPBindingClient.async_responses.length > 0) {
- var res = HTTPBindingClient.async_responses.shift();
- if(res.canceled) continue;
- if(res.profile) res.profile.dispatch = new Date();
+HTTPBindingClient.jsonResult = function(http) {
+ // Get the charset
+ function httpCharset(http) {
try {
- res.cb(res.result, res.ex, res.profile);
- } catch(e) {
- HTTPBindingClient.toplevel_ex_handler(e);
- }
- }
-
- while(HTTPBindingClient.async_requests.length > 0 && HTTPBindingClient.num_req_active < HTTPBindingClient.max_req_active) {
- var req = HTTPBindingClient.async_requests.shift();
- if(req.canceled) continue;
- req.client._sendRequest.call(req.client, req);
+ var contentType = http.getResponseHeader("Content-type");
+ var parts = contentType.split(/\s*;\s*/);
+ for (var i = 0; i < parts.length; i++) {
+ if (parts[i].substring(0, 8) == "charset=")
+ return parts[i].substring(8, parts[i].length);
+ }
+ } catch (e) {}
+ return "UTF-8";
}
-};
+ if(!HTTPBindingClient.charset)
+ HTTPBindingClient.charset = httpCharset(http);
-HTTPBindingClient.kick_async = function() {
- if(HTTPBindingClient.async_timeout == null)
- HTTPBindingClient.async_timeout = setTimeout(HTTPBindingClient._async_handler, 0);
+ // Unmarshall the JSON response
+ var data = http.responseText;
+ var obj;
+ eval("obj = " + data);
+ if(obj.error)
+ throw new HTTPBindingClient.Exception(obj.error.code, obj.error.msg);
+ var res = obj.result;
+ return res;
};
-HTTPBindingClient.cancelRequest = function(requestId) {
- /* If it is in flight then mark it as canceled in the inflight map
- and the XMLHttpRequest callback will discard the reply. */
- if(HTTPBindingClient.async_inflight[requestId]) {
- HTTPBindingClient.async_inflight[requestId].canceled = true;
- return true;
- }
+/**
+ * Apply a function remotely using JSON-RPC.
+ */
+HTTPBindingClient.prototype.jsonApply = function(req) {
+ // Connect to the service
+ var http = HTTPBindingClient.getHTTPRequest();
+ var hascb = req.cb? true : false;
+ http.open("POST", this.uri, hascb);
+ http.setRequestHeader("Content-type", "application/json-rpc");
- /* If its not in flight yet then we can just mark it as canceled in
- the the request queue and it will get discarded before being sent. */
- for(var i in HTTPBindingClient.async_requests) {
- if(HTTPBindingClient.async_requests[i].requestId == requestId) {
- HTTPBindingClient.async_requests[i].canceled = true;
- return true;
- }
- }
+ // Construct call back if we have one
+ if(hascb) {
+ http.onreadystatechange = function() {
+ if(http.readyState == 4) {
+ // Pass the result or exception
+ if(http.status == 200) {
+ var res = null;
+ try {
+ res = HTTPBindingClient.jsonResult(http);
+ } catch(e) {
+ req.cb(null, e);
+ }
+ req.cb(res);
+ } else
+ req.cb(null, HTTPBindingClient.Exception(http.status, http.statusText));
+ }
+ };
- /* It may have returned from the network and be waiting for its callback
- to be dispatched, so mark it as canceled in the response queue
- and the response will get discarded before calling the callback. */
- for(var i in HTTPBindingClient.async_responses) {
- if(HTTPBindingClient.async_responses[i].requestId == requestId) {
- HTTPBindingClient.async_responses[i].canceled = true;
- return true;
- }
+ // Send the request
+ http.send(req.data);
+ return req.id;
}
- return false;
+ // Send the request and return the result or exception
+ http.send(req.data);
+ if (http.status == 200)
+ return HTTPBindingClient.jsonResult(http);
+ throw new HTTPBindingClient.Exception(http.status, http.statusText);
};
-HTTPBindingClient.prototype._makeRequest = function(methodName, args, cb) {
- var req = {};
- req.client = this;
- req.requestId = HTTPBindingClient.requestId++;
+/**
+ * Return the XML Document result from an XMLHTTPRequest.
+ */
+HTTPBindingClient.xmlResult = function(http) {
+ if(!http.responseXML || http.responseXML.childNodes.length == 0)
+ return (new DOMParser()).parseFromString(http.responseText, "text/xml");
+ return http.responseXML;
+}
- var obj = {};
- obj.id = req.requestId;
- if (this.objectID)
- obj.method = ".obj#" + this.objectID + "." + methodName;
- else
- obj.method = methodName;
- obj.params = args;
+/**
+ * REST ATOMPub GET method.
+ */
+HTTPBindingClient.prototype.get = function(id, cb) {
+ // Connect to the service
+ var http = HTTPBindingClient.getHTTPRequest();
+ var hascb = cb? true : false;
+ http.open("GET", this.uri + '/' + id, hascb);
+
+ // Construct call back if we have one
+ if (hascb) {
+ http.onreadystatechange = function() {
+ if (http.readyState == 4) {
+ // Pass the result or exception
+ if (http.status == 200) {
+ var res = null;
+ try {
+ res = HTTPBindingClient.xmlResult(http);
+ } catch (e) {
+ cb(null, e);
+ }
+ cb(res);
+ } else
+ cb(null, new HTTPBindingClient.Exception(http.status, http.statusText));
+ }
+ };
- if (cb) req.cb = cb;
- if (HTTPBindingClient.profile_async)
- req.profile = { "submit": new Date() };
- req.data = JSONClient.toJSON(obj);
+ // Send the request
+ http.send(null);
+ return true;
+ }
- return req;
+ // Send the request and return the result or exception
+ http.send(null);
+ if (http.status == 200)
+ return HTTPBindingClient.xmlResult(http);
+ throw new HTTPBindingClient.Exception(http.status, http.statusText);
};
-HTTPBindingClient.prototype._sendRequest = function(req) {
- if(req.profile) req.profile.start = new Date();
-
- /* Get free http object from the pool */
- var http = HTTPBindingClient.poolGetHTTPRequest();
- HTTPBindingClient.num_req_active++;
-
- /* Send the request */
- http.open("POST", this.uri, (req.cb != null));
- http.setRequestHeader("Content-type", "application/json-rpc");
-
- /* Construct call back if we have one */
- if(req.cb) {
- var self = this;
+/**
+ * REST ATOMPub POST method.
+ */
+HTTPBindingClient.prototype.post = function (entry, cb) {
+ // Connect to the service
+ var http = HTTPBindingClient.getHTTPRequest();
+ var hascb = cb? true : false;
+ http.open("POST", this.uri, hascb);
+ http.setRequestHeader("Content-Type", "application/atom+xml");
+
+ // Construct call back if we have one
+ if (hascb) {
http.onreadystatechange = function() {
- if(http.readyState == 4) {
- http.onreadystatechange = function () {};
- var res = { "cb": req.cb, "result": null, "ex": null};
- if (req.profile) {
- res.profile = req.profile;
- res.profile.end = new Date();
- }
- try { res.result = self._handleResponse(http); }
- catch(e) { res.ex = e; }
- if(!HTTPBindingClient.async_inflight[req.requestId].canceled)
- HTTPBindingClient.async_responses.push(res);
- delete HTTPBindingClient.async_inflight[req.requestId];
- HTTPBindingClient.kick_async();
+ // Pass the result or exception
+ if (http.readyState == 4) {
+ if (http.status == 201) {
+ var res = null;
+ try {
+ res = HTTPBindingClient.xmlResult(http);
+ } catch (e) {
+ cb(null, e);
+ }
+ cb(res);
+ } else
+ cb(null, new HTTPBindingClient.Exception(http.status, http.statusText));
}
};
- } else {
- http.onreadystatechange = function() {};
- }
-
- HTTPBindingClient.async_inflight[req.requestId] = req;
-
- try {
- http.send(req.data);
- } catch(e) {
- HTTPBindingClient.poolReturnHTTPRequest(http);
- HTTPBindingClient.num_req_active--;
- throw new HTTPBindingClient.Exception(HTTPBindingClient.Exception.CODE_ERR_CLIENT, "Connection failed");
+ // Send the request
+ http.send(entry);
+ return true;
}
- if(!req.cb) return this._handleResponse(http);
+ // Send the request and return the result or exception
+ http.send(entry);
+ if (http.status == 201)
+ return HTTPBindingClient.xmlResult(http);
+ throw new HTTPBindingClient.Exception(http.status, http.statusText);
};
-HTTPBindingClient.prototype._handleResponse = function(http) {
- /* Get the charset */
- if(!this.charset) {
- this.charset = HTTPBindingClient._getCharsetFromHeaders(http);
- }
-
- /* Get request results */
- var status, statusText, data;
- try {
- status = http.status;
- statusText = http.statusText;
- data = http.responseText;
- } catch(e) {
- HTTPBindingClient.poolReturnHTTPRequest(http);
- HTTPBindingClient.num_req_active--;
- HTTPBindingClient.kick_async();
- throw new HTTPBindingClient.Exception(HTTPBindingClient.Exception.CODE_ERR_CLIENT, "Connection failed");
+/**
+ * REST ATOMPub PUT method.
+ */
+HTTPBindingClient.prototype.put = function (id, entry, cb) {
+ // Connect to the service
+ var http = HTTPBindingClient.getHTTPRequest();
+ var hascb = cb? true : false;
+ http.open("PUT", this.uri + '/' + id, hascb);
+ http.setRequestHeader("Content-Type", "application/atom+xml");
+
+ // Construct call back if we have one
+ if (hascb) {
+ http.onreadystatechange = function() {
+ if (http.readyState == 4) {
+ // Pass any exception
+ if (http.status == 200)
+ cb();
+ else
+ cb(new HTTPBindingClient.Exception(http.status, http.statusText));
+ }
+ };
+ // Send the request
+ http.send(entry);
+ return true;
}
- /* Return http object to the pool; */
- HTTPBindingClient.poolReturnHTTPRequest(http);
- HTTPBindingClient.num_req_active--;
+ // Send the request and return any exception
+ http.send(entry);
+ if (http.status == 200)
+ return true;
+ throw new HTTPBindingClient.Exception(http.status, http.statusText);
+};
- /* Unmarshall the response */
- if(status != 200) {
- throw new HTTPBindingClient.Exception(status, statusText);
- }
- var obj;
- try {
- eval("obj = " + data);
- } catch(e) {
- throw new HTTPBindingClient.Exception(550, "error parsing result");
+/**
+ * REST ATOMPub DELETE method.
+ */
+HTTPBindingClient.prototype.del = function (id, cb) {
+ // Connect to the service
+ var http = HTTPBindingClient.getHTTPRequest();
+ var hascb = cb? true : false;
+ http.open("DELETE", this.uri + '/' + id, hascb);
+
+ // Construct call back if we have one
+ if (cb) {
+ http.onreadystatechange = function() {
+ if (http.readyState == 4) {
+ // Pass any exception
+ if (http.status == 200)
+ cb();
+ else
+ cb(new HTTPBindingClient.Exception(http.status, http.statusText));
+ }
+ };
+ // Send the request
+ http.send(null);
+ return true;
}
- if(obj.error)
- throw new HTTPBindingClient.Exception(obj.error.code, obj.error.msg, obj.error.trace);
- var res = obj.result;
-
- /* Handle CallableProxy */
- if(res && res.objectID && res.JSONRPCType == "CallableReference")
- return new HTTPBindingClient(this.uri, res.objectID);
- return res;
+ // Send the request and return any exception
+ http.send(null);
+ if (http.status == 200)
+ return true;
+ throw new HTTPBindingClient.Exception(http.status, http.statusText);
};
-
/**
- * XMLHttpRequest wrapper code
+ * HTTPBindingClient exceptions.
*/
-HTTPBindingClient.http_spare = [];
-HTTPBindingClient.http_max_spare = 8;
-
-HTTPBindingClient.poolGetHTTPRequest = function() {
- if(HTTPBindingClient.http_spare.length > 0) {
- return HTTPBindingClient.http_spare.pop();
- }
- return HTTPBindingClient.getHTTPRequest();
+HTTPBindingClient.Exception = function(code, message) {
+ this.name = "HTTPBindingClientException";
+ this.code = code;
+ this.message = message;
};
-HTTPBindingClient.poolReturnHTTPRequest = function(http) {
- if(HTTPBindingClient.http_spare.length >= HTTPBindingClient.http_max_spare)
- delete http;
- else
- HTTPBindingClient.http_spare.push(http);
+HTTPBindingClient.Exception.prototype = new Error();
+
+HTTPBindingClient.Exception.prototype.toString = function() {
+ return this.name + ": " + this.message;
};
-HTTPBindingClient.msxmlNames = [ "MSXML2.XMLHTTP.5.0",
- "MSXML2.XMLHTTP.4.0",
- "MSXML2.XMLHTTP.3.0",
- "MSXML2.XMLHTTP",
- "Microsoft.XMLHTTP" ];
+/**
+ * XMLHttpRequest wrapper.
+ */
+HTTPBindingClient.msxmlNames = [ "MSXML2.XMLHTTP.5.0", "MSXML2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP" ];
HTTPBindingClient.getHTTPRequest = function() {
- /* Mozilla XMLHttpRequest */
+ if (HTTPBindingClient.httpFactory)
+ return HTTPBindingClient.httpFactory();
+
+ // Mozilla XMLHttpRequest
try {
- HTTPBindingClient.httpObjectName = "XMLHttpRequest";
- return new XMLHttpRequest();
+ HTTPBindingClient.httpFactory = function() {
+ return new XMLHttpRequest();
+ };
+ return HTTPBindingClient.httpFactory();
} catch(e) {}
- /* Microsoft MSXML ActiveX */
- for (var i=0; i < HTTPBindingClient.msxmlNames.length; i++) {
+ // Microsoft MSXML ActiveX
+ for (var i = 0; i < HTTPBindingClient.msxmlNames.length; i++) {
try {
- HTTPBindingClient.httpObjectName = HTTPBindingClient.msxmlNames[i];
- return new ActiveXObject(HTTPBindingClient.msxmlNames[i]);
+ HTTPBindingClient.httpFactory = function() {
+ return new ActiveXObject(HTTPBindingClient.msxmlNames[i]);
+ };
+ return HTTPBindingClient.httpFactory();
} catch (e) {}
}
- /* None found */
- HTTPBindingClient.httpObjectName = null;
+ // Can't create XMLHttpRequest
+ HTTPBindingClient.httpFactory = null;
throw new HTTPBindingClient.Exception(0, "Can't create XMLHttpRequest object");
};
-
-HTTPBindingClient.prototype.get = function(id, responseFunction) {
- var xhr = HTTPBindingClient.getHTTPRequest();
- xhr.onreadystatechange = function() {
- if (xhr.readyState == 4) {
- if (xhr.status == 200) {
- var strDocument = xhr.responseText;
- var xmlDocument = xhr.responseXML;
- if(!xmlDocument || xmlDocument.childNodes.length==0){
- xmlDocument = (new DOMParser()).parseFromString(strDocument, "text/xml");
- }
- if (responseFunction != null) responseFunction(xmlDocument);
- } else {
- alert("get - Error getting data from the server");
- }
- }
- }
- xhr.open("GET", this.uri + '/' + id, true);
- xhr.send(null);
-};
-
-HTTPBindingClient.prototype.post = function (entry, responseFunction) {
- var xhr = HTTPBindingClient.getHTTPRequest();
- xhr.onreadystatechange = function() {
- if (xhr.readyState == 4) {
- if (xhr.status == 201) {
- var strDocument = xhr.responseText;
- var xmlDocument = xhr.responseXML;
- if(!xmlDocument || xmlDocument.childNodes.length==0){
- xmlDocument = (new DOMParser()).parseFromString(strDocument, "text/xml");
- }
- if (responseFunction != null) responseFunction(xmlDocument);
- } else {
- alert("post - Error getting data from the server");
- }
- }
- }
- xhr.open("POST", this.uri, true);
- xhr.setRequestHeader("Content-Type", "application/atom+xml;type=entry");
- xhr.send(entry);
-};
-
-HTTPBindingClient.prototype.put = function (id, entry, responseFunction) {
- var xhr = HTTPBindingClient.getHTTPRequest();
- xhr.onreadystatechange = function() {
- if (xhr.readyState == 4) {
- if (xhr.status == 200) {
- var strDocument = xhr.responseText;
- var xmlDocument = xhr.responseXML;
- if(!xmlDocument || xmlDocument.childNodes.length==0){
- xmlDocument = (new DOMParser()).parseFromString(strDocument, "text/xml");
- }
- if (responseFunction != null) responseFunction(xmlDocument);
- } else {
- alert("put - Error getting data from the server");
- }
- }
- }
- xhr.open("PUT", this.uri + '/' + id, true);
- xhr.setRequestHeader("Content-Type", "application/atom+xml;type=entry");
- xhr.send(entry);
-};
-
-HTTPBindingClient.prototype.del = function (id, responseFunction) {
- var xhr = HTTPBindingClient.getHTTPRequest();
- xhr.onreadystatechange = function() {
- if (xhr.readyState == 4) {
- if (xhr.status == 200) {
- if (responseFunction != null) responseFunction();
- } else {
- alert("delete - Error getting data from the server");
+/**
+ * DOM parser wrapper.
+ */
+if (typeof DOMParser == "undefined") {
+ DOMParser = function() {}
+
+ DOMParser.prototype.parseFromString = function (str, contentType) {
+ if (typeof ActiveXObject != "undefined") {
+ var d = new ActiveXObject("MSXML.DomDocument");
+ d.loadXML(str);
+ return d;
+ } else if (typeof XMLHttpRequest != "undefined") {
+ var req = new XMLHttpRequest;
+ req.open("GET", "data:" + (contentType || "application/xml") +
+ ";charset=utf-8," + encodeURIComponent(str), false);
+ if (req.overrideMimeType) {
+ req.overrideMimeType(contentType);
}
+ req.send(null);
+ return req.responseXML;
}
}
- xhr.open("DELETE", this.uri + '/' + id, true);
- xhr.send(null);
-};
+}
/**
* Public API.