This is an automated email from the ASF dual-hosted git repository.

madhan pushed a commit to branch RANGER-3923
in repository https://gitbox.apache.org/repos/asf/ranger.git


The following commit(s) were added to refs/heads/RANGER-3923 by this push:
     new 3b9ec333e RANGER-4490: added API to fetch DataShareInDataset Summary
3b9ec333e is described below

commit 3b9ec333e6f1c20874e0b8b82da1ce073125af6b
Author: prashant <[email protected]>
AuthorDate: Fri Dec 29 17:45:08 2023 +0530

    RANGER-4490: added API to fetch DataShareInDataset Summary
    
    Signed-off-by: Madhan Neethiraj <[email protected]>
---
 .../org/apache/ranger/plugin/model/RangerGds.java  |   2 +-
 .../apache/ranger/plugin/util/SearchFilter.java    |   2 +
 .../java/org/apache/ranger/biz/GdsDBStore.java     | 105 ++++++++++++++++++++-
 .../org/apache/ranger/common/RangerSearchUtil.java |   2 +
 .../main/java/org/apache/ranger/rest/GdsREST.java  |  30 ++++++
 .../ranger/security/context/RangerAPIList.java     |   1 +
 .../RangerGdsDataShareInDatasetService.java        |   7 +-
 7 files changed, 143 insertions(+), 6 deletions(-)

diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerGds.java 
b/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerGds.java
index e4943d740..3bf53968f 100644
--- a/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerGds.java
+++ b/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerGds.java
@@ -796,7 +796,7 @@ public class RangerGds {
 
         public void setApprover(String approver) { this.approver = approver; }
 
-        @Override
+               @Override
         public String toString() {return toString(new 
StringBuilder()).toString(); }
 
         public StringBuilder toString(StringBuilder sb) {
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 fe06d1dbe..ad304f88f 100755
--- 
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
@@ -115,6 +115,8 @@ public class SearchFilter {
        public static final String SHARED_RESOURCE_NAME_PARTIAL = 
"sharedResourceNamePartial";   // search, sort
        public static final String RESOURCE_CONTAINS        = 
"resourceContains";     // search
        public static final String SHARED_RESOURCE_ID       = 
"sharedResourceId";     // search, sort
+       public static final String APPROVER                 = "approver";       
      // search, sort
+       public static final String SHARE_STATUS             = "shareStatus";    
      // search, sort
        public static final String PROFILE_NAME             = "profileName";    
      // search
        public static final String OWNER_NAME               = "ownerName";      
      // search
        public static final String OWNER_TYPE               = "ownerType";      
      // search: valid-values(user, group, role)
diff --git a/security-admin/src/main/java/org/apache/ranger/biz/GdsDBStore.java 
b/security-admin/src/main/java/org/apache/ranger/biz/GdsDBStore.java
index e38d0d15c..0112c3427 100755
--- a/security-admin/src/main/java/org/apache/ranger/biz/GdsDBStore.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/GdsDBStore.java
@@ -26,6 +26,7 @@ import org.apache.ranger.common.*;
 import org.apache.ranger.common.db.RangerTransactionSynchronizationAdapter;
 import org.apache.ranger.db.*;
 import org.apache.ranger.entity.*;
+import org.apache.ranger.plugin.model.RangerGds;
 import org.apache.ranger.plugin.model.RangerGds.*;
 import org.apache.ranger.plugin.model.RangerPolicy;
 import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyItem;
@@ -48,6 +49,8 @@ import org.springframework.stereotype.Component;
 import javax.annotation.PostConstruct;
 
 import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 import static 
org.apache.ranger.db.XXGlobalStateDao.RANGER_GLOBAL_STATE_NAME_GDS;
 import static 
org.apache.ranger.plugin.store.EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_GDS_NAME;
@@ -277,9 +280,7 @@ public class GdsDBStore extends AbstractGdsStore {
         LOG.debug("==> searchDatasets({})", filter);
 
                if (filter.getParam(SearchFilter.CREATED_BY) != null) {
-                       String userName = 
filter.getParam(SearchFilter.CREATED_BY);
-                       Long userId = 
daoMgr.getXXPortalUser().findByLoginId(userName).getId();
-                       filter.setParam(SearchFilter.CREATED_BY, 
Long.toString(userId));
+                       setUserId(filter, SearchFilter.CREATED_BY);
                }
 
         PList<RangerDataset> ret           = getUnscrubbedDatasets(filter);
@@ -1230,10 +1231,78 @@ public class GdsDBStore extends AbstractGdsStore {
         return ret;
     }
 
+    public PList<DataShareInDatasetSummary> getDshInDsSummary(SearchFilter 
filter) {
+               LOG.debug("==> getDshInDsSummary({})", filter);
+
+               int maxRows    = filter.getMaxRows();
+               int startIndex = filter.getStartIndex();
+
+        filter.setParam(SearchFilter.GDS_PERMISSION, 
GdsPermission.ADMIN.name());
+
+               if (filter.getParam(SearchFilter.CREATED_BY) != null) {
+                       setUserId(filter, SearchFilter.CREATED_BY);
+               }
+
+               if(filter.getParam(SearchFilter.APPROVER)!= null) {
+                       setUserId(filter, SearchFilter.APPROVER);
+               }
+
+               if (filter.getParam(SearchFilter.SHARE_STATUS) != null) {
+                       String shareStatus = 
filter.getParam(SearchFilter.SHARE_STATUS);
+                       int    status      = 
GdsShareStatus.valueOf(shareStatus).ordinal();
+
+                       filter.setParam(SearchFilter.SHARE_STATUS, 
Integer.toString(status));
+               }
+
+               List<RangerDataset>             datasets       = 
getUnscrubbedDatasets(filter).getList();
+               List<RangerDataShare>           dataShares     = 
getUnscrubbedDataShares(filter).getList();
+               RangerDataShareInDatasetList    dshInDsList    = 
dataShareInDatasetService.searchDataShareInDatasets(filter);
+               List<DataShareInDatasetSummary> dshInDsSummary = 
getDshInDsSummary(dataShares, datasets, dshInDsList);
+
+               PList<DataShareInDatasetSummary> ret = getPList(dshInDsSummary, 
startIndex, maxRows, filter.getSortBy(),        filter.getSortType());
+
+               LOG.debug("<== getDshInDsSummary({}): ret={}", filter, ret);
+
+               return ret;
+       }
+
+       private List<DataShareInDatasetSummary> 
getDshInDsSummary(List<RangerDataShare> dataShares, List<RangerDataset> 
datasets, RangerDataShareInDatasetList dshInDsList) {
+               Set<DataShareInDatasetSummary> ret          = new 
LinkedHashSet<>();
+               Map<Long, RangerDataset>       datasetMap   = toMap(datasets);
+               Map<Long, RangerDataShare>     dataShareMap = toMap(dataShares);
+
+               for (RangerDataShareInDataset dshInDs : dshInDsList.getList()) {
+                       RangerDataset   dataset   = 
datasetMap.get(dshInDs.getDatasetId());
+                       RangerDataShare dataShare = 
dataShareMap.get(dshInDs.getDataShareId());
+
+                       if (dataset != null || dataShare != null) {
+                if (dataset == null) {
+                    dataset = datasetService.read(dshInDs.getDatasetId());
+                } else if (dataShare == null) {
+                    dataShare = 
dataShareService.read(dshInDs.getDataShareId());
+                }
+
+                               ret.add(toDshInDsSummary(dataset, dataShare, 
dshInDs));
+                       }
+               }
+
+               return Collections.unmodifiableList(new ArrayList<>(ret));
+       }
+
+       private <T extends RangerGdsBaseModelObject> Map<Long, T> toMap(List<T> 
gdsObjects) {
+               return 
gdsObjects.stream().collect(Collectors.toMap(RangerGdsBaseModelObject::getId, 
Function.identity()));
+       }
+
     private void updateGdsVersion() {
         transactionSynchronizationAdapter.executeOnTransactionCommit(new 
GlobalVersionUpdater(daoMgr, RANGER_GLOBAL_STATE_NAME_GDS));
     }
 
+       private void setUserId(SearchFilter filter, String filterParam) {
+               String userName = filter.getParam(filterParam);
+               Long userId = 
daoMgr.getXXPortalUser().findByLoginId(userName).getId();
+               filter.setParam(filterParam, Long.toString(userId));
+       }
+
     private static class GlobalVersionUpdater implements Runnable {
         final RangerDaoManager daoManager;
         final String           stateName;
@@ -1808,6 +1877,36 @@ public class GdsDBStore extends AbstractGdsStore {
         return summary;
     }
 
+       private DataShareInDatasetSummary toDshInDsSummary(RangerDataset 
dataset, RangerDataShare dataShare,
+                       RangerDataShareInDataset dshInDs) {
+               Map<String, Long> zoneIds = new HashMap<>();
+               DataShareInDatasetSummary summary = new 
DataShareInDatasetSummary();
+
+               summary.setId(dshInDs.getId());
+               summary.setGuid(dshInDs.getGuid());
+               summary.setCreatedBy(dshInDs.getCreatedBy());
+               summary.setCreateTime(dshInDs.getCreateTime());
+               summary.setUpdatedBy(dshInDs.getUpdatedBy());
+               summary.setUpdateTime(dshInDs.getUpdateTime());
+
+               summary.setApprover(dshInDs.getApprover());
+               summary.setShareStatus(dshInDs.getStatus());
+               summary.setDatasetId(dataset.getId());
+               summary.setDatasetName(dataset.getName());
+               summary.setDataShareId(dataShare.getId());
+               summary.setDataShareName(dataShare.getName());
+               if (dataShare.getZone() != null && 
!dataShare.getZone().isEmpty()) {
+                       summary.setZoneName(dataShare.getZone());
+                       
summary.setZoneId(getZoneId(dataShare.getZone(),zoneIds));
+               }
+               summary.setServiceName(dataShare.getService());
+               summary.setServiceId(getServiceId(dataShare.getService()));
+               summary.setDataShareName(dataShare.getName());
+               
summary.setResourceCount(sharedResourceService.getResourceCountForDataShare(dataShare.getId()));
+
+               return summary;
+       }
+
     private Long getServiceId(String serviceName) {
         XXService xService = daoMgr.getXXService().findByName(serviceName);
 
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 c26993304..59b57370b 100755
--- 
a/security-admin/src/main/java/org/apache/ranger/common/RangerSearchUtil.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/common/RangerSearchUtil.java
@@ -93,6 +93,8 @@ public class RangerSearchUtil extends SearchUtil {
                ret.setParam(SearchFilter.SERVICE_NAME_PREFIX, 
request.getParameter(SearchFilter.SERVICE_NAME_PREFIX));
                ret.setParam(SearchFilter.ZONE_NAME_PREFIX, 
request.getParameter(SearchFilter.ZONE_NAME_PREFIX));
                ret.setParam(SearchFilter.CREATED_BY, 
request.getParameter(SearchFilter.CREATED_BY));
+               ret.setParam(SearchFilter.APPROVER, 
request.getParameter(SearchFilter.APPROVER));
+               ret.setParam(SearchFilter.SHARE_STATUS, 
request.getParameter(SearchFilter.SHARE_STATUS));
 
                for (Map.Entry<String, String[]> e : 
request.getParameterMap().entrySet()) {
                        String name = e.getKey();
diff --git a/security-admin/src/main/java/org/apache/ranger/rest/GdsREST.java 
b/security-admin/src/main/java/org/apache/ranger/rest/GdsREST.java
index 043d00b59..eadcf0707 100755
--- a/security-admin/src/main/java/org/apache/ranger/rest/GdsREST.java
+++ b/security-admin/src/main/java/org/apache/ranger/rest/GdsREST.java
@@ -37,6 +37,7 @@ import org.apache.ranger.plugin.model.RangerPluginInfo;
 import org.apache.ranger.plugin.model.RangerPolicy;
 import org.apache.ranger.plugin.model.RangerGds.DatasetSummary;
 import org.apache.ranger.plugin.model.RangerGds.DataShareSummary;
+import org.apache.ranger.plugin.model.RangerGds.DataShareInDatasetSummary;
 import org.apache.ranger.plugin.store.PList;
 import org.apache.ranger.plugin.util.RangerPerfTracer;
 import org.apache.ranger.plugin.util.SearchFilter;
@@ -1337,6 +1338,35 @@ public class GdsREST {
         return ret;
     }
 
+       @GET
+       @Path("/datashare/dataset/summary")
+       @Produces({ "application/json" })
+       @PreAuthorize("@rangerPreAuthSecurityHandler.isAPIAccessible(\"" + 
RangerAPIList.SEARCH_DATASHARE_IN_DATASET_SUMMARY + "\")")
+       public PList<DataShareInDatasetSummary> getDshInDsSummary(@Context 
HttpServletRequest request) {
+               LOG.debug("==> GdsREST.searchDshInDsSummary()");
+
+               PList<DataShareInDatasetSummary> ret;
+               SearchFilter                     filter = null;
+               RangerPerfTracer                 perf   = 
RangerPerfTracer.getPerfTracer(PERF_LOG, "GdsREST.getDshInDsSummary()");
+
+               try {
+                       filter = searchUtil.getSearchFilter(request, 
dshidService.sortFields);
+
+                       ret = gdsStore.getDshInDsSummary(filter);
+               } catch (WebApplicationException excp) {
+                       throw excp;
+               } catch (Throwable excp) {
+                       LOG.error("getDshInDsSummary({}) failed", filter, excp);
+
+                       throw 
restErrorUtil.createRESTException(excp.getMessage());
+               } finally {
+                       RangerPerfTracer.log(perf);
+               }
+
+               LOG.debug("<== GdsREST.getDshInDsSummary({}): {}", filter, ret);
+
+               return ret;
+       }
 
     @POST
     @Path("/dataset/project")
diff --git 
a/security-admin/src/main/java/org/apache/ranger/security/context/RangerAPIList.java
 
b/security-admin/src/main/java/org/apache/ranger/security/context/RangerAPIList.java
index f21d445c4..65e0f7848 100755
--- 
a/security-admin/src/main/java/org/apache/ranger/security/context/RangerAPIList.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/security/context/RangerAPIList.java
@@ -251,6 +251,7 @@ public class RangerAPIList {
        public static final String REMOVE_DATASHARE_IN_DATASET = 
"GdsREST.removeDataShareInDataset";
        public static final String GET_DATASHARE_IN_DATASET    = 
"GdsREST.getDataShareInDataset";
        public static final String SEARCH_DATASHARE_IN_DATASET = 
"GdsREST.searchDataShareInDataset";
+       public static final String SEARCH_DATASHARE_IN_DATASET_SUMMARY = 
"GdsREST.getDshInDsSummary";
 
        public static final String ADD_DATASET_IN_PROJECT    = 
"GdsREST.addDatasetInProject";
        public static final String UPDATE_DATASET_IN_PROJECT = 
"GdsREST.updateDatasetInProject";
diff --git 
a/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDataShareInDatasetService.java
 
b/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDataShareInDatasetService.java
index 016711f6b..a76cb2a99 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDataShareInDatasetService.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDataShareInDatasetService.java
@@ -72,11 +72,14 @@ public class RangerGdsDataShareInDatasetService extends 
RangerGdsBaseModelServic
         searchFields.add(new SearchField(SearchFilter.ZONE_NAME,               
 "z.name",          SearchField.DATA_TYPE.STRING,  
SearchField.SEARCH_TYPE.FULL,    "XXGdsDataShare dsh, XXSecurityZone z", 
"obj.dataShareId = dsh.id and dsh.zoneId = z.id"));
         searchFields.add(new SearchField(SearchFilter.ZONE_NAME_PARTIAL,       
 "z.name",          SearchField.DATA_TYPE.STRING,  
SearchField.SEARCH_TYPE.PARTIAL, "XXGdsDataShare dsh, XXSecurityZone z", 
"obj.dataShareId = dsh.id and dsh.zoneId = z.id"));
         searchFields.add(new SearchField(SearchFilter.DATASET_ID,              
 "obj.datasetId",   SearchField.DATA_TYPE.INTEGER, 
SearchField.SEARCH_TYPE.FULL));
-        searchFields.add(new SearchField(SearchFilter.DATASET_NAME,            
 "d.name",          SearchField.DATA_TYPE.STRING,  
SearchField.SEARCH_TYPE.FULL,    "XXGdsDataset d",                              
              "obj.datasetId = d.id"));
-        searchFields.add(new SearchField(SearchFilter.DATASET_NAME_PARTIAL,    
 "d.name",          SearchField.DATA_TYPE.STRING,  
SearchField.SEARCH_TYPE.PARTIAL, "XXGdsDataset d",                              
              "obj.datasetId = d.id"));
+        searchFields.add(new SearchField(SearchFilter.DATASET_NAME,            
 "d.name",          SearchField.DATA_TYPE.STRING,  
SearchField.SEARCH_TYPE.FULL,    "XXGdsDataset d", "obj.datasetId = d.id"));
+        searchFields.add(new SearchField(SearchFilter.DATASET_NAME_PARTIAL,    
 "d.name",          SearchField.DATA_TYPE.STRING,  
SearchField.SEARCH_TYPE.PARTIAL, "XXGdsDataset d", "obj.datasetId = d.id"));
         searchFields.add(new SearchField(SearchFilter.PROJECT_ID,              
 "dip.projectId",   SearchField.DATA_TYPE.INTEGER, 
SearchField.SEARCH_TYPE.FULL,    "XXGdsDataset d, XXGdsDatasetInProject dip",   
              "obj.datasetId = d.id and d.id = dip.datasetId"));
         searchFields.add(new SearchField(SearchFilter.PROJECT_NAME,            
 "p.name",          SearchField.DATA_TYPE.STRING,  
SearchField.SEARCH_TYPE.FULL,    "XXGdsDataset d, XXGdsDatasetInProject dip, 
XXGdsProject p", "obj.datasetId = d.id and d.id = dip.datasetId and 
dip.projectId = p.id"));
         searchFields.add(new SearchField(SearchFilter.PROJECT_NAME_PARTIAL,    
 "p.name",          SearchField.DATA_TYPE.STRING,  
SearchField.SEARCH_TYPE.PARTIAL, "XXGdsDataset d, XXGdsDatasetInProject dip, 
XXGdsProject p", "obj.datasetId = d.id and d.id = dip.datasetId and 
dip.projectId = p.id"));
+        searchFields.add(new SearchField(SearchFilter.APPROVER,                
 "obj.approverId",  SearchField.DATA_TYPE.INTEGER, 
SearchField.SEARCH_TYPE.FULL));
+        searchFields.add(new SearchField(SearchFilter.CREATED_BY,              
"obj.addedByUserId",SearchField.DATA_TYPE.INTEGER, 
SearchField.SEARCH_TYPE.FULL));
+        searchFields.add(new SearchField(SearchFilter.SHARE_STATUS,            
"obj.status",       SearchField.DATA_TYPE.INTEGER, 
SearchField.SEARCH_TYPE.FULL));
 
         sortFields.add(new SortField(SearchFilter.CREATE_TIME,              
"obj.createTime"));
         sortFields.add(new SortField(SearchFilter.UPDATE_TIME,              
"obj.updateTime"));

Reply via email to