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

commit 3b2fb766c22faa4f267ffa155870736a0f6081cd
Author: prashant <prashantsatam...@gmail.com>
AuthorDate: Fri Oct 6 04:15:40 2023 -0700

    RANGER-4436: cascade delete for dataset
    
    Signed-off-by: Madhan Neethiraj <mad...@apache.org>
---
 .../ranger/plugin/store/AbstractGdsStore.java      |  2 +-
 .../org/apache/ranger/plugin/store/GdsStore.java   |  2 +-
 .../java/org/apache/ranger/biz/GdsDBStore.java     | 41 ++++++++++++++++++++--
 .../main/java/org/apache/ranger/rest/GdsREST.java  |  6 ++--
 4 files changed, 44 insertions(+), 7 deletions(-)

diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/store/AbstractGdsStore.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/store/AbstractGdsStore.java
index 7b3677e30..1c08e36ec 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/store/AbstractGdsStore.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/store/AbstractGdsStore.java
@@ -36,7 +36,7 @@ public abstract class AbstractGdsStore implements GdsStore {
     public RangerDataset updateDataset(RangerDataset dataset) throws Exception 
{ return null; }
 
     @Override
-    public void deleteDataset(Long datasetId) throws Exception { }
+    public void deleteDataset(Long datasetId, boolean forceDelete) throws 
Exception { }
 
     @Override
     public RangerDataset getDataset(Long datasetId) throws Exception { return 
null; }
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/store/GdsStore.java 
b/agents-common/src/main/java/org/apache/ranger/plugin/store/GdsStore.java
index 2dadf2cd4..794c265a3 100644
--- a/agents-common/src/main/java/org/apache/ranger/plugin/store/GdsStore.java
+++ b/agents-common/src/main/java/org/apache/ranger/plugin/store/GdsStore.java
@@ -39,7 +39,7 @@ public interface GdsStore {
 
     RangerDataset updateDataset(RangerDataset dataset) throws Exception;
 
-    void deleteDataset(Long datasetId) throws Exception;
+    void deleteDataset(Long datasetId, boolean forceDelete) throws Exception;
 
     RangerDataset getDataset(Long datasetId) throws Exception;
 
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 6a37da62a..eeebb6394 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
@@ -221,8 +221,8 @@ public class GdsDBStore extends AbstractGdsStore {
     }
 
     @Override
-    public void deleteDataset(Long datasetId) throws Exception {
-        LOG.debug("==> deleteDataset({})", datasetId);
+    public void deleteDataset(Long datasetId, boolean forceDelete) throws 
Exception {
+        LOG.debug("==> deleteDataset({}, {})", datasetId, forceDelete);
 
         RangerDataset existing = null;
 
@@ -235,6 +235,11 @@ public class GdsDBStore extends AbstractGdsStore {
         validator.validateDelete(datasetId, existing);
 
         if (existing != null) {
+            if (forceDelete) {
+                removeDSHIDForDataset(datasetId);
+                removeDIPForDataset(datasetId);
+            }
+
             deleteDatasetPolicies(existing);
             datasetService.delete(existing);
 
@@ -243,7 +248,7 @@ public class GdsDBStore extends AbstractGdsStore {
             updateGlobalVersion(RANGER_GLOBAL_STATE_NAME_DATASET);
         }
 
-        LOG.debug("<== deleteDataset({})", datasetId);
+        LOG.debug("<== deleteDataset({}, {})", datasetId, forceDelete);
     }
 
     @Override
@@ -1438,6 +1443,36 @@ public class GdsDBStore extends AbstractGdsStore {
         }
     }
 
+    private void removeDIPForDataset(Long datasetId) {
+        XXGdsDatasetInProjectDao    dipDao    = 
daoMgr.getXXGdsDatasetInProject();
+        List<XXGdsDatasetInProject> dshidList = 
dipDao.findByDatasetId(datasetId);
+
+        for (XXGdsDatasetInProject dip : dshidList) {
+            boolean dipDeleted = dipDao.remove(dip.getId());
+
+            if (!dipDeleted) {
+                throw restErrorUtil.createRESTException("DatasetInProject 
could not be deleted",
+                                                        
MessageEnums.ERROR_DELETE_OBJECT, dip.getId(), "DatasetInProjectId", null,
+                                                        
HttpStatus.SC_INTERNAL_SERVER_ERROR);
+            }
+        }
+    }
+
+    private void removeDSHIDForDataset(Long datasetId) {
+        XXGdsDataShareInDatasetDao    dshidDao  = 
daoMgr.getXXGdsDataShareInDataset();
+        List<XXGdsDataShareInDataset> dshidList = 
dshidDao.findByDatasetId(datasetId);
+
+        for (XXGdsDataShareInDataset dshid : dshidList) {
+            boolean dshidDeleted = dshidDao.remove(dshid.getId());
+
+            if (!dshidDeleted) {
+                throw restErrorUtil.createRESTException("DataShareInDataset 
could not be deleted",
+                                                        
MessageEnums.ERROR_DELETE_OBJECT, dshid.getId(), "DataShareInDataset", null,
+                                                        
HttpStatus.SC_INTERNAL_SERVER_ERROR);
+            }
+        }
+    }
+
     private void addCreatorAsAclAdmin(RangerGdsObjectACL acl) {
         String currentUser = bizUtil.getCurrentUserLoginId();
         Map<String, GdsPermission> userAcl = acl.getUsers();
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 7617fb411..cc09506f3 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
@@ -161,7 +161,7 @@ public class GdsREST {
     @DELETE
     @Path("/dataset/{id}")
     @PreAuthorize("@rangerPreAuthSecurityHandler.isAPIAccessible(\"" + 
RangerAPIList.DELETE_DATASET + "\")")
-    public void deleteDataset(@PathParam("id") Long datasetId) {
+    public void deleteDataset(@PathParam("id") Long datasetId, @Context 
HttpServletRequest request) {
         LOG.debug("==> deleteDataset({})", datasetId);
 
         RangerPerfTracer perf = null;
@@ -171,7 +171,9 @@ public class GdsREST {
                 perf = RangerPerfTracer.getPerfTracer(PERF_LOG, 
"GdsREST.deleteDataset(datasetId=" + datasetId + ")");
             }
 
-            gdsStore.deleteDataset(datasetId);
+            boolean forceDelete = 
Boolean.parseBoolean(request.getParameter("forceDelete"));
+
+            gdsStore.deleteDataset(datasetId, forceDelete);
         } catch(WebApplicationException excp) {
             throw excp;
         } catch(Throwable excp) {

Reply via email to