1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-23 17:34:34 +03:00

r20601: Web Application Framework

More testing revealed that this isn't yet bug-free...  Sigh.  One of these
days I'll start writing bug-free software...

- Status and Statistics timer wasn't always stopped properly when switching
  away from that module's display.  It seems silly to continue to update
  status and statistics when the page isn't being viewed.

- Single instance of the Login window was not accessible if one switched
  between modules.

- Upon return from a Session Timeout, we can retry the original RPC request,
  but it may fail due to information that was stored in the old session.  This
  was the case in the LDB Browser module, where the open database handle
  became gone with the session.  We now detect a Resource Not Found and
  re-open the database.
This commit is contained in:
Derrell Lipman 2007-01-08 04:58:04 +00:00 committed by Gerald (Jerry) Carter
parent 27c5d7dca6
commit 09a8292033
4 changed files with 60 additions and 29 deletions

View File

@ -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("");

View File

@ -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;

View File

@ -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();

View File

@ -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);
}
});