Author: hqm
Date: 2007-10-15 19:36:23 -0700 (Mon, 15 Oct 2007)
New Revision: 6855
Modified:
openlaszlo/trunk/WEB-INF/lps/lfc/data/LzHTTPDataProvider.lzs
openlaszlo/trunk/WEB-INF/lps/lfc/kernel/dhtml/LzHTTPLoader.js
openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf/LzHTTPLoader.as
openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf/LzLoader.lzs
openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/compiler/NodeModel.java
Log:
Change 20071015-hqm-2 by [EMAIL PROTECTED] on 2007-10-15 16:39:47 EDT
in /cygdrive/c/users/hqm/openlaszlo/trunk
for http://svn.openlaszlo.org/openlaszlo/trunk
Summary: fix dataset timeout event callback
New Features:
Bugs Fixed: LPP-4881
Technical Reviewer: andre
QA Reviewer: pkang
Doc Reviewer:
Documentation:
Release Notes:
Details:
The code in LzHttpDataProvider which dispatched on the datarequest
status type was
always calling loadResponse, which always set the requests status to
error if data was null.
Modified the code in LzHttpDataProcider.loadTimeout to just directly
call the onstatus event
iinstead of calling loadResponse.
DHTML timeout checking code rewritten by andre to be more efficient
Tests:
test/lfc/data/alldata.lzx
amazon app
calendar app
smokecheck
Modified: openlaszlo/trunk/WEB-INF/lps/lfc/data/LzHTTPDataProvider.lzs
===================================================================
--- openlaszlo/trunk/WEB-INF/lps/lfc/data/LzHTTPDataProvider.lzs
2007-10-16 02:30:15 UTC (rev 6854)
+++ openlaszlo/trunk/WEB-INF/lps/lfc/data/LzHTTPDataProvider.lzs
2007-10-16 02:36:23 UTC (rev 6855)
@@ -201,7 +201,7 @@
function loadTimeout( loader, data ) {
var dreq = loader.dataRequest;
dreq.status = LzDataRequest.TIMEOUT;
- loader.owner.loadResponse( dreq, data );
+ dreq.onstatus.sendEvent( dreq );
}
function setRequestError (dreq, msg) {
@@ -220,6 +220,7 @@
// all its values.
var content = null;
+
if (data == null) {
this.setRequestError(dreq, "client could not parse XML from
server");
dreq.onstatus.sendEvent( dreq );
Modified: openlaszlo/trunk/WEB-INF/lps/lfc/kernel/dhtml/LzHTTPLoader.js
===================================================================
--- openlaszlo/trunk/WEB-INF/lps/lfc/kernel/dhtml/LzHTTPLoader.js
2007-10-16 02:30:15 UTC (rev 6854)
+++ openlaszlo/trunk/WEB-INF/lps/lfc/kernel/dhtml/LzHTTPLoader.js
2007-10-16 02:36:23 UTC (rev 6855)
@@ -14,6 +14,8 @@
this.options = {parsexml: true};
this.requestheaders = {};
this.requestmethod = LzHTTPLoader.GET_METHOD;
+
+ this.__loaderid = LzHTTPLoader.loaderIDCounter++;
}
// Default callback handlers
@@ -61,8 +63,10 @@
LzHTTPLoader.prototype.abort = function () {
if (this.req) {
- this.req.cancel();
- // [todo hqm 2006-07 ] +++ abort timeout timer
+ this.__abort = true;
+ this.req.abort();
+ this.req = null;
+ this.removeTimeout(this);
}
}
@@ -113,10 +117,16 @@
// headers can be a hashtable or null
LzHTTPLoader.prototype.open = function (method, url, username, password) {
- {
+ if (this.req) {
+ Debug.warn("pending request for id=%s", this.__loaderid);
+ }
+
+ {
#pragma "passThrough=true"
this.req = window.XMLHttpRequest? new XMLHttpRequest(): new
ActiveXObject("Microsoft.XMLHTTP");
}
+ this.__abort = false;
+ this.__timeout = false;
this.requesturl = url;
this.requestmethod = method;
@@ -189,7 +199,9 @@
// holds list of outstanding data requests, to handle timeouts
-LzHTTPLoader.activeRequests = [];
+//LzHTTPLoader.activeRequests = [];
+LzHTTPLoader.activeRequests = {};
+LzHTTPLoader.loaderIDCounter = 0;
// Default infinite timeout
LzHTTPLoader.prototype.timeout = Infinity;
@@ -199,49 +211,64 @@
// [todo hqm 2006-07] Should we have an API method for setting LzLoader
timeout?
}
-// Set up a pending timeout for a dataset.
+// Set up a pending timeout for a loader.
+/*
LzHTTPLoader.prototype.setupTimeout = function (obj, duration) {
var endtime = (new Date()).getTime() + duration;
LzHTTPLoader.activeRequests.push(obj, endtime);
setTimeout("LzHTTPLoader.__LZcheckXMLHTTPTimeouts()", duration);
}
+*/
+LzHTTPLoader.prototype.setupTimeout = function (obj, duration) {
+ var endtime = (new Date()).getTime() + duration;
+ //obj.__loaderid = LzHTTPLoader.loaderIDCounter++;//uncomment to give
LzHTTPLoader-instance a new loader-id
+ var lid = obj.__loaderid;
-// Remove a dataset from the timeouts list.
+ LzHTTPLoader.activeRequests[lid] = [obj, endtime];
+ var timeoutid = setTimeout("LzHTTPLoader.__LZcheckXMLHTTPTimeouts(" + lid
+ ")", duration);
+ LzHTTPLoader.activeRequests[lid][2] = timeoutid;
+}
+
+// Remove a loader from the timeouts list.
LzHTTPLoader.prototype.removeTimeout = function (target) {
- var activeReqs = LzHTTPLoader.activeRequests;
- LzHTTPLoader.activeRequests = [];
- // copy every dataset in the list except for the target
- for (var i = 0; i < activeReqs.length; i+=2) {
- var dset = activeReqs[i];
- var dstimeout = activeReqs[i+1];
- if (dset != target) {
- LzHTTPLoader.activeRequests.push(dset, dstimeout);
+ var lid = target.__loaderid;
+ //Debug.write("remove timeout for id=%s", lid);
+ if (lid != null) {
+ var reqarr = LzHTTPLoader.activeRequests[lid];
+ if (reqarr && reqarr[0] === target) {
+ clearTimeout(reqarr[2]);
+ delete LzHTTPLoader.activeRequests[lid];
}
}
}
// Check if any outstanding requests have timed out.
-LzHTTPLoader.__LZcheckXMLHTTPTimeouts = function () {
- var activeReqs = LzHTTPLoader.activeRequests;
- LzHTTPLoader.activeRequests = [];
- for (var i = 0; i < activeReqs.length; i+=2) {
- var loader = activeReqs[i];
- var dstimeout = activeReqs[i+1];
+LzHTTPLoader.__LZcheckXMLHTTPTimeouts = function (lid) {
+ var req = LzHTTPLoader.activeRequests[lid];
+ if (req) {
var now = (new Date()).getTime();
- if (now > dstimeout) {
+ var loader = req[0];
+ var dstimeout = req[1];
+ //Debug.write("diff %d", now - dstimeout);
+ if (now >= dstimeout) {
+ //Debug.write("timeout for %s", lid);
+ delete LzHTTPLoader.activeRequests[lid];
+ loader.__timeout = true;
if (loader.req) {
loader.req.abort();
}
- this.req = null;
+ loader.req = null;
loader.loadTimeout(loader, null);
} else {
// if it hasn't timed out, add it back to the list for the future
- LzHTTPLoader.activeRequests.push(loader, dstimeout);
+ //Debug.write("recheck timeout");
+ var timeoutid =
setTimeout("LzHTTPLoader.__LZcheckXMLHTTPTimeouts(" + lid + ")", now -
dstimeout);
+ req[2] = timeoutid;
}
}
}
-
+
LzHTTPLoader.prototype.getElapsedTime = function () {
return ((new Date()).getTime() - this.gstart);
}
@@ -267,45 +294,58 @@
var __pthis__ = this;
this.req.onreadystatechange = function () {
if (__pthis__.req == null) { return; }
-
+ //Debug.write("readyState=%d", __pthis__.req.readyState);
if (__pthis__.req.readyState == 4) {
- // only if "OK"
- if (__pthis__.req.status == 200 || __pthis__.req.status ==
304) {
- var elt = null;
- var xml = __pthis__.req.responseXML;
- __pthis__.responseXML = xml;
- var lzxdata = null;
- if (xml != null && parsexml) {
- var nodes = __pthis__.req.responseXML.childNodes;
- // find first content (type == 1) child node
- for (var i = 0; i < nodes.length; i++) {
- var child = nodes.item(i);
- if (child.nodeType == 1) {
- elt = child;
- break;
+ if (__pthis__.__timeout) {
+ //Debug.write("timeout for id=%s, xhr=%w",
__pthis__.__loaderid, __pthis__.req);
+ } else if (__pthis__.__abort) {
+ //Debug.write("abort for id=%s, xhr=%w",
__pthis__.__loaderid, __pthis__.req);
+ } else {
+ try {
+ // only if "OK"
+ //Debug.write("status=%d", __pthis__.req.status);
+ if (__pthis__.req.status == 200 ||
__pthis__.req.status == 304) {
+ var elt = null;
+ var xml = __pthis__.req.responseXML;
+ __pthis__.responseXML = xml;
+ var lzxdata = null;
+ if (xml != null && parsexml) {
+ var nodes =
__pthis__.req.responseXML.childNodes;
+ // find first content (type == 1) child node
+ for (var i = 0; i < nodes.length; i++) {
+ var child = nodes.item(i);
+ if (child.nodeType == 1) {
+ elt = child;
+ break;
+ }
+ }
+ lzxdata = LzXMLTranslator.copyXML(elt,
+
__pthis__.options.trimwhitespace,
+
__pthis__.options.nsprefix);
}
+
+ __pthis__.responseText =
__pthis__.req.responseText;
+ __pthis__.removeTimeout(__pthis__);
+
+
+
+ /**** DEBUGGING
+ var xmlSerializer = new XMLSerializer();
+ var markup = xmlSerializer.serializeToString(elt);
+ Debug.write("loadXMLDoc", elt, markup,
d.serialize());
+ *** /DEBUGGING
+ */
+ __pthis__.req = null;
+ __pthis__.loadSuccess(__pthis__, lzxdata);
+ } else {
+ __pthis__.req = null;
+ __pthis__.loadError(__pthis__, null);
}
- lzxdata = LzXMLTranslator.copyXML(elt,
-
__pthis__.options.trimwhitespace,
-
__pthis__.options.nsprefix);
+ } catch (e) {
+ //if you abort a request, readyState will be set to 4,
+ //but reading status will result in an exception (at
least in Firefox).
+ //Debug.write("catched error: %s", e);
}
-
- __pthis__.responseText = __pthis__.req.responseText;
- __pthis__.removeTimeout(__pthis__);
-
-
-
- /**** DEBUGGING
- var xmlSerializer = new XMLSerializer();
- var markup = xmlSerializer.serializeToString(elt);
- Debug.write("loadXMLDoc", elt, markup, d.serialize());
- *** /DEBUGGING
- */
- __pthis__.req = null;
- __pthis__.loadSuccess(__pthis__, lzxdata);
- } else {
- __pthis__.req = null;
- __pthis__.loadError(__pthis__, null);
}
}
};
@@ -319,6 +359,8 @@
this.req.send(postbody);
}
// Set up the timeout
- this.setupTimeout(this, this.timeout);
+ if (isFinite(this.timeout)) {
+ this.setupTimeout(this, this.timeout);
+ }
}
Modified: openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf/LzHTTPLoader.as
===================================================================
--- openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf/LzHTTPLoader.as 2007-10-16
02:30:15 UTC (rev 6854)
+++ openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf/LzHTTPLoader.as 2007-10-16
02:36:23 UTC (rev 6855)
@@ -34,9 +34,9 @@
// Default callback handlers
-LzHTTPLoader.prototype._loadSuccessHandler = function (data)
{this.loadSuccess(this,data);}
-LzHTTPLoader.prototype._loadErrorHandler = function (data) {
this.loadError(this,data);}
-LzHTTPLoader.prototype._loadTimeoutHandler = function (data) {
this.loadTimeout(this,data);}
+LzHTTPLoader.prototype._loadSuccessHandler = function (data) {
this.loadSuccess(this,data); }
+LzHTTPLoader.prototype._loadErrorHandler = function (data) { this.loadError
(this,data); }
+LzHTTPLoader.prototype._loadTimeoutHandler = function (data) {
this.loadTimeout(this,data); }
LzHTTPLoader.GET_METHOD = "GET";
LzHTTPLoader.POST_METHOD = "POST";
Modified: openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf/LzLoader.lzs
===================================================================
--- openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf/LzLoader.lzs 2007-10-16
02:30:15 UTC (rev 6854)
+++ openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf/LzLoader.lzs 2007-10-16
02:36:23 UTC (rev 6855)
@@ -144,7 +144,7 @@
// object. This can happen if a serverless data load timed out in
// the LFC, but eventually returned something via the
// LoadVars.sendAndLoad() callback.
- if (loadobj.loaded) {
+ if (loadobj.loaded && loadobj.valid) {
if ($debug) {
Debug.warn("%w.returnData: %w already loaded",
this, loadobj);
@@ -399,7 +399,7 @@
}
if (loadobj) {
this.unload(loadobj);
- if (this.ontimeout.ready) this.ontimeout.sendEvent( loadobj.reqobj);
+ if (this.ontimeout.ready) this.ontimeout.sendEvent();
}
}
Modified:
openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/compiler/NodeModel.java
===================================================================
---
openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/compiler/NodeModel.java
2007-10-16 02:30:15 UTC (rev 6854)
+++
openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/compiler/NodeModel.java
2007-10-16 02:36:23 UTC (rev 6855)
@@ -334,8 +334,18 @@
// <dataset> tags that are not top level datasets.
if (elt.getName().equals("dataset")) {
+ boolean contentIsLiteralXMLData = true;
String datafromchild = elt.getAttributeValue("datafromchild");
- if (! "true".equals(datafromchild)) {
+ String src = elt.getAttributeValue("src");
+ String type = elt.getAttributeValue("type");
+
+ if ((type != null && (type.equals("soap") || type.equals("http")))
+ || (src != null && XMLUtils.isURL(src))
+ || "true".equals(datafromchild)) {
+ contentIsLiteralXMLData = false;
+ }
+
+ if (contentIsLiteralXMLData) {
// Default to legacy behavior, treat all children as XML
literal data.
attrs.put("initialdata", getDatasetContent(elt, env));
includeChildren = false;
_______________________________________________
Laszlo-checkins mailing list
[email protected]
http://www.openlaszlo.org/mailman/listinfo/laszlo-checkins