RANGER-200: Pagination on Analytics Page (Gautam Borad via Velmurugan Periasamy)
Project: http://git-wip-us.apache.org/repos/asf/incubator-ranger/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ranger/commit/85d5658f Tree: http://git-wip-us.apache.org/repos/asf/incubator-ranger/tree/85d5658f Diff: http://git-wip-us.apache.org/repos/asf/incubator-ranger/diff/85d5658f Branch: refs/heads/master Commit: 85d5658fc205a647bb397ee83d81df4cbaa5f53d Parents: 4bf8a3f Author: Velmurugan Periasamy <[email protected]> Authored: Fri Mar 20 04:18:15 2015 -0400 Committer: Velmurugan Periasamy <[email protected]> Committed: Fri Mar 20 04:18:15 2015 -0400 ---------------------------------------------------------------------- .../apache/ranger/plugin/util/SearchFilter.java | 2 + .../org/apache/ranger/biz/ServiceDBStore.java | 171 ++- .../apache/ranger/common/RangerSearchUtil.java | 86 ++ .../org/apache/ranger/db/XXDataHistDao.java | 18 + .../org/apache/ranger/rest/ServiceREST.java | 260 +++- .../ranger/service/RangerDataHistService.java | 19 +- .../ranger/service/RangerPolicyService.java | 4 + .../ranger/service/RangerPolicyServiceBase.java | 19 +- .../service/RangerServiceDefServiceBase.java | 20 +- .../service/RangerServiceServiceBase.java | 18 +- .../apache/ranger/view/RangerPolicyList.java | 55 + .../ranger/view/RangerServiceDefList.java | 55 + .../apache/ranger/view/RangerServiceList.java | 55 + .../collection_bases/RangerPolicyListBase.js | 8 +- .../RangerServiceDefListBase.js | 9 +- .../collection_bases/RangerServiceListBase.js | 8 +- .../webapp/scripts/controllers/Controller.js | 44 +- .../scripts/views/common/XATableLayout.js | 12 +- .../scripts/views/policies/PermissionList.js | 17 +- .../scripts/views/policies/RangerPolicyForm.js | 10 +- .../scripts/views/reports/UserAccessLayout.js | 1175 ++++-------------- .../reports/UserAccessLayout_tmpl.html | 55 +- 22 files changed, 971 insertions(+), 1149 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/agents-common/src/main/java/org/apache/ranger/plugin/util/SearchFilter.java ---------------------------------------------------------------------- diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/util/SearchFilter.java b/agents-common/src/main/java/org/apache/ranger/plugin/util/SearchFilter.java index c669f23..86e5f7d 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/util/SearchFilter.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/util/SearchFilter.java @@ -39,6 +39,8 @@ public class SearchFilter { public static final String USER = "user"; // search public static final String GROUP = "group"; // search public static final String RESOURCE_PREFIX = "resource:"; // search + public static final String POL_RESOURCE = "polResource"; // search + public static final String POLICY_NAME_PARTIAL = "policyNamePartial"; // search, sort public static final String CREATE_TIME = "createTime"; // sort public static final String UPDATE_TIME = "updateTime"; // sort public static final String START_INDEX = "startIndex"; http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java ---------------------------------------------------------------------- diff --git a/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java b/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java index 2a30fd8..844a52e 100644 --- a/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java +++ b/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java @@ -32,6 +32,7 @@ import javax.annotation.PostConstruct; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.ranger.common.AppConstants; import org.apache.ranger.common.ContextUtil; import org.apache.ranger.common.DateUtil; import org.apache.ranger.common.MessageEnums; @@ -60,6 +61,7 @@ import org.apache.ranger.entity.XXAccessTypeDef; import org.apache.ranger.entity.XXAccessTypeDefGrants; import org.apache.ranger.entity.XXContextEnricherDef; import org.apache.ranger.entity.XXDBBase; +import org.apache.ranger.entity.XXDataHist; import org.apache.ranger.entity.XXEnumDef; import org.apache.ranger.entity.XXEnumElementDef; import org.apache.ranger.entity.XXGroup; @@ -102,6 +104,9 @@ import org.apache.ranger.service.RangerPolicyService; import org.apache.ranger.service.RangerServiceDefService; import org.apache.ranger.service.RangerServiceService; import org.apache.ranger.service.XUserService; +import org.apache.ranger.view.RangerPolicyList; +import org.apache.ranger.view.RangerServiceDefList; +import org.apache.ranger.view.RangerServiceList; import org.apache.ranger.view.VXUser; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -226,6 +231,9 @@ public class ServiceDBStore implements ServiceStore { serviceDef.setCreateTime(null); serviceDef.setUpdateTime(null); + // While creating, value of version should be 1. + serviceDef.setVersion(new Long(1)); + serviceDef = serviceDefService.create(serviceDef); Long serviceDefId = serviceDef.getId(); XXServiceDef createdSvcDef = daoMgr.getXXServiceDef().getById(serviceDefId); @@ -377,21 +385,34 @@ public class ServiceDBStore implements ServiceStore { @Override public List<RangerServiceDef> getServiceDefs(SearchFilter filter) throws Exception { - if(LOG.isDebugEnabled()) { + if (LOG.isDebugEnabled()) { LOG.debug("==> ServiceDBStore.getServiceDefs(" + filter + ")"); } - List<RangerServiceDef> ret = null; + RangerServiceDefList svcDefList = serviceDefService.searchRangerServiceDefs(filter); + List<RangerServiceDef> ret = svcDefList.getServiceDefs(); - ret = serviceDefService.searchRangerServiceDefs(filter); - - if(LOG.isDebugEnabled()) { + if (LOG.isDebugEnabled()) { LOG.debug("==> ServiceDBStore.getServiceDefs(" + filter + "): " + ret); } return ret; } + public RangerServiceDefList getPaginatedServiceDefs(SearchFilter filter) throws Exception { + if (LOG.isDebugEnabled()) { + LOG.debug("==> ServiceDBStore.getPaginatedServiceDefs(" + filter + ")"); + } + + RangerServiceDefList svcDefList = serviceDefService.searchRangerServiceDefs(filter); + + if (LOG.isDebugEnabled()) { + LOG.debug("==> ServiceDBStore.getPaginatedServiceDefs(" + filter + ")"); + } + + return svcDefList; + } + @Override public RangerService createService(RangerService service) throws Exception { if (LOG.isDebugEnabled()) { @@ -413,6 +434,9 @@ public class ServiceDBStore implements ServiceStore { MessageEnums.ERROR_CREATING_OBJECT); } + // While creating, value of version should be 1. + service.setVersion(new Long(1)); + if(populateExistingBaseFields) { svcService.setPopulateExistingBaseFields(true); service = svcService.create(service); @@ -506,7 +530,16 @@ public class ServiceDBStore implements ServiceStore { } List<XXTrxLog> trxLogList = svcService.getTransactionLog(service, existing, RangerServiceService.OPERATION_UPDATE_CONTEXT); + + Long version = service.getVersion(); + if(version == null) { + version = new Long(1); + LOG.info("Found Version Value: `null`, so setting value of version to 1, While updating object, version should not be null."); + } else { + version = new Long(version.longValue() + 1); + } + service.setVersion(version); service = svcService.update(service); XXService xUpdService = daoMgr.getXXService().getById(service.getId()); @@ -573,7 +606,17 @@ public class ServiceDBStore implements ServiceStore { configDao.remove(configMap); } + Long version = service.getVersion(); + if(version == null) { + version = new Long(1); + LOG.info("Found Version Value: `null`, so setting value of version to 1, While updating object, version should not be null."); + } else { + version = new Long(version.longValue() + 1); + } + service.setVersion(version); + svcService.delete(service); + dataHistService.createObjectDataHistory(service, RangerDataHistService.ACTION_DELETE); List<XXTrxLog> trxLogList = svcService.getTransactionLog(service, RangerServiceService.OPERATION_DELETE_CONTEXT); @@ -602,11 +645,24 @@ public class ServiceDBStore implements ServiceStore { if(LOG.isDebugEnabled()) { LOG.debug("==> ServiceDBStore.getServices()"); } - List<RangerService> ret = svcService.searchRangerPolicies(filter); + RangerServiceList serviceList = svcService.searchRangerServices(filter); + List<RangerService> ret = serviceList.getServices(); return ret; } + public RangerServiceList getPaginatedServices(SearchFilter filter) throws Exception { + if (LOG.isDebugEnabled()) { + LOG.debug("==> ServiceDBStore.getPaginatedServices()"); + } + RangerServiceList serviceList = svcService.searchRangerServices(filter); + + if (LOG.isDebugEnabled()) { + LOG.debug("<== ServiceDBStore.getPaginatedServices()"); + } + return serviceList; + } + @Override public RangerPolicy createPolicy(RangerPolicy policy) throws Exception { @@ -631,6 +687,8 @@ public class ServiceDBStore implements ServiceStore { Map<String, RangerPolicyResource> resources = policy.getResources(); List<RangerPolicyItem> policyItems = policy.getPolicyItems(); + policy.setVersion(new Long(1)); + if(populateExistingBaseFields) { policyService.setPopulateExistingBaseFields(true); policy = policyService.create(policy); @@ -696,6 +754,16 @@ public class ServiceDBStore implements ServiceStore { List<XXTrxLog> trxLogList = policyService.getTransactionLog(policy, xxExisting, RangerPolicyService.OPERATION_UPDATE_CONTEXT); + Long version = policy.getVersion(); + if(version == null) { + version = new Long(1); + LOG.info("Found Version Value: `null`, so setting value of version to 1, While updating object, version should not be null."); + } else { + version = new Long(version.longValue() + 1); + } + + policy.setVersion(version); + policy = policyService.update(policy); XXPolicy newUpdPolicy = daoMgr.getXXPolicy().getById(policy.getId()); @@ -733,6 +801,16 @@ public class ServiceDBStore implements ServiceStore { throw new Exception("service does not exist - name='" + policy.getService()); } + Long version = policy.getVersion(); + if(version == null) { + version = new Long(1); + LOG.info("Found Version Value: `null`, so setting value of version to 1, While updating object, version should not be null."); + } else { + version = new Long(version.longValue() + 1); + } + + policy.setVersion(version); + List<XXTrxLog> trxLogList = policyService.getTransactionLog(policy, RangerPolicyService.OPERATION_DELETE_CONTEXT); deleteExistingPolicyItems(policy); @@ -759,11 +837,30 @@ public class ServiceDBStore implements ServiceStore { LOG.debug("==> ServiceDBStore.getPolicies()"); } - List<RangerPolicy> ret = policyService.searchRangerPolicies(filter); + RangerPolicyList policyList = policyService.searchRangerPolicies(filter); + List<RangerPolicy> ret = policyList.getPolicies(); + if(LOG.isDebugEnabled()) { + LOG.debug("<== ServiceDBStore.getPolicies()"); + } + return ret; } + public RangerPolicyList getPaginatedPolicies(SearchFilter filter) throws Exception { + if (LOG.isDebugEnabled()) { + LOG.debug("==> ServiceDBStore.getPaginatedPolicies()"); + } + + RangerPolicyList policyList = policyService.searchRangerPolicies(filter); + + if (LOG.isDebugEnabled()) { + LOG.debug("<== ServiceDBStore.getPaginatedPolicies()"); + } + + return policyList; + } + @Override public List<RangerPolicy> getServicePolicies(Long serviceId, SearchFilter filter) throws Exception { if(LOG.isDebugEnabled()) { @@ -781,6 +878,25 @@ public class ServiceDBStore implements ServiceStore { return ret; } + public RangerPolicyList getPaginatedServicePolicies(Long serviceId, SearchFilter filter) throws Exception { + if (LOG.isDebugEnabled()) { + LOG.debug("==> ServiceDBStore.getPaginatedServicePolicies(" + serviceId + ")"); + } + + RangerService service = getService(serviceId); + + if (service == null) { + throw new Exception("service does not exist - id='" + serviceId); + } + + RangerPolicyList ret = getPaginatedServicePolicies(service.getName(), filter); + + if (LOG.isDebugEnabled()) { + LOG.debug("<== ServiceDBStore.getPaginatedServicePolicies(" + serviceId + ")"); + } + return ret; + } + @Override public List<RangerPolicy> getServicePolicies(String serviceName, SearchFilter filter) throws Exception { if(LOG.isDebugEnabled()) { @@ -808,6 +924,33 @@ public class ServiceDBStore implements ServiceStore { return ret; } + public RangerPolicyList getPaginatedServicePolicies(String serviceName, SearchFilter filter) throws Exception { + if (LOG.isDebugEnabled()) { + LOG.debug("==> ServiceDBStore.getPaginatedServicePolicies(" + serviceName + ")"); + } + + RangerPolicyList ret = null; + + try { + if (filter == null) { + filter = new SearchFilter(); + } + + filter.setParam(SearchFilter.SERVICE_NAME, serviceName); + + ret = getPaginatedPolicies(filter); + } catch (Exception excp) { + LOG.error("ServiceDBStore.getPaginatedServicePolicies(" + serviceName + "): failed to read policies", excp); + } + + if (LOG.isDebugEnabled()) { + LOG.debug("<== ServiceDBStore.getPaginatedServicePolicies(" + serviceName + "): count=" + + ((ret == null) ? 0 : ret.getListSize())); + } + + return ret; + } + @Override public ServicePolicies getServicePoliciesIfUpdated(String serviceName, Long lastKnownVersion) throws Exception { if(LOG.isDebugEnabled()) { @@ -870,7 +1013,7 @@ public class ServiceDBStore implements ServiceStore { String value; if("path".equalsIgnoreCase(resDef.getName())) { - value = "/*/*"; + value = "/*"; } else { value = "*"; } @@ -1151,4 +1294,14 @@ public class ServiceDBStore implements ServiceStore { this.populateExistingBaseFields = populateExistingBaseFields; } -} \ No newline at end of file + public RangerPolicy getPolicyFromEventTime(Date eventTime, Long policyId) { + + XXDataHist xDataHist = daoMgr.getXXDataHist().findObjByEventTimeClassTypeAndId(eventTime, + AppConstants.CLASS_TYPE_RANGER_POLICY, policyId); + String content = xDataHist.getContent(); + RangerPolicy policy = (RangerPolicy) dataHistService.writeJsonToJavaObject(content, RangerPolicy.class); + + return policy; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/java/org/apache/ranger/common/RangerSearchUtil.java ---------------------------------------------------------------------- diff --git a/security-admin/src/main/java/org/apache/ranger/common/RangerSearchUtil.java b/security-admin/src/main/java/org/apache/ranger/common/RangerSearchUtil.java index 192734e..205f4f5 100644 --- a/security-admin/src/main/java/org/apache/ranger/common/RangerSearchUtil.java +++ b/security-admin/src/main/java/org/apache/ranger/common/RangerSearchUtil.java @@ -21,11 +21,17 @@ import java.util.ArrayList; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; import javax.persistence.EntityManager; import javax.persistence.Query; +import javax.servlet.http.HttpServletRequest; +import org.apache.commons.collections.MapUtils; +import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.apache.ranger.plugin.util.SearchFilter; import org.springframework.stereotype.Component; @@ -33,6 +39,86 @@ import org.springframework.stereotype.Component; @Component public class RangerSearchUtil extends SearchUtil { final static Logger logger = Logger.getLogger(RangerSearchUtil.class); + + public SearchFilter getSearchFilter(HttpServletRequest request, List<SortField> sortFields) { + if (request == null) { + return null; + } + + SearchFilter ret = new SearchFilter(); + + if (MapUtils.isEmpty(request.getParameterMap())) { + ret.setParams(new HashMap<String, String>()); + } + + ret.setParam(SearchFilter.LOGIN_USER, request.getParameter(SearchFilter.LOGIN_USER)); + ret.setParam(SearchFilter.SERVICE_TYPE, request.getParameter(SearchFilter.SERVICE_TYPE)); + ret.setParam(SearchFilter.SERVICE_TYPE_ID, request.getParameter(SearchFilter.SERVICE_TYPE_ID)); + ret.setParam(SearchFilter.SERVICE_NAME, request.getParameter(SearchFilter.SERVICE_NAME)); + ret.setParam(SearchFilter.SERVICE_ID, request.getParameter(SearchFilter.SERVICE_ID)); + ret.setParam(SearchFilter.POLICY_NAME, request.getParameter(SearchFilter.POLICY_NAME)); + ret.setParam(SearchFilter.POLICY_NAME_PARTIAL, request.getParameter(SearchFilter.POLICY_NAME_PARTIAL)); + ret.setParam(SearchFilter.POLICY_ID, request.getParameter(SearchFilter.POLICY_ID)); + ret.setParam(SearchFilter.STATUS, request.getParameter(SearchFilter.STATUS)); + ret.setParam(SearchFilter.USER, request.getParameter(SearchFilter.USER)); + ret.setParam(SearchFilter.GROUP, request.getParameter(SearchFilter.GROUP)); + ret.setParam(SearchFilter.POL_RESOURCE, request.getParameter(SearchFilter.POL_RESOURCE)); + + for (Map.Entry<String, String[]> e : request.getParameterMap().entrySet()) { + String name = e.getKey(); + String[] values = e.getValue(); + + if (!StringUtils.isEmpty(name) && !ArrayUtils.isEmpty(values) + && name.startsWith(SearchFilter.RESOURCE_PREFIX)) { + ret.setParam(name, values[0]); + } + } + + extractCommonCriteriasForFilter(request, ret, sortFields); + + return ret; + } + + public SearchFilter extractCommonCriteriasForFilter(HttpServletRequest request, SearchFilter ret, List<SortField> sortFields) { + int startIndex = restErrorUtil.parseInt(request.getParameter(SearchFilter.START_INDEX), 0, + "Invalid value for parameter startIndex", MessageEnums.INVALID_INPUT_DATA, null, + SearchFilter.START_INDEX); + ret.setStartIndex(startIndex); + + int pageSize = restErrorUtil.parseInt(request.getParameter(SearchFilter.PAGE_SIZE), + configUtil.getDefaultMaxRows(), "Invalid value for parameter pageSize", + MessageEnums.INVALID_INPUT_DATA, null, SearchFilter.PAGE_SIZE); + ret.setMaxRows(pageSize); + + ret.setGetCount(restErrorUtil.parseBoolean(request.getParameter("getCount"), true)); + String sortBy = restErrorUtil.validateString(request.getParameter(SearchFilter.SORT_BY), + StringUtil.VALIDATION_ALPHA, "Invalid value for parameter sortBy", MessageEnums.INVALID_INPUT_DATA, + null, SearchFilter.SORT_BY); + + boolean sortSet = false; + if (!StringUtils.isEmpty(sortBy)) { + for (SortField sortField : sortFields) { + if (sortField.getParamName().equalsIgnoreCase(sortBy)) { + ret.setSortBy(sortField.getParamName()); + String sortType = restErrorUtil.validateString(request.getParameter("sortType"), + StringUtil.VALIDATION_ALPHA, "Invalid value for parameter sortType", + MessageEnums.INVALID_INPUT_DATA, null, "sortType"); + ret.setSortType(sortType); + sortSet = true; + break; + } + } + } + + if (!sortSet && !StringUtils.isEmpty(sortBy)) { + logger.info("Invalid or unsupported sortBy field passed. sortBy=" + sortBy, new Throwable()); + } + + if(ret.getParams() == null) { + ret.setParams(new HashMap<String, String>()); + } + return ret; + } public Query createSearchQuery(EntityManager em, String queryStr, String sortClause, SearchFilter searchCriteria, List<SearchField> searchFields, http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/java/org/apache/ranger/db/XXDataHistDao.java ---------------------------------------------------------------------- diff --git a/security-admin/src/main/java/org/apache/ranger/db/XXDataHistDao.java b/security-admin/src/main/java/org/apache/ranger/db/XXDataHistDao.java index 29c4246..4479145 100644 --- a/security-admin/src/main/java/org/apache/ranger/db/XXDataHistDao.java +++ b/security-admin/src/main/java/org/apache/ranger/db/XXDataHistDao.java @@ -1,6 +1,9 @@ package org.apache.ranger.db; +import java.util.Date; + import javax.persistence.NoResultException; +import javax.persistence.Query; import org.apache.ranger.common.db.BaseDao; import org.apache.ranger.entity.XXDataHist; @@ -25,5 +28,20 @@ public class XXDataHistDao extends BaseDao<XXDataHist> { return null; } } + + public XXDataHist findObjByEventTimeClassTypeAndId(Date eventTime, int classType, Long objId) { + if (eventTime == null || objId == null) { + return null; + } + try { + String queryStr = "select obj.* from x_data_hist obj where obj.obj_class_type = "+classType + + " and obj.obj_id = "+objId + " and obj.create_time <= '" + eventTime + "' ORDER BY obj.id DESC"; + Query jpaQuery = getEntityManager().createNativeQuery(queryStr, tClass).setMaxResults(1); + + return (XXDataHist) jpaQuery.getSingleResult(); + } catch (NoResultException e) { + return null; + } + } } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java ---------------------------------------------------------------------- diff --git a/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java b/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java index ec64e89..1cfaa91 100644 --- a/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java +++ b/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java @@ -21,6 +21,7 @@ package org.apache.ranger.rest; import java.util.ArrayList; import java.util.Collections; +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -40,8 +41,6 @@ import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Context; import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.collections.MapUtils; -import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -49,7 +48,10 @@ import org.apache.ranger.admin.client.datatype.RESTResponse; import org.apache.ranger.biz.AssetMgr; import org.apache.ranger.biz.ServiceDBStore; import org.apache.ranger.biz.ServiceMgr; +import org.apache.ranger.common.MessageEnums; import org.apache.ranger.common.RESTErrorUtil; +import org.apache.ranger.common.RangerConfigUtil; +import org.apache.ranger.common.RangerSearchUtil; import org.apache.ranger.common.ServiceUtil; import org.apache.ranger.entity.XXPolicyExportAudit; import org.apache.ranger.plugin.model.RangerPolicy; @@ -72,6 +74,12 @@ import org.apache.ranger.plugin.service.ResourceLookupContext; import org.apache.ranger.plugin.util.GrantRevokeRequest; import org.apache.ranger.plugin.util.SearchFilter; import org.apache.ranger.plugin.util.ServicePolicies; +import org.apache.ranger.service.RangerPolicyService; +import org.apache.ranger.service.RangerServiceDefService; +import org.apache.ranger.service.RangerServiceService; +import org.apache.ranger.view.RangerPolicyList; +import org.apache.ranger.view.RangerServiceDefList; +import org.apache.ranger.view.RangerServiceList; import org.apache.ranger.view.VXResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; @@ -103,6 +111,21 @@ public class ServiceREST { @Autowired ServiceUtil serviceUtil; + @Autowired + RangerConfigUtil configUtil; + + @Autowired + RangerPolicyService policyService; + + @Autowired + RangerServiceService svcService; + + @Autowired + RangerServiceDefService serviceDefService; + + @Autowired + RangerSearchUtil searchUtil; + // this indirection for validation via a factory exists only for testability // TODO move the instantiation to DI framework? RangerValidatorFactory validatorFactory = new RangerValidatorFactory(); @@ -250,7 +273,7 @@ public class ServiceREST { } @GET - @Path("/definitions") + @Path("/definitions/unpaginated") @Produces({ "application/json", "application/xml" }) public List<RangerServiceDef> getServiceDefs(@Context HttpServletRequest request) { if(LOG.isDebugEnabled()) { @@ -259,7 +282,7 @@ public class ServiceREST { List<RangerServiceDef> ret = null; - SearchFilter filter = getSearchFilter(request); + SearchFilter filter = searchUtil.getSearchFilter(request, serviceDefService.sortFields); try { ret = svcStore.getServiceDefs(filter); @@ -417,7 +440,7 @@ public class ServiceREST { } @GET - @Path("/services") + @Path("/services/unpaginated") @Produces({ "application/json", "application/xml" }) public List<RangerService> getServices(@Context HttpServletRequest request) { if(LOG.isDebugEnabled()) { @@ -426,7 +449,7 @@ public class ServiceREST { List<RangerService> ret = null; - SearchFilter filter = getSearchFilter(request); + SearchFilter filter = searchUtil.getSearchFilter(request, svcService.sortFields); try { ret = svcStore.getServices(filter); @@ -899,7 +922,7 @@ public class ServiceREST { } @GET - @Path("/policies") + @Path("/policies/unpaginated") @Produces({ "application/json", "application/xml" }) public List<RangerPolicy> getPolicies(@Context HttpServletRequest request) { if(LOG.isDebugEnabled()) { @@ -908,7 +931,8 @@ public class ServiceREST { List<RangerPolicy> ret = null; - SearchFilter filter = getSearchFilter(request); + SearchFilter filter = searchUtil.getSearchFilter(request, policyService.sortFields); + try { ret = svcStore.getPolicies(filter); @@ -953,7 +977,7 @@ public class ServiceREST { } @GET - @Path("/policies/service/{id}") + @Path("/policies/service/unpaginated/{id}") @Produces({ "application/json", "application/xml" }) public List<RangerPolicy> getServicePolicies(@PathParam("id") Long serviceId, @Context HttpServletRequest request) { if(LOG.isDebugEnabled()) { @@ -962,7 +986,7 @@ public class ServiceREST { List<RangerPolicy> ret = null; - SearchFilter filter = getSearchFilter(request); + SearchFilter filter = searchUtil.getSearchFilter(request, policyService.sortFields); try { ret = svcStore.getServicePolicies(serviceId, filter); @@ -984,7 +1008,7 @@ public class ServiceREST { } @GET - @Path("/policies/service/name/{name}") + @Path("/policies/service/unpaginated/name/{name}") @Produces({ "application/json", "application/xml" }) public List<RangerPolicy> getServicePolicies(@PathParam("name") String serviceName, @Context HttpServletRequest request) { if(LOG.isDebugEnabled()) { @@ -993,7 +1017,7 @@ public class ServiceREST { List<RangerPolicy> ret = null; - SearchFilter filter = getSearchFilter(request); + SearchFilter filter = searchUtil.getSearchFilter(request, policyService.sortFields); try { ret = svcStore.getServicePolicies(serviceName, filter); @@ -1060,44 +1084,6 @@ public class ServiceREST { return ret; } - - private SearchFilter getSearchFilter(HttpServletRequest request) { - if(request == null) { - return null; - } - - SearchFilter ret = new SearchFilter(); - - if(MapUtils.isEmpty(request.getParameterMap())) { - ret.setParams(new HashMap<String, String>()); - } - - ret.setParam(SearchFilter.LOGIN_USER, request.getParameter(SearchFilter.LOGIN_USER)); - ret.setParam(SearchFilter.SERVICE_TYPE, request.getParameter(SearchFilter.SERVICE_TYPE)); - ret.setParam(SearchFilter.SERVICE_TYPE_ID, request.getParameter(SearchFilter.SERVICE_TYPE_ID)); - ret.setParam(SearchFilter.SERVICE_NAME, request.getParameter(SearchFilter.SERVICE_NAME)); - ret.setParam(SearchFilter.SERVICE_ID, request.getParameter(SearchFilter.SERVICE_ID)); - ret.setParam(SearchFilter.POLICY_NAME, request.getParameter(SearchFilter.POLICY_NAME)); - ret.setParam(SearchFilter.POLICY_ID, request.getParameter(SearchFilter.POLICY_ID)); - ret.setParam(SearchFilter.STATUS, request.getParameter(SearchFilter.STATUS)); - ret.setParam(SearchFilter.USER, request.getParameter(SearchFilter.USER)); - ret.setParam(SearchFilter.GROUP, request.getParameter(SearchFilter.GROUP)); - ret.setParam(SearchFilter.SORT_BY, request.getParameter(SearchFilter.SORT_BY)); - ret.setParam(SearchFilter.START_INDEX, request.getParameter(SearchFilter.START_INDEX)); - ret.setParam(SearchFilter.PAGE_SIZE, request.getParameter(SearchFilter.PAGE_SIZE)); - - for(Map.Entry<String, String[]> e : request.getParameterMap().entrySet()) { - String name = e.getKey(); - String[] values = e.getValue(); - - if(!StringUtils.isEmpty(name) && !ArrayUtils.isEmpty(values) && name.startsWith(SearchFilter.RESOURCE_PREFIX)) { - ret.setParam(name, values[0]); - } - } - - return ret; - } - private void createPolicyDownloadAudit(String serviceName, Long lastKnownVersion, String pluginId, ServicePolicies policies, int httpRespCode, HttpServletRequest request) { try { String ipAddress = request.getHeader("X-FORWARDED-FOR"); @@ -1347,4 +1333,178 @@ public class ServiceREST { return ret; } + + @GET + @Path("/definitions") + @Produces({ "application/json", "application/xml" }) + public RangerServiceDefList getPaginatedServiceDefs(@Context HttpServletRequest request) { + if (LOG.isDebugEnabled()) { + LOG.debug("==> ServiceREST.getPaginatedServiceDefs()"); + } + + RangerServiceDefList ret = null; + + SearchFilter filter = searchUtil.getSearchFilter(request, serviceDefService.sortFields); + + try { + ret = svcStore.getPaginatedServiceDefs(filter); + } catch (Exception excp) { + LOG.error("getServiceDefs() failed", excp); + + throw restErrorUtil.createRESTException(HttpServletResponse.SC_BAD_REQUEST, excp.getMessage(), true); + } + + if (LOG.isDebugEnabled()) { + LOG.debug("<== ServiceREST.getPaginatedServiceDefs(): count=" + (ret == null ? 0 : ret.getListSize())); + } + return ret; + } + + @GET + @Path("/services") + @Produces({ "application/json", "application/xml" }) + public RangerServiceList getPaginatedServices(@Context HttpServletRequest request) { + if (LOG.isDebugEnabled()) { + LOG.debug("==> ServiceREST.getPaginatedServices()"); + } + + RangerServiceList ret = null; + + SearchFilter filter = searchUtil.getSearchFilter(request, svcService.sortFields); + + try { + ret = svcStore.getPaginatedServices(filter); + } catch (Exception excp) { + LOG.error("getServices() failed", excp); + + throw restErrorUtil.createRESTException(HttpServletResponse.SC_BAD_REQUEST, excp.getMessage(), true); + } + + if (LOG.isDebugEnabled()) { + LOG.debug("<== ServiceREST.getPaginatedServices(): count=" + (ret == null ? 0 : ret.getListSize())); + } + return ret; + } + + @GET + @Path("/policies") + @Produces({ "application/json", "application/xml" }) + public RangerPolicyList getPaginatedPolicies(@Context HttpServletRequest request) { + if (LOG.isDebugEnabled()) { + LOG.debug("==> ServiceREST.getPaginatedPolicies()"); + } + + RangerPolicyList ret = null; + + SearchFilter filter = searchUtil.getSearchFilter(request, policyService.sortFields); + + try { + ret = svcStore.getPaginatedPolicies(filter); + } catch (Exception excp) { + LOG.error("getPolicies() failed", excp); + + throw restErrorUtil.createRESTException(HttpServletResponse.SC_BAD_REQUEST, excp.getMessage(), true); + } + + if (LOG.isDebugEnabled()) { + LOG.debug("<== ServiceREST.getPaginatedPolicies(): count=" + (ret == null ? 0 : ret.getListSize())); + } + return ret; + } + + @GET + @Path("/policies/service/{id}") + @Produces({ "application/json", "application/xml" }) + public RangerPolicyList getPaginatedServicePolicies(@PathParam("id") Long serviceId, + @Context HttpServletRequest request) { + if (LOG.isDebugEnabled()) { + LOG.debug("==> ServiceREST.getServicePolicies(" + serviceId + ")"); + } + + RangerPolicyList ret = null; + + SearchFilter filter = searchUtil.getSearchFilter(request, policyService.sortFields); + + try { + ret = svcStore.getPaginatedServicePolicies(serviceId, filter); + } catch (Exception excp) { + LOG.error("getServicePolicies(" + serviceId + ") failed", excp); + + throw restErrorUtil.createRESTException(HttpServletResponse.SC_BAD_REQUEST, excp.getMessage(), true); + } + + if (ret == null) { + throw restErrorUtil.createRESTException(HttpServletResponse.SC_NOT_FOUND, "Not found", true); + } + + if (LOG.isDebugEnabled()) { + LOG.debug("<== ServiceREST.getServicePolicies(" + serviceId + "): count=" + + (ret == null ? 0 : ret.getListSize())); + } + return ret; + } + + @GET + @Path("/policies/service/name/{name}") + @Produces({ "application/json", "application/xml" }) + public RangerPolicyList getPaginatedServicePolicies(@PathParam("name") String serviceName, + @Context HttpServletRequest request) { + if (LOG.isDebugEnabled()) { + LOG.debug("==> ServiceREST.getServicePolicies(" + serviceName + ")"); + } + + RangerPolicyList ret = null; + + SearchFilter filter = searchUtil.getSearchFilter(request, policyService.sortFields); + + try { + ret = svcStore.getPaginatedServicePolicies(serviceName, filter); + } catch (Exception excp) { + LOG.error("getServicePolicies(" + serviceName + ") failed", excp); + + throw restErrorUtil.createRESTException(HttpServletResponse.SC_BAD_REQUEST, excp.getMessage(), true); + } + + if (ret == null) { + throw restErrorUtil.createRESTException(HttpServletResponse.SC_NOT_FOUND, "Not found", true); + } + + if (LOG.isDebugEnabled()) { + LOG.debug("<== ServiceREST.getServicePolicies(" + serviceName + "): count=" + + (ret == null ? 0 : ret.getListSize())); + } + + return ret; + } + + @GET + @Path("/policies/eventTime") + @Produces({ "application/json", "application/xml" }) + public RangerPolicy getPolicyFromEventTime(@Context HttpServletRequest request) { + if (LOG.isDebugEnabled()) { + LOG.debug("==> ServiceREST.getPolicyFromEventTime()"); + } + + String eventTimeStr = request.getParameter("eventTime"); + String policyIdStr = request.getParameter("policyId"); + + if (StringUtils.isEmpty(eventTimeStr) || StringUtils.isEmpty(policyIdStr)) { + throw restErrorUtil.createRESTException("EventTime or policyId cannot be null or empty string.", + MessageEnums.INVALID_INPUT_DATA); + } + + Long policyId = Long.parseLong(policyIdStr); + + Date eventTime = restErrorUtil.parseDate(eventTimeStr, "Invalid value for" + "Event Time", + MessageEnums.INVALID_INPUT_DATA, null, "eventTime", "MM/dd/yyyy"); + + RangerPolicy policy = svcStore.getPolicyFromEventTime(eventTime, policyId); + + if (LOG.isDebugEnabled()) { + LOG.debug("<== ServiceREST.getPolicyFromEventTime()"); + } + + return policy; + } + } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/java/org/apache/ranger/service/RangerDataHistService.java ---------------------------------------------------------------------- diff --git a/security-admin/src/main/java/org/apache/ranger/service/RangerDataHistService.java b/security-admin/src/main/java/org/apache/ranger/service/RangerDataHistService.java index a5aa16e..b75b514 100644 --- a/security-admin/src/main/java/org/apache/ranger/service/RangerDataHistService.java +++ b/security-admin/src/main/java/org/apache/ranger/service/RangerDataHistService.java @@ -122,5 +122,22 @@ public class RangerDataHistService { MessageEnums.INVALID_INPUT_DATA); } } - + + public Object writeJsonToJavaObject(String json, Class<?> tClass) { + ObjectMapper mapper = new ObjectMapper(); + + try { + return mapper.readValue(json, tClass); + } catch (JsonParseException e) { + throw restErrorUtil.createRESTException("Invalid input data: " + e.getMessage(), + MessageEnums.INVALID_INPUT_DATA); + } catch (JsonMappingException e) { + throw restErrorUtil.createRESTException("Invalid input data: " + e.getMessage(), + MessageEnums.INVALID_INPUT_DATA); + } catch (IOException e) { + throw restErrorUtil.createRESTException("Invalid input data: " + e.getMessage(), + MessageEnums.INVALID_INPUT_DATA); + } + } + } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/java/org/apache/ranger/service/RangerPolicyService.java ---------------------------------------------------------------------- diff --git a/security-admin/src/main/java/org/apache/ranger/service/RangerPolicyService.java b/security-admin/src/main/java/org/apache/ranger/service/RangerPolicyService.java index ace800d..1db4779 100644 --- a/security-admin/src/main/java/org/apache/ranger/service/RangerPolicyService.java +++ b/security-admin/src/main/java/org/apache/ranger/service/RangerPolicyService.java @@ -88,6 +88,10 @@ public class RangerPolicyService extends RangerPolicyServiceBase<XXPolicy, Range searchFields.add(new SearchField(SearchFilter.GROUP, "xGrp.name", DATA_TYPE.STRING, SEARCH_TYPE.FULL, "XXGroup xGrp, XXPolicyItem xPolItem, XXPolicyItemGroupPerm grpPerm", "obj.id = xPolItem.policyId " + "and grpPerm.policyItemId = xPolItem.id and xGrp.id = grpPerm.groupId")); + searchFields.add(new SearchField(SearchFilter.POL_RESOURCE, "resMap.value", DATA_TYPE.STRING, + SEARCH_TYPE.PARTIAL, "XXPolicyResourceMap resMap, XXPolicyResource polRes", + "resMap.resourceId = polRes.id and polRes.policyId = obj.id")); + searchFields.add(new SearchField(SearchFilter.POLICY_NAME_PARTIAL, "obj.name", DATA_TYPE.STRING, SEARCH_TYPE.PARTIAL)); sortFields.add(new SortField(SearchFilter.CREATE_TIME, "obj.createTime")); sortFields.add(new SortField(SearchFilter.UPDATE_TIME, "obj.updateTime")); http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/java/org/apache/ranger/service/RangerPolicyServiceBase.java ---------------------------------------------------------------------- diff --git a/security-admin/src/main/java/org/apache/ranger/service/RangerPolicyServiceBase.java b/security-admin/src/main/java/org/apache/ranger/service/RangerPolicyServiceBase.java index d19e580..58c2b69 100644 --- a/security-admin/src/main/java/org/apache/ranger/service/RangerPolicyServiceBase.java +++ b/security-admin/src/main/java/org/apache/ranger/service/RangerPolicyServiceBase.java @@ -8,10 +8,9 @@ import org.apache.ranger.common.GUIDUtil; import org.apache.ranger.common.MessageEnums; import org.apache.ranger.entity.XXPolicy; import org.apache.ranger.entity.XXService; -import org.apache.ranger.entity.XXServiceDef; import org.apache.ranger.plugin.model.RangerPolicy; -import org.apache.ranger.plugin.model.RangerServiceDef; import org.apache.ranger.plugin.util.SearchFilter; +import org.apache.ranger.view.RangerPolicyList; public abstract class RangerPolicyServiceBase<T extends XXPolicy, V extends RangerPolicy> extends RangerBaseModelService<T, V> { @@ -52,17 +51,19 @@ public abstract class RangerPolicyServiceBase<T extends XXPolicy, V extends Rang vObj.setIsAuditEnabled(xObj.getIsAuditEnabled()); return vObj; } - + @SuppressWarnings("unchecked") - public List<RangerPolicy> searchRangerPolicies(SearchFilter searchFilter) { + public RangerPolicyList searchRangerPolicies(SearchFilter searchFilter) { List<RangerPolicy> policyList = new ArrayList<RangerPolicy>(); + RangerPolicyList retList = new RangerPolicyList(); - List<XXPolicy> xPolList = (List<XXPolicy>) searchResources(searchFilter, searchFields, sortFields, null); - for(XXPolicy xPol : xPolList) { + List<XXPolicy> xPolList = (List<XXPolicy>) searchResources(searchFilter, searchFields, sortFields, retList); + for (XXPolicy xPol : xPolList) { policyList.add(populateViewBean((T) xPol)); } - - return policyList; + retList.setPolicies(policyList); + + return retList; } - + } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/java/org/apache/ranger/service/RangerServiceDefServiceBase.java ---------------------------------------------------------------------- diff --git a/security-admin/src/main/java/org/apache/ranger/service/RangerServiceDefServiceBase.java b/security-admin/src/main/java/org/apache/ranger/service/RangerServiceDefServiceBase.java index 374217f..afaf2cb 100644 --- a/security-admin/src/main/java/org/apache/ranger/service/RangerServiceDefServiceBase.java +++ b/security-admin/src/main/java/org/apache/ranger/service/RangerServiceDefServiceBase.java @@ -27,6 +27,7 @@ import org.apache.ranger.plugin.model.RangerServiceDef.RangerPolicyConditionDef; import org.apache.ranger.plugin.model.RangerServiceDef.RangerResourceDef; import org.apache.ranger.plugin.model.RangerServiceDef.RangerServiceConfigDef; import org.apache.ranger.plugin.util.SearchFilter; +import org.apache.ranger.view.RangerServiceDefList; import org.springframework.beans.factory.annotation.Autowired; public abstract class RangerServiceDefServiceBase<T extends XXServiceDef, V extends RangerServiceDef> @@ -302,17 +303,20 @@ public abstract class RangerServiceDefServiceBase<T extends XXServiceDef, V exte vObj.setRbKeyLabel(xObj.getRbkeylabel()); return vObj; } - + @SuppressWarnings("unchecked") - public List<RangerServiceDef> searchRangerServiceDefs(SearchFilter searchFilter) { + public RangerServiceDefList searchRangerServiceDefs(SearchFilter searchFilter) { List<RangerServiceDef> serviceDefList = new ArrayList<RangerServiceDef>(); - - List<XXServiceDef> xSvcDefList = (List<XXServiceDef>) searchResources(searchFilter, searchFields, sortFields, null); - for(XXServiceDef xSvcDef : xSvcDefList) { + RangerServiceDefList retList = new RangerServiceDefList(); + + List<XXServiceDef> xSvcDefList = (List<XXServiceDef>) searchResources(searchFilter, searchFields, sortFields, retList); + for (XXServiceDef xSvcDef : xSvcDefList) { serviceDefList.add(populateViewBean((T) xSvcDef)); } - - return serviceDefList; + + retList.setServiceDefs(serviceDefList); + + return retList; } - + } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/java/org/apache/ranger/service/RangerServiceServiceBase.java ---------------------------------------------------------------------- diff --git a/security-admin/src/main/java/org/apache/ranger/service/RangerServiceServiceBase.java b/security-admin/src/main/java/org/apache/ranger/service/RangerServiceServiceBase.java index 6f484ec..fb6142e 100644 --- a/security-admin/src/main/java/org/apache/ranger/service/RangerServiceServiceBase.java +++ b/security-admin/src/main/java/org/apache/ranger/service/RangerServiceServiceBase.java @@ -10,6 +10,7 @@ import org.apache.ranger.entity.XXService; import org.apache.ranger.entity.XXServiceDef; import org.apache.ranger.plugin.model.RangerService; import org.apache.ranger.plugin.util.SearchFilter; +import org.apache.ranger.view.RangerServiceList; public abstract class RangerServiceServiceBase<T extends XXService, V extends RangerService> extends RangerBaseModelService<T, V> { @@ -49,17 +50,18 @@ public abstract class RangerServiceServiceBase<T extends XXService, V extends Ra vObj.setPolicyUpdateTime(xObj.getPolicyUpdateTime()); return vObj; } - + @SuppressWarnings("unchecked") - public List<RangerService> searchRangerPolicies(SearchFilter searchFilter) { + public RangerServiceList searchRangerServices(SearchFilter searchFilter) { List<RangerService> serviceList = new ArrayList<RangerService>(); - - List<XXService> xSvcList = (List<XXService>) searchResources(searchFilter, searchFields, sortFields, null); - for(XXService xSvc : xSvcList) { + RangerServiceList retList = new RangerServiceList(); + + List<XXService> xSvcList = (List<XXService>) searchResources(searchFilter, searchFields, sortFields, retList); + for (XXService xSvc : xSvcList) { serviceList.add(populateViewBean((T) xSvc)); } - - return serviceList; + retList.setServices(serviceList); + return retList; } - + } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/java/org/apache/ranger/view/RangerPolicyList.java ---------------------------------------------------------------------- diff --git a/security-admin/src/main/java/org/apache/ranger/view/RangerPolicyList.java b/security-admin/src/main/java/org/apache/ranger/view/RangerPolicyList.java new file mode 100644 index 0000000..d4f8b2f --- /dev/null +++ b/security-admin/src/main/java/org/apache/ranger/view/RangerPolicyList.java @@ -0,0 +1,55 @@ +package org.apache.ranger.view; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlRootElement; + +import org.apache.ranger.common.view.VList; +import org.apache.ranger.plugin.model.RangerPolicy; +import org.codehaus.jackson.annotate.JsonAutoDetect; +import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility; +import org.codehaus.jackson.map.annotate.JsonSerialize; + +@JsonAutoDetect(getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE, fieldVisibility = Visibility.ANY) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@XmlRootElement +@XmlAccessorType(XmlAccessType.FIELD) +public class RangerPolicyList extends VList { + private static final long serialVersionUID = 1L; + + List<RangerPolicy> policies = new ArrayList<RangerPolicy>(); + + public RangerPolicyList() { + super(); + } + + public RangerPolicyList(List<RangerPolicy> objList) { + super(objList); + this.policies = objList; + } + + public List<RangerPolicy> getPolicies() { + return policies; + } + + public void setPolicies(List<RangerPolicy> policies) { + this.policies = policies; + } + + @Override + public int getListSize() { + if (policies != null) { + return policies.size(); + } + return 0; + } + + @Override + public List<?> getList() { + return policies; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/java/org/apache/ranger/view/RangerServiceDefList.java ---------------------------------------------------------------------- diff --git a/security-admin/src/main/java/org/apache/ranger/view/RangerServiceDefList.java b/security-admin/src/main/java/org/apache/ranger/view/RangerServiceDefList.java new file mode 100644 index 0000000..eba8e9c --- /dev/null +++ b/security-admin/src/main/java/org/apache/ranger/view/RangerServiceDefList.java @@ -0,0 +1,55 @@ +package org.apache.ranger.view; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlRootElement; + +import org.apache.ranger.common.view.VList; +import org.apache.ranger.plugin.model.RangerServiceDef; +import org.codehaus.jackson.annotate.JsonAutoDetect; +import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility; +import org.codehaus.jackson.map.annotate.JsonSerialize; + +@JsonAutoDetect(getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE, fieldVisibility = Visibility.ANY) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@XmlRootElement +@XmlAccessorType(XmlAccessType.FIELD) +public class RangerServiceDefList extends VList { + private static final long serialVersionUID = 1L; + + List<RangerServiceDef> serviceDefs = new ArrayList<RangerServiceDef>(); + + public RangerServiceDefList() { + super(); + } + + public RangerServiceDefList(List<RangerServiceDef> objList) { + super(objList); + this.serviceDefs = objList; + } + + public List<RangerServiceDef> getServiceDefs() { + return serviceDefs; + } + + public void setServiceDefs(List<RangerServiceDef> serviceDefs) { + this.serviceDefs = serviceDefs; + } + + @Override + public int getListSize() { + if (serviceDefs != null) { + return serviceDefs.size(); + } + return 0; + } + + @Override + public List<?> getList() { + return serviceDefs; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/java/org/apache/ranger/view/RangerServiceList.java ---------------------------------------------------------------------- diff --git a/security-admin/src/main/java/org/apache/ranger/view/RangerServiceList.java b/security-admin/src/main/java/org/apache/ranger/view/RangerServiceList.java new file mode 100644 index 0000000..94780e5 --- /dev/null +++ b/security-admin/src/main/java/org/apache/ranger/view/RangerServiceList.java @@ -0,0 +1,55 @@ +package org.apache.ranger.view; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlRootElement; + +import org.apache.ranger.common.view.VList; +import org.apache.ranger.plugin.model.RangerService; +import org.codehaus.jackson.annotate.JsonAutoDetect; +import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility; +import org.codehaus.jackson.map.annotate.JsonSerialize; + +@JsonAutoDetect(getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE, fieldVisibility = Visibility.ANY) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@XmlRootElement +@XmlAccessorType(XmlAccessType.FIELD) +public class RangerServiceList extends VList { + private static final long serialVersionUID = 1L; + + List<RangerService> services = new ArrayList<RangerService>(); + + public RangerServiceList() { + super(); + } + + public RangerServiceList(List<RangerService> objList) { + super(objList); + this.services = objList; + } + + public List<RangerService> getServices() { + return services; + } + + public void setServices(List<RangerService> services) { + this.services = services; + } + + @Override + public int getListSize() { + if (services != null) { + return services.size(); + } + return 0; + } + + @Override + public List<?> getList() { + return services; + } + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/webapp/scripts/collection_bases/RangerPolicyListBase.js ---------------------------------------------------------------------- diff --git a/security-admin/src/main/webapp/scripts/collection_bases/RangerPolicyListBase.js b/security-admin/src/main/webapp/scripts/collection_bases/RangerPolicyListBase.js index a63e4b2..f81f500 100644 --- a/security-admin/src/main/webapp/scripts/collection_bases/RangerPolicyListBase.js +++ b/security-admin/src/main/webapp/scripts/collection_bases/RangerPolicyListBase.js @@ -39,14 +39,8 @@ define(function(require){ */ initialize : function() { this.modelName = 'RangerPolicy'; - this.modelAttrName = 'RangerPolicies'; + this.modelAttrName = 'policies'; this.bindErrorEvents(); - }, - /** - * override the parseRecords of PageableCollection for our use - */ - parseRecords : function(resp, options){ - return resp; } },{ // static class members http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/webapp/scripts/collection_bases/RangerServiceDefListBase.js ---------------------------------------------------------------------- diff --git a/security-admin/src/main/webapp/scripts/collection_bases/RangerServiceDefListBase.js b/security-admin/src/main/webapp/scripts/collection_bases/RangerServiceDefListBase.js index 2754f62..9c57b61 100644 --- a/security-admin/src/main/webapp/scripts/collection_bases/RangerServiceDefListBase.js +++ b/security-admin/src/main/webapp/scripts/collection_bases/RangerServiceDefListBase.js @@ -39,15 +39,10 @@ define(function(require){ */ initialize : function() { this.modelName = 'RangerServiceDef'; - this.modelAttrName = 'RangerServiceDefs'; + this.modelAttrName = 'serviceDefs'; this.bindErrorEvents(); }, - /** - * override the parseRecords of PageableCollection for our use - */ - parseRecords : function(resp, options){ - return resp; - }, + comparator: function(def) { return def.get('id'); } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/webapp/scripts/collection_bases/RangerServiceListBase.js ---------------------------------------------------------------------- diff --git a/security-admin/src/main/webapp/scripts/collection_bases/RangerServiceListBase.js b/security-admin/src/main/webapp/scripts/collection_bases/RangerServiceListBase.js index 99d1533..561d98f 100644 --- a/security-admin/src/main/webapp/scripts/collection_bases/RangerServiceListBase.js +++ b/security-admin/src/main/webapp/scripts/collection_bases/RangerServiceListBase.js @@ -39,15 +39,9 @@ define(function(require){ */ initialize : function() { this.modelName = 'RangerService'; - this.modelAttrName = 'RangerServices'; + this.modelAttrName = 'services'; this.bindErrorEvents(); }, - /** - * override the parseRecords of PageableCollection for our use - */ - parseRecords : function(resp, options){ - return resp; - } },{ // static class members /** http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/webapp/scripts/controllers/Controller.js ---------------------------------------------------------------------- diff --git a/security-admin/src/main/webapp/scripts/controllers/Controller.js b/security-admin/src/main/webapp/scripts/controllers/Controller.js index 9915fb5..34a0a94 100644 --- a/security-admin/src/main/webapp/scripts/controllers/Controller.js +++ b/security-admin/src/main/webapp/scripts/controllers/Controller.js @@ -58,10 +58,10 @@ define(function(require) { userAccessReportAction : function(){ MAppState.set({ 'currentTab' : XAGlobals.AppTabs.Analytics.value }); var view = require('views/reports/UserAccessLayout'); - var VXResourceList = require('collections/VXResourceList'); + var RangerPolicyList = require('collections/RangerPolicyList'); var VXGroupList = require('collections/VXGroupList'); var VXUserList = require('collections/VXUserList'); - var resourceList = new VXResourceList([],{ + var policyList = new RangerPolicyList([],{ queryParams : { //'resourceType' : XAEnums.AssetType.ASSET_HDFS.value, //'assetId' : assetId @@ -70,29 +70,23 @@ define(function(require) { var that = this; this.groupList = new VXGroupList(); this.userList = new VXUserList(); - resourceList.setPageSize(200, {fetch : false}); - resourceList.fetch({ - async:false, - cache : false - }).done(function(){ - that.groupList.fetch({ - async:false, - cache:false - }).done(function(){ - that.userList.fetch({ - async:false, - cache:false - }).done(function(){ - if(App.rContent.currentView) - App.rContent.currentView.close(); - App.rContent.show(new view({ - collection : resourceList, - groupList :that.groupList, - userList :that.userList - })); - }); + that.groupList.fetch({ + async:false, + cache:false + }).done(function(){ + that.userList.fetch({ + async:false, + cache:false + }).done(function(){ + if(App.rContent.currentView) + App.rContent.currentView.close(); + App.rContent.show(new view({ + collection : policyList, + groupList :that.groupList, + userList :that.userList + })); }); - }); + }); }, auditReportAction : function(tab){ MAppState.set({ 'currentTab' : XAGlobals.AppTabs.Audit.value }); @@ -230,7 +224,7 @@ define(function(require) { var view = require('views/policymanager/ServiceLayout'); var RangerServiceDefList = require('collections/RangerServiceDefList'); var collection = new RangerServiceDefList(); - collection.queryParams.sortBy = 'id'; + collection.queryParams.sortBy = 'serviceTypeId'; collection.fetch({ cache : false, async:false http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/webapp/scripts/views/common/XATableLayout.js ---------------------------------------------------------------------- diff --git a/security-admin/src/main/webapp/scripts/views/common/XATableLayout.js b/security-admin/src/main/webapp/scripts/views/common/XATableLayout.js index 5556559..12bd6d7 100644 --- a/security-admin/src/main/webapp/scripts/views/common/XATableLayout.js +++ b/security-admin/src/main/webapp/scripts/views/common/XATableLayout.js @@ -122,16 +122,19 @@ define(function(require){ this.listenTo(this.collection, "sync reset", this.showHidePager); this.listenTo(this.collection, 'request', function(){ - $(this.rTableSpinner.el).addClass('loading'); +// $(this.rTableSpinner.el).addClass('loading'); + this.$el.find(this.rTableSpinner.el).addClass('loading'); },this); this.listenTo(this.collection, 'sync error', function(){ - $(this.rTableSpinner.el).removeClass('loading'); +// $(this.rTableSpinner.el).removeClass('loading'); + this.$el.find(this.rTableSpinner.el).removeClass('loading'); },this); }, /** on render callback */ onRender: function() { this.initializePlugins(); + this.renderTable(); if(this.includePagination) { this.renderPagination(); @@ -171,9 +174,10 @@ define(function(require){ }, showHidePager : function(){ if(this.collection.state && this.collection.state.totalRecords > XAGlobals.settings.PAGE_SIZE) { - $(this.rPagination.el).show(); + this.$el.find(this.rPagination.el).show() + //$(this.rPagination.el).show(); } else { - $(this.rPagination.el).hide(); + this.$el.find(this.rPagination.el).hide(); } }, renderFilter : function(){ http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/webapp/scripts/views/policies/PermissionList.js ---------------------------------------------------------------------- diff --git a/security-admin/src/main/webapp/scripts/views/policies/PermissionList.js b/security-admin/src/main/webapp/scripts/views/policies/PermissionList.js index b938c66..686836b 100644 --- a/security-admin/src/main/webapp/scripts/views/policies/PermissionList.js +++ b/security-admin/src/main/webapp/scripts/views/policies/PermissionList.js @@ -262,19 +262,16 @@ define(function(require) { if(that.model.has('accesses')){ perms = that.model.get('accesses'); } - //reset isAllowed flag in accesssItems to set newly isAllowed - _.each(that.accessItems, function(item){ item.isAllowed = false }); - _.each(that.accessTypes, function(obj) { - if(_.contains(values, obj.name)){ - var type = obj.name - _.each(that.accessItems, function(item){ if(item.type == type) item.isAllowed = true }); + var items=[]; + _.each(that.accessItems, function(item){ + if($.inArray( item.type, values) >= 0){ + item.isAllowed = true; + items.push(item) ; } - }); + },this); // Save form data to model - - if(!_.isEmpty(that.accessItems)) - that.model.set('accesses', that.accessItems); + that.model.set('accesses', items); $(this).html(valArr.join(" ")); that.ui.addPermissionsSpan.find('i').attr('class', 'icon-pencil'); http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/webapp/scripts/views/policies/RangerPolicyForm.js ---------------------------------------------------------------------- diff --git a/security-admin/src/main/webapp/scripts/views/policies/RangerPolicyForm.js b/security-admin/src/main/webapp/scripts/views/policies/RangerPolicyForm.js index bcbb3e0..42b5f68 100644 --- a/security-admin/src/main/webapp/scripts/views/policies/RangerPolicyForm.js +++ b/security-admin/src/main/webapp/scripts/views/policies/RangerPolicyForm.js @@ -455,14 +455,14 @@ define(function(require){ }, results: function (data, page) { var results = []; - if(data.length > 0){ - results = data.map(function(m, i){ return {id : m, text: m}; }); - } - /*if(!_.isUndefined(data)){ + if(!_.isUndefined(data)){ + if(_.isArray(data) && data.length > 0){ + results = data.map(function(m, i){ return {id : m, text: m}; }); + } if(data.resultSize != "0"){ results = data.vXStrings.map(function(m, i){ return {id : m.value, text: m.value}; }); } - }*/ + } return { results : results };
