1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * This library is free software; you can redistribute it and/or modify it under
5    * the terms of the GNU Lesser General Public License as published by the Free
6    * Software Foundation; either version 2.1 of the License, or (at your option)
7    * any later version.
8    *
9    * This library is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11   * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12   * details.
13   */
14  
15  package com.liferay.portlet.enterpriseadmin.action;
16  
17  import com.liferay.portal.AddressCityException;
18  import com.liferay.portal.AddressStreetException;
19  import com.liferay.portal.AddressZipException;
20  import com.liferay.portal.CompanyMaxUsersException;
21  import com.liferay.portal.ContactFirstNameException;
22  import com.liferay.portal.ContactFullNameException;
23  import com.liferay.portal.ContactLastNameException;
24  import com.liferay.portal.DuplicateUserEmailAddressException;
25  import com.liferay.portal.DuplicateUserScreenNameException;
26  import com.liferay.portal.EmailAddressException;
27  import com.liferay.portal.NoSuchCountryException;
28  import com.liferay.portal.NoSuchListTypeException;
29  import com.liferay.portal.NoSuchRegionException;
30  import com.liferay.portal.NoSuchUserException;
31  import com.liferay.portal.PhoneNumberException;
32  import com.liferay.portal.RequiredUserException;
33  import com.liferay.portal.ReservedUserEmailAddressException;
34  import com.liferay.portal.ReservedUserScreenNameException;
35  import com.liferay.portal.UserEmailAddressException;
36  import com.liferay.portal.UserIdException;
37  import com.liferay.portal.UserPasswordException;
38  import com.liferay.portal.UserReminderQueryException;
39  import com.liferay.portal.UserScreenNameException;
40  import com.liferay.portal.UserSmsException;
41  import com.liferay.portal.WebsiteURLException;
42  import com.liferay.portal.kernel.bean.BeanParamUtil;
43  import com.liferay.portal.kernel.servlet.SessionErrors;
44  import com.liferay.portal.kernel.util.CalendarFactoryUtil;
45  import com.liferay.portal.kernel.util.Constants;
46  import com.liferay.portal.kernel.util.GetterUtil;
47  import com.liferay.portal.kernel.util.HttpUtil;
48  import com.liferay.portal.kernel.util.LocaleUtil;
49  import com.liferay.portal.kernel.util.ParamUtil;
50  import com.liferay.portal.kernel.util.StringPool;
51  import com.liferay.portal.kernel.util.StringUtil;
52  import com.liferay.portal.kernel.util.Validator;
53  import com.liferay.portal.model.Address;
54  import com.liferay.portal.model.Contact;
55  import com.liferay.portal.model.EmailAddress;
56  import com.liferay.portal.model.Group;
57  import com.liferay.portal.model.Layout;
58  import com.liferay.portal.model.Phone;
59  import com.liferay.portal.model.User;
60  import com.liferay.portal.model.UserGroupRole;
61  import com.liferay.portal.model.Website;
62  import com.liferay.portal.security.auth.PrincipalException;
63  import com.liferay.portal.service.ServiceContext;
64  import com.liferay.portal.service.ServiceContextFactory;
65  import com.liferay.portal.service.UserServiceUtil;
66  import com.liferay.portal.struts.PortletAction;
67  import com.liferay.portal.theme.ThemeDisplay;
68  import com.liferay.portal.util.PortalUtil;
69  import com.liferay.portal.util.WebKeys;
70  import com.liferay.portlet.InvokerPortletImpl;
71  import com.liferay.portlet.admin.util.AdminUtil;
72  import com.liferay.portlet.announcements.model.AnnouncementsDelivery;
73  import com.liferay.portlet.announcements.model.AnnouncementsEntryConstants;
74  import com.liferay.portlet.announcements.model.impl.AnnouncementsDeliveryImpl;
75  import com.liferay.portlet.communities.util.CommunitiesUtil;
76  import com.liferay.portlet.enterpriseadmin.util.EnterpriseAdminUtil;
77  
78  import java.util.ArrayList;
79  import java.util.Calendar;
80  import java.util.List;
81  
82  import javax.portlet.ActionRequest;
83  import javax.portlet.ActionResponse;
84  import javax.portlet.PortletConfig;
85  import javax.portlet.PortletRequest;
86  import javax.portlet.PortletSession;
87  import javax.portlet.RenderRequest;
88  import javax.portlet.RenderResponse;
89  
90  import javax.servlet.http.HttpServletRequest;
91  import javax.servlet.http.HttpSession;
92  
93  import org.apache.struts.Globals;
94  import org.apache.struts.action.ActionForm;
95  import org.apache.struts.action.ActionForward;
96  import org.apache.struts.action.ActionMapping;
97  
98  /**
99   * <a href="EditUserAction.java.html"><b><i>View Source</i></b></a>
100  *
101  * @author Brian Wing Shun Chan
102  * @author Jorge Ferrer
103  * @author Julio Camarero
104  * @author Wesley Gong
105  */
106 public class EditUserAction extends PortletAction {
107 
108     public void processAction(
109             ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
110             ActionRequest actionRequest, ActionResponse actionResponse)
111         throws Exception {
112 
113         String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
114 
115         try {
116             User user = null;
117             String oldScreenName = StringPool.BLANK;
118             String oldLanguageId = StringPool.BLANK;
119 
120             if (cmd.equals(Constants.ADD)) {
121                 user = addUser(actionRequest);
122             }
123             else if (cmd.equals(Constants.DEACTIVATE) ||
124                      cmd.equals(Constants.DELETE) ||
125                      cmd.equals(Constants.RESTORE)) {
126 
127                 deleteUsers(actionRequest);
128             }
129             else if (cmd.equals("deleteRole")) {
130                 deleteRole(actionRequest);
131             }
132             else if (cmd.equals(Constants.UPDATE)) {
133                 Object[] returnValue = updateUser(actionRequest);
134 
135                 user = (User)returnValue[0];
136                 oldScreenName = ((String)returnValue[1]);
137                 oldLanguageId = ((String)returnValue[2]);
138             }
139             else if (cmd.equals("unlock")) {
140                 user = updateLockout(actionRequest);
141             }
142 
143             String redirect = ParamUtil.getString(actionRequest, "redirect");
144 
145             if (user != null) {
146                 ThemeDisplay themeDisplay =
147                     (ThemeDisplay)actionRequest.getAttribute(
148                         WebKeys.THEME_DISPLAY);
149 
150                 if (Validator.isNotNull(oldScreenName)) {
151 
152                     // This will fix the redirect if the user is on his personal
153                     // my account page and changes his screen name. A redirect
154                     // that references the old screen name no longer points to a
155                     // valid screen name and therefore needs to be updated.
156 
157                     Group group = user.getGroup();
158 
159                     if (group.getGroupId() == themeDisplay.getScopeGroupId()) {
160                         Layout layout = themeDisplay.getLayout();
161 
162                         String friendlyURLPath = group.getPathFriendlyURL(
163                             layout.isPrivateLayout(), themeDisplay);
164 
165                         String oldPath =
166                             friendlyURLPath + StringPool.SLASH + oldScreenName;
167                         String newPath =
168                             friendlyURLPath + StringPool.SLASH +
169                                 user.getScreenName();
170 
171                         redirect = StringUtil.replace(
172                             redirect, oldPath, newPath);
173 
174                         redirect = StringUtil.replace(
175                             redirect, HttpUtil.encodeURL(oldPath),
176                             HttpUtil.encodeURL(newPath));
177                     }
178                 }
179 
180                 if (Validator.isNotNull(oldLanguageId) &&
181                     themeDisplay.isI18n()) {
182 
183                     String i18nLanguageId = user.getLanguageId();
184                     int pos = i18nLanguageId.indexOf(StringPool.UNDERLINE);
185 
186                     if (pos != -1){
187                         i18nLanguageId = i18nLanguageId.substring(0, pos);
188                     }
189 
190                     String i18nPath = StringPool.SLASH + i18nLanguageId;
191 
192                     redirect = StringUtil.replace(
193                         redirect, themeDisplay.getI18nPath(), i18nPath);
194                 }
195 
196                 redirect = HttpUtil.setParameter(
197                     redirect, actionResponse.getNamespace() + "p_u_i_d",
198                     user.getUserId());
199             }
200 
201             sendRedirect(actionRequest, actionResponse, redirect);
202         }
203         catch (Exception e) {
204             if (e instanceof NoSuchUserException ||
205                 e instanceof PrincipalException) {
206 
207                 SessionErrors.add(actionRequest, e.getClass().getName());
208 
209                 setForward(actionRequest, "portlet.enterprise_admin.error");
210             }
211             else if (e instanceof AddressCityException ||
212                      e instanceof AddressStreetException ||
213                      e instanceof AddressZipException ||
214                      e instanceof CompanyMaxUsersException ||
215                      e instanceof ContactFirstNameException ||
216                      e instanceof ContactFullNameException ||
217                      e instanceof ContactLastNameException ||
218                      e instanceof DuplicateUserEmailAddressException ||
219                      e instanceof DuplicateUserScreenNameException ||
220                      e instanceof EmailAddressException ||
221                      e instanceof NoSuchCountryException ||
222                      e instanceof NoSuchListTypeException ||
223                      e instanceof NoSuchRegionException ||
224                      e instanceof PhoneNumberException ||
225                      e instanceof RequiredUserException ||
226                      e instanceof ReservedUserEmailAddressException ||
227                      e instanceof ReservedUserScreenNameException ||
228                      e instanceof UserEmailAddressException ||
229                      e instanceof UserIdException ||
230                      e instanceof UserPasswordException ||
231                      e instanceof UserReminderQueryException ||
232                      e instanceof UserScreenNameException ||
233                      e instanceof UserSmsException ||
234                      e instanceof WebsiteURLException) {
235 
236                 if (e instanceof NoSuchListTypeException) {
237                     NoSuchListTypeException nslte = (NoSuchListTypeException)e;
238 
239                     SessionErrors.add(
240                         actionRequest,
241                         e.getClass().getName() + nslte.getType());
242                 }
243                 else {
244                     SessionErrors.add(actionRequest, e.getClass().getName(), e);
245                 }
246 
247                 if (e instanceof RequiredUserException) {
248                     actionResponse.sendRedirect(
249                         ParamUtil.getString(actionRequest, "redirect"));
250                 }
251             }
252             else {
253                 throw e;
254             }
255         }
256     }
257 
258     public ActionForward render(
259             ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
260             RenderRequest renderRequest, RenderResponse renderResponse)
261         throws Exception {
262 
263         try {
264             PortalUtil.getSelectedUser(renderRequest);
265         }
266         catch (Exception e) {
267             if (e instanceof PrincipalException) {
268                 SessionErrors.add(renderRequest, e.getClass().getName());
269 
270                 return mapping.findForward("portlet.enterprise_admin.error");
271             }
272             else {
273                 throw e;
274             }
275         }
276 
277         return mapping.findForward(
278             getForward(renderRequest, "portlet.enterprise_admin.edit_user"));
279     }
280 
281     protected User addUser(ActionRequest actionRequest)
282         throws Exception {
283 
284         ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
285             WebKeys.THEME_DISPLAY);
286 
287         boolean autoPassword = ParamUtil.getBoolean(
288             actionRequest, "autoPassword", true);
289         String password1 = ParamUtil.getString(actionRequest, "password1");
290         String password2 = ParamUtil.getString(actionRequest, "password2");
291 
292         String reminderQueryQuestion = ParamUtil.getString(
293             actionRequest, "reminderQueryQuestion");
294 
295         if (reminderQueryQuestion.equals(EnterpriseAdminUtil.CUSTOM_QUESTION)) {
296             reminderQueryQuestion = ParamUtil.getString(
297                 actionRequest, "reminderQueryCustomQuestion");
298         }
299 
300         String reminderQueryAnswer = ParamUtil.getString(
301             actionRequest, "reminderQueryAnswer");
302         boolean autoScreenName = ParamUtil.getBoolean(
303             actionRequest, "autoScreenName");
304         String screenName = ParamUtil.getString(actionRequest, "screenName");
305         String emailAddress = ParamUtil.getString(
306             actionRequest, "emailAddress");
307         String openId = ParamUtil.getString(actionRequest, "openId");
308         String languageId = ParamUtil.getString(actionRequest, "languageId");
309         String timeZoneId = ParamUtil.getString(actionRequest, "timeZoneId");
310         String greeting = ParamUtil.getString(actionRequest, "greeting");
311         String firstName = ParamUtil.getString(actionRequest, "firstName");
312         String middleName = ParamUtil.getString(actionRequest, "middleName");
313         String lastName = ParamUtil.getString(actionRequest, "lastName");
314         int prefixId = ParamUtil.getInteger(actionRequest, "prefixId");
315         int suffixId = ParamUtil.getInteger(actionRequest, "suffixId");
316         boolean male = ParamUtil.getBoolean(actionRequest, "male", true);
317         int birthdayMonth = ParamUtil.getInteger(
318             actionRequest, "birthdayMonth");
319         int birthdayDay = ParamUtil.getInteger(actionRequest, "birthdayDay");
320         int birthdayYear = ParamUtil.getInteger(actionRequest, "birthdayYear");
321         String comments = ParamUtil.getString(actionRequest, "comments");
322         String smsSn = ParamUtil.getString(actionRequest, "smsSn");
323         String aimSn = ParamUtil.getString(actionRequest, "aimSn");
324         String facebookSn = ParamUtil.getString(actionRequest, "facebookSn");
325         String icqSn = ParamUtil.getString(actionRequest, "icqSn");
326         String jabberSn = ParamUtil.getString(actionRequest, "jabberSn");
327         String msnSn = ParamUtil.getString(actionRequest, "msnSn");
328         String mySpaceSn = ParamUtil.getString(actionRequest, "mySpaceSn");
329         String skypeSn = ParamUtil.getString(actionRequest, "skypeSn");
330         String twitterSn = ParamUtil.getString(actionRequest, "twitterSn");
331         String ymSn = ParamUtil.getString(actionRequest, "ymSn");
332         String jobTitle = ParamUtil.getString(actionRequest, "jobTitle");
333         long[] groupIds = getLongArray(
334             actionRequest, "groupsSearchContainerPrimaryKeys");
335         long[] organizationIds = getLongArray(
336             actionRequest, "organizationsSearchContainerPrimaryKeys");
337         long[] roleIds = getLongArray(
338             actionRequest, "rolesSearchContainerPrimaryKeys");
339         List<UserGroupRole> userGroupRoles =
340             EnterpriseAdminUtil.getUserGroupRoles(actionRequest);
341         long[] userGroupIds = getLongArray(
342             actionRequest, "userGroupsSearchContainerPrimaryKeys");
343         boolean sendEmail = true;
344         List<Address> addresses = EnterpriseAdminUtil.getAddresses(
345             actionRequest);
346         List<EmailAddress> emailAddresses =
347             EnterpriseAdminUtil.getEmailAddresses(actionRequest);
348         List<Phone> phones = EnterpriseAdminUtil.getPhones(actionRequest);
349         List<Website> websites = EnterpriseAdminUtil.getWebsites(actionRequest);
350         List<AnnouncementsDelivery> announcementsDeliveries =
351             getAnnouncementsDeliveries(actionRequest);
352 
353         ServiceContext serviceContext = ServiceContextFactory.getInstance(
354             User.class.getName(), actionRequest);
355 
356         User user = null;
357 
358         user = UserServiceUtil.addUser(
359             themeDisplay.getCompanyId(), autoPassword, password1, password2,
360             autoScreenName, screenName, emailAddress, openId,
361             LocaleUtil.getDefault(), firstName, middleName, lastName, prefixId,
362             suffixId, male, birthdayMonth, birthdayDay, birthdayYear, jobTitle,
363             groupIds, organizationIds, roleIds, userGroupIds, sendEmail,
364             addresses, emailAddresses, phones, websites,
365             announcementsDeliveries, serviceContext);
366 
367         if (!userGroupRoles.isEmpty()) {
368             for (UserGroupRole userGroupRole : userGroupRoles) {
369                 userGroupRole.setUserId(user.getUserId());
370             }
371 
372             user = UserServiceUtil.updateUser(
373                 user.getUserId(), StringPool.BLANK, StringPool.BLANK,
374                 StringPool.BLANK, false, reminderQueryQuestion,
375                 reminderQueryAnswer, screenName, emailAddress, openId,
376                 languageId, timeZoneId, greeting, comments, firstName,
377                 middleName, lastName, prefixId, suffixId, male, birthdayMonth,
378                 birthdayDay, birthdayYear, smsSn, aimSn, facebookSn, icqSn,
379                 jabberSn, msnSn, mySpaceSn, skypeSn, twitterSn, ymSn, jobTitle,
380                 groupIds, organizationIds, roleIds, userGroupRoles,
381                 userGroupIds, addresses, emailAddresses, phones, websites,
382                 announcementsDeliveries, serviceContext);
383         }
384 
385         long publicLayoutSetPrototypeId = ParamUtil.getLong(
386             actionRequest, "publicLayoutSetPrototypeId");
387         long privateLayoutSetPrototypeId = ParamUtil.getLong(
388             actionRequest, "privateLayoutSetPrototypeId");
389 
390         CommunitiesUtil.applyLayoutSetPrototypes(
391             user.getGroup(), publicLayoutSetPrototypeId,
392             privateLayoutSetPrototypeId);
393 
394         return user;
395     }
396 
397     protected void deleteRole(ActionRequest actionRequest) throws Exception {
398         User user = PortalUtil.getSelectedUser(actionRequest);
399 
400         long roleId = ParamUtil.getLong(actionRequest, "roleId");
401 
402         UserServiceUtil.deleteRoleUser(roleId, user.getUserId());
403     }
404 
405     protected void deleteUsers(ActionRequest actionRequest) throws Exception {
406         String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
407 
408         long[] deleteUserIds = StringUtil.split(
409             ParamUtil.getString(actionRequest, "deleteUserIds"), 0L);
410 
411         for (int i = 0; i < deleteUserIds.length; i++) {
412             if (cmd.equals(Constants.DEACTIVATE) ||
413                 cmd.equals(Constants.RESTORE)) {
414 
415                 boolean active = !cmd.equals(Constants.DEACTIVATE);
416 
417                 UserServiceUtil.updateActive(deleteUserIds[i], active);
418             }
419             else {
420                 UserServiceUtil.deleteUser(deleteUserIds[i]);
421             }
422         }
423     }
424 
425     protected List<AnnouncementsDelivery> getAnnouncementsDeliveries(
426         ActionRequest actionRequest) {
427 
428         List<AnnouncementsDelivery> announcementsDeliveries =
429             new ArrayList<AnnouncementsDelivery>();
430 
431         for (String type : AnnouncementsEntryConstants.TYPES) {
432             boolean email = ParamUtil.getBoolean(
433                 actionRequest, "announcementsType" + type + "Email");
434             boolean sms = ParamUtil.getBoolean(
435                 actionRequest, "announcementsType" + type + "Sms");
436             boolean website = ParamUtil.getBoolean(
437                 actionRequest, "announcementsType" + type + "Website");
438 
439             AnnouncementsDelivery announcementsDelivery =
440                 new AnnouncementsDeliveryImpl();
441 
442             announcementsDelivery.setType(type);
443             announcementsDelivery.setEmail(email);
444             announcementsDelivery.setSms(sms);
445             announcementsDelivery.setWebsite(website);
446 
447             announcementsDeliveries.add(announcementsDelivery);
448         }
449 
450         return announcementsDeliveries;
451     }
452 
453     protected long[] getLongArray(PortletRequest portletRequest, String name) {
454         String value = portletRequest.getParameter(name);
455 
456         if (value == null) {
457             return null;
458         }
459 
460         return StringUtil.split(GetterUtil.getString(value), 0L);
461     }
462 
463     protected User updateLockout(ActionRequest actionRequest) throws Exception {
464         User user = PortalUtil.getSelectedUser(actionRequest);
465 
466         UserServiceUtil.updateLockout(user.getUserId(), false);
467 
468         return user;
469     }
470 
471     protected Object[] updateUser(ActionRequest actionRequest)
472         throws Exception {
473 
474         ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
475             WebKeys.THEME_DISPLAY);
476 
477         User user = PortalUtil.getSelectedUser(actionRequest);
478 
479         Contact contact = user.getContact();
480 
481         String oldPassword = AdminUtil.getUpdateUserPassword(
482             actionRequest, user.getUserId());
483         String newPassword1 = ParamUtil.getString(actionRequest, "password1");
484         String newPassword2 = ParamUtil.getString(actionRequest, "password2");
485         boolean passwordReset = ParamUtil.getBoolean(
486             actionRequest, "passwordReset");
487 
488         String reminderQueryQuestion = BeanParamUtil.getString(
489             user, actionRequest, "reminderQueryQuestion");
490 
491         if (reminderQueryQuestion.equals(EnterpriseAdminUtil.CUSTOM_QUESTION)) {
492             reminderQueryQuestion = BeanParamUtil.getString(
493                 user, actionRequest, "reminderQueryCustomQuestion");
494         }
495 
496         String reminderQueryAnswer = BeanParamUtil.getString(
497             user, actionRequest, "reminderQueryAnswer");
498         String oldScreenName = user.getScreenName();
499         String screenName = BeanParamUtil.getString(
500             user, actionRequest, "screenName");
501         String emailAddress = BeanParamUtil.getString(
502             user, actionRequest, "emailAddress");
503         String openId = BeanParamUtil.getString(user, actionRequest, "openId");
504         String oldLanguageId = user.getLanguageId();
505         String languageId = BeanParamUtil.getString(
506             user, actionRequest, "languageId");
507         String timeZoneId = BeanParamUtil.getString(
508             user, actionRequest, "timeZoneId");
509         String greeting = BeanParamUtil.getString(
510             user, actionRequest, "greeting");
511         String firstName = BeanParamUtil.getString(
512             user, actionRequest, "firstName");
513         String middleName = BeanParamUtil.getString(
514             user, actionRequest, "middleName");
515         String lastName = BeanParamUtil.getString(
516             user, actionRequest, "lastName");
517         int prefixId = BeanParamUtil.getInteger(
518             user, actionRequest, "prefixId");
519         int suffixId = BeanParamUtil.getInteger(
520             user, actionRequest, "suffixId");
521         boolean male = BeanParamUtil.getBoolean(
522             user, actionRequest, "male", true);
523 
524         Calendar birthdayCal = CalendarFactoryUtil.getCalendar();
525 
526         birthdayCal.setTime(contact.getBirthday());
527 
528         int birthdayMonth = ParamUtil.getInteger(
529             actionRequest, "birthdayMonth", birthdayCal.get(Calendar.MONTH));
530         int birthdayDay = ParamUtil.getInteger(
531             actionRequest, "birthdayDay", birthdayCal.get(Calendar.DATE));
532         int birthdayYear = ParamUtil.getInteger(
533             actionRequest, "birthdayYear", birthdayCal.get(Calendar.YEAR));
534         String comments = BeanParamUtil.getString(
535             user, actionRequest, "comments");
536         String smsSn = BeanParamUtil.getString(contact, actionRequest, "smsSn");
537         String aimSn = BeanParamUtil.getString(contact, actionRequest, "aimSn");
538         String facebookSn = BeanParamUtil.getString(
539             contact, actionRequest, "facebookSn");
540         String icqSn = BeanParamUtil.getString(contact, actionRequest, "icqSn");
541         String jabberSn = BeanParamUtil.getString(
542             contact, actionRequest, "jabberSn");
543         String msnSn = BeanParamUtil.getString(contact, actionRequest, "msnSn");
544         String mySpaceSn = BeanParamUtil.getString(
545             contact, actionRequest, "mySpaceSn");
546         String skypeSn = BeanParamUtil.getString(
547             contact, actionRequest, "skypeSn");
548         String twitterSn = BeanParamUtil.getString(
549             contact, actionRequest, "twitterSn");
550         String ymSn = BeanParamUtil.getString(contact, actionRequest, "ymSn");
551         String jobTitle = BeanParamUtil.getString(
552             user, actionRequest, "jobTitle");
553         long[] groupIds = getLongArray(
554             actionRequest, "groupsSearchContainerPrimaryKeys");
555         long[] organizationIds = getLongArray(
556             actionRequest, "organizationsSearchContainerPrimaryKeys");
557         long[] roleIds = getLongArray(
558             actionRequest, "rolesSearchContainerPrimaryKeys");
559         List<UserGroupRole> userGroupRoles =
560             EnterpriseAdminUtil.getUserGroupRoles(actionRequest);
561         long[] userGroupIds = getLongArray(
562             actionRequest, "userGroupsSearchContainerPrimaryKeys");
563         List<Address> addresses = EnterpriseAdminUtil.getAddresses(
564             actionRequest);
565         List<EmailAddress> emailAddresses =
566             EnterpriseAdminUtil.getEmailAddresses(actionRequest);
567         List<Phone> phones = EnterpriseAdminUtil.getPhones(actionRequest);
568         List<Website> websites = EnterpriseAdminUtil.getWebsites(actionRequest);
569         List<AnnouncementsDelivery> announcementsDeliveries =
570             getAnnouncementsDeliveries(actionRequest);
571 
572         ServiceContext serviceContext = ServiceContextFactory.getInstance(
573             User.class.getName(), actionRequest);
574 
575         user = UserServiceUtil.updateUser(
576             user.getUserId(), oldPassword, newPassword1, newPassword2,
577             passwordReset, reminderQueryQuestion, reminderQueryAnswer,
578             screenName, emailAddress, openId, languageId, timeZoneId,greeting,
579             comments, firstName, middleName, lastName, prefixId, suffixId, male,
580             birthdayMonth, birthdayDay, birthdayYear, smsSn, aimSn, facebookSn,
581             icqSn, jabberSn, msnSn, mySpaceSn, skypeSn, twitterSn, ymSn,
582             jobTitle, groupIds, organizationIds, roleIds, userGroupRoles,
583             userGroupIds, addresses, emailAddresses, phones, websites,
584             announcementsDeliveries, serviceContext);
585 
586         if (oldScreenName.equals(user.getScreenName())) {
587             oldScreenName = StringPool.BLANK;
588         }
589 
590         boolean deletePortrait = ParamUtil.getBoolean(
591             actionRequest, "deletePortrait");
592 
593         if (deletePortrait) {
594             UserServiceUtil.deletePortrait(user.getUserId());
595         }
596 
597         if (user.getUserId() == themeDisplay.getUserId()) {
598 
599             // Reset the locale
600 
601             HttpServletRequest request = PortalUtil.getHttpServletRequest(
602                 actionRequest);
603             HttpSession session = request.getSession();
604 
605             session.removeAttribute(Globals.LOCALE_KEY);
606 
607             // Clear cached portlet responses
608 
609             PortletSession portletSession = actionRequest.getPortletSession();
610 
611             InvokerPortletImpl.clearResponses(portletSession);
612 
613             // Password
614 
615             if (Validator.isNotNull(newPassword1)) {
616                 portletSession.setAttribute(
617                     WebKeys.USER_PASSWORD, newPassword1,
618                     PortletSession.APPLICATION_SCOPE);
619             }
620         }
621 
622         long publicLayoutSetPrototypeId = ParamUtil.getLong(
623             actionRequest, "publicLayoutSetPrototypeId");
624         long privateLayoutSetPrototypeId = ParamUtil.getLong(
625             actionRequest, "privateLayoutSetPrototypeId");
626 
627         CommunitiesUtil.applyLayoutSetPrototypes(
628             user.getGroup(), publicLayoutSetPrototypeId,
629             privateLayoutSetPrototypeId);
630 
631         return new Object[] {user, oldScreenName, oldLanguageId};
632     }
633 
634 }