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