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