View Javadoc

1   package org.appfuse.webapp.pages;
2   
3   import org.apache.commons.lang.StringUtils;
4   import org.apache.tapestry5.PersistenceConstants;
5   import org.apache.tapestry5.alerts.AlertManager;
6   import org.apache.tapestry5.alerts.Duration;
7   import org.apache.tapestry5.alerts.Severity;
8   import org.apache.tapestry5.annotations.*;
9   import org.apache.tapestry5.ioc.Messages;
10  import org.apache.tapestry5.ioc.annotations.Inject;
11  import org.apache.tapestry5.services.PageRenderLinkSource;
12  import org.appfuse.Constants;
13  import org.appfuse.model.Role;
14  import org.appfuse.model.User;
15  import org.appfuse.service.RoleManager;
16  import org.appfuse.service.UserExistsException;
17  import org.appfuse.service.UserManager;
18  import org.appfuse.webapp.components.UserForm;
19  import org.appfuse.webapp.pages.admin.UserList;
20  import org.appfuse.webapp.services.EmailService;
21  import org.appfuse.webapp.services.SecurityContext;
22  import org.appfuse.webapp.util.RequestUtil;
23  import org.slf4j.Logger;
24  import org.springframework.mail.MailException;
25  import org.springframework.security.access.AccessDeniedException;
26  
27  import javax.servlet.http.HttpServletRequest;
28  import java.io.IOException;
29  import java.util.ArrayList;
30  import java.util.HashSet;
31  import java.util.List;
32  
33  /**
34   * Allow adding new users or viewing/updating existing users
35   *
36   * @author Serge Eby
37   * @version $Id: UserEdit.java 5 2008-08-30 09:59:21Z serge.eby $
38   */
39  public class UserEdit {
40  
41      @Inject
42      private Logger logger;
43  
44      @PageActivationContext(passivate = false)
45      @Property(write = false)
46      private User user;
47  
48      @Property
49      @Persist
50      private List<Role> selectedRoles;
51  
52      @Inject
53      private PageRenderLinkSource pageRenderLinkSource;
54  
55      @Inject
56      private Messages messages;
57  
58      @Inject
59      private SecurityContext securityContext;
60  
61  
62      @Inject
63      private UserManager userManager;
64  
65      @Inject
66      private RoleManager roleManager;
67  
68      @Inject
69      private HttpServletRequest request;
70  
71      @Inject
72      private AlertManager alertManager;
73  
74  
75      @Inject
76      private EmailService emailService;
77  
78      @InjectPage
79      private UserList userList;
80  
81      @InjectPage
82      private Home home;
83  
84      @Persist(PersistenceConstants.FLASH)
85      @Property
86      private Class goBack;
87  
88      @Persist
89      @Property(write = false)
90      private String from;
91  
92  
93      @Persist(PersistenceConstants.FLASH)
94      @Property(write = false)
95      private String infoMessage;
96  
97      @Component(id = "edit")
98      private UserForm form;
99  
100     private boolean delete = false;
101 
102     private boolean cancel = false;
103 
104     public void setUser(User user) {
105         this.user = user;
106     }
107 
108     public void set(User user, String from) {
109         this.user = user;
110         this.from = from;
111     }
112 
113     public Object initialize(User user, String from, String infoMessage) {
114         this.user = user;
115         this.from = from;
116         this.infoMessage = infoMessage;
117 
118         return this;
119     }
120 
121     public void setInfoMessage(String infoMessage) {
122         this.infoMessage = infoMessage;
123     }
124 
125     Object[] onPassivate() {
126         if (user != null && user.getId() != null) {
127             return new Object[]{user};
128         }
129         return new User[]{};
130     }
131 
132     void setupRender() {
133         if (user == null) {
134             user = new User();
135             // Add default role
136             user.addRole(new Role(Constants.USER_ROLE));
137         }
138 
139         selectedRoles = new ArrayList<Role>(user.getRoles());
140 
141         // if user logged in with remember me, display a warning that they
142         // can't change passwords
143         logger.debug("checking for remember me login...");
144 
145         if (securityContext.isRememberMe()) {
146             // add warning message
147             alertManager.info(messages.get("userProfile.cookieLogin"));
148         }
149 
150         // Set info message
151         form.setInfoMessage(infoMessage);
152     }
153 
154 
155     public boolean isCookieLogin() {
156         return securityContext.isRememberMe();
157     }
158 
159     // ~ --- Event Handlers
160 
161     @Log
162     @DiscardAfter
163     Object onCanceledFromEdit() {
164         //  return pageRenderLinkSource.createPageRenderLink(goBack);
165 
166         if (from != null && from.equalsIgnoreCase("list")) {
167             return pageRenderLinkSource.createPageRenderLink(UserList.class);
168         } else {
169             return pageRenderLinkSource.createPageRenderLink(Home.class);
170         }
171     }
172 
173     @Log
174     void onValidatePasswordFromEdit() {
175         // Ensure the password fields match
176         if (form.isValid()) {
177             if (!StringUtils.equals(user.getPassword(), user.getConfirmPassword())) {
178 
179                 String errorMessage = messages.format("errors.twofields",
180                         messages.get("user.confirmPassword"),
181                         messages.get("user.password"));
182 
183                 // form.recordError(passwordField, errorMessage);
184 
185                 alertManager.alert(Duration.TRANSIENT, Severity.ERROR, errorMessage);
186             }
187         }
188     }
189 
190     void onPrepare() {
191         if (user == null) {
192             user = new User();
193         }
194     }
195 
196     @Log
197     @DiscardAfter
198     Object onSuccess() throws UserExistsException, IOException {
199 
200         // Delete Button Clicked
201         if (delete) {
202             return onDelete();
203         }
204 
205         // Only Admins can update roles for other users
206         if (securityContext.isAdmin()) {
207             if (selectedRoles != null && !selectedRoles.isEmpty()) {
208                 user.getRoles().clear();
209                 for (int i = 0; selectedRoles != null && i < selectedRoles.size(); i++) {
210                     String roleName = selectedRoles.get(i).getName();
211                     user.addRole(roleManager.getRole(roleName));
212                 }
213             }
214         }
215 
216         Integer originalVersion = user.getVersion();
217 
218         try {
219             user = userManager.saveUser(user);
220         } catch (AccessDeniedException ade) {
221             // thrown by UserSecurityAdvice configured in aop:advisor userManagerSecurity
222             logger.warn(ade.getMessage());
223             return AccessDenied.class;
224         } catch (UserExistsException e) {
225             // TODO
226             //form.recordError(form.getEmailField(), "User exits");
227             alertManager.alert(Duration.TRANSIENT, Severity.ERROR,
228                     messages.format("errors.existing.user", user.getUsername(), user.getEmail())
229             );
230 
231             user.setPassword(user.getConfirmPassword());
232             user.setVersion(originalVersion);
233             return null;
234         }
235 
236         if (!"list".equalsIgnoreCase(from)) {
237             // add success messages
238             alertManager.alert(
239                     Duration.TRANSIENT,
240                     Severity.INFO,
241                     messages.format("user.saved", user.getFullName()));
242             return Home.class;
243         } else {
244             // add success messages
245             if (originalVersion == null) {
246                 alertManager.alert(Duration.TRANSIENT, Severity.INFO,
247                         messages.format("user.added", user.getFullName()));
248 
249                 try {
250                     String msg = messages.format("newuser.email.message", user.getFullName());
251                     String subject = messages.get("signup.email.subject");
252                     emailService.send(user, subject, msg, RequestUtil.getAppURL(request), false);
253                 } catch (MailException me) {
254                     alertManager.alert(
255                             Duration.TRANSIENT,
256                             Severity.ERROR,
257                             me.getCause().getLocalizedMessage());
258                 }
259                 return UserList.class;
260             } else {
261                 alertManager.alert(Duration.TRANSIENT, Severity.INFO,
262                         messages.format("user.updated.byAdmin", user.getFullName()));
263             }
264         }
265 
266         return this;
267     }
268 
269     @Log
270     Object onDelete() {
271         // Save full name before deletion
272         String fullName = user.getFullName();
273         userManager.removeUser(user.getId().toString());
274         alertManager.alert(Duration.TRANSIENT, Severity.INFO,
275                 messages.format("user.deleted", fullName)
276         );
277         logger.debug("After deletion.. ready to return userList object");
278         return UserList.class;
279     }
280 
281     public void setFrom(String from) {
282         this.from = from;
283     }
284 
285 
286 }