/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.portlet.usersadmin.util; import com.liferay.portal.kernel.configuration.Filter; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.language.LanguageUtil; import com.liferay.portal.kernel.model.Address; import com.liferay.portal.kernel.model.EmailAddress; import com.liferay.portal.kernel.model.Group; import com.liferay.portal.kernel.model.OrgLabor; import com.liferay.portal.kernel.model.Organization; import com.liferay.portal.kernel.model.Phone; import com.liferay.portal.kernel.model.Role; import com.liferay.portal.kernel.model.RoleConstants; import com.liferay.portal.kernel.model.User; import com.liferay.portal.kernel.model.UserGroup; import com.liferay.portal.kernel.model.UserGroupRole; import com.liferay.portal.kernel.model.Website; import com.liferay.portal.kernel.search.Document; import com.liferay.portal.kernel.search.Field; import com.liferay.portal.kernel.search.Hits; import com.liferay.portal.kernel.search.Indexer; import com.liferay.portal.kernel.search.IndexerRegistryUtil; import com.liferay.portal.kernel.security.auth.PrincipalThreadLocal; import com.liferay.portal.kernel.security.membershippolicy.OrganizationMembershipPolicyUtil; import com.liferay.portal.kernel.security.membershippolicy.SiteMembershipPolicyUtil; import com.liferay.portal.kernel.security.pacl.DoPrivileged; import com.liferay.portal.kernel.security.permission.ActionKeys; import com.liferay.portal.kernel.security.permission.PermissionChecker; import com.liferay.portal.kernel.service.AddressLocalServiceUtil; import com.liferay.portal.kernel.service.AddressServiceUtil; import com.liferay.portal.kernel.service.EmailAddressLocalServiceUtil; import com.liferay.portal.kernel.service.EmailAddressServiceUtil; import com.liferay.portal.kernel.service.GroupLocalServiceUtil; import com.liferay.portal.kernel.service.OrgLaborLocalServiceUtil; import com.liferay.portal.kernel.service.OrgLaborServiceUtil; import com.liferay.portal.kernel.service.OrganizationLocalServiceUtil; import com.liferay.portal.kernel.service.PhoneLocalServiceUtil; import com.liferay.portal.kernel.service.PhoneServiceUtil; import com.liferay.portal.kernel.service.RoleLocalServiceUtil; import com.liferay.portal.kernel.service.ServiceContext; import com.liferay.portal.kernel.service.UserGroupLocalServiceUtil; import com.liferay.portal.kernel.service.UserGroupRoleLocalServiceUtil; import com.liferay.portal.kernel.service.UserLocalServiceUtil; import com.liferay.portal.kernel.service.WebsiteLocalServiceUtil; import com.liferay.portal.kernel.service.WebsiteServiceUtil; import com.liferay.portal.kernel.service.permission.GroupPermissionUtil; import com.liferay.portal.kernel.service.permission.OrganizationPermissionUtil; import com.liferay.portal.kernel.service.permission.RolePermissionUtil; import com.liferay.portal.kernel.service.permission.UserGroupPermissionUtil; import com.liferay.portal.kernel.service.permission.UserGroupRolePermissionUtil; import com.liferay.portal.kernel.service.permission.UserPermissionUtil; import com.liferay.portal.kernel.service.persistence.UserGroupRolePK; import com.liferay.portal.kernel.util.Accessor; import com.liferay.portal.kernel.util.ArrayUtil; import com.liferay.portal.kernel.util.GetterUtil; import com.liferay.portal.kernel.util.ListUtil; import com.liferay.portal.kernel.util.OrderByComparator; import com.liferay.portal.kernel.util.ParamUtil; import com.liferay.portal.kernel.util.PortalUtil; import com.liferay.portal.kernel.util.PropsKeys; import com.liferay.portal.kernel.util.SetUtil; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.StringUtil; import com.liferay.portal.kernel.util.Validator; import com.liferay.portal.kernel.util.comparator.GroupNameComparator; import com.liferay.portal.kernel.util.comparator.GroupTypeComparator; import com.liferay.portal.kernel.util.comparator.OrganizationNameComparator; import com.liferay.portal.kernel.util.comparator.OrganizationTypeComparator; import com.liferay.portal.kernel.util.comparator.RoleDescriptionComparator; import com.liferay.portal.kernel.util.comparator.RoleNameComparator; import com.liferay.portal.kernel.util.comparator.RoleTypeComparator; import com.liferay.portal.kernel.util.comparator.UserEmailAddressComparator; import com.liferay.portal.kernel.util.comparator.UserFirstNameComparator; import com.liferay.portal.kernel.util.comparator.UserGroupDescriptionComparator; import com.liferay.portal.kernel.util.comparator.UserGroupNameComparator; import com.liferay.portal.kernel.util.comparator.UserJobTitleComparator; import com.liferay.portal.kernel.util.comparator.UserLastNameComparator; import com.liferay.portal.kernel.util.comparator.UserScreenNameComparator; import com.liferay.portal.util.PropsUtil; import com.liferay.portal.util.PropsValues; import com.liferay.users.admin.kernel.util.UsersAdmin; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Set; import javax.portlet.ActionRequest; import javax.portlet.PortletRequest; import javax.portlet.PortletURL; import javax.portlet.RenderResponse; import javax.servlet.http.HttpServletRequest; /** * @author Brian Wing Shun Chan * @author Jorge Ferrer * @author Julio Camarero */ @DoPrivileged public class UsersAdminImpl implements UsersAdmin { @Override public void addPortletBreadcrumbEntries( Organization organization, HttpServletRequest request, RenderResponse renderResponse) throws Exception { PortletURL portletURL = renderResponse.createRenderURL(); portletURL.setParameter("mvcRenderCommandName", "/users_admin/view"); portletURL.setParameter("toolbarItem", "view-all-organizations"); portletURL.setParameter("usersListView", "tree"); List<Organization> ancestorOrganizations = organization.getAncestors(); Collections.reverse(ancestorOrganizations); for (Organization ancestorOrganization : ancestorOrganizations) { portletURL.setParameter( "organizationId", String.valueOf(ancestorOrganization.getOrganizationId())); PortalUtil.addPortletBreadcrumbEntry( request, ancestorOrganization.getName(), portletURL.toString()); } Organization unescapedOrganization = organization.toUnescapedModel(); portletURL.setParameter( "organizationId", String.valueOf(unescapedOrganization.getOrganizationId())); PortalUtil.addPortletBreadcrumbEntry( request, unescapedOrganization.getName(), portletURL.toString()); } @Override public long[] addRequiredRoles(long userId, long[] roleIds) throws PortalException { User user = UserLocalServiceUtil.getUser(userId); return addRequiredRoles(user, roleIds); } @Override public long[] addRequiredRoles(User user, long[] roleIds) throws PortalException { if (user.isDefaultUser()) { return removeRequiredRoles(user, roleIds); } Role administratorRole = RoleLocalServiceUtil.getRole( user.getCompanyId(), RoleConstants.ADMINISTRATOR); long[] administratorUserIds = UserLocalServiceUtil.getRoleUserIds( administratorRole.getRoleId()); if (ArrayUtil.contains(administratorUserIds, user.getUserId()) && !ArrayUtil.contains(roleIds, administratorRole.getRoleId()) && (administratorUserIds.length == 1)) { roleIds = ArrayUtil.append(roleIds, administratorRole.getRoleId()); } Role userRole = RoleLocalServiceUtil.getRole( user.getCompanyId(), RoleConstants.USER); if (!ArrayUtil.contains(roleIds, userRole.getRoleId())) { roleIds = ArrayUtil.append(roleIds, userRole.getRoleId()); } return roleIds; } @Override public List<Role> filterGroupRoles( PermissionChecker permissionChecker, long groupId, List<Role> roles) throws PortalException { List<Role> filteredGroupRoles = ListUtil.copy(roles); Iterator<Role> itr = filteredGroupRoles.iterator(); while (itr.hasNext()) { Role groupRole = itr.next(); String roleName = groupRole.getName(); if (roleName.equals(RoleConstants.ORGANIZATION_USER) || roleName.equals(RoleConstants.SITE_MEMBER)) { itr.remove(); } } if (permissionChecker.isCompanyAdmin() || permissionChecker.isGroupOwner(groupId)) { return filteredGroupRoles; } Group group = GroupLocalServiceUtil.getGroup(groupId); if (!GroupPermissionUtil.contains( permissionChecker, group, ActionKeys.ASSIGN_USER_ROLES) && !OrganizationPermissionUtil.contains( permissionChecker, group.getOrganizationId(), ActionKeys.ASSIGN_USER_ROLES)) { return Collections.emptyList(); } itr = filteredGroupRoles.iterator(); while (itr.hasNext()) { Role groupRole = itr.next(); String roleName = groupRole.getName(); if (roleName.equals(RoleConstants.ORGANIZATION_ADMINISTRATOR) || roleName.equals(RoleConstants.ORGANIZATION_OWNER) || roleName.equals(RoleConstants.SITE_ADMINISTRATOR) || roleName.equals(RoleConstants.SITE_OWNER) || !RolePermissionUtil.contains( permissionChecker, groupId, groupRole.getRoleId(), ActionKeys.ASSIGN_MEMBERS)) { itr.remove(); } } return filteredGroupRoles; } @Override public List<Group> filterGroups( PermissionChecker permissionChecker, List<Group> groups) throws PortalException { if (permissionChecker.isCompanyAdmin()) { return groups; } List<Group> filteredGroups = ListUtil.copy(groups); Iterator<Group> itr = filteredGroups.iterator(); while (itr.hasNext()) { Group group = itr.next(); if (!GroupPermissionUtil.contains( permissionChecker, group, ActionKeys.ASSIGN_MEMBERS)) { itr.remove(); } } return filteredGroups; } @Override public List<Organization> filterOrganizations( PermissionChecker permissionChecker, List<Organization> organizations) throws PortalException { if (permissionChecker.isCompanyAdmin()) { return organizations; } List<Organization> filteredOrganizations = ListUtil.copy(organizations); Iterator<Organization> itr = filteredOrganizations.iterator(); while (itr.hasNext()) { Organization organization = itr.next(); if (!OrganizationPermissionUtil.contains( permissionChecker, organization, ActionKeys.ASSIGN_MEMBERS)) { itr.remove(); } } return filteredOrganizations; } @Override public List<Role> filterRoles( PermissionChecker permissionChecker, List<Role> roles) { List<Role> filteredRoles = ListUtil.copy(roles); Iterator<Role> itr = filteredRoles.iterator(); while (itr.hasNext()) { Role role = itr.next(); String roleName = role.getName(); if (roleName.equals(RoleConstants.GUEST) || roleName.equals(RoleConstants.ORGANIZATION_USER) || roleName.equals(RoleConstants.OWNER) || roleName.equals(RoleConstants.SITE_MEMBER) || roleName.equals(RoleConstants.USER)) { itr.remove(); } } if (permissionChecker.isCompanyAdmin()) { return filteredRoles; } itr = filteredRoles.iterator(); while (itr.hasNext()) { Role role = itr.next(); if (!RolePermissionUtil.contains( permissionChecker, role.getRoleId(), ActionKeys.ASSIGN_MEMBERS)) { itr.remove(); } } return filteredRoles; } @Override public long[] filterUnsetGroupUserIds( PermissionChecker permissionChecker, long groupId, long[] userIds) throws PortalException { long[] filteredUserIds = userIds; for (long userId : userIds) { if (SiteMembershipPolicyUtil.isMembershipProtected( permissionChecker, userId, groupId)) { filteredUserIds = ArrayUtil.remove(filteredUserIds, userId); } } return filteredUserIds; } @Override public long[] filterUnsetOrganizationUserIds( PermissionChecker permissionChecker, long organizationId, long[] userIds) throws PortalException { long[] filteredUserIds = userIds; for (long userId : userIds) { if (OrganizationMembershipPolicyUtil.isMembershipProtected( permissionChecker, userId, organizationId)) { filteredUserIds = ArrayUtil.remove(filteredUserIds, userId); } } return filteredUserIds; } @Override public List<UserGroupRole> filterUserGroupRoles( PermissionChecker permissionChecker, List<UserGroupRole> userGroupRoles) throws PortalException { List<UserGroupRole> filteredUserGroupRoles = ListUtil.copy( userGroupRoles); Iterator<UserGroupRole> itr = filteredUserGroupRoles.iterator(); while (itr.hasNext()) { UserGroupRole userGroupRole = itr.next(); Role role = userGroupRole.getRole(); String roleName = role.getName(); if (roleName.equals(RoleConstants.ORGANIZATION_USER) || roleName.equals(RoleConstants.SITE_MEMBER)) { itr.remove(); } } if (permissionChecker.isCompanyAdmin()) { return filteredUserGroupRoles; } itr = filteredUserGroupRoles.iterator(); while (itr.hasNext()) { UserGroupRole userGroupRole = itr.next(); if (!UserGroupRolePermissionUtil.contains( permissionChecker, userGroupRole.getGroupId(), userGroupRole.getRoleId())) { itr.remove(); } } return filteredUserGroupRoles; } @Override public List<UserGroup> filterUserGroups( PermissionChecker permissionChecker, List<UserGroup> userGroups) { if (permissionChecker.isCompanyAdmin()) { return userGroups; } List<UserGroup> filteredUserGroups = ListUtil.copy(userGroups); Iterator<UserGroup> itr = filteredUserGroups.iterator(); while (itr.hasNext()) { UserGroup userGroup = itr.next(); if (!UserGroupPermissionUtil.contains( permissionChecker, userGroup.getUserGroupId(), ActionKeys.ASSIGN_MEMBERS)) { itr.remove(); } } return filteredUserGroups; } @Override public List<Address> getAddresses(ActionRequest actionRequest) { return getAddresses(actionRequest, Collections.<Address>emptyList()); } @Override public List<Address> getAddresses( ActionRequest actionRequest, List<Address> defaultAddresses) { String addressesIndexesString = actionRequest.getParameter( "addressesIndexes"); if (addressesIndexesString == null) { return defaultAddresses; } List<Address> addresses = new ArrayList<>(); int[] addressesIndexes = StringUtil.split(addressesIndexesString, 0); int addressPrimary = ParamUtil.getInteger( actionRequest, "addressPrimary"); for (int addressesIndex : addressesIndexes) { long addressId = ParamUtil.getLong( actionRequest, "addressId" + addressesIndex); String street1 = ParamUtil.getString( actionRequest, "addressStreet1_" + addressesIndex); String street2 = ParamUtil.getString( actionRequest, "addressStreet2_" + addressesIndex); String street3 = ParamUtil.getString( actionRequest, "addressStreet3_" + addressesIndex); String city = ParamUtil.getString( actionRequest, "addressCity" + addressesIndex); String zip = ParamUtil.getString( actionRequest, "addressZip" + addressesIndex); long countryId = ParamUtil.getLong( actionRequest, "addressCountryId" + addressesIndex); if (Validator.isNull(street1) && Validator.isNull(street2) && Validator.isNull(street3) && Validator.isNull(city) && Validator.isNull(zip) && (countryId == 0)) { continue; } long regionId = ParamUtil.getLong( actionRequest, "addressRegionId" + addressesIndex); long typeId = ParamUtil.getLong( actionRequest, "addressTypeId" + addressesIndex); boolean mailing = ParamUtil.getBoolean( actionRequest, "addressMailing" + addressesIndex); boolean primary = false; if (addressesIndex == addressPrimary) { primary = true; } Address address = AddressLocalServiceUtil.createAddress(addressId); address.setStreet1(street1); address.setStreet2(street2); address.setStreet3(street3); address.setCity(city); address.setZip(zip); address.setRegionId(regionId); address.setCountryId(countryId); address.setTypeId(typeId); address.setMailing(mailing); address.setPrimary(primary); addresses.add(address); } return addresses; } @Override public List<EmailAddress> getEmailAddresses(ActionRequest actionRequest) { return getEmailAddresses( actionRequest, Collections.<EmailAddress>emptyList()); } @Override public List<EmailAddress> getEmailAddresses( ActionRequest actionRequest, List<EmailAddress> defaultEmailAddresses) { String emailAddressesIndexesString = actionRequest.getParameter( "emailAddressesIndexes"); if (emailAddressesIndexesString == null) { return defaultEmailAddresses; } List<EmailAddress> emailAddresses = new ArrayList<>(); int[] emailAddressesIndexes = StringUtil.split( emailAddressesIndexesString, 0); int emailAddressPrimary = ParamUtil.getInteger( actionRequest, "emailAddressPrimary"); for (int emailAddressesIndex : emailAddressesIndexes) { long emailAddressId = ParamUtil.getLong( actionRequest, "emailAddressId" + emailAddressesIndex); String address = ParamUtil.getString( actionRequest, "emailAddressAddress" + emailAddressesIndex); if (Validator.isNull(address)) { continue; } long typeId = ParamUtil.getLong( actionRequest, "emailAddressTypeId" + emailAddressesIndex); boolean primary = false; if (emailAddressesIndex == emailAddressPrimary) { primary = true; } EmailAddress emailAddress = EmailAddressLocalServiceUtil.createEmailAddress(emailAddressId); emailAddress.setAddress(address); emailAddress.setTypeId(typeId); emailAddress.setPrimary(primary); emailAddresses.add(emailAddress); } return emailAddresses; } @Override public long[] getGroupIds(PortletRequest portletRequest) throws PortalException { long[] groupIds = new long[0]; User user = PortalUtil.getSelectedUser(portletRequest); if (user != null) { groupIds = user.getGroupIds(); } return getRequestPrimaryKeys( portletRequest, groupIds, "addGroupIds", "deleteGroupIds"); } @Override public OrderByComparator<Group> getGroupOrderByComparator( String orderByCol, String orderByType) { boolean orderByAsc = false; if (orderByType.equals("asc")) { orderByAsc = true; } OrderByComparator<Group> orderByComparator = null; if (orderByCol.equals("name")) { orderByComparator = new GroupNameComparator(orderByAsc); } else if (orderByCol.equals("type")) { orderByComparator = new GroupTypeComparator(orderByAsc); } else { orderByComparator = new GroupNameComparator(orderByAsc); } return orderByComparator; } @Override public Long[] getOrganizationIds(List<Organization> organizations) { if ((organizations == null) || organizations.isEmpty()) { return new Long[0]; } Long[] organizationIds = new Long[organizations.size()]; for (int i = 0; i < organizations.size(); i++) { Organization organization = organizations.get(i); organizationIds[i] = Long.valueOf(organization.getOrganizationId()); } return organizationIds; } @Override public long[] getOrganizationIds(PortletRequest portletRequest) throws PortalException { long[] organizationIds = new long[0]; User user = PortalUtil.getSelectedUser(portletRequest); if (user != null) { organizationIds = user.getOrganizationIds(); } return getRequestPrimaryKeys( portletRequest, organizationIds, "addOrganizationIds", "deleteOrganizationIds"); } @Override public OrderByComparator<Organization> getOrganizationOrderByComparator( String orderByCol, String orderByType) { boolean orderByAsc = false; if (orderByType.equals("asc")) { orderByAsc = true; } OrderByComparator<Organization> orderByComparator = null; if (orderByCol.equals("name")) { orderByComparator = new OrganizationNameComparator(orderByAsc); } else if (orderByCol.equals("type")) { orderByComparator = new OrganizationTypeComparator(orderByAsc); } else { orderByComparator = new OrganizationNameComparator(orderByAsc); } return orderByComparator; } @Override public List<Organization> getOrganizations(Hits hits) throws PortalException { List<Document> documents = hits.toList(); List<Organization> organizations = new ArrayList<>(documents.size()); for (Document document : documents) { long organizationId = GetterUtil.getLong( document.get(Field.ORGANIZATION_ID)); Organization organization = OrganizationLocalServiceUtil.fetchOrganization(organizationId); if (organization == null) { organizations = null; Indexer<Organization> indexer = IndexerRegistryUtil.getIndexer( Organization.class); long companyId = GetterUtil.getLong( document.get(Field.COMPANY_ID)); indexer.delete(companyId, document.getUID()); } else if (organizations != null) { organizations.add(organization); } } return organizations; } @Override public List<OrgLabor> getOrgLabors(ActionRequest actionRequest) { List<OrgLabor> orgLabors = new ArrayList<>(); int[] orgLaborsIndexes = StringUtil.split( ParamUtil.getString(actionRequest, "orgLaborsIndexes"), 0); for (int orgLaborsIndex : orgLaborsIndexes) { long orgLaborId = ParamUtil.getLong( actionRequest, "orgLaborId" + orgLaborsIndex); long typeId = ParamUtil.getLong( actionRequest, "orgLaborTypeId" + orgLaborsIndex, -1); if (typeId == -1) { continue; } int sunOpen = ParamUtil.getInteger( actionRequest, "sunOpen" + orgLaborsIndex, -1); int sunClose = ParamUtil.getInteger( actionRequest, "sunClose" + orgLaborsIndex, -1); int monOpen = ParamUtil.getInteger( actionRequest, "monOpen" + orgLaborsIndex, -1); int monClose = ParamUtil.getInteger( actionRequest, "monClose" + orgLaborsIndex, -1); int tueOpen = ParamUtil.getInteger( actionRequest, "tueOpen" + orgLaborsIndex, -1); int tueClose = ParamUtil.getInteger( actionRequest, "tueClose" + orgLaborsIndex, -1); int wedOpen = ParamUtil.getInteger( actionRequest, "wedOpen" + orgLaborsIndex, -1); int wedClose = ParamUtil.getInteger( actionRequest, "wedClose" + orgLaborsIndex, -1); int thuOpen = ParamUtil.getInteger( actionRequest, "thuOpen" + orgLaborsIndex, -1); int thuClose = ParamUtil.getInteger( actionRequest, "thuClose" + orgLaborsIndex, -1); int friOpen = ParamUtil.getInteger( actionRequest, "friOpen" + orgLaborsIndex, -1); int friClose = ParamUtil.getInteger( actionRequest, "friClose" + orgLaborsIndex, -1); int satOpen = ParamUtil.getInteger( actionRequest, "satOpen" + orgLaborsIndex, -1); int satClose = ParamUtil.getInteger( actionRequest, "satClose" + orgLaborsIndex, -1); OrgLabor orgLabor = OrgLaborLocalServiceUtil.createOrgLabor( orgLaborId); orgLabor.setTypeId(typeId); orgLabor.setSunOpen(sunOpen); orgLabor.setSunClose(sunClose); orgLabor.setMonOpen(monOpen); orgLabor.setMonClose(monClose); orgLabor.setTueOpen(tueOpen); orgLabor.setTueClose(tueClose); orgLabor.setWedOpen(wedOpen); orgLabor.setWedClose(wedClose); orgLabor.setThuOpen(thuOpen); orgLabor.setThuClose(thuClose); orgLabor.setFriOpen(friOpen); orgLabor.setFriClose(friClose); orgLabor.setSatOpen(satOpen); orgLabor.setSatClose(satClose); orgLabors.add(orgLabor); } return orgLabors; } @Override public List<Phone> getPhones(ActionRequest actionRequest) { return getPhones(actionRequest, Collections.<Phone>emptyList()); } @Override public List<Phone> getPhones( ActionRequest actionRequest, List<Phone> defaultPhones) { String phonesIndexesString = actionRequest.getParameter( "phonesIndexes"); if (phonesIndexesString == null) { return defaultPhones; } List<Phone> phones = new ArrayList<>(); int[] phonesIndexes = StringUtil.split(phonesIndexesString, 0); int phonePrimary = ParamUtil.getInteger(actionRequest, "phonePrimary"); for (int phonesIndex : phonesIndexes) { long phoneId = ParamUtil.getLong( actionRequest, "phoneId" + phonesIndex); String number = ParamUtil.getString( actionRequest, "phoneNumber" + phonesIndex); String extension = ParamUtil.getString( actionRequest, "phoneExtension" + phonesIndex); if (Validator.isNull(number) && Validator.isNull(extension)) { continue; } long typeId = ParamUtil.getLong( actionRequest, "phoneTypeId" + phonesIndex); boolean primary = false; if (phonesIndex == phonePrimary) { primary = true; } Phone phone = PhoneLocalServiceUtil.createPhone(phoneId); phone.setNumber(number); phone.setExtension(extension); phone.setTypeId(typeId); phone.setPrimary(primary); phones.add(phone); } return phones; } @Override public long[] getRoleIds(PortletRequest portletRequest) throws PortalException { long[] roleIds = new long[0]; User user = PortalUtil.getSelectedUser(portletRequest); if (user != null) { roleIds = user.getRoleIds(); } return getRequestPrimaryKeys( portletRequest, roleIds, "addRoleIds", "deleteRoleIds"); } @Override public OrderByComparator<Role> getRoleOrderByComparator( String orderByCol, String orderByType) { boolean orderByAsc = false; if (orderByType.equals("asc")) { orderByAsc = true; } OrderByComparator<Role> orderByComparator = null; if (orderByCol.equals("name")) { orderByComparator = new RoleNameComparator(orderByAsc); } else if (orderByCol.equals("description")) { orderByComparator = new RoleDescriptionComparator(orderByAsc); } else if (orderByCol.equals("type")) { orderByComparator = new RoleTypeComparator(orderByAsc); } else { orderByComparator = new RoleNameComparator(orderByAsc); } return orderByComparator; } @Override public <T> String getUserColumnText( Locale locale, List<? extends T> list, Accessor<T, String> accessor, int count) { String result = ListUtil.toString( list, accessor, StringPool.COMMA_AND_SPACE); if (list.size() < count) { String message = LanguageUtil.format( locale, "and-x-more", String.valueOf(count - list.size()), false); result += StringPool.SPACE + message; } return result; } @Override public long[] getUserGroupIds(PortletRequest portletRequest) throws PortalException { long[] userGroupIds = new long[0]; User user = PortalUtil.getSelectedUser(portletRequest); if (user != null) { userGroupIds = user.getUserGroupIds(); } return getRequestPrimaryKeys( portletRequest, userGroupIds, "addUserGroupIds", "deleteUserGroupIds"); } @Override public OrderByComparator<UserGroup> getUserGroupOrderByComparator( String orderByCol, String orderByType) { boolean orderByAsc = false; if (orderByType.equals("asc")) { orderByAsc = true; } OrderByComparator<UserGroup> orderByComparator = null; if (orderByCol.equals("name")) { orderByComparator = new UserGroupNameComparator(orderByAsc); } else if (orderByCol.equals("description")) { orderByComparator = new UserGroupDescriptionComparator(orderByAsc); } else { orderByComparator = new UserGroupNameComparator(orderByAsc); } return orderByComparator; } @Override public List<UserGroupRole> getUserGroupRoles(PortletRequest portletRequest) throws PortalException { User user = PortalUtil.getSelectedUser(portletRequest); if (user == null) { return Collections.emptyList(); } Set<UserGroupRole> userGroupRoles = new HashSet<>( UserGroupRoleLocalServiceUtil.getUserGroupRoles(user.getUserId())); userGroupRoles.addAll( getUserGroupRoles( portletRequest, user, "addGroupRolesGroupIds", "addGroupRolesRoleIds")); userGroupRoles.removeAll( getUserGroupRoles( portletRequest, user, "deleteGroupRolesGroupIds", "deleteGroupRolesRoleIds")); return new ArrayList<>(userGroupRoles); } @Override public List<UserGroup> getUserGroups(Hits hits) throws PortalException { List<Document> documents = hits.toList(); List<UserGroup> userGroups = new ArrayList<>(documents.size()); for (Document document : documents) { long userGroupId = GetterUtil.getLong( document.get(Field.USER_GROUP_ID)); UserGroup userGroup = UserGroupLocalServiceUtil.fetchUserGroup( userGroupId); if (userGroup == null) { userGroups = null; Indexer<UserGroup> indexer = IndexerRegistryUtil.getIndexer( UserGroup.class); long companyId = GetterUtil.getLong( document.get(Field.COMPANY_ID)); indexer.delete(companyId, document.getUID()); } else if (userGroups != null) { userGroups.add(userGroup); } } return userGroups; } @Override public OrderByComparator<User> getUserOrderByComparator( String orderByCol, String orderByType) { boolean orderByAsc = false; if (orderByType.equals("asc")) { orderByAsc = true; } OrderByComparator<User> orderByComparator = null; if (orderByCol.equals("email-address")) { orderByComparator = new UserEmailAddressComparator(orderByAsc); } else if (orderByCol.equals("first-name")) { orderByComparator = new UserFirstNameComparator(orderByAsc); } else if (orderByCol.equals("job-title")) { orderByComparator = new UserJobTitleComparator(orderByAsc); } else if (orderByCol.equals("last-name")) { orderByComparator = new UserLastNameComparator(orderByAsc); } else if (orderByCol.equals("screen-name")) { orderByComparator = new UserScreenNameComparator(orderByAsc); } else { orderByComparator = new UserLastNameComparator(orderByAsc); } return orderByComparator; } @Override public List<User> getUsers(Hits hits) throws PortalException { List<Document> documents = hits.toList(); List<User> users = new ArrayList<>(documents.size()); for (Document document : documents) { long userId = GetterUtil.getLong(document.get(Field.USER_ID)); User user = UserLocalServiceUtil.fetchUser(userId); if (user == null) { users = null; Indexer<User> indexer = IndexerRegistryUtil.getIndexer( User.class); long companyId = GetterUtil.getLong( document.get(Field.COMPANY_ID)); indexer.delete(companyId, document.getUID()); } else if (users != null) { users.add(user); } } return users; } @Override public List<Website> getWebsites(ActionRequest actionRequest) { return getWebsites(actionRequest, Collections.<Website>emptyList()); } @Override public List<Website> getWebsites( ActionRequest actionRequest, List<Website> defaultWebsites) { String websitesIndexesString = actionRequest.getParameter( "websitesIndexes"); if (websitesIndexesString == null) { return defaultWebsites; } List<Website> websites = new ArrayList<>(); int[] websitesIndexes = StringUtil.split(websitesIndexesString, 0); int websitePrimary = ParamUtil.getInteger( actionRequest, "websitePrimary"); for (int websitesIndex : websitesIndexes) { long websiteId = ParamUtil.getLong( actionRequest, "websiteId" + websitesIndex); String url = ParamUtil.getString( actionRequest, "websiteUrl" + websitesIndex); if (Validator.isNull(url)) { continue; } long typeId = ParamUtil.getLong( actionRequest, "websiteTypeId" + websitesIndex); boolean primary = false; if (websitesIndex == websitePrimary) { primary = true; } Website website = WebsiteLocalServiceUtil.createWebsite(websiteId); website.setUrl(url); website.setTypeId(typeId); website.setPrimary(primary); websites.add(website); } return websites; } @Override public boolean hasUpdateFieldPermission( PermissionChecker permissionChecker, User updatingUser, User updatedUser, String field) throws PortalException { if (updatedUser == null) { return true; } if (updatingUser == null) { long updatingUserId = PrincipalThreadLocal.getUserId(); if (updatingUserId > 0) { updatingUser = UserLocalServiceUtil.fetchUserById( updatingUserId); } } if ((updatingUser != null) && !updatingUser.equals(updatedUser) && UserPermissionUtil.contains( permissionChecker, updatingUser.getUserId(), ActionKeys.UPDATE_USER)) { return true; } for (String userType : PropsValues.FIELD_EDITABLE_USER_TYPES) { if (userType.equals("user-with-mx") && updatedUser.hasCompanyMx()) { return true; } if (userType.equals("user-without-mx") && !updatedUser.hasCompanyMx()) { return true; } } for (String roleName : PropsValues.FIELD_EDITABLE_ROLES) { Role role = RoleLocalServiceUtil.fetchRole( updatedUser.getCompanyId(), roleName); if ((role != null) && RoleLocalServiceUtil.hasUserRole( updatedUser.getUserId(), role.getRoleId())) { return true; } } String emailAddress = updatedUser.getEmailAddress(); for (String domainName : PropsValues.FIELD_EDITABLE_DOMAINS) { if (emailAddress.endsWith(domainName)) { return true; } } String[] fieldEditableDomainNames = PropsUtil.getArray( PropsKeys.FIELD_EDITABLE_DOMAINS, new Filter(field)); for (String domainName : fieldEditableDomainNames) { if (domainName.equals(StringPool.STAR) || emailAddress.endsWith(domainName)) { return true; } } return false; } @Override public long[] removeRequiredRoles(long userId, long[] roleIds) throws PortalException { User user = UserLocalServiceUtil.getUser(userId); return removeRequiredRoles(user, roleIds); } @Override public long[] removeRequiredRoles(User user, long[] roleIds) throws PortalException { Role role = RoleLocalServiceUtil.getRole( user.getCompanyId(), RoleConstants.USER); roleIds = ArrayUtil.remove(roleIds, role.getRoleId()); return roleIds; } @Override public void updateAddresses( String className, long classPK, List<Address> addresses) throws PortalException { Set<Long> addressIds = new HashSet<>(); for (Address address : addresses) { long addressId = address.getAddressId(); String street1 = address.getStreet1(); String street2 = address.getStreet2(); String street3 = address.getStreet3(); String city = address.getCity(); String zip = address.getZip(); long regionId = address.getRegionId(); long countryId = address.getCountryId(); long typeId = address.getTypeId(); boolean mailing = address.isMailing(); boolean primary = address.isPrimary(); if (addressId <= 0) { address = AddressServiceUtil.addAddress( className, classPK, street1, street2, street3, city, zip, regionId, countryId, typeId, mailing, primary, new ServiceContext()); addressId = address.getAddressId(); } else { AddressServiceUtil.updateAddress( addressId, street1, street2, street3, city, zip, regionId, countryId, typeId, mailing, primary); } addressIds.add(addressId); } addresses = AddressServiceUtil.getAddresses(className, classPK); for (Address address : addresses) { if (!addressIds.contains(address.getAddressId())) { AddressServiceUtil.deleteAddress(address.getAddressId()); } } } @Override public void updateEmailAddresses( String className, long classPK, List<EmailAddress> emailAddresses) throws PortalException { Set<Long> emailAddressIds = new HashSet<>(); for (EmailAddress emailAddress : emailAddresses) { long emailAddressId = emailAddress.getEmailAddressId(); String address = emailAddress.getAddress(); long typeId = emailAddress.getTypeId(); boolean primary = emailAddress.isPrimary(); if (emailAddressId <= 0) { emailAddress = EmailAddressServiceUtil.addEmailAddress( className, classPK, address, typeId, primary, new ServiceContext()); emailAddressId = emailAddress.getEmailAddressId(); } else { EmailAddressServiceUtil.updateEmailAddress( emailAddressId, address, typeId, primary); } emailAddressIds.add(emailAddressId); } emailAddresses = EmailAddressServiceUtil.getEmailAddresses( className, classPK); for (EmailAddress emailAddress : emailAddresses) { if (!emailAddressIds.contains(emailAddress.getEmailAddressId())) { EmailAddressServiceUtil.deleteEmailAddress( emailAddress.getEmailAddressId()); } } } @Override public void updateOrgLabors(long classPK, List<OrgLabor> orgLabors) throws PortalException { Set<Long> orgLaborsIds = new HashSet<>(); for (OrgLabor orgLabor : orgLabors) { long orgLaborId = orgLabor.getOrgLaborId(); long typeId = orgLabor.getTypeId(); int sunOpen = orgLabor.getSunOpen(); int sunClose = orgLabor.getSunClose(); int monOpen = orgLabor.getMonOpen(); int monClose = orgLabor.getMonClose(); int tueOpen = orgLabor.getTueOpen(); int tueClose = orgLabor.getTueClose(); int wedOpen = orgLabor.getWedOpen(); int wedClose = orgLabor.getWedClose(); int thuOpen = orgLabor.getThuOpen(); int thuClose = orgLabor.getThuClose(); int friOpen = orgLabor.getFriOpen(); int friClose = orgLabor.getFriClose(); int satOpen = orgLabor.getSatOpen(); int satClose = orgLabor.getSatClose(); if (orgLaborId <= 0) { orgLabor = OrgLaborServiceUtil.addOrgLabor( classPK, typeId, sunOpen, sunClose, monOpen, monClose, tueOpen, tueClose, wedOpen, wedClose, thuOpen, thuClose, friOpen, friClose, satOpen, satClose); orgLaborId = orgLabor.getOrgLaborId(); } else { OrgLaborServiceUtil.updateOrgLabor( orgLaborId, typeId, sunOpen, sunClose, monOpen, monClose, tueOpen, tueClose, wedOpen, wedClose, thuOpen, thuClose, friOpen, friClose, satOpen, satClose); } orgLaborsIds.add(orgLaborId); } orgLabors = OrgLaborServiceUtil.getOrgLabors(classPK); for (OrgLabor orgLabor : orgLabors) { if (!orgLaborsIds.contains(orgLabor.getOrgLaborId())) { OrgLaborServiceUtil.deleteOrgLabor(orgLabor.getOrgLaborId()); } } } @Override public void updatePhones(String className, long classPK, List<Phone> phones) throws PortalException { Set<Long> phoneIds = new HashSet<>(); for (Phone phone : phones) { long phoneId = phone.getPhoneId(); String number = phone.getNumber(); String extension = phone.getExtension(); long typeId = phone.getTypeId(); boolean primary = phone.isPrimary(); if (phoneId <= 0) { phone = PhoneServiceUtil.addPhone( className, classPK, number, extension, typeId, primary, new ServiceContext()); phoneId = phone.getPhoneId(); } else { PhoneServiceUtil.updatePhone( phoneId, number, extension, typeId, primary); } phoneIds.add(phoneId); } phones = PhoneServiceUtil.getPhones(className, classPK); for (Phone phone : phones) { if (!phoneIds.contains(phone.getPhoneId())) { PhoneServiceUtil.deletePhone(phone.getPhoneId()); } } } @Override public void updateWebsites( String className, long classPK, List<Website> websites) throws PortalException { Set<Long> websiteIds = new HashSet<>(); for (Website website : websites) { long websiteId = website.getWebsiteId(); String url = website.getUrl(); long typeId = website.getTypeId(); boolean primary = website.isPrimary(); if (websiteId <= 0) { website = WebsiteServiceUtil.addWebsite( className, classPK, url, typeId, primary, new ServiceContext()); websiteId = website.getWebsiteId(); } else { WebsiteServiceUtil.updateWebsite( websiteId, url, typeId, primary); } websiteIds.add(websiteId); } websites = WebsiteServiceUtil.getWebsites(className, classPK); for (Website website : websites) { if (!websiteIds.contains(website.getWebsiteId())) { WebsiteServiceUtil.deleteWebsite(website.getWebsiteId()); } } } protected long[] getRequestPrimaryKeys( PortletRequest portletRequest, long[] currentPKs, String addParam, String deleteParam) { Set<Long> primaryKeys = SetUtil.fromArray(currentPKs); long[] addPrimaryKeys = StringUtil.split( ParamUtil.getString(portletRequest, addParam), 0L); long[] deletePrimaryKeys = StringUtil.split( ParamUtil.getString(portletRequest, deleteParam), 0L); for (long addPrimaryKey : addPrimaryKeys) { primaryKeys.add(addPrimaryKey); } for (long deletePrimaryKey : deletePrimaryKeys) { primaryKeys.remove(deletePrimaryKey); } return ArrayUtil.toLongArray(primaryKeys); } protected Set<UserGroupRole> getUserGroupRoles( PortletRequest portletRequest, User user, String groupIdsParam, String roleIdsParam) { Set<UserGroupRole> userGroupRoles = new HashSet<>(); long[] groupRolesGroupIds = StringUtil.split( ParamUtil.getString(portletRequest, groupIdsParam), 0L); long[] groupRolesRoleIds = StringUtil.split( ParamUtil.getString(portletRequest, roleIdsParam), 0L); if (groupRolesGroupIds.length != groupRolesRoleIds.length) { return userGroupRoles; } long userId = 0; if (user != null) { userId = user.getUserId(); } for (int i = 0; i < groupRolesGroupIds.length; i++) { if ((groupRolesGroupIds[i] == 0) || (groupRolesRoleIds[i] == 0)) { continue; } UserGroupRolePK userGroupRolePK = new UserGroupRolePK( userId, groupRolesGroupIds[i], groupRolesRoleIds[i]); UserGroupRole userGroupRole = UserGroupRoleLocalServiceUtil.createUserGroupRole( userGroupRolePK); userGroupRoles.add(userGroupRole); } return userGroupRoles; } }