package org.appfuse.webapp.pages; import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationMessage; import org.apache.wicket.RestartResponseException; import org.apache.wicket.model.Model; import org.apache.wicket.model.ResourceModel; import org.apache.wicket.model.StringResourceModel; import org.apache.wicket.request.Url; import org.apache.wicket.request.cycle.RequestCycle; import org.apache.wicket.request.http.WebResponse; import org.apache.wicket.spring.injection.annot.SpringBean; import org.appfuse.Constants; import org.appfuse.model.User; import org.appfuse.service.MailEngine; import org.appfuse.service.UserExistsException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.mail.MailException; import org.springframework.mail.SimpleMailMessage; import org.springframework.security.access.AccessDeniedException; import org.wicketstuff.annotation.mount.MountPath; import javax.servlet.http.Cookie; /** * Page for a new user signup. * * @author Marcin ZajÄ…czkowski, 2010-09-03 */ @MountPath("signup") public class Signup extends AbstractUserEdit { private final static Logger log = LoggerFactory.getLogger(Signup.class); private static final String SIGNUP_PROPERTY_PREFIX = "signup"; @SpringBean private MailEngine mailEngine; public Signup() { super(NO_RESPONSE_PAGE, SIGNUP_PROPERTY_PREFIX, new Model<User>(new User())); } @Override protected void onInitialize() { //TODO: MZA: quite odd, before super setUser(new User()); super.onInitialize(); } //TODO: MZA: Maybe use a visitor pattern? @Override protected void onSaveButtonSubmit() { User user = prepareNewUser(); user = saveUser(user); prepareAndSendNewUserEmail(user); getSession().info(createDefaultInfoNotificationMessage(new ResourceModel("user.registered"))); setUserNameCookieAndSetResponsePage(user.getUsername()); } private User prepareNewUser() { User user = getUser(); user.setEnabled(true); user.addRole(getRoleManager().getRole(Constants.USER_ROLE)); return user; } private User saveUser(User user) { try { user = getUserManager().saveUser(user); } catch (AccessDeniedException ade) { // thrown by UserSecurityAdvice configured in aop:advisor log.warn(ade.getMessage()); throw new SecurityException("AccessDenied on saving new user", ade); } catch (UserExistsException e) { error(new StringResourceModel("errors.existing.user", this, null, new Object[] { user.getUsername(), user.getEmail()}).getString()); throw new RestartResponseException(getPage()); } return user; } private void prepareAndSendNewUserEmail(User user) { SimpleMailMessage messageToSend = prepareMailMessage(user); sendMessage(messageToSend); } //TODO: MZA: Should be moved to business layer private SimpleMailMessage prepareMailMessage(User user) { log.debug("Preparing message for user '{}' with an account information", user.getUsername()); SimpleMailMessage message = new SimpleMailMessage(); //serviceFacade.getMailMessage(); message.setTo(user.getFullName() + "<" + user.getEmail() + ">"); StringBuilder msg = new StringBuilder(); msg.append(getString("signup.email.message")); msg.append("\n\n").append(getString("user.username")); msg.append(": ").append(user.getUsername()).append("\n"); msg.append(getString("user.password")).append(": "); msg.append(user.getPassword()); msg.append("\n\nLogin at: ") .append(RequestCycle.get().getUrlRenderer().renderFullUrl( Url.parse(urlFor(Login.class, null).toString()))); message.setText(msg.toString()); message.setSubject(getString("signup.email.subject")); return message; } private void sendMessage(SimpleMailMessage message) { try { mailEngine.send(message); } catch (MailException me) { log.error(me.getMostSpecificCause().getMessage(), me); getSession().warn(new NotificationMessage(new ResourceModel("errors.sending.email"))); } } private void setUserNameCookieAndSetResponsePage(String userName) { ((WebResponse)getResponse()).addCookie(new Cookie("username", userName)); setResponsePage(Login.class); } @Override protected void onDeleteButtonSubmit() { throw new IllegalStateException("Delete button should not be able to submit on signup"); } @Override protected void onCancelButtonSubmit() { //MZA: getSignInPage would be better, but it has protected visibility modifier. //MZA: getHomePage should be ok - not authorized user should be redirected to login page setResponsePage(Login.class); } @Override protected boolean getDisplayRolesGroupVisibility() { return false; } @Override protected boolean getAccountSettingsGroupVisibility() { return false; } @Override protected boolean getDeleteButtonVisibility() { return false; } @Override protected boolean isCollapsedAddressTab() { return false; } }