View Javadoc

1   package org.appfuse.webapp.pages;
2   
3   import org.apache.commons.lang.StringUtils;
4   import org.apache.tapestry5.alerts.AlertManager;
5   import org.apache.tapestry5.alerts.Duration;
6   import org.apache.tapestry5.alerts.Severity;
7   import org.apache.tapestry5.annotations.Component;
8   import org.apache.tapestry5.annotations.Log;
9   import org.apache.tapestry5.annotations.PageActivationContext;
10  import org.apache.tapestry5.annotations.Property;
11  import org.apache.tapestry5.ioc.Messages;
12  import org.apache.tapestry5.ioc.annotations.Inject;
13  import org.apache.tapestry5.services.HttpError;
14  import org.apache.tapestry5.services.Response;
15  import org.appfuse.Constants;
16  import org.appfuse.model.User;
17  import org.appfuse.service.RoleManager;
18  import org.appfuse.service.UserExistsException;
19  import org.appfuse.service.UserManager;
20  import org.appfuse.webapp.components.UserForm;
21  import org.appfuse.webapp.services.EmailService;
22  import org.appfuse.webapp.services.SecurityContext;
23  import org.appfuse.webapp.util.RequestUtil;
24  import org.slf4j.Logger;
25  import org.springframework.mail.MailException;
26  import org.springframework.security.access.AccessDeniedException;
27  
28  import javax.servlet.http.HttpServletRequest;
29  import javax.servlet.http.HttpServletResponse;
30  import java.io.IOException;
31  
32  /**
33   * Self-registration page for new users
34   *
35   * @author Serge Eby
36   * @version $Id: Signup.java 5 2008-08-30 09:59:21Z serge.eby $
37   */
38  public class Signup {
39      @Inject
40      private Logger logger;
41  
42      @Inject
43      private UserManager userManager;
44  
45      @Inject
46      private RoleManager roleManager;
47  
48      @Inject
49      private AlertManager alertManager;
50  
51      @Inject
52      private EmailService emailService;
53  
54      @Property
55      @PageActivationContext
56      private User user;
57  
58      @Inject
59      private HttpServletRequest request;
60  
61      @Inject
62      private SecurityContext securityContext;
63  
64      @Inject
65      private Response response;
66  
67      @Inject
68      private Messages messages;
69  
70      @Component(id = "signup")
71      private UserForm form;
72  
73      @Property
74      private Boolean cookieLogin;
75  
76      void onPrepare() {
77          if (user == null) {
78              user = new User();
79          }
80          // Enable user;
81          user.setEnabled(true);
82  
83          // Set the default user role on this new user
84          user.addRole(roleManager.getRole(Constants.USER_ROLE));
85      }
86  
87      void setupRender() {
88          form.setInfoMessage(messages.get("signup.message"));
89      }
90  
91      // ~ Event Handlers
92  
93      @Log
94      Object onCanceledFromSignup() {
95          return Login.class;
96      }
97  
98      @Log
99      void onValidatePasswordFromSignup() {
100         // Ensure the password fields match
101         if (form.isValid()) {
102             if (!StringUtils.equals(user.getPassword(), user.getConfirmPassword())) {
103 
104                 String errorMessage = messages.format("errors.twofields",
105                         messages.get("user.confirmPassword"),
106                         messages.get("user.password"));
107 
108                 form.recordError(errorMessage);
109 
110                 alertManager.alert(
111                         Duration.TRANSIENT,
112                         Severity.ERROR,
113                         errorMessage);
114             }
115         }
116     }
117 
118     @Log
119     Object onSuccess() throws IOException {
120         try {
121             user = userManager.saveUser(user);
122         } catch (AccessDeniedException ade) {
123             // thrown by UserSecurityAdvice configured in aop:advisor
124             logger.warn(ade.getMessage());
125             return new HttpError(HttpServletResponse.SC_FORBIDDEN, "Resource not available");
126         } catch (UserExistsException e) {
127             // TODO #1: FIXME: only username should be highlighted.. move to onValidate()?
128 
129             alertManager.error(
130                     messages.format("errors.existing.user", user.getUsername(), user.getEmail())
131             );
132             // redisplay the unencrypted passwords
133             user.setPassword(user.getConfirmPassword());
134             //TODO: somehow returning current page doesn't work
135             //return this;
136 
137             response.sendRedirect("signup");
138         }
139 
140         // log user in automatically
141         securityContext.login(user);
142 
143         // Send user an e-mail
144         logger.debug(String.format("Sending user '%s' an account information e-mail", user.getUsername()));
145         try {
146             String msg = messages.get("signup.email.message");
147             String subject = messages.get("signup.email.subject");
148             emailService.send(user, subject, msg, RequestUtil.getAppURL(request), false);
149         } catch (MailException me) {
150             request.getSession(true).setAttribute("error",
151                     me.getMostSpecificCause().getMessage());
152         }
153 
154         alertManager.alert(Duration.TRANSIENT, Severity.INFO,  messages.get("user.registered"));
155         if (request != null) { // needed for testing
156             response.sendRedirect(request.getContextPath());
157         }
158         return null;
159     }
160 
161     @Log
162     void onFailure() throws IOException {
163         response.sendRedirect("signup");
164     }
165 }