package org.appfuse.webapp.pages;
import org.apache.tapestry5.SymbolConstants;
import org.apache.tapestry5.alerts.AlertManager;
import org.apache.tapestry5.annotations.Environmental;
import org.apache.tapestry5.annotations.Import;
import org.apache.tapestry5.annotations.Log;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.ioc.Messages;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.ioc.annotations.Symbol;
import org.apache.tapestry5.json.JSONObject;
import org.apache.tapestry5.services.Context;
import org.apache.tapestry5.services.PageRenderLinkSource;
import org.apache.tapestry5.services.Request;
import org.apache.tapestry5.services.javascript.JavaScriptSupport;
import org.appfuse.Constants;
import org.appfuse.webapp.AppFuseSymbolConstants;
import org.slf4j.Logger;
import org.springframework.security.web.WebAttributes;
import java.util.HashMap;
import java.util.Map;
/**
* Login Page
*
* @author Serge Eby
* @version $Id: Login.java 5 2008-08-30 09:59:21Z serge.eby $
*/
@Import(library = {"plugins/jquery.cookie.js"}, module = "app/login")
public class Login {
@Inject
private Logger logger;
@Inject
@Symbol(AppFuseSymbolConstants.SECURITY_URL)
private String securityUrl;
@Inject
@Symbol(SymbolConstants.CONTEXT_PATH)
private String contextPath;
@Inject
private Request request;
@Inject
private Messages messages;
@Inject
private AlertManager alertManager;
@Inject
private PageRenderLinkSource pageRendererLinkSource;
@Environmental
private JavaScriptSupport javascriptSupport;
@Property
private String errorMessage;
@Inject
private Context context;
@Log
void onActivate(String loginError) {
if ("error".equals(loginError)) {
this.errorMessage = ((Exception) request
.getSession(true)
.getAttribute(WebAttributes.AUTHENTICATION_EXCEPTION))
.getMessage();
logger.error(String.format("Error while attempting to login: %s",
errorMessage));
}
}
String onPassivate() {
return errorMessage;
}
void afterRender() {
JSONObject spec = new JSONObject();
String requiredUsernameError = messages.format("errors.required",
messages.get("label.username"));
String requiredPasswordError = messages.format("errors.required",
messages.get("label.password"));
spec.put("passwordHintUrl", createLink(PasswordHint.class))
.put("passwordResetUrl", createLink(PasswordRecoveryToken.class))
.put("requiredUsername", requiredUsernameError)
.put("requiredPassword", requiredPasswordError);
// For some reason, the line below causes JavaScript to fail to load (loading screen)
//javascriptSupport.require("app/login").invoke("init").with(spec);
}
public String getSpringSecurityUrl() {
return contextPath + securityUrl;
}
void cleanupRender() {
this.errorMessage = null;
}
@SuppressWarnings("unchecked")
public boolean isRememberMeEnabled() {
try {
Map config = (HashMap) context.getAttribute(Constants.CONFIG);
if (config != null) {
return (config.get("rememberMeEnabled") != null);
}
} catch (UnsupportedOperationException uoe) {
// only happens in tests
// getAttribute() is not supported for ContextForPageTester
logger.warn(uoe.getMessage());
}
return false;
}
public String getSignupLink() {
String link = createLink(Signup.class);
return messages.format("login.signup", link);
}
private String createLink(Class clazz) {
return pageRendererLinkSource.createPageRenderLink(clazz).toAbsoluteURI();
}
}