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