diff --git a/webapps/swat/source/class/swat/main/AbstractModuleFsm.js b/webapps/swat/source/class/swat/main/AbstractModuleFsm.js index fed11eb0d37..8c11c7fadfc 100644 --- a/webapps/swat/source/class/swat/main/AbstractModuleFsm.js +++ b/webapps/swat/source/class/swat/main/AbstractModuleFsm.js @@ -119,7 +119,6 @@ qx.Proto.addAwaitRpcResultState = function(module) { bAuthCompleted = true; } -_this.debug("bAuthCompleted=" + bAuthCompleted); // If we didn't just complete an authentication and we're coming // from some other state... @@ -127,7 +126,6 @@ _this.debug("bAuthCompleted=" + bAuthCompleted); fsm.getPreviousState() != "State_AwaitRpcResult") { // ... then push the previous state onto the state stack -_this.warn("PUSHING STATE"); fsm.pushState(false); } }, @@ -203,8 +201,10 @@ _this.warn("PUSHING STATE"); } // Retrieve the modal authentication window. + var loginWin = swat.main.Authenticate.getInstance(); - var loginWin = swat.main.Authenticate.getInstance(module); + // Ensure that it's saved in the current finite state machine + loginWin.addToFsm(fsm); // Set the caption loginWin.setCaption(caption); @@ -310,7 +310,7 @@ _this.warn("PUSHING STATE"); function(fsm, event) { // Retrieve the login window object - var win = module.fsm.getObject("login_window"); + var win = fsm.getObject("login_window"); // Clear the password field win.password.setValue(""); diff --git a/webapps/swat/source/class/swat/main/Authenticate.js b/webapps/swat/source/class/swat/main/Authenticate.js index 449a17d9ad2..d586ea1f4ac 100644 --- a/webapps/swat/source/class/swat/main/Authenticate.js +++ b/webapps/swat/source/class/swat/main/Authenticate.js @@ -11,10 +11,9 @@ * Swat authentication window class */ qx.OO.defineClass("swat.main.Authenticate", qx.ui.window.Window, -function(module) +function() { var o; - var fsm = module.fsm; qx.ui.window.Window.call(this); @@ -101,26 +100,36 @@ function(module) return new qx.ui.form.Button("Login"); }); - // Save this login button since we receive events on it - fsm.addObject("login_button", this.login); - - // We want to receive "execute" events on this button - this.login.addEventListener("execute", fsm.eventListener, fsm); - // Add the grid to the window this.add(grid); // Add this window to the document this.addToDocument(); - - // Save this window object - fsm.addObject("login_window", this); - - // We want to receive "complete" events on this button (which we generate) - this.addEventListener("complete", fsm.eventListener, fsm); }); +qx.Proto.addToFsm = function(fsm) +{ + // Have we already been here for this fsm? + if (fsm.getObject("login_window")) + { + // Yup. Everything's already done. See ya! + return; + } + + // Save the login button since we receive events on it + fsm.addObject("login_button", this.login); + + // We want to receive "execute" events on this button + this.login.addEventListener("execute", fsm.eventListener, fsm); + + // Save the window object + fsm.addObject("login_window", this); + + // We want to receive "complete" events on this window (which we generate) + this.addEventListener("complete", fsm.eventListener, fsm); +}; + qx.Proto.setInfo = function(info) { @@ -141,12 +150,4 @@ qx.Proto.setInfo = function(info) /** * Singleton Instance Getter */ -qx.Class.getInstance = function(module) -{ - if (! this._instance) - { - this._instance = new this(module); - } - - return this._instance; -}; +qx.Class.getInstance = qx.util.Return.returnInstance; diff --git a/webapps/swat/source/class/swat/module/ldbbrowse/Fsm.js b/webapps/swat/source/class/swat/module/ldbbrowse/Fsm.js index 4ddc0185954..d24f156e4fa 100644 --- a/webapps/swat/source/class/swat/module/ldbbrowse/Fsm.js +++ b/webapps/swat/source/class/swat/module/ldbbrowse/Fsm.js @@ -47,7 +47,28 @@ qx.Proto.buildFsm = function(module) // Display the result var gui = swat.module.ldbbrowse.Gui.getInstance(); - gui.displayData(module, rpcRequest); + + // Did we get a Resource Not Found error? We'll get this after a + // session timeout, because the request is retried but can't + // succeed because the database has been closed by the session + // timing out. + var result = rpcRequest.getUserData("result"); + var origins = swat.main.AbstractModuleFsm.JsonRpc_Origin; + var serverErrors = swat.main.AbstractModuleFsm.JsonRpc_ServerError; + if (result.type == "failed" && + result.data.origin == origins.Server && + result.data.code == serverErrors.ResourceError) + { + // Yup. Re-open the database + var dbName = fsm.getObject("dbName"); + dbName.dispatchEvent(new qx.event.type.Event("changeSelection"), + true); + } + else + { + // Otherwise, display the result + gui.displayData(module, rpcRequest); + } // Dispose of the request rpcRequest.request.dispose(); diff --git a/webapps/swat/source/class/swat/module/statistics/Fsm.js b/webapps/swat/source/class/swat/module/statistics/Fsm.js index b60501512a8..3ecb42a49d1 100644 --- a/webapps/swat/source/class/swat/module/statistics/Fsm.js +++ b/webapps/swat/source/class/swat/module/statistics/Fsm.js @@ -19,6 +19,9 @@ function() qx.Class._startTimer = function(fsm) { + // First, for good house keeping, ensure no timer exists + swat.module.statistics.Fsm._stopTimer(fsm); + // Create a timer instance to expire in a few seconds var timer = new qx.client.Timer(5000); timer.addEventListener("interval", fsm.eventListener, fsm); @@ -46,6 +49,7 @@ qx.Proto.buildFsm = function(module) { var fsm = module.fsm; var _this = this; + var _module = module; /* * State: Idle @@ -78,7 +82,10 @@ qx.Proto.buildFsm = function(module) rpcRequest.request = null; // Restart the timer. - swat.module.statistics.Fsm._startTimer(fsm); + if (_module.visible) + { + swat.module.statistics.Fsm._startTimer(fsm); + } } }, @@ -164,6 +171,7 @@ qx.Proto.buildFsm = function(module) "ontransition" : function(fsm, event) { + _module.visible = true; swat.module.statistics.Fsm._startTimer(fsm); } }); @@ -186,6 +194,7 @@ qx.Proto.buildFsm = function(module) "ontransition" : function(fsm, event) { + _module.visible = false; swat.module.statistics.Fsm._stopTimer(fsm); } });