| /* |
| CVS: $Id: prefs.js,v 1.4 2003/07/14 09:30:46 reinhard Exp $ |
| |
| This file is the central controller piece in the preferences |
| application. It receives the requests from the client browser (the |
| View in the MVC pattern), and coordinates with the Model (written |
| in Java, in the logic/ directory) to do the business logic. |
| |
| Author: Ovidiu Predescu <ovidiu@apache.org> |
| Date: August 30, 2002 |
| */ |
| |
| // The global user registry, through which we add new users or access |
| // existing ones. |
| var userRegistry = Packages.org.apache.cocoon.samples.flow.prefs.UserRegistry.getUserRegistry(); |
| |
| var user; |
| |
| // This top-level function is called from the sitemap to start the |
| // process of registering a user. |
| // |
| // This function takes care of all the steps required during the |
| // registration of a new user. It is the controller is the MVC |
| // pattern, an intermediary between the View, in our case the client's |
| // browser, and the Model, in the case of this particular function the |
| // code that maintains the registered users. |
| // |
| // The function collects the necessary information from the View, and |
| // calls the Model to do the necessary work of checking whether the |
| // user exists or not, and registering the new user. |
| function registerUser() |
| { |
| var check = false; |
| var errorMsg = null; |
| |
| var login = ""; |
| var password = ""; |
| var firstName = ""; |
| var lastName = ""; |
| var email = ""; |
| |
| while (true) { |
| // Present the user with addUser page. `check' indicates the XSP |
| // template that it needs to check the registration parameters, |
| // and print an indicator close to where the errors |
| // are. `errorMsg' if not null is printed at the top of the page |
| // as an error message. |
| cocoon.sendPageAndWait("page/userInfo", |
| { |
| "check" : check, |
| "errorMsg" : errorMsg, |
| "title": "New User Registration", |
| "button" : "Register", |
| "login" : login, |
| "password" : password, |
| "firstName" : firstName, |
| "lastName" : lastName, |
| "email" : email |
| } |
| ); |
| |
| check = false; |
| errorMsg = null; |
| |
| login = cocoon.request.login; |
| password = cocoon.request.password; |
| firstName = cocoon.request.firstName; |
| lastName = cocoon.request.lastName; |
| email = cocoon.request.email; |
| |
| if (login == "" || password == "" |
| || firstName == "" || lastName == "" || email == "") { |
| check = true; |
| errorMsg = "Please correct the marked errors before continuing"; |
| continue; |
| } |
| |
| // Check for the existence of an already registered user with the |
| // same login name. There is a possibility of a race condition |
| // here, with another user registering with the same login id |
| // between this check and the creation of a new user few lines |
| // below. We ignore this problem in this example. |
| var existingUser = userRegistry.isLoginNameTaken(login); |
| if (!existingUser) { |
| user = new Packages.org.apache.cocoon.samples.flow.prefs.User(login, password, |
| firstName, lastName, |
| email); |
| userRegistry.addUser(user); |
| break; |
| } else { |
| errorMsg = "Login name '" + login |
| + "' is already in use, please choose another name"; |
| } |
| } |
| |
| // The user has successfully registered, so we consider (s)he to be |
| // already logged in. At this point we want to create a session, so |
| // that all the JavaScript global variables are shared among |
| // invocations of top-level functions. Up until this point, each |
| // invocation had a separate global scope for the variables. |
| var session = cocoon.session; |
| |
| // Here we just send a response to the client browser and we don't |
| // wait for any response. This is the last page generated by this |
| // top-level function. In general is good to make sure a top-level |
| // function, e.g. one that's invoked directly from the sitemap using |
| // <map:call function="..."> sends a response page to the client at |
| // all the exit points. Otherwise the user will get a blank page and |
| // will be really confused. |
| // |
| // In the case of this particular function, this is the only exit |
| // point. |
| cocoon.sendPage("page/registrationSuccessful", {"user" : user}); |
| } |
| |
| |
| // This top-level function is used for user login. |
| function login(errorMsg) |
| { |
| var login = ""; |
| var password = ""; |
| |
| while (true) { |
| cocoon.sendPageAndWait("page/login", |
| { |
| "errorMsg" : errorMsg, |
| "login" : login, |
| "password" : password |
| } |
| ); |
| |
| errorMsg = null; |
| |
| login = cocoon.request.getParameter("login"); |
| password = cocoon.request.getParameter("password"); |
| |
| user = userRegistry.getUserWithLogin(login, password); |
| |
| if (user != undefined) { |
| break; |
| } else { |
| errorMsg = "No such user or bad password"; |
| } |
| } |
| |
| // The user has successfully signed in. At this point we want to |
| // create a session, so that all the JavaScript global variables are |
| // shared among invocations of top-level functions. Up until this |
| // point, each invocation had a separate global scope for the |
| // variables. |
| var session = cocoon.session; |
| |
| // We send to the user a welcome page which contains links back to |
| // what (s)he can do. These links essentially point to other top |
| // level functions in this script. |
| cocoon.sendPage("page/welcome", {"user" : user}); |
| } |
| |
| // This function is called to edit the preferences of an already |
| // registered user. If this function was called without the user being |
| // logged in first, the 'user' global variable is null. When this |
| // happens the user is redirected to the login page first. |
| function edit() |
| { |
| if (user == undefined) |
| login("Please login before continuing"); |
| |
| var login = user.login; |
| var password = user.password; |
| var firstName = user.firstName; |
| var lastName = user.lastName; |
| var email = user.email; |
| var errorMsg = ""; |
| var check = false; |
| |
| while (true) { |
| // Present the user with addUser page. `check' indicates the XSP |
| // template that it needs to check the registration parameters, |
| // and print an indicator close to where the errors |
| // are. `errorMsg' if not null is printed at the top of the page |
| // as an error message. |
| cocoon.sendPageAndWait("page/userInfo", |
| { |
| "check" : check, |
| "errorMsg" : errorMsg, |
| "title": "Edit account", |
| "button" : "Change", |
| "cancel" : true, |
| "login" : login, |
| "password" : password, |
| "firstName" : firstName, |
| "lastName" : lastName, |
| "email" : email |
| } |
| ); |
| |
| if (cocoon.request.get("cancel")) |
| break; |
| |
| check = false; |
| errorMsg = null; |
| |
| login = cocoon.request.get("login"); |
| password = cocoon.request.get("password"); |
| firstName = cocoon.request.get("firstName"); |
| lastName = cocoon.request.get("lastName"); |
| email = cocoon.request.get("email"); |
| |
| if (login == "" || password == "" |
| || firstName == "" || lastName == "" || email == "") { |
| check = true; |
| errorMsg = "Please correct the marked errors before continuing"; |
| continue; |
| } else { |
| // Save the changes the user made in the User object |
| user.login = login; |
| user.password = password; |
| user.firstName = firstName; |
| user.lastName = lastName; |
| user.email = email; |
| break; |
| } |
| } |
| |
| cocoon.sendPage("page/welcome", {"user" : user}); |
| } |
| |
| function logout() |
| { |
| user = undefined; |
| login("You're successfully logged out. Please log in to continue"); |
| } |