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