package proto; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.tapestry.IPage; import org.apache.tapestry.IRequestCycle; import org.apache.tapestry.annotations.*; import org.apache.tapestry.event.PageBeginRenderListener; import org.apache.tapestry.event.PageEvent; import org.apache.tapestry.form.TextField; import org.apache.tapestry.form.Checkbox; import org.apache.tapestry.services.CookieSource; import org.apache.tapestry.valid.ValidationDelegate; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.tapestry.annotations.InjectPage; import org.apache.tapestry.annotations.Meta; import org.apache.tapestry.html.BasePage; import proto.exception.ExceptionFormatter; import common.crypto.*; @Meta("anonymous-access=true") public abstract class Login extends BasePage implements PageBeginRenderListener { public abstract String getEmailAddress(); public abstract void setEmailAddress(String value); public abstract String getPassword(); public abstract void setPassword(String value); @Persist @InitialValue("true") public abstract boolean isRememberMe(); public IPage onFormSubmit(IRequestCycle cycle) { try { CookieSource cookieSrc = getCookieSource(); ICrypto cryptoService = getCryptoService(); if (isRememberMe()) { cookieSrc.writeCookieValue(EMAILADDRESS_COOKIE_NAME, getPerson().getEmailAddress(), COOKIE_MAX_AGE); cookieSrc.writeCookieValue(PASSWORD_COOKIE_NAME, getPerson() .getPassword(), COOKIE_MAX_AGE); } else { cookieSrc.removeCookieValue(EMAILADDRESS_COOKIE_NAME); cookieSrc.removeCookieValue(PASSWORD_COOKIE_NAME); setEmailAddress(""); setPassword(""); } /** * Do Model Object Stuff */ } catch (Exception e) { LOG.error("** Exception was: " + e.getMessage()); LOG.error("** Stack trace follows..."); LOG.error(ExceptionFormatter.toString(e)); return getLoginPage(); } return getHomePage(); } public IPage onFormCancel(IRequestCycle cycle) { return getHomePage(); } public void pageBeginRender(PageEvent event) { CookieSource cookieSrc = getCookieSource(); ICrypto cryptoService = getCryptoService(); try { String cookieVal = getCookieSource().readCookieValue( EMAILADDRESS_COOKIE_NAME); Checkbox checkbox = getRememberMeComponent(); Person p = getPerson(); if (p == null) { p = new Person(); setPerson(p); } if (!"".equals(cookieVal)) { // if we see a valid cookie, then read it getPerson().setEmailAddress( getCookieSource().readCookieValue( EMAILADDRESS_COOKIE_NAME)); getPerson() .setPassword( getCookieSource().readCookieValue( PASSWORD_COOKIE_NAME)); } else { if ("".equals(cookieVal)) { // if cookie blank, then nuke it getCookieSource().removeCookieValue( EMAILADDRESS_COOKIE_NAME); getCookieSource().removeCookieValue(PASSWORD_COOKIE_NAME); getPerson().setEmailAddress(""); getPerson().setPassword(""); checkbox.setValue(false); } } } catch (Exception e) { LOG.error("** Exception was: " + e.getMessage()); LOG.error("** Stack trace follows..."); LOG.error(ExceptionFormatter.toString(e)); } } private static final String EMAILADDRESS_COOKIE_NAME = "Login.emailAddress"; private static final String PASSWORD_COOKIE_NAME = "Login.password"; private static final int COOKIE_MAX_AGE = 60 * 60 * 24 * 7; static public final Log LOG = LogFactory.getLog(TapBasePage.class); @InjectObject("infrastructure:cookieSource") public abstract CookieSource getCookieSource(); public abstract ICrypto getCryptoService(); @Bean public abstract ValidationDelegate getValidationDelegate(); @Persist("session") public abstract Person getPerson(); public abstract void setPerson(Person value); @InjectComponent("rememberMe") public abstract Checkbox getRememberMeComponent(); @InjectPage("Home") public abstract Home getHomePage(); @InjectPage("Login") public abstract Login getLoginPage(); }