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
35
36
37
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
136 user.addRole(new Role(Constants.USER_ROLE));
137 }
138
139 selectedRoles = new ArrayList<Role>(user.getRoles());
140
141
142
143 logger.debug("checking for remember me login...");
144
145 if (securityContext.isRememberMe()) {
146
147 alertManager.info(messages.get("userProfile.cookieLogin"));
148 }
149
150
151 form.setInfoMessage(infoMessage);
152 }
153
154
155 public boolean isCookieLogin() {
156 return securityContext.isRememberMe();
157 }
158
159
160
161 @Log
162 @DiscardAfter
163 Object onCanceledFromEdit() {
164
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
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
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
201 if (delete) {
202 return onDelete();
203 }
204
205
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
222 logger.warn(ade.getMessage());
223 return AccessDenied.class;
224 } catch (UserExistsException e) {
225
226
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
238 alertManager.alert(
239 Duration.TRANSIENT,
240 Severity.INFO,
241 messages.format("user.saved", user.getFullName()));
242 return Home.class;
243 } else {
244
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
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 }