From 93dd552b337729ee6a8a4dda02d307a896538bf4 Mon Sep 17 00:00:00 2001
From: Nicola Fulvio Calabria <nicola.calabria@inaf.it>
Date: Fri, 21 Oct 2022 21:20:38 +0200
Subject: [PATCH] Added busy and immutable management to delete

---
 .../inaf/oats/vospace/DeleteNodeService.java  | 55 ++++++++++++-------
 1 file changed, 34 insertions(+), 21 deletions(-)

diff --git a/src/main/java/it/inaf/oats/vospace/DeleteNodeService.java b/src/main/java/it/inaf/oats/vospace/DeleteNodeService.java
index 9366338..3713840 100644
--- a/src/main/java/it/inaf/oats/vospace/DeleteNodeService.java
+++ b/src/main/java/it/inaf/oats/vospace/DeleteNodeService.java
@@ -20,69 +20,82 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 import org.springframework.transaction.annotation.Isolation;
 import it.inaf.ia2.aa.data.User;
+import it.inaf.oats.vospace.exception.InternalFaultException;
+import it.inaf.oats.vospace.exception.NodeBusyException;
 import org.springframework.transaction.annotation.Transactional;
 
 /**
  *
  * @author Nicola Fulvio Calabria <nicola.calabria at inaf.it>
  */
-
 @Service
 @EnableTransactionManagement
 public class DeleteNodeService {
-    
+
     @Autowired
     protected NodeDAO nodeDao;
 
     @Value("${vospace-authority}")
     protected String authority;
-    
-    @Transactional(rollbackFor = { Exception.class }, 
+
+    @Transactional(rollbackFor = {Exception.class},
             isolation = Isolation.REPEATABLE_READ)
-    public void deleteNode(String path, User principal) {       
-        
+    public void deleteNode(String path, User principal) {
+
         Node toBeDeletedNode = nodeDao.listNode(path)
-                .orElseThrow(() -> new NodeNotFoundException(path));        
-        
+                .orElseThrow(() -> new NodeNotFoundException(path));
+
         if (!NodeUtils.checkIfWritable(toBeDeletedNode, principal.getName(), principal.getGroups())) {
             throw PermissionDeniedException.forPath(path);
         }
-        
-        nodeDao.deleteNode(path);              
+
+        Long nodeId = nodeDao.getNodeId(path).get();
+
+        if (nodeDao.isBranchBusy(nodeId)) {
+            throw new NodeBusyException(path);
+        }
+
+        if (nodeDao.isBranchImmutable(nodeId)) {
+            throw new InternalFaultException("Target branch contains immutable nodes");
+        }
+
+        nodeDao.deleteNode(path);
 
     }
-    
+
     public void doPreliminaryChecks(String path) throws Exception {
         // Check if the node is present, 
         // if the node does not exist the service SHALL throw a HTTP 404 status code 
         // including a NodeNotFound fault in the entity-body 
         // If note present, got it
         nodeDao.listNode(path)
-                .orElseThrow(() -> new NodeNotFoundException(path));               
-        
+                .orElseThrow(() -> new NodeNotFoundException(path));
+
         // If a parent node in the URI path is a LinkNode, the service SHALL throw 
         // a HTTP 400 status code including a LinkFound fault in the entity-body.
         // For example, given the URI path /a/b/c, the service must throw a HTTP 400 
         // status code including a LinkFound fault in the entity-body if either /a 
         // or /a/b are LinkNodes.
         List<String> pathComponents = NodeUtils.subPathComponents(path);
-        if (pathComponents.isEmpty()) { 
-            
+        if (pathComponents.isEmpty()) {
+
             // Manage root node
             throw PermissionDeniedException.forPath("/");
-            
+
         } else {
-            
+
             // Manage all precursors in full path
-            for (int i = 0; i < pathComponents.size(); i++) { 
+            for (int i = 0; i < pathComponents.size(); i++) {
                 String tmpPath = pathComponents.get(i);
                 Node mynode = nodeDao.listNode(tmpPath)
                         .orElseThrow(() -> new NodeNotFoundException(tmpPath));
-                if (mynode.getType().equals("vos:LinkNode") && i < pathComponents.size()-1) // a LinkNode leaf can be deleted
+                if (mynode.getType().equals("vos:LinkNode") && i < pathComponents.size() - 1) // a LinkNode leaf can be deleted
+                {
                     throw new LinkFoundException(tmpPath);
-                            
+                }
+
             }
-                    
+
         }
     }
 }
-- 
GitLab