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.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.MembershipPolicyException;
071    import com.liferay.portal.security.auth.PrincipalException;
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.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 DuplicateOpenIdException ||
248                                             e instanceof DuplicateUserEmailAddressException ||
249                                             e instanceof DuplicateUserScreenNameException ||
250                                             e instanceof EmailAddressException ||
251                                             e instanceof GroupFriendlyURLException ||
252                                             e instanceof MembershipPolicyException ||
253                                             e instanceof NoSuchCountryException ||
254                                             e instanceof NoSuchListTypeException ||
255                                             e instanceof NoSuchRegionException ||
256                                             e instanceof PhoneNumberException ||
257                                             e instanceof RequiredUserException ||
258                                             e instanceof ReservedUserEmailAddressException ||
259                                             e instanceof ReservedUserScreenNameException ||
260                                             e instanceof UserEmailAddressException ||
261                                             e instanceof UserIdException ||
262                                             e instanceof UserPasswordException ||
263                                             e instanceof UserReminderQueryException ||
264                                             e instanceof UserScreenNameException ||
265                                             e instanceof UserSmsException ||
266                                             e instanceof WebsiteURLException) {
267    
268                                    if (e instanceof NoSuchListTypeException) {
269                                            NoSuchListTypeException nslte = (NoSuchListTypeException)e;
270    
271                                            SessionErrors.add(
272                                                    actionRequest,
273                                                    e.getClass().getName() + nslte.getType());
274                                    }
275                                    else {
276                                            SessionErrors.add(actionRequest, e.getClass(), e);
277                                    }
278    
279                                    if (e instanceof RequiredUserException) {
280                                            String redirect = PortalUtil.escapeRedirect(
281                                                    ParamUtil.getString(actionRequest, "redirect"));
282    
283                                            if (Validator.isNotNull(redirect)) {
284                                                    actionResponse.sendRedirect(redirect);
285                                            }
286                                    }
287                            }
288                            else {
289                                    throw e;
290                            }
291                    }
292            }
293    
294            @Override
295            public ActionForward render(
296                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
297                            RenderRequest renderRequest, RenderResponse renderResponse)
298                    throws Exception {
299    
300                    try {
301                            PortalUtil.getSelectedUser(renderRequest);
302                    }
303                    catch (Exception e) {
304                            if (e instanceof PrincipalException) {
305                                    SessionErrors.add(renderRequest, e.getClass());
306    
307                                    return mapping.findForward("portlet.users_admin.error");
308                            }
309                            else {
310                                    throw e;
311                            }
312                    }
313    
314                    return mapping.findForward(
315                            getForward(renderRequest, "portlet.users_admin.edit_user"));
316            }
317    
318            protected User addUser(ActionRequest actionRequest) throws Exception {
319                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
320                            WebKeys.THEME_DISPLAY);
321    
322                    boolean autoPassword = ParamUtil.getBoolean(
323                            actionRequest, "autoPassword", true);
324                    String password1 = actionRequest.getParameter("password1");
325                    String password2 = actionRequest.getParameter("password2");
326    
327                    String reminderQueryQuestion = ParamUtil.getString(
328                            actionRequest, "reminderQueryQuestion");
329    
330                    if (reminderQueryQuestion.equals(UsersAdminUtil.CUSTOM_QUESTION)) {
331                            reminderQueryQuestion = ParamUtil.getString(
332                                    actionRequest, "reminderQueryCustomQuestion");
333                    }
334    
335                    String reminderQueryAnswer = ParamUtil.getString(
336                            actionRequest, "reminderQueryAnswer");
337                    boolean autoScreenName = ParamUtil.getBoolean(
338                            actionRequest, "autoScreenName");
339                    String screenName = ParamUtil.getString(actionRequest, "screenName");
340                    String emailAddress = ParamUtil.getString(
341                            actionRequest, "emailAddress");
342                    long facebookId = 0;
343                    String openId = ParamUtil.getString(actionRequest, "openId");
344                    String languageId = ParamUtil.getString(actionRequest, "languageId");
345                    String timeZoneId = ParamUtil.getString(actionRequest, "timeZoneId");
346                    String greeting = ParamUtil.getString(actionRequest, "greeting");
347                    String firstName = ParamUtil.getString(actionRequest, "firstName");
348                    String middleName = ParamUtil.getString(actionRequest, "middleName");
349                    String lastName = ParamUtil.getString(actionRequest, "lastName");
350                    int prefixId = ParamUtil.getInteger(actionRequest, "prefixId");
351                    int suffixId = ParamUtil.getInteger(actionRequest, "suffixId");
352                    boolean male = ParamUtil.getBoolean(actionRequest, "male", true);
353                    int birthdayMonth = ParamUtil.getInteger(
354                            actionRequest, "birthdayMonth");
355                    int birthdayDay = ParamUtil.getInteger(actionRequest, "birthdayDay");
356                    int birthdayYear = ParamUtil.getInteger(actionRequest, "birthdayYear");
357                    String comments = ParamUtil.getString(actionRequest, "comments");
358                    String smsSn = ParamUtil.getString(actionRequest, "smsSn");
359                    String aimSn = ParamUtil.getString(actionRequest, "aimSn");
360                    String facebookSn = ParamUtil.getString(actionRequest, "facebookSn");
361                    String icqSn = ParamUtil.getString(actionRequest, "icqSn");
362                    String jabberSn = ParamUtil.getString(actionRequest, "jabberSn");
363                    String msnSn = ParamUtil.getString(actionRequest, "msnSn");
364                    String mySpaceSn = ParamUtil.getString(actionRequest, "mySpaceSn");
365                    String skypeSn = ParamUtil.getString(actionRequest, "skypeSn");
366                    String twitterSn = ParamUtil.getString(actionRequest, "twitterSn");
367                    String ymSn = ParamUtil.getString(actionRequest, "ymSn");
368                    String jobTitle = ParamUtil.getString(actionRequest, "jobTitle");
369                    long[] groupIds = getLongArray(
370                            actionRequest, "groupsSearchContainerPrimaryKeys");
371                    long[] organizationIds = getLongArray(
372                            actionRequest, "organizationsSearchContainerPrimaryKeys");
373                    long[] roleIds = getLongArray(
374                            actionRequest, "rolesSearchContainerPrimaryKeys");
375                    List<UserGroupRole> userGroupRoles = UsersAdminUtil.getUserGroupRoles(
376                            actionRequest);
377                    long[] userGroupIds = getLongArray(
378                            actionRequest, "userGroupsSearchContainerPrimaryKeys");
379                    List<Address> addresses = UsersAdminUtil.getAddresses(actionRequest);
380                    List<EmailAddress> emailAddresses = UsersAdminUtil.getEmailAddresses(
381                            actionRequest);
382                    List<Phone> phones = UsersAdminUtil.getPhones(actionRequest);
383                    List<Website> websites = UsersAdminUtil.getWebsites(actionRequest);
384                    List<AnnouncementsDelivery> announcementsDeliveries =
385                            getAnnouncementsDeliveries(actionRequest);
386                    boolean sendEmail = true;
387    
388                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
389                            User.class.getName(), actionRequest);
390    
391                    User user = UserServiceUtil.addUser(
392                            themeDisplay.getCompanyId(), autoPassword, password1, password2,
393                            autoScreenName, screenName, emailAddress, facebookId, openId,
394                            LocaleUtil.getDefault(), firstName, middleName, lastName, prefixId,
395                            suffixId, male, birthdayMonth, birthdayDay, birthdayYear, jobTitle,
396                            groupIds, organizationIds, roleIds, userGroupIds, addresses,
397                            emailAddresses, phones, websites, announcementsDeliveries,
398                            sendEmail, serviceContext);
399    
400                    if (!userGroupRoles.isEmpty()) {
401                            for (UserGroupRole userGroupRole : userGroupRoles) {
402                                    userGroupRole.setUserId(user.getUserId());
403                            }
404    
405                            user = UserServiceUtil.updateUser(
406                                    user.getUserId(), StringPool.BLANK, StringPool.BLANK,
407                                    StringPool.BLANK, false, reminderQueryQuestion,
408                                    reminderQueryAnswer, user.getScreenName(),
409                                    user.getEmailAddress(), facebookId, openId, languageId,
410                                    timeZoneId, greeting, comments, firstName, middleName, lastName,
411                                    prefixId, suffixId, male, birthdayMonth, birthdayDay,
412                                    birthdayYear, smsSn, aimSn, facebookSn, icqSn, jabberSn, msnSn,
413                                    mySpaceSn, skypeSn, twitterSn, ymSn, jobTitle, groupIds,
414                                    organizationIds, roleIds, userGroupRoles, userGroupIds,
415                                    addresses, emailAddresses, phones, websites,
416                                    announcementsDeliveries, serviceContext);
417                    }
418    
419                    long publicLayoutSetPrototypeId = ParamUtil.getLong(
420                            actionRequest, "publicLayoutSetPrototypeId");
421                    long privateLayoutSetPrototypeId = ParamUtil.getLong(
422                            actionRequest, "privateLayoutSetPrototypeId");
423                    boolean publicLayoutSetPrototypeLinkEnabled = ParamUtil.getBoolean(
424                            actionRequest, "publicLayoutSetPrototypeLinkEnabled");
425                    boolean privateLayoutSetPrototypeLinkEnabled = ParamUtil.getBoolean(
426                            actionRequest, "privateLayoutSetPrototypeLinkEnabled");
427    
428                    SitesUtil.updateLayoutSetPrototypesLinks(
429                            user.getGroup(), publicLayoutSetPrototypeId,
430                            privateLayoutSetPrototypeId, publicLayoutSetPrototypeLinkEnabled,
431                            privateLayoutSetPrototypeLinkEnabled);
432    
433                    return user;
434            }
435    
436            protected void deleteRole(ActionRequest actionRequest) throws Exception {
437                    User user = PortalUtil.getSelectedUser(actionRequest);
438    
439                    long roleId = ParamUtil.getLong(actionRequest, "roleId");
440    
441                    UserServiceUtil.deleteRoleUser(roleId, user.getUserId());
442            }
443    
444            protected void deleteUsers(ActionRequest actionRequest) throws Exception {
445                    String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
446    
447                    long[] deleteUserIds = StringUtil.split(
448                            ParamUtil.getString(actionRequest, "deleteUserIds"), 0L);
449    
450                    for (long deleteUserId : deleteUserIds) {
451                            if (cmd.equals(Constants.DEACTIVATE) ||
452                                    cmd.equals(Constants.RESTORE)) {
453    
454                                    int status = WorkflowConstants.STATUS_APPROVED;
455    
456                                    if (cmd.equals(Constants.DEACTIVATE)) {
457                                            status = WorkflowConstants.STATUS_INACTIVE;
458                                    }
459    
460                                    UserServiceUtil.updateStatus(deleteUserId, status);
461                            }
462                            else {
463                                    UserServiceUtil.deleteUser(deleteUserId);
464                            }
465                    }
466            }
467    
468            protected List<AnnouncementsDelivery> getAnnouncementsDeliveries(
469                    ActionRequest actionRequest) {
470    
471                    List<AnnouncementsDelivery> announcementsDeliveries =
472                            new ArrayList<AnnouncementsDelivery>();
473    
474                    for (String type : AnnouncementsEntryConstants.TYPES) {
475                            boolean email = ParamUtil.getBoolean(
476                                    actionRequest, "announcementsType" + type + "Email");
477                            boolean sms = ParamUtil.getBoolean(
478                                    actionRequest, "announcementsType" + type + "Sms");
479                            boolean website = ParamUtil.getBoolean(
480                                    actionRequest, "announcementsType" + type + "Website");
481    
482                            AnnouncementsDelivery announcementsDelivery =
483                                    new AnnouncementsDeliveryImpl();
484    
485                            announcementsDelivery.setType(type);
486                            announcementsDelivery.setEmail(email);
487                            announcementsDelivery.setSms(sms);
488                            announcementsDelivery.setWebsite(website);
489    
490                            announcementsDeliveries.add(announcementsDelivery);
491                    }
492    
493                    return announcementsDeliveries;
494            }
495    
496            protected List<AnnouncementsDelivery> getAnnouncementsDeliveries(
497                            ActionRequest actionRequest, User user)
498                    throws Exception {
499    
500                    if (actionRequest.getParameter(
501                                    "announcementsType" + AnnouncementsEntryConstants.TYPES[0] +
502                                            "Email") == null) {
503    
504                            return AnnouncementsDeliveryLocalServiceUtil.getUserDeliveries(
505                                    user.getUserId());
506                    }
507    
508                    return getAnnouncementsDeliveries(actionRequest);
509            }
510    
511            protected long[] getLongArray(PortletRequest portletRequest, String name) {
512                    String value = portletRequest.getParameter(name);
513    
514                    if (value == null) {
515                            return null;
516                    }
517    
518                    return StringUtil.split(GetterUtil.getString(value), 0L);
519            }
520    
521            protected User updateLockout(ActionRequest actionRequest) throws Exception {
522                    User user = PortalUtil.getSelectedUser(actionRequest);
523    
524                    UserServiceUtil.updateLockoutById(user.getUserId(), false);
525    
526                    return user;
527            }
528    
529            protected Object[] updateUser(
530                            ActionRequest actionRequest, ActionResponse actionResponse)
531                    throws Exception {
532    
533                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
534                            WebKeys.THEME_DISPLAY);
535    
536                    User user = PortalUtil.getSelectedUser(actionRequest);
537    
538                    boolean deleteLogo = ParamUtil.getBoolean(actionRequest, "deleteLogo");
539    
540                    if (deleteLogo) {
541                            UserServiceUtil.deletePortrait(user.getUserId());
542                    }
543    
544                    Contact contact = user.getContact();
545    
546                    String oldPassword = AdminUtil.getUpdateUserPassword(
547                            actionRequest, user.getUserId());
548                    String newPassword1 = actionRequest.getParameter("password1");
549                    String newPassword2 = actionRequest.getParameter("password2");
550                    boolean passwordReset = ParamUtil.getBoolean(
551                            actionRequest, "passwordReset");
552    
553                    String reminderQueryQuestion = BeanParamUtil.getString(
554                            user, actionRequest, "reminderQueryQuestion");
555    
556                    if (reminderQueryQuestion.equals(UsersAdminUtil.CUSTOM_QUESTION)) {
557                            reminderQueryQuestion = BeanParamUtil.getStringSilent(
558                                    user, actionRequest, "reminderQueryCustomQuestion");
559                    }
560    
561                    String reminderQueryAnswer = BeanParamUtil.getString(
562                            user, actionRequest, "reminderQueryAnswer");
563                    String oldScreenName = user.getScreenName();
564                    String screenName = BeanParamUtil.getString(
565                            user, actionRequest, "screenName");
566                    String oldEmailAddress = user.getEmailAddress();
567                    String emailAddress = BeanParamUtil.getString(
568                            user, actionRequest, "emailAddress");
569                    long facebookId = user.getFacebookId();
570                    String openId = BeanParamUtil.getString(user, actionRequest, "openId");
571                    String oldLanguageId = user.getLanguageId();
572                    String languageId = BeanParamUtil.getString(
573                            user, actionRequest, "languageId");
574                    String timeZoneId = BeanParamUtil.getString(
575                            user, actionRequest, "timeZoneId");
576                    String greeting = BeanParamUtil.getString(
577                            user, actionRequest, "greeting");
578                    String firstName = BeanParamUtil.getString(
579                            user, actionRequest, "firstName");
580                    String middleName = BeanParamUtil.getString(
581                            user, actionRequest, "middleName");
582                    String lastName = BeanParamUtil.getString(
583                            user, actionRequest, "lastName");
584                    int prefixId = BeanParamUtil.getInteger(
585                            contact, actionRequest, "prefixId");
586                    int suffixId = BeanParamUtil.getInteger(
587                            contact, actionRequest, "suffixId");
588                    boolean male = BeanParamUtil.getBoolean(
589                            user, actionRequest, "male", true);
590    
591                    Calendar birthdayCal = CalendarFactoryUtil.getCalendar();
592    
593                    birthdayCal.setTime(contact.getBirthday());
594    
595                    int birthdayMonth = ParamUtil.getInteger(
596                            actionRequest, "birthdayMonth", birthdayCal.get(Calendar.MONTH));
597                    int birthdayDay = ParamUtil.getInteger(
598                            actionRequest, "birthdayDay", birthdayCal.get(Calendar.DATE));
599                    int birthdayYear = ParamUtil.getInteger(
600                            actionRequest, "birthdayYear", birthdayCal.get(Calendar.YEAR));
601                    String comments = BeanParamUtil.getString(
602                            user, actionRequest, "comments");
603                    String smsSn = BeanParamUtil.getString(contact, actionRequest, "smsSn");
604                    String aimSn = BeanParamUtil.getString(contact, actionRequest, "aimSn");
605                    String facebookSn = BeanParamUtil.getString(
606                            contact, actionRequest, "facebookSn");
607                    String icqSn = BeanParamUtil.getString(contact, actionRequest, "icqSn");
608                    String jabberSn = BeanParamUtil.getString(
609                            contact, actionRequest, "jabberSn");
610                    String msnSn = BeanParamUtil.getString(contact, actionRequest, "msnSn");
611                    String mySpaceSn = BeanParamUtil.getString(
612                            contact, actionRequest, "mySpaceSn");
613                    String skypeSn = BeanParamUtil.getString(
614                            contact, actionRequest, "skypeSn");
615                    String twitterSn = BeanParamUtil.getString(
616                            contact, actionRequest, "twitterSn");
617                    String ymSn = BeanParamUtil.getString(contact, actionRequest, "ymSn");
618                    String jobTitle = BeanParamUtil.getString(
619                            user, actionRequest, "jobTitle");
620                    long[] groupIds = getLongArray(
621                            actionRequest, "groupsSearchContainerPrimaryKeys");
622                    long[] organizationIds = getLongArray(
623                            actionRequest, "organizationsSearchContainerPrimaryKeys");
624                    long[] roleIds = getLongArray(
625                            actionRequest, "rolesSearchContainerPrimaryKeys");
626    
627                    List<UserGroupRole> userGroupRoles = null;
628    
629                    if ((actionRequest.getParameter("groupRolesGroupIds") != null) ||
630                            (actionRequest.getParameter("groupRolesRoleIds") != null)) {
631    
632                            userGroupRoles = UsersAdminUtil.getUserGroupRoles(actionRequest);
633                    }
634    
635                    long[] userGroupIds = getLongArray(
636                            actionRequest, "userGroupsSearchContainerPrimaryKeys");
637                    List<Address> addresses = UsersAdminUtil.getAddresses(
638                            actionRequest, user.getAddresses());
639                    List<EmailAddress> emailAddresses = UsersAdminUtil.getEmailAddresses(
640                            actionRequest, user.getEmailAddresses());
641                    List<Phone> phones = UsersAdminUtil.getPhones(
642                            actionRequest, user.getPhones());
643                    List<Website> websites = UsersAdminUtil.getWebsites(
644                            actionRequest, user.getWebsites());
645                    List<AnnouncementsDelivery> announcementsDeliveries =
646                            getAnnouncementsDeliveries(actionRequest, user);
647    
648                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
649                            User.class.getName(), actionRequest);
650    
651                    user = UserServiceUtil.updateUser(
652                            user.getUserId(), oldPassword, newPassword1, newPassword2,
653                            passwordReset, reminderQueryQuestion, reminderQueryAnswer,
654                            screenName, emailAddress, facebookId, openId, languageId,
655                            timeZoneId, greeting, comments, firstName, middleName, lastName,
656                            prefixId, suffixId, male, birthdayMonth, birthdayDay, birthdayYear,
657                            smsSn, aimSn, facebookSn, icqSn, jabberSn, msnSn, mySpaceSn,
658                            skypeSn, twitterSn, ymSn, jobTitle, groupIds, organizationIds,
659                            roleIds, userGroupRoles, userGroupIds, addresses, emailAddresses,
660                            phones, websites, announcementsDeliveries, serviceContext);
661    
662                    if (oldScreenName.equals(user.getScreenName())) {
663                            oldScreenName = StringPool.BLANK;
664                    }
665    
666                    if (user.getUserId() == themeDisplay.getUserId()) {
667    
668                            // Reset the locale
669    
670                            HttpServletRequest request = PortalUtil.getHttpServletRequest(
671                                    actionRequest);
672                            HttpServletResponse response= PortalUtil.getHttpServletResponse(
673                                    actionResponse);
674                            HttpSession session = request.getSession();
675    
676                            session.removeAttribute(Globals.LOCALE_KEY);
677    
678                            Locale locale = LocaleUtil.fromLanguageId(languageId);
679    
680                            LanguageUtil.updateCookie(request, response, locale);
681    
682                            // Clear cached portlet responses
683    
684                            PortletSession portletSession = actionRequest.getPortletSession();
685    
686                            InvokerPortletImpl.clearResponses(portletSession);
687    
688                            // Password
689    
690                            if (PropsValues.SESSION_STORE_PASSWORD &&
691                                    Validator.isNotNull(newPassword1)) {
692    
693                                    portletSession.setAttribute(
694                                            WebKeys.USER_PASSWORD, newPassword1,
695                                            PortletSession.APPLICATION_SCOPE);
696                            }
697                    }
698    
699                    String portletId = serviceContext.getPortletId();
700    
701                    if (!portletId.equals(PortletKeys.MY_ACCOUNT)) {
702                            long publicLayoutSetPrototypeId = ParamUtil.getLong(
703                                    actionRequest, "publicLayoutSetPrototypeId");
704                            long privateLayoutSetPrototypeId = ParamUtil.getLong(
705                                    actionRequest, "privateLayoutSetPrototypeId");
706                            boolean publicLayoutSetPrototypeLinkEnabled = ParamUtil.getBoolean(
707                                    actionRequest, "publicLayoutSetPrototypeLinkEnabled");
708                            boolean privateLayoutSetPrototypeLinkEnabled = ParamUtil.getBoolean(
709                                    actionRequest, "privateLayoutSetPrototypeLinkEnabled");
710    
711                            SitesUtil.updateLayoutSetPrototypesLinks(
712                                    user.getGroup(), publicLayoutSetPrototypeId,
713                                    privateLayoutSetPrototypeId,
714                                    publicLayoutSetPrototypeLinkEnabled,
715                                    privateLayoutSetPrototypeLinkEnabled);
716                    }
717    
718                    Company company = PortalUtil.getCompany(actionRequest);
719    
720                    if (company.isStrangersVerify() &&
721                            !oldEmailAddress.equalsIgnoreCase(emailAddress)) {
722    
723                            SessionMessages.add(actionRequest, "verificationEmailSent");
724                    }
725    
726                    return new Object[] {user, oldScreenName, oldLanguageId};
727            }
728    
729    }