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 <mehul@apache.org>
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.RangerCommonEnums;
import org.apache.ranger.common.RangerConstants;
-import java.util.Objects;
-
@Entity
@Table(name="x_user")
@@ -287,8 +285,4 @@
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.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.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 @@
}
@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 @@
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 @@
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 @@
}
}
- 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 @@
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 @@
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