This is an automated email from the ASF dual-hosted git repository. mehul pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/ranger.git
commit 166dfb6c478faba275766e5e2566031231a7decb Author: Mahesh Bandal <[email protected]> AuthorDate: Sat Oct 3 02:39:27 2020 +0530 RANGER-3014: Revert "RANGER-2789: GET API service/xusers/users turns very slow when there are more than 1000 users" Signed-off-by: Mehul Parikh <[email protected]> --- .../main/java/org/apache/ranger/entity/XXUser.java | 6 - .../org/apache/ranger/service/XUserService.java | 141 +-------------------- .../apache/ranger/service/XUserServiceBase.java | 130 ------------------- .../main/java/org/apache/ranger/view/VXUser.java | 19 --- 4 files changed, 1 insertion(+), 295 deletions(-) diff --git a/security-admin/src/main/java/org/apache/ranger/entity/XXUser.java b/security-admin/src/main/java/org/apache/ranger/entity/XXUser.java index 14f0b64..0464e7b 100644 --- a/security-admin/src/main/java/org/apache/ranger/entity/XXUser.java +++ b/security-admin/src/main/java/org/apache/ranger/entity/XXUser.java @@ -37,8 +37,6 @@ import org.apache.ranger.common.AppConstants; import org.apache.ranger.common.RangerCommonEnums; import org.apache.ranger.common.RangerConstants; -import java.util.Objects; - @Entity @Table(name="x_user") @@ -287,8 +285,4 @@ public class XXUser extends XXDBBase implements java.io.Serializable { return null; } - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), name, description, status, credStoreId); - } } diff --git a/security-admin/src/main/java/org/apache/ranger/service/XUserService.java b/security-admin/src/main/java/org/apache/ranger/service/XUserService.java index 4b0c7e3..adb8e60 100644 --- a/security-admin/src/main/java/org/apache/ranger/service/XUserService.java +++ b/security-admin/src/main/java/org/apache/ranger/service/XUserService.java @@ -25,19 +25,13 @@ import java.util.HashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Set; -import java.util.stream.Collectors; - -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.collections4.MapUtils; import org.apache.ranger.biz.RangerBizUtil; import org.apache.ranger.common.AppConstants; import org.apache.ranger.common.MessageEnums; import org.apache.ranger.common.PropertiesUtil; import org.apache.ranger.common.RangerCommonEnums; import org.apache.ranger.common.RangerConstants; -import org.apache.ranger.common.SearchCriteria; import org.apache.ranger.common.SearchField; import org.apache.ranger.common.SortField; import org.apache.ranger.common.StringUtil; @@ -50,13 +44,10 @@ import org.apache.ranger.entity.XXUser; import org.apache.ranger.util.RangerEnumUtil; import org.apache.ranger.view.VXPortalUser; import org.apache.ranger.view.VXUser; -import org.apache.ranger.view.VXUserList; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; - -import static java.util.function.Function.identity; -import static java.util.stream.Collectors.toMap; +import org.springframework.util.CollectionUtils; @Service @Scope("singleton") @@ -215,19 +206,6 @@ public class XUserService extends XUserServiceBase<XXUser, VXUser> { } @Override - protected List<VXUser> mapEntityToViewBeans(Map<VXUser, XXUser> vxUserXXUserMap) { - if (MapUtils.isNotEmpty(vxUserXXUserMap)) { - Map<String, VXUser> userNameVXUserMap = vxUserXXUserMap.keySet() - .stream() - .collect(toMap(VXUser::getName, identity())); - super.mapEntityToViewBeans(vxUserXXUserMap); - populateUserListAttributes(userNameVXUserMap); - return new ArrayList<>(vxUserXXUserMap.keySet()); - } - return new ArrayList<>(); - } - - @Override public VXUser populateViewBean(XXUser xUser) { VXUser vObj = super.populateViewBean(xUser); vObj.setIsVisible(xUser.getIsVisible()); @@ -235,38 +213,6 @@ public class XUserService extends XUserServiceBase<XXUser, VXUser> { return vObj; } - @Override - public List<VXUser> populateViewBeans(List<XXUser> xUsers) { - List<VXUser> vObjList = super.populateViewBeans(xUsers); - if (CollectionUtils.isNotEmpty(vObjList) && CollectionUtils.isNotEmpty(xUsers) && xUsers.size() == vObjList.size()) { - Map<Long, VXUser> xUserIdVObjMap = new HashMap<>(xUsers.size()); - for (int i = 0; i < xUsers.size(); ++i) { - VXUser vObj = vObjList.get(i); - XXUser xUser = xUsers.get(i); - vObj.setIsVisible(xUser.getIsVisible()); - xUserIdVObjMap.put(xUser.getId(), vObj); - } - populateGroupList(xUserIdVObjMap); - } - return vObjList; - } - - /** - * @param searchCriteria - * @return - */ - @Override - public VXUserList searchXUsers(SearchCriteria searchCriteria) { - VXUserList returnList = new VXUserList(); - - @SuppressWarnings("unchecked") - List<XXUser> resultList = searchResources(searchCriteria, - searchFields, sortFields, returnList); - - returnList.setVXUsers(populateViewBeans(resultList)); - return returnList; - } - private void populateGroupList(Long xUserId, VXUser vObj) { List<XXGroupUser> xGroupUserList = daoManager.getXXGroupUser() .findByUserId(xUserId); @@ -284,40 +230,6 @@ public class XUserService extends XUserServiceBase<XXUser, VXUser> { vObj.setGroupNameList(groupNames); } - private void populateGroupList(Map<Long, VXUser> xUserIdVObjMap) { - List<XXGroupUser> allXXGroupUsers = daoManager.getXXGroupUser().getAll(); - if (MapUtils.isNotEmpty(xUserIdVObjMap) && CollectionUtils.isNotEmpty(allXXGroupUsers)) { - Map<Long, List<XXGroupUser>> userIdXXGroupUserMap = new HashMap<>(xUserIdVObjMap.size()); - for (Map.Entry<Long, VXUser> xUserIdVXUserEntry : xUserIdVObjMap.entrySet()) { - Long xUserId = xUserIdVXUserEntry.getKey(); - List<XXGroupUser> xxGroupUsers = allXXGroupUsers - .stream() - .filter(xXGroupUser -> Objects.equals(xXGroupUser.getUserId(), xUserId)) - .collect(Collectors.toList()); - userIdXXGroupUserMap.put(xUserId, xxGroupUsers); - } - for (Map.Entry<Long, List<XXGroupUser>> xUserIdXXGroupUserListEntry : userIdXXGroupUserMap.entrySet()) { - Long xUserId = xUserIdXXGroupUserListEntry.getKey(); - List<XXGroupUser> xGroupUserList = xUserIdXXGroupUserListEntry.getValue(); - Set<Long> groupIdList = new LinkedHashSet<>(); - Set<String> groupNameList = new LinkedHashSet<>(); - if (xGroupUserList != null) { - for (XXGroupUser xGroupUser : xGroupUserList) { - groupIdList.add(xGroupUser.getParentGroupId()); - groupNameList.add(xGroupUser.getName()); - } - } - List<Long> groups = new ArrayList<>(groupIdList); - List<String> groupNames = new ArrayList<>(groupNameList); - VXUser vObj = xUserIdVObjMap.get(xUserId); - if (vObj != null) { - vObj.setGroupIdList(groups); - vObj.setGroupNameList(groupNames); - } - } - } - } - private void populateUserAttributes(String userName, VXUser vObj) { if (userName != null && !userName.isEmpty()) { List<String> userRoleList =new ArrayList<String>(); @@ -347,57 +259,6 @@ public class XUserService extends XUserServiceBase<XXUser, VXUser> { } } - private void populateUserListAttributes(Map<String, VXUser> userNameVObjMap) { - List<XXPortalUser> allXPortalUsers = daoManager.getXXPortalUser().findAllXPortalUser(); - List<XXPortalUserRole> allXPortalUserRoles = daoManager.getXXPortalUserRole().getAll(); - if (MapUtils.isNotEmpty(userNameVObjMap) && CollectionUtils.isNotEmpty(allXPortalUsers)) { - Map<String, XXPortalUser> loginIdXXPortalUserMap = new HashMap<>(allXPortalUsers.size()); - Map<Long, List<XXPortalUserRole>> userIdRoleMap = new HashMap<>(); - for (XXPortalUser xPortalUser : allXPortalUsers) { - loginIdXXPortalUserMap.put(xPortalUser.getLoginId(), xPortalUser); - List<XXPortalUserRole> xxPortalUserRoles = new ArrayList<>(); - if (allXPortalUserRoles != null) { - for (XXPortalUserRole xPortalUserRole : allXPortalUserRoles) { - if (Objects.equals(xPortalUserRole.getUserId(), xPortalUser.getId())) { - xxPortalUserRoles.add(xPortalUserRole); - } - } - } - userIdRoleMap.put(xPortalUser.getId(), xxPortalUserRoles); - } - - for (Map.Entry<String, VXUser> userNameVObjEntry : userNameVObjMap.entrySet()) { - String userName = userNameVObjEntry.getKey(); - VXUser vObj = userNameVObjEntry.getValue(); - if (userName != null && !userName.isEmpty()) { - List<String> userRoleList = new ArrayList<>(); - XXPortalUser xXPortalUser = loginIdXXPortalUserMap.get(userName); - if (xXPortalUser != null) { - vObj.setFirstName(xXPortalUser.getFirstName()); - vObj.setLastName(xXPortalUser.getLastName()); - vObj.setPassword(PropertiesUtil.getProperty("ranger.password.hidden")); - String emailAddress = xXPortalUser.getEmailAddress(); - if (emailAddress != null - && stringUtil.validateEmail(emailAddress)) { - vObj.setEmailAddress(xXPortalUser.getEmailAddress()); - } - vObj.setStatus(xXPortalUser.getStatus()); - vObj.setUserSource(xXPortalUser.getUserSource()); - List<XXPortalUserRole> gjUserRoleList = userIdRoleMap.get( - xXPortalUser.getId()); - for (XXPortalUserRole gjUserRole : gjUserRoleList) { - userRoleList.add(gjUserRole.getUserRole()); - } - } - if(userRoleList==null || userRoleList.isEmpty()){ - userRoleList.add(RangerConstants.ROLE_USER); - } - vObj.setUserRoleList(userRoleList); - } - } - } - } - public List<XXTrxLog> getTransactionLog(VXUser vResource, String action) { return getTransactionLog(vResource, null, action); } diff --git a/security-admin/src/main/java/org/apache/ranger/service/XUserServiceBase.java b/security-admin/src/main/java/org/apache/ranger/service/XUserServiceBase.java index 4fcdda2..9cdc14e 100644 --- a/security-admin/src/main/java/org/apache/ranger/service/XUserServiceBase.java +++ b/security-admin/src/main/java/org/apache/ranger/service/XUserServiceBase.java @@ -24,27 +24,17 @@ */ import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.function.Function; - import com.google.gson.Gson; import com.google.gson.GsonBuilder; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.collections4.MapUtils; -import org.apache.ranger.common.ContextUtil; import org.apache.ranger.common.SearchCriteria; -import org.apache.ranger.common.UserSessionBase; -import org.apache.ranger.entity.XXPortalUser; import org.apache.ranger.entity.XXUser; import org.apache.ranger.plugin.model.UserInfo; import org.apache.ranger.view.VXUser; import org.apache.ranger.view.VXUserList; -import static java.util.stream.Collectors.toMap; - public abstract class XUserServiceBase<T extends XXUser, V extends VXUser> extends AbstractBaseResourceService<T, V> { public static final String NAME = "XUser"; @@ -76,126 +66,6 @@ public abstract class XUserServiceBase<T extends XXUser, V extends VXUser> return vObj; } - protected List<VXUser> mapEntityToViewBeans(Map<VXUser, XXUser> vxUserXXUserMap) { - List<VXUser> vxUsers = new ArrayList<>(); - if (MapUtils.isNotEmpty(vxUserXXUserMap)) { - for (Map.Entry<VXUser, XXUser> vxUserXXUserEntry : vxUserXXUserMap.entrySet()) { - VXUser vObj = vxUserXXUserEntry.getKey(); - XXUser mObj = vxUserXXUserEntry.getValue(); - vObj.setName(mObj.getName()); - vObj.setIsVisible(mObj.getIsVisible()); - vObj.setDescription(mObj.getDescription()); - vObj.setCredStoreId(mObj.getCredStoreId()); - vObj.setOtherAttributes(mObj.getOtherAttributes()); - vxUsers.add(vObj); - } - } - return vxUsers; - } - - public List<VXUser> populateViewBeans(List<XXUser> resources) { - List<VXUser> viewBeans = new ArrayList<>(); - if (CollectionUtils.isNotEmpty(resources)) { - Map<XXUser, VXUser> resourceViewBeanMap = new HashMap<>(resources.size()); - Map<VXUser, XXUser> viewBeanResourceMap = new HashMap<>(resources.size()); - for (XXUser resource : resources) { - VXUser viewBean = createViewObject(); - viewBean.setCredStoreId(resource.getCredStoreId()); - viewBean.setDescription(resource.getDescription()); - viewBean.setName(resource.getName()); - viewBean.setStatus(resource.getStatus()); - resourceViewBeanMap.put(resource, viewBean); - viewBeanResourceMap.put(viewBean, resource); - viewBeans.add(viewBean); - } - populateViewBeans(resourceViewBeanMap); - mapEntityToViewBeans(viewBeanResourceMap); - } - return viewBeans; - } - - protected void populateViewBeans(Map<XXUser, VXUser> resourceViewBeanMap) { - mapBaseAttributesToViewBeans(resourceViewBeanMap); - } - - private void mapBaseAttributesToViewBeans(Map<XXUser, VXUser> resourceViewBeanMap) { - List<XXPortalUser> allXPortalUsers = daoManager.getXXPortalUser().findAllXPortalUser(); - if (MapUtils.isNotEmpty(resourceViewBeanMap) && CollectionUtils.isNotEmpty(allXPortalUsers)) { - Map<Long, XXPortalUser> idXXPortalUserMap = allXPortalUsers - .stream() - .collect(toMap(XXPortalUser::getId, Function.identity())); - resourceViewBeanMap.forEach((resource, viewBean) -> { - viewBean.setId(resource.getId()); - - // TBD: Need to review this change later - viewBean.setMObj(resource); - viewBean.setCreateDate(resource.getCreateTime()); - viewBean.setUpdateDate(resource.getUpdateTime()); - - Long ownerId = resource.getAddedByUserId(); - UserSessionBase currentUserSession = ContextUtil - .getCurrentUserSession(); - - if (currentUserSession == null) { - return; - } - - if (ownerId != null) { - XXPortalUser tUser = idXXPortalUserMap.get( - resource.getAddedByUserId()); - if (tUser != null) { - if (tUser.getPublicScreenName() != null - && !tUser.getPublicScreenName().trim().isEmpty() - && !"null".equalsIgnoreCase(tUser.getPublicScreenName().trim())) { - viewBean.setOwner(tUser.getPublicScreenName()); - } else { - if (tUser.getFirstName() != null - && !tUser.getFirstName().trim().isEmpty() - && !"null".equalsIgnoreCase(tUser.getFirstName().trim())) { - if (tUser.getLastName() != null - && !tUser.getLastName().trim().isEmpty() - && !"null".equalsIgnoreCase(tUser.getLastName().trim())) { - viewBean.setOwner(tUser.getFirstName() + " " - + tUser.getLastName()); - } else { - viewBean.setOwner(tUser.getFirstName()); - } - } else { - viewBean.setOwner(tUser.getLoginId()); - } - } - } - } - if (resource.getUpdatedByUserId() != null) { - XXPortalUser tUser = idXXPortalUserMap.get( - resource.getUpdatedByUserId()); - if (tUser != null) { - if (tUser.getPublicScreenName() != null - && !tUser.getPublicScreenName().trim().isEmpty() - && !"null".equalsIgnoreCase(tUser.getPublicScreenName().trim())) { - viewBean.setUpdatedBy(tUser.getPublicScreenName()); - } else { - if (tUser.getFirstName() != null - && !tUser.getFirstName().trim().isEmpty() - && !"null".equalsIgnoreCase(tUser.getFirstName().trim())) { - if (tUser.getLastName() != null - && !tUser.getLastName().trim().isEmpty() - && !"null".equalsIgnoreCase(tUser.getLastName().trim())) { - viewBean.setUpdatedBy(tUser.getFirstName() + " " - + tUser.getLastName()); - } else { - viewBean.setUpdatedBy(tUser.getFirstName()); - } - } else { - viewBean.setUpdatedBy(tUser.getLoginId()); - } - } - } - } - }); - } - } - /** * @param searchCriteria * @return diff --git a/security-admin/src/main/java/org/apache/ranger/view/VXUser.java b/security-admin/src/main/java/org/apache/ranger/view/VXUser.java index d6f53fd..96f6468 100644 --- a/security-admin/src/main/java/org/apache/ranger/view/VXUser.java +++ b/security-admin/src/main/java/org/apache/ranger/view/VXUser.java @@ -25,7 +25,6 @@ */ import java.util.Collection; -import java.util.Objects; import javax.xml.bind.annotation.XmlRootElement; @@ -306,24 +305,6 @@ public class VXUser extends VXDataObject implements java.io.Serializable { this.otherAttributes = otherAttributes; } - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - VXUser vxUser = (VXUser) o; - - return Objects.equals(status, vxUser.status) && - Objects.equals(name, vxUser.name) && - Objects.equals(description, vxUser.description) && - Objects.equals(credStoreId, vxUser.credStoreId); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), name, description, credStoreId, status); - } - /** * This return the bean content in string format * @return formatedStr
