/* Date: August 2, 2009
* Template: PluginScreenJavaTemplateGen.java.ftl
* generator: org.molgenis.generators.screen.PluginScreenJavaTemplateGen 3.3.0-testing
*
* THIS FILE IS A TEMPLATE. PLEASE EDIT :-)
*/
package plugin.topmenu;
import java.util.List;
import org.molgenis.framework.db.Database;
import org.molgenis.framework.ui.PluginModel;
import org.molgenis.framework.ui.ScreenController;
import org.molgenis.framework.ui.ScreenMessage;
import org.molgenis.framework.ui.html.ActionInput;
import org.molgenis.framework.ui.html.CommandTemplate;
import org.molgenis.framework.ui.html.HtmlInput;
import org.molgenis.framework.ui.html.PasswordInput;
import org.molgenis.framework.ui.html.StringInput;
import org.molgenis.util.Entity;
import org.molgenis.util.HandleRequestDelegationException;
import org.molgenis.util.Tuple;
//import plugin.login.DatabaseLogin;
public class LoginScreen extends PluginModel<Entity>
{
private static final long serialVersionUID = 4180722803810720253L;
public enum State
{
Signup, Register, Activate, Login, Edit_profile, Save_profile, Logout, Forgot_your_password, Cancel
};
State state = State.Login;
public LoginScreen(String name, ScreenController<?> parent)
{
super(name, parent);
}
@Override
public String getViewName()
{
return "plugin_topmenu_LoginScreen";
}
@Override
public String getViewTemplate()
{
return "plugin/topmenu/LoginScreen.ftl";
}
@Override
public void handleRequest(Database db, Tuple request) throws HandleRequestDelegationException, Exception
{
// reset messages
this.setMessages();
// convert action to enum value
State action = State.valueOf(request.getAction().replace(" ", "_"));
// workflow:
// login -> logout -> edit_profile -> save_profile -> logout
// -> email_password -> login
// -> register -> login
switch (action)
{
case Login:
doLogin(db, request);
break;
case Activate:
doActivate(db, request);
this.state = State.Logout;
case Logout:
doLogout(db, request);
break;
case Forgot_your_password:
doEmailPassword(db, request);
break;
case Signup:
this.state = State.Register;
break;
case Register:
doRegister(db, request);
break;
case Edit_profile:
this.state = State.Save_profile;
break;
case Save_profile:
doSaveProfile(db, request);
break;
case Cancel:
default:
this.state = getLogin().isAuthenticated() ? State.Logout : State.Login;
}
// todo: add jcaptcha service
// todo add password change options
}
private void doActivate(Database db, Tuple request)
{
this.setMessages(new ScreenMessage("TODO", false));
}
private void doSaveProfile(Database db, Tuple request)
{
// TODO: Where is MolgenisUser?
/*
* // check password // change emailadress only after verification
* MolgenisUser user = ((DatabaseLogin) getLogin()).getMolgenisUser();
* user.setEmailaddress(request.getString("emailaddress"));
* user.setPassword(request.getString("password")); try {
* db.update(user); this.setMessages(new
* ScreenMessage("Profile updated", true)); } catch (Exception e) {
* this.setMessages(new
* ScreenMessage("Update of profile failed failed: " + e.getMessage(),
* false)); e.printStackTrace(); }
*/
}
private void doRegister(Database db, Tuple request)
{
// TODO: Where is MolgenisUser?
/*
* // TODO: check password try { String user =
* request.getString("name"); String email =
* request.getString("emailaddress"); String password =
* request.getString("password");
*
* // check if username or email exists boolean userExists =
* db.query(MolgenisUser.class).equals("name", user).find().size() > 0;
* boolean emailExists =
* db.query(MolgenisUser.class).equals("emailaddress",
* email).find().size() > 0;
*
* if (userExists || emailExists) { String errorMessage = "User with";
* if (userExists) errorMessage += " name " + user; if (userExists &&
* emailExists) errorMessage += " and "; if (emailExists) errorMessage
* += " emailadress " + email; throw new DatabaseException(errorMessage
* + " already exists."); }
*
* // todo: fire up the emailing protocol or queue or something...
* //fixme: automate String baseUrl =
* "http://localhost:8080/molgenis_online/molgenis.do?__target="
* +this.getName()+"&select="+this.getName(); String activationCode =
* UUID.randomUUID().toString(); String url = baseUrl+
* "&__action=Activate&__activationCode=" + activationCode; String
* emailBody =
* "Dear "+user+",\n We welcome you as new user to "+this.getRootScreen
* ().getLabel()+". Please click on <a href=\"" + url + "\">" + url +
* "</a> to activate your account. Notice that this hyperlink may be spread over multiple lines.\n\nRegards,\nthe system administrators."
* ; this.getEmailService().email("Account activation MOLGENIS",
* emailBody, email, true);
*
* // finally add user including activiation code MolgenisUser newUser =
* new MolgenisUser(); newUser.setName(user);
* newUser.setEmailaddress(email); newUser.setPassword(password);
* newUser.setActivationCode(activationCode);
*
* db.add(newUser);
*
* this.setMessages(new ScreenMessage(
* "Registration succesfull, an email confirmation has been sent to " +
* request.getString("emailaddress") + " for activation", true));
* this.state = State.Login; } catch (Exception e) {
* this.setMessages(new ScreenMessage("Registration failed: " +
* e.getMessage(), false)); }
*/
}
private void doEmailPassword(Database db, Tuple request)
{
try
{
// getLogin().emailPassword();
this.setMessages(new ScreenMessage("password sent", true));
this.state = State.Login;
}
catch (Exception e)
{
this.setMessages(new ScreenMessage("sending of password failed: " + e.getMessage(), false));
}
}
private void doLogout(Database db, Tuple request) throws Exception
{
getLogin().logout(db);
this.state = State.Login;
}
private void doLogin(Database db, Tuple request) throws HandleRequestDelegationException, Exception
{
if (!getLogin().login(db, request.getString("name"), request.getString("password")))
{
this.setMessages(new ScreenMessage("login failed: username or password unknown", false));
}
else
{
this.state = State.Logout;
}
}
public List<HtmlInput<?>> getInputs()
{
CommandTemplate f = new CommandTemplate();
// workflow:
// login -> logout -> edit_profile -> save_profile -> cancel -> logout
// -> email_password -> cancel -> login
// -> register -> cancel -> login
String action = state.toString().replace("_", " ");
switch (state)
{
case Register:
f.add(new StringInput("name"));
f.add(new StringInput("emailaddress"));
f.add(new PasswordInput("password"));
f.add(new PasswordInput("Retype new password"));
f.add(new ActionInput(action));
f.add(new ActionInput(State.Cancel.toString()));
break;
case Login:
f.add(new StringInput("name"));
f.add(new PasswordInput("password"));
f.add(new ActionInput(action));
f.add(new ActionInput(State.Signup.toString()));
f.add(new ActionInput(State.Forgot_your_password.toString().replace("_", " ")));
break;
case Logout:
// also option to move to Edit_profile
String edit_action = State.Edit_profile.toString().replace("_", " ");
f.add(new ActionInput(edit_action));
f.add(new ActionInput(state.toString()));
break;
case Forgot_your_password:
f.add(new StringInput("emailaddress"));
f.add(new ActionInput(action));
f.add(new ActionInput(State.Cancel.toString()));
break;
case Edit_profile:
// identical to next so no break
// difference is any errors
case Save_profile:
// TODO: Where is MolgenisUser?
/*
* MolgenisUser user = ((DatabaseLogin)
* getLogin()).getMolgenisUser(); f.add(new StringInput("name",
* user.getName())); f.add(new PasswordInput("password",
* user.getPassword())); f.add(new
* PasswordInput("Retype password")); f.add(new
* StringInput("emailaddress", user.getEmailaddress()));
* f.add(new
* ActionInput(State.Save_profile.toString().replace("_",
* " "))); f.add(new ActionInput(State.Cancel.toString()));
*/
}
// logger.debug("STATE: " + this.state);
return f.getInputs();
}
@Override
public void reload(Database db)
{
// nothing todo, Login takes care of this.
if (getLogin().isAuthenticated())
{
this.setLabel("Sign out '" + getLogin().getUserName() + "'");
}
else
{
this.setLabel("Login");
}
}
@Override
public boolean isVisible()
{
// always visible
return true;
}
}