package org.appfuse.webapp.pages;
import org.apache.commons.lang.StringUtils;
import org.apache.tapestry5.alerts.AlertManager;
import org.apache.tapestry5.alerts.Duration;
import org.apache.tapestry5.alerts.Severity;
import org.apache.tapestry5.annotations.*;
import org.apache.tapestry5.ioc.Messages;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.services.HttpError;
import org.apache.tapestry5.services.Response;
import org.appfuse.Constants;
import org.appfuse.model.User;
import org.appfuse.service.RoleManager;
import org.appfuse.service.UserExistsException;
import org.appfuse.service.UserManager;
import org.appfuse.webapp.components.UserForm;
import org.appfuse.webapp.services.EmailService;
import org.appfuse.webapp.services.SecurityContext;
import org.appfuse.webapp.util.RequestUtil;
import org.slf4j.Logger;
import org.springframework.mail.MailException;
import org.springframework.security.access.AccessDeniedException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* Self-registration page for new users
*
* @author Serge Eby
* @version $Id: Signup.java 5 2008-08-30 09:59:21Z serge.eby $
*/
public class Signup {
@Inject
private Logger logger;
@Inject
private UserManager userManager;
@Inject
private RoleManager roleManager;
@Inject
private AlertManager alertManager;
@Inject
private EmailService emailService;
@Property
@PageActivationContext
private User user;
@Inject
private HttpServletRequest request;
@Inject
private SecurityContext securityContext;
@Inject
private Response response;
@Inject
private Messages messages;
@Component(id = "signup")
private UserForm form;
@Property
private Boolean cookieLogin;
void onPrepare() {
if (user == null) {
user = new User();
}
// Enable user;
user.setEnabled(true);
// Set the default user role on this new user
user.addRole(roleManager.getRole(Constants.USER_ROLE));
}
void setupRender() {
form.setInfoMessage(messages.get("signup.message"));
}
// ~ Event Handlers
@Log
Object onCanceledFromSignup() {
return Login.class;
}
@Log
void onValidatePasswordFromSignup() {
// Ensure the password fields match
if (form.isValid()) {
if (!StringUtils.equals(user.getPassword(), user.getConfirmPassword())) {
String errorMessage = messages.format("errors.twofields",
messages.get("user.confirmPassword"),
messages.get("user.password"));
form.recordError(errorMessage);
alertManager.alert(
Duration.TRANSIENT,
Severity.ERROR,
errorMessage);
}
}
}
@Log
Object onSuccess() throws UserExistsException, IOException {
try {
user = userManager.saveUser(user);
} catch (AccessDeniedException ade) {
// thrown by UserSecurityAdvice configured in aop:advisor
logger.warn(ade.getMessage());
return new HttpError(HttpServletResponse.SC_FORBIDDEN, "Resource not available");
} catch (UserExistsException e) {
// TODO #1: FIXME: only username should be highlighted.. move to onValidate()?
alertManager.error(
messages.format("errors.existing.user", user.getUsername(), user.getEmail())
);
// redisplay the unencrypted passwords
user.setPassword(user.getConfirmPassword());
//TODO: somehow returning current page doesn't work
//return this;
response.sendRedirect("signup");
return null;
}
// log user in automatically
securityContext.login(user);
// Send user an e-mail
logger.debug(String.format("Sending user '%s' an account information e-mail", user.getUsername()));
try {
String msg = messages.get("signup.email.message");
String subject = messages.get("signup.email.subject");
emailService.send(user, subject, msg, RequestUtil.getAppURL(request), false);
} catch (MailException me) {
request.getSession(true).setAttribute("error",
me.getMostSpecificCause().getMessage());
}
alertManager.alert(Duration.TRANSIENT, Severity.SUCCESS, messages.get("user.registered"));
return Home.class;
}
}