001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portlet.usersadmin.action;
016    
017    import com.liferay.portal.AddressCityException;
018    import com.liferay.portal.AddressStreetException;
019    import com.liferay.portal.AddressZipException;
020    import com.liferay.portal.CompanyMaxUsersException;
021    import com.liferay.portal.ContactBirthdayException;
022    import com.liferay.portal.ContactFirstNameException;
023    import com.liferay.portal.ContactFullNameException;
024    import com.liferay.portal.ContactLastNameException;
025    import com.liferay.portal.DuplicateOpenIdException;
026    import com.liferay.portal.DuplicateUserEmailAddressException;
027    import com.liferay.portal.DuplicateUserScreenNameException;
028    import com.liferay.portal.EmailAddressException;
029    import com.liferay.portal.GroupFriendlyURLException;
030    import com.liferay.portal.NoSuchCountryException;
031    import com.liferay.portal.NoSuchListTypeException;
032    import com.liferay.portal.NoSuchRegionException;
033    import com.liferay.portal.NoSuchUserException;
034    import com.liferay.portal.PhoneNumberException;
035    import com.liferay.portal.RequiredUserException;
036    import com.liferay.portal.ReservedUserEmailAddressException;
037    import com.liferay.portal.ReservedUserScreenNameException;
038    import com.liferay.portal.UserEmailAddressException;
039    import com.liferay.portal.UserIdException;
040    import com.liferay.portal.UserPasswordException;
041    import com.liferay.portal.UserReminderQueryException;
042    import com.liferay.portal.UserScreenNameException;
043    import com.liferay.portal.UserSmsException;
044    import com.liferay.portal.WebsiteURLException;
045    import com.liferay.portal.kernel.bean.BeanParamUtil;
046    import com.liferay.portal.kernel.language.LanguageUtil;
047    import com.liferay.portal.kernel.servlet.SessionErrors;
048    import com.liferay.portal.kernel.servlet.SessionMessages;
049    import com.liferay.portal.kernel.util.CalendarFactoryUtil;
050    import com.liferay.portal.kernel.util.CharPool;
051    import com.liferay.portal.kernel.util.Constants;
052    import com.liferay.portal.kernel.util.GetterUtil;
053    import com.liferay.portal.kernel.util.HttpUtil;
054    import com.liferay.portal.kernel.util.LocaleUtil;
055    import com.liferay.portal.kernel.util.ParamUtil;
056    import com.liferay.portal.kernel.util.StringPool;
057    import com.liferay.portal.kernel.util.StringUtil;
058    import com.liferay.portal.kernel.util.Validator;
059    import com.liferay.portal.kernel.workflow.WorkflowConstants;
060    import com.liferay.portal.model.Address;
061    import com.liferay.portal.model.Company;
062    import com.liferay.portal.model.Contact;
063    import com.liferay.portal.model.EmailAddress;
064    import com.liferay.portal.model.Group;
065    import com.liferay.portal.model.Layout;
066    import com.liferay.portal.model.Phone;
067    import com.liferay.portal.model.User;
068    import com.liferay.portal.model.UserGroupRole;
069    import com.liferay.portal.model.Website;
070    import com.liferay.portal.security.auth.PrincipalException;
071    import com.liferay.portal.security.membershippolicy.MembershipPolicyException;
072    import com.liferay.portal.service.ServiceContext;
073    import com.liferay.portal.service.ServiceContextFactory;
074    import com.liferay.portal.service.UserLocalServiceUtil;
075    import com.liferay.portal.service.UserServiceUtil;
076    import com.liferay.portal.struts.PortletAction;
077    import com.liferay.portal.theme.ThemeDisplay;
078    import com.liferay.portal.util.PortalUtil;
079    import com.liferay.portal.util.PortletKeys;
080    import com.liferay.portal.util.PropsValues;
081    import com.liferay.portal.util.WebKeys;
082    import com.liferay.portlet.InvokerPortletImpl;
083    import com.liferay.portlet.admin.util.AdminUtil;
084    import com.liferay.portlet.announcements.model.AnnouncementsDelivery;
085    import com.liferay.portlet.announcements.model.AnnouncementsEntryConstants;
086    import com.liferay.portlet.announcements.model.impl.AnnouncementsDeliveryImpl;
087    import com.liferay.portlet.announcements.service.AnnouncementsDeliveryLocalServiceUtil;
088    import com.liferay.portlet.sites.util.SitesUtil;
089    import com.liferay.portlet.usersadmin.util.UsersAdmin;
090    import com.liferay.portlet.usersadmin.util.UsersAdminUtil;
091    
092    import java.util.ArrayList;
093    import java.util.Calendar;
094    import java.util.List;
095    import java.util.Locale;
096    
097    import javax.portlet.ActionRequest;
098    import javax.portlet.ActionResponse;
099    import javax.portlet.PortletConfig;
100    import javax.portlet.PortletRequest;
101    import javax.portlet.PortletSession;
102    import javax.portlet.RenderRequest;
103    import javax.portlet.RenderResponse;
104    
105    import javax.servlet.http.HttpServletRequest;
106    import javax.servlet.http.HttpServletResponse;
107    import javax.servlet.http.HttpSession;
108    
109    import org.apache.struts.Globals;
110    import org.apache.struts.action.ActionForm;
111    import org.apache.struts.action.ActionForward;
112    import org.apache.struts.action.ActionMapping;
113    
114    /**
115     * @author Brian Wing Shun Chan
116     * @author Jorge Ferrer
117     * @author Julio Camarero
118     * @author Wesley Gong
119     */
120    public class EditUserAction extends PortletAction {
121    
122            @Override
123            public void processAction(
124                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
125                            ActionRequest actionRequest, ActionResponse actionResponse)
126                    throws Exception {
127    
128                    String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
129    
130                    try {
131                            User user = null;
132                            String oldScreenName = StringPool.BLANK;
133                            String oldLanguageId = StringPool.BLANK;
134    
135                            if (cmd.equals(Constants.ADD)) {
136                                    user = addUser(actionRequest);
137                            }
138                            else if (cmd.equals(Constants.DEACTIVATE) ||
139                                             cmd.equals(Constants.DELETE) ||
140                                             cmd.equals(Constants.RESTORE)) {
141    
142                                    deleteUsers(actionRequest);
143                            }
144                            else if (cmd.equals("deleteRole")) {
145                                    deleteRole(actionRequest);
146                            }
147                            else if (cmd.equals(Constants.UPDATE)) {
148                                    Object[] returnValue = updateUser(
149                                            actionRequest, actionResponse);
150    
151                                    user = (User)returnValue[0];
152                                    oldScreenName = ((String)returnValue[1]);
153                                    oldLanguageId = ((String)returnValue[2]);
154                            }
155                            else if (cmd.equals("unlock")) {
156                                    user = updateLockout(actionRequest);
157                            }
158    
159                            ThemeDisplay themeDisplay =
160                                    (ThemeDisplay)actionRequest.getAttribute(WebKeys.THEME_DISPLAY);
161    
162                            String redirect = ParamUtil.getString(actionRequest, "redirect");
163    
164                            if (user != null) {
165                                    if (Validator.isNotNull(oldScreenName)) {
166    
167                                            // This will fix the redirect if the user is on his personal
168                                            // my account page and changes his screen name. A redirect
169                                            // that references the old screen name no longer points to a
170                                            // valid screen name and therefore needs to be updated.
171    
172                                            Group group = user.getGroup();
173    
174                                            if (group.getGroupId() == themeDisplay.getScopeGroupId()) {
175                                                    Layout layout = themeDisplay.getLayout();
176    
177                                                    String friendlyURLPath = group.getPathFriendlyURL(
178                                                            layout.isPrivateLayout(), themeDisplay);
179    
180                                                    String oldPath =
181                                                            friendlyURLPath + StringPool.SLASH + oldScreenName;
182                                                    String newPath =
183                                                            friendlyURLPath + StringPool.SLASH +
184                                                                    user.getScreenName();
185    
186                                                    redirect = StringUtil.replace(
187                                                            redirect, oldPath, newPath);
188    
189                                                    redirect = StringUtil.replace(
190                                                            redirect, HttpUtil.encodeURL(oldPath),
191                                                            HttpUtil.encodeURL(newPath));
192                                            }
193                                    }
194    
195                                    if (Validator.isNotNull(oldLanguageId) &&
196                                            themeDisplay.isI18n()) {
197    
198                                            String i18nLanguageId = user.getLanguageId();
199                                            int pos = i18nLanguageId.indexOf(CharPool.UNDERLINE);
200    
201                                            if (pos != -1) {
202                                                    i18nLanguageId = i18nLanguageId.substring(0, pos);
203                                            }
204    
205                                            String i18nPath = StringPool.SLASH + i18nLanguageId;
206    
207                                            redirect = StringUtil.replace(
208                                                    redirect, themeDisplay.getI18nPath(), i18nPath);
209                                    }
210    
211                                    redirect = HttpUtil.setParameter(
212                                            redirect, actionResponse.getNamespace() + "p_u_i_d",
213                                            user.getUserId());
214                            }
215    
216                            Group scopeGroup = themeDisplay.getScopeGroup();
217    
218                            if (scopeGroup.isUser()) {
219                                    try {
220                                            UserLocalServiceUtil.getUserById(scopeGroup.getClassPK());
221                                    }
222                                    catch (NoSuchUserException nsue) {
223                                            redirect = HttpUtil.setParameter(
224                                                    redirect, "doAsGroupId" , 0);
225                                            redirect = HttpUtil.setParameter(
226                                                    redirect, "refererPlid" , 0);
227                                    }
228                            }
229    
230                            sendRedirect(actionRequest, actionResponse, redirect);
231                    }
232                    catch (Exception e) {
233                            if (e instanceof NoSuchUserException ||
234                                    e instanceof PrincipalException) {
235    
236                                    SessionErrors.add(actionRequest, e.getClass());
237    
238                                    setForward(actionRequest, "portlet.users_admin.error");
239                            }
240                            else if (e instanceof AddressCityException ||
241                                             e instanceof AddressStreetException ||
242                                             e instanceof AddressZipException ||
243                                             e instanceof CompanyMaxUsersException ||
244                                             e instanceof ContactBirthdayException ||
245                                             e instanceof ContactFirstNameException ||
246                                             e instanceof ContactFullNameException ||
247                                             e instanceof ContactLastNameException ||
248                                             e instanceof DuplicateOpenIdException ||
249                                             e instanceof DuplicateUserEmailAddressException ||
250                                             e instanceof DuplicateUserScreenNameException ||
251                                             e instanceof EmailAddressException ||
252                                             e instanceof GroupFriendlyURLException ||
253                                             e instanceof MembershipPolicyException ||
254                                             e instanceof NoSuchCountryException ||
255                                             e instanceof NoSuchListTypeException ||
256                                             e instanceof NoSuchRegionException ||
257                                             e instanceof PhoneNumberException ||
258                                             e instanceof RequiredUserException ||
259                                             e instanceof ReservedUserEmailAddressException ||
260                                             e instanceof ReservedUserScreenNameException ||
261                                             e instanceof UserEmailAddressException ||
262                                             e instanceof UserIdException ||
263                                             e instanceof UserPasswordException ||
264                                             e instanceof UserReminderQueryException ||
265                                             e instanceof UserScreenNameException ||
266                                             e instanceof UserSmsException ||
267                                             e instanceof WebsiteURLException) {
268    
269                                    if (e instanceof NoSuchListTypeException) {
270                                            NoSuchListTypeException nslte = (NoSuchListTypeException)e;
271    
272                                            SessionErrors.add(
273                                                    actionRequest,
274                                                    e.getClass().getName() + nslte.getType());
275                                    }
276                                    else {
277                                            SessionErrors.add(actionRequest, e.getClass(), e);
278                                    }
279    
280                                    if (e instanceof CompanyMaxUsersException ||
281                                            e instanceof RequiredUserException) {
282    
283                                            String redirect = PortalUtil.escapeRedirect(
284                                                    ParamUtil.getString(actionRequest, "redirect"));
285    
286                                            if (Validator.isNotNull(redirect)) {
287                                                    actionResponse.sendRedirect(redirect);
288                                            }
289                                    }
290                            }
291                            else {
292                                    throw e;
293                            }
294                    }
295            }
296    
297            @Override
298            public ActionForward render(
299                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
300                            RenderRequest renderRequest, RenderResponse renderResponse)
301                    throws Exception {
302    
303                    try {
304                            PortalUtil.getSelectedUser(renderRequest);
305                    }
306                    catch (Exception e) {
307                            if (e instanceof PrincipalException) {
308                                    SessionErrors.add(renderRequest, e.getClass());
309    
310                                    return mapping.findForward("portlet.users_admin.error");
311                            }
312                            else {
313                                    throw e;
314                            }
315                    }
316    
317                    return mapping.findForward(
318                            getForward(renderRequest, "portlet.users_admin.edit_user"));
319            }
320    
321            protected User addUser(ActionRequest actionRequest) throws Exception {
322                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
323                            WebKeys.THEME_DISPLAY);
324    
325                    boolean autoPassword = ParamUtil.getBoolean(
326                            actionRequest, "autoPassword", true);
327                    String password1 = actionRequest.getParameter("password1");
328                    String password2 = actionRequest.getParameter("password2");
329    
330                    String reminderQueryQuestion = ParamUtil.getString(
331                            actionRequest, "reminderQueryQuestion");
332    
333                    if (reminderQueryQuestion.equals(UsersAdmin.CUSTOM_QUESTION)) {
334                            reminderQueryQuestion = ParamUtil.getString(
335                                    actionRequest, "reminderQueryCustomQuestion");
336                    }
337    
338                    String reminderQueryAnswer = ParamUtil.getString(
339                            actionRequest, "reminderQueryAnswer");
340                    boolean autoScreenName = ParamUtil.getBoolean(
341                            actionRequest, "autoScreenName");
342                    String screenName = ParamUtil.getString(actionRequest, "screenName");
343                    String emailAddress = ParamUtil.getString(
344                            actionRequest, "emailAddress");
345                    long facebookId = 0;
346                    String openId = ParamUtil.getString(actionRequest, "openId");
347                    String languageId = ParamUtil.getString(actionRequest, "languageId");
348                    String timeZoneId = ParamUtil.getString(actionRequest, "timeZoneId");
349                    String greeting = ParamUtil.getString(actionRequest, "greeting");
350                    String firstName = ParamUtil.getString(actionRequest, "firstName");
351                    String middleName = ParamUtil.getString(actionRequest, "middleName");
352                    String lastName = ParamUtil.getString(actionRequest, "lastName");
353                    int prefixId = ParamUtil.getInteger(actionRequest, "prefixId");
354                    int suffixId = ParamUtil.getInteger(actionRequest, "suffixId");
355                    boolean male = ParamUtil.getBoolean(actionRequest, "male", true);
356                    int birthdayMonth = ParamUtil.getInteger(
357                            actionRequest, "birthdayMonth");
358                    int birthdayDay = ParamUtil.getInteger(actionRequest, "birthdayDay");
359                    int birthdayYear = ParamUtil.getInteger(actionRequest, "birthdayYear");
360                    String comments = ParamUtil.getString(actionRequest, "comments");
361                    String smsSn = ParamUtil.getString(actionRequest, "smsSn");
362                    String aimSn = ParamUtil.getString(actionRequest, "aimSn");
363                    String facebookSn = ParamUtil.getString(actionRequest, "facebookSn");
364                    String icqSn = ParamUtil.getString(actionRequest, "icqSn");
365                    String jabberSn = ParamUtil.getString(actionRequest, "jabberSn");
366                    String msnSn = ParamUtil.getString(actionRequest, "msnSn");
367                    String mySpaceSn = ParamUtil.getString(actionRequest, "mySpaceSn");
368                    String skypeSn = ParamUtil.getString(actionRequest, "skypeSn");
369                    String twitterSn = ParamUtil.getString(actionRequest, "twitterSn");
370                    String ymSn = ParamUtil.getString(actionRequest, "ymSn");
371                    String jobTitle = ParamUtil.getString(actionRequest, "jobTitle");
372                    long[] groupIds = getLongArray(
373                            actionRequest, "groupsSearchContainerPrimaryKeys");
374                    long[] organizationIds = getLongArray(
375                            actionRequest, "organizationsSearchContainerPrimaryKeys");
376                    long[] roleIds = getLongArray(
377                            actionRequest, "rolesSearchContainerPrimaryKeys");
378                    List<UserGroupRole> userGroupRoles = UsersAdminUtil.getUserGroupRoles(
379                            actionRequest);
380                    long[] userGroupIds = getLongArray(
381                            actionRequest, "userGroupsSearchContainerPrimaryKeys");
382                    List<Address> addresses = UsersAdminUtil.getAddresses(actionRequest);
383                    List<EmailAddress> emailAddresses = UsersAdminUtil.getEmailAddresses(
384                            actionRequest);
385                    List<Phone> phones = UsersAdminUtil.getPhones(actionRequest);
386                    List<Website> websites = UsersAdminUtil.getWebsites(actionRequest);
387                    List<AnnouncementsDelivery> announcementsDeliveries =
388                            getAnnouncementsDeliveries(actionRequest);
389                    boolean sendEmail = true;
390    
391                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
392                            User.class.getName(), actionRequest);
393    
394                    User user = UserServiceUtil.addUser(
395                            themeDisplay.getCompanyId(), autoPassword, password1, password2,
396                            autoScreenName, screenName, emailAddress, facebookId, openId,
397                            LocaleUtil.getDefault(), firstName, middleName, lastName, prefixId,
398                            suffixId, male, birthdayMonth, birthdayDay, birthdayYear, jobTitle,
399                            groupIds, organizationIds, roleIds, userGroupIds, addresses,
400                            emailAddresses, phones, websites, announcementsDeliveries,
401                            sendEmail, serviceContext);
402    
403                    if (!userGroupRoles.isEmpty()) {
404                            for (UserGroupRole userGroupRole : userGroupRoles) {
405                                    userGroupRole.setUserId(user.getUserId());
406                            }
407    
408                            user = UserServiceUtil.updateUser(
409                                    user.getUserId(), StringPool.BLANK, StringPool.BLANK,
410                                    StringPool.BLANK, false, reminderQueryQuestion,
411                                    reminderQueryAnswer, user.getScreenName(),
412                                    user.getEmailAddress(), facebookId, openId, languageId,
413                                    timeZoneId, greeting, comments, firstName, middleName, lastName,
414                                    prefixId, suffixId, male, birthdayMonth, birthdayDay,
415                                    birthdayYear, smsSn, aimSn, facebookSn, icqSn, jabberSn, msnSn,
416                                    mySpaceSn, skypeSn, twitterSn, ymSn, jobTitle, groupIds,
417                                    organizationIds, roleIds, userGroupRoles, userGroupIds,
418                                    addresses, emailAddresses, phones, websites,
419                                    announcementsDeliveries, serviceContext);
420                    }
421    
422                    long publicLayoutSetPrototypeId = ParamUtil.getLong(
423                            actionRequest, "publicLayoutSetPrototypeId");
424                    long privateLayoutSetPrototypeId = ParamUtil.getLong(
425                            actionRequest, "privateLayoutSetPrototypeId");
426                    boolean publicLayoutSetPrototypeLinkEnabled = ParamUtil.getBoolean(
427                            actionRequest, "publicLayoutSetPrototypeLinkEnabled");
428                    boolean privateLayoutSetPrototypeLinkEnabled = ParamUtil.getBoolean(
429                            actionRequest, "privateLayoutSetPrototypeLinkEnabled");
430    
431                    SitesUtil.updateLayoutSetPrototypesLinks(
432                            user.getGroup(), publicLayoutSetPrototypeId,
433                            privateLayoutSetPrototypeId, publicLayoutSetPrototypeLinkEnabled,
434                            privateLayoutSetPrototypeLinkEnabled);
435    
436                    return user;
437            }
438    
439            protected void deleteRole(ActionRequest actionRequest) throws Exception {
440                    User user = PortalUtil.getSelectedUser(actionRequest);
441    
442                    long roleId = ParamUtil.getLong(actionRequest, "roleId");
443    
444                    UserServiceUtil.deleteRoleUser(roleId, user.getUserId());
445            }
446    
447            protected void deleteUsers(ActionRequest actionRequest) throws Exception {
448                    String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
449    
450                    long[] deleteUserIds = StringUtil.split(
451                            ParamUtil.getString(actionRequest, "deleteUserIds"), 0L);
452    
453                    for (long deleteUserId : deleteUserIds) {
454                            if (cmd.equals(Constants.DEACTIVATE) ||
455                                    cmd.equals(Constants.RESTORE)) {
456    
457                                    int status = WorkflowConstants.STATUS_APPROVED;
458    
459                                    if (cmd.equals(Constants.DEACTIVATE)) {
460                                            status = WorkflowConstants.STATUS_INACTIVE;
461                                    }
462    
463                                    UserServiceUtil.updateStatus(deleteUserId, status);
464                            }
465                            else {
466                                    UserServiceUtil.deleteUser(deleteUserId);
467                            }
468                    }
469            }
470    
471            protected List<AnnouncementsDelivery> getAnnouncementsDeliveries(
472                    ActionRequest actionRequest) {
473    
474                    List<AnnouncementsDelivery> announcementsDeliveries =
475                            new ArrayList<AnnouncementsDelivery>();
476    
477                    for (String type : AnnouncementsEntryConstants.TYPES) {
478                            boolean email = ParamUtil.getBoolean(
479                                    actionRequest, "announcementsType" + type + "Email");
480                            boolean sms = ParamUtil.getBoolean(
481                                    actionRequest, "announcementsType" + type + "Sms");
482                            boolean website = ParamUtil.getBoolean(
483                                    actionRequest, "announcementsType" + type + "Website");
484    
485                            AnnouncementsDelivery announcementsDelivery =
486                                    new AnnouncementsDeliveryImpl();
487    
488                            announcementsDelivery.setType(type);
489                            announcementsDelivery.setEmail(email);
490                            announcementsDelivery.setSms(sms);
491                            announcementsDelivery.setWebsite(website);
492    
493                            announcementsDeliveries.add(announcementsDelivery);
494                    }
495    
496                    return announcementsDeliveries;
497            }
498    
499            protected List<AnnouncementsDelivery> getAnnouncementsDeliveries(
500                            ActionRequest actionRequest, User user)
501                    throws Exception {
502    
503                    if (actionRequest.getParameter(
504                                    "announcementsType" + AnnouncementsEntryConstants.TYPES[0] +
505                                            "Email") == null) {
506    
507                            return AnnouncementsDeliveryLocalServiceUtil.getUserDeliveries(
508                                    user.getUserId());
509                    }
510    
511                    return getAnnouncementsDeliveries(actionRequest);
512            }
513    
514            protected long[] getLongArray(PortletRequest portletRequest, String name) {
515                    String value = portletRequest.getParameter(name);
516    
517                    if (value == null) {
518                            return null;
519                    }
520    
521                    return StringUtil.split(GetterUtil.getString(value), 0L);
522            }
523    
524            protected User updateLockout(ActionRequest actionRequest) throws Exception {
525                    User user = PortalUtil.getSelectedUser(actionRequest);
526    
527                    UserServiceUtil.updateLockoutById(user.getUserId(), false);
528    
529                    return user;
530            }
531    
532            protected Object[] updateUser(
533                            ActionRequest actionRequest, ActionResponse actionResponse)
534                    throws Exception {
535    
536                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
537                            WebKeys.THEME_DISPLAY);
538    
539                    User user = PortalUtil.getSelectedUser(actionRequest);
540    
541                    boolean deleteLogo = ParamUtil.getBoolean(actionRequest, "deleteLogo");
542    
543                    if (deleteLogo) {
544                            UserServiceUtil.deletePortrait(user.getUserId());
545                    }
546    
547                    Contact contact = user.getContact();
548    
549                    String oldPassword = AdminUtil.getUpdateUserPassword(
550                            actionRequest, user.getUserId());
551                    String newPassword1 = actionRequest.getParameter("password1");
552                    String newPassword2 = actionRequest.getParameter("password2");
553                    boolean passwordReset = ParamUtil.getBoolean(
554                            actionRequest, "passwordReset");
555    
556                    String reminderQueryQuestion = BeanParamUtil.getString(
557                            user, actionRequest, "reminderQueryQuestion");
558    
559                    if (reminderQueryQuestion.equals(UsersAdmin.CUSTOM_QUESTION)) {
560                            reminderQueryQuestion = BeanParamUtil.getStringSilent(
561                                    user, actionRequest, "reminderQueryCustomQuestion");
562                    }
563    
564                    String reminderQueryAnswer = BeanParamUtil.getString(
565                            user, actionRequest, "reminderQueryAnswer");
566                    String oldScreenName = user.getScreenName();
567                    String screenName = BeanParamUtil.getString(
568                            user, actionRequest, "screenName");
569                    String oldEmailAddress = user.getEmailAddress();
570                    String emailAddress = BeanParamUtil.getString(
571                            user, actionRequest, "emailAddress");
572                    long facebookId = user.getFacebookId();
573                    String openId = BeanParamUtil.getString(user, actionRequest, "openId");
574                    String oldLanguageId = user.getLanguageId();
575                    String languageId = BeanParamUtil.getString(
576                            user, actionRequest, "languageId");
577                    String timeZoneId = BeanParamUtil.getString(
578                            user, actionRequest, "timeZoneId");
579                    String greeting = BeanParamUtil.getString(
580                            user, actionRequest, "greeting");
581                    String firstName = BeanParamUtil.getString(
582                            user, actionRequest, "firstName");
583                    String middleName = BeanParamUtil.getString(
584                            user, actionRequest, "middleName");
585                    String lastName = BeanParamUtil.getString(
586                            user, actionRequest, "lastName");
587                    int prefixId = BeanParamUtil.getInteger(
588                            contact, actionRequest, "prefixId");
589                    int suffixId = BeanParamUtil.getInteger(
590                            contact, actionRequest, "suffixId");
591                    boolean male = BeanParamUtil.getBoolean(
592                            user, actionRequest, "male", true);
593    
594                    Calendar birthdayCal = CalendarFactoryUtil.getCalendar();
595    
596                    birthdayCal.setTime(contact.getBirthday());
597    
598                    int birthdayMonth = ParamUtil.getInteger(
599                            actionRequest, "birthdayMonth", birthdayCal.get(Calendar.MONTH));
600                    int birthdayDay = ParamUtil.getInteger(
601                            actionRequest, "birthdayDay", birthdayCal.get(Calendar.DATE));
602                    int birthdayYear = ParamUtil.getInteger(
603                            actionRequest, "birthdayYear", birthdayCal.get(Calendar.YEAR));
604                    String comments = BeanParamUtil.getString(
605                            user, actionRequest, "comments");
606                    String smsSn = BeanParamUtil.getString(contact, actionRequest, "smsSn");
607                    String aimSn = BeanParamUtil.getString(contact, actionRequest, "aimSn");
608                    String facebookSn = BeanParamUtil.getString(
609                            contact, actionRequest, "facebookSn");
610                    String icqSn = BeanParamUtil.getString(contact, actionRequest, "icqSn");
611                    String jabberSn = BeanParamUtil.getString(
612                            contact, actionRequest, "jabberSn");
613                    String msnSn = BeanParamUtil.getString(contact, actionRequest, "msnSn");
614                    String mySpaceSn = BeanParamUtil.getString(
615                            contact, actionRequest, "mySpaceSn");
616                    String skypeSn = BeanParamUtil.getString(
617                            contact, actionRequest, "skypeSn");
618                    String twitterSn = BeanParamUtil.getString(
619                            contact, actionRequest, "twitterSn");
620                    String ymSn = BeanParamUtil.getString(contact, actionRequest, "ymSn");
621                    String jobTitle = BeanParamUtil.getString(
622                            user, actionRequest, "jobTitle");
623                    long[] groupIds = getLongArray(
624                            actionRequest, "groupsSearchContainerPrimaryKeys");
625                    long[] organizationIds = getLongArray(
626                            actionRequest, "organizationsSearchContainerPrimaryKeys");
627                    long[] roleIds = getLongArray(
628                            actionRequest, "rolesSearchContainerPrimaryKeys");
629    
630                    List<UserGroupRole> userGroupRoles = null;
631    
632                    if ((actionRequest.getParameter("groupRolesGroupIds") != null) ||
633                            (actionRequest.getParameter("groupRolesRoleIds") != null)) {
634    
635                            userGroupRoles = UsersAdminUtil.getUserGroupRoles(actionRequest);
636                    }
637    
638                    long[] userGroupIds = getLongArray(
639                            actionRequest, "userGroupsSearchContainerPrimaryKeys");
640                    List<Address> addresses = UsersAdminUtil.getAddresses(
641                            actionRequest, user.getAddresses());
642                    List<EmailAddress> emailAddresses = UsersAdminUtil.getEmailAddresses(
643                            actionRequest, user.getEmailAddresses());
644                    List<Phone> phones = UsersAdminUtil.getPhones(
645                            actionRequest, user.getPhones());
646                    List<Website> websites = UsersAdminUtil.getWebsites(
647                            actionRequest, user.getWebsites());
648                    List<AnnouncementsDelivery> announcementsDeliveries =
649                            getAnnouncementsDeliveries(actionRequest, user);
650    
651                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
652                            User.class.getName(), actionRequest);
653    
654                    user = UserServiceUtil.updateUser(
655                            user.getUserId(), oldPassword, newPassword1, newPassword2,
656                            passwordReset, reminderQueryQuestion, reminderQueryAnswer,
657                            screenName, emailAddress, facebookId, openId, languageId,
658                            timeZoneId, greeting, comments, firstName, middleName, lastName,
659                            prefixId, suffixId, male, birthdayMonth, birthdayDay, birthdayYear,
660                            smsSn, aimSn, facebookSn, icqSn, jabberSn, msnSn, mySpaceSn,
661                            skypeSn, twitterSn, ymSn, jobTitle, groupIds, organizationIds,
662                            roleIds, userGroupRoles, userGroupIds, addresses, emailAddresses,
663                            phones, websites, announcementsDeliveries, serviceContext);
664    
665                    if (oldScreenName.equals(user.getScreenName())) {
666                            oldScreenName = StringPool.BLANK;
667                    }
668    
669                    if (user.getUserId() == themeDisplay.getUserId()) {
670    
671                            // Reset the locale
672    
673                            HttpServletRequest request = PortalUtil.getHttpServletRequest(
674                                    actionRequest);
675                            HttpServletResponse response= PortalUtil.getHttpServletResponse(
676                                    actionResponse);
677                            HttpSession session = request.getSession();
678    
679                            session.removeAttribute(Globals.LOCALE_KEY);
680    
681                            Locale locale = LocaleUtil.fromLanguageId(languageId);
682    
683                            LanguageUtil.updateCookie(request, response, locale);
684    
685                            // Clear cached portlet responses
686    
687                            PortletSession portletSession = actionRequest.getPortletSession();
688    
689                            InvokerPortletImpl.clearResponses(portletSession);
690    
691                            // Password
692    
693                            if (PropsValues.SESSION_STORE_PASSWORD &&
694                                    Validator.isNotNull(newPassword1)) {
695    
696                                    portletSession.setAttribute(
697                                            WebKeys.USER_PASSWORD, newPassword1,
698                                            PortletSession.APPLICATION_SCOPE);
699                            }
700                    }
701    
702                    String portletId = serviceContext.getPortletId();
703    
704                    if (!portletId.equals(PortletKeys.MY_ACCOUNT)) {
705                            long publicLayoutSetPrototypeId = ParamUtil.getLong(
706                                    actionRequest, "publicLayoutSetPrototypeId");
707                            long privateLayoutSetPrototypeId = ParamUtil.getLong(
708                                    actionRequest, "privateLayoutSetPrototypeId");
709                            boolean publicLayoutSetPrototypeLinkEnabled = ParamUtil.getBoolean(
710                                    actionRequest, "publicLayoutSetPrototypeLinkEnabled");
711                            boolean privateLayoutSetPrototypeLinkEnabled = ParamUtil.getBoolean(
712                                    actionRequest, "privateLayoutSetPrototypeLinkEnabled");
713    
714                            SitesUtil.updateLayoutSetPrototypesLinks(
715                                    user.getGroup(), publicLayoutSetPrototypeId,
716                                    privateLayoutSetPrototypeId,
717                                    publicLayoutSetPrototypeLinkEnabled,
718                                    privateLayoutSetPrototypeLinkEnabled);
719                    }
720    
721                    Company company = PortalUtil.getCompany(actionRequest);
722    
723                    if (company.isStrangersVerify() &&
724                            !oldEmailAddress.equalsIgnoreCase(emailAddress)) {
725    
726                            SessionMessages.add(actionRequest, "verificationEmailSent");
727                    }
728    
729                    return new Object[] {user, oldScreenName, oldLanguageId};
730            }
731    
732    }