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