From a1c4d3f5172808afd081f371ee1e2d61001543c2 Mon Sep 17 00:00:00 2001
From: Nicola Fulvio Calabria <nicola.calabria@inaf.it>
Date: Sat, 31 Jul 2021 16:25:52 +0200
Subject: [PATCH] Added call to file service for copyNode

---
 .../it/inaf/oats/vospace/CopyService.java     | 13 +++-
 .../inaf/oats/vospace/FileServiceClient.java  | 61 ++++++++++++++++++-
 .../java/it/inaf/oats/vospace/JobService.java |  4 --
 3 files changed, 70 insertions(+), 8 deletions(-)

diff --git a/src/main/java/it/inaf/oats/vospace/CopyService.java b/src/main/java/it/inaf/oats/vospace/CopyService.java
index 3897247..a2cd3ed 100644
--- a/src/main/java/it/inaf/oats/vospace/CopyService.java
+++ b/src/main/java/it/inaf/oats/vospace/CopyService.java
@@ -18,11 +18,15 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.beans.factory.annotation.Autowired;
 
 @Service
 @EnableTransactionManagement
 public class CopyService extends AbstractNodeService {
 
+    @Autowired
+    private FileServiceClient fileServiceClient;
+
     @Transactional(rollbackFor = {Exception.class}, isolation = Isolation.REPEATABLE_READ)
     public String processCopyNodes(Transfer transfer, String jobId, User user) {
 
@@ -47,11 +51,11 @@ public class CopyService extends AbstractNodeService {
         if (destinationPath.startsWith(sourcePath + "/")) {
             throw new IllegalArgumentException("Cannot copy node to a subdirectory of its own path");
         }
-        
+
         // Check if destination equals parent path of source
-        if(NodeUtils.getParentPath(sourcePath).equals(destinationPath)){
+        if (NodeUtils.getParentPath(sourcePath).equals(destinationPath)) {
             throw new IllegalArgumentException("Cannot duplicate node at same path without renaming it");
-        }           
+        }
 
         try {
 
@@ -84,6 +88,9 @@ public class CopyService extends AbstractNodeService {
             nodeDao.copyBranch(
                     sourcePath,
                     destinationCopyRoot);
+            
+            // Call file service and command copy
+            fileServiceClient.startFileCopyJob(sourcePath, destinationCopyRoot, jobId, user);
 
         } catch (CannotSerializeTransactionException ex) {
             // Concurrent transactions attempted to modify this set of nodes            
diff --git a/src/main/java/it/inaf/oats/vospace/FileServiceClient.java b/src/main/java/it/inaf/oats/vospace/FileServiceClient.java
index 83a8f1b..f23a4b2 100644
--- a/src/main/java/it/inaf/oats/vospace/FileServiceClient.java
+++ b/src/main/java/it/inaf/oats/vospace/FileServiceClient.java
@@ -79,13 +79,72 @@ public class FileServiceClient {
                 headers.setBearerAuth(token);
             }
             headers.setContentType(MediaType.APPLICATION_JSON);
-            try ( OutputStream os = req.getBody()) {
+            try (OutputStream os = req.getBody()) {
                 MAPPER.writeValue(os, archiveRequest);
             }
         }, res -> {
             return res.getHeaders().getLocation().toString();
         }, new Object[]{});
     }
+    
+    public void startFileCopyJob(String sourceVosPath, 
+            String destiantionVosPath, String jobId, User user) {
+        
+        CopyRequest copyRequest = new CopyRequest();
+        copyRequest.setJobId(jobId);
+        copyRequest.setSourceRootVosPath(sourceVosPath);
+        copyRequest.setDestinationRootVosPath(destiantionVosPath);
+        
+        String url = fileServiceUrl + "/copy";
+        
+        String token = user.getAccessToken();
+        restTemplate.execute(url, HttpMethod.POST, req -> {
+            HttpHeaders headers = req.getHeaders();
+            if (token != null) {
+                headers.setBearerAuth(token);
+            }
+
+            headers.setContentType(MediaType.APPLICATION_JSON);
+            try (OutputStream os = req.getBody()) {
+                MAPPER.writeValue(os, copyRequest);
+            }
+        }, res -> {           
+           return null;
+        }, new Object[]{});
+        
+    }
+
+    public static class CopyRequest {
+
+        private String jobId;
+        private String sourceRootVosPath;
+        private String destinationRootVosPath;
+
+        public String getJobId() {
+            return jobId;
+        }
+
+        public void setJobId(String jobId) {
+            this.jobId = jobId;
+        }
+
+        public String getSourceRootVosPath() {
+            return sourceRootVosPath;
+        }
+
+        public void setSourceRootVosPath(String sourceRootVosPath) {
+            this.sourceRootVosPath = sourceRootVosPath;
+        }
+
+        public String getDestinationRootVosPath() {
+            return destinationRootVosPath;
+        }
+
+        public void setDestinationRootVosPath(String destinationRootVosPath) {
+            this.destinationRootVosPath = destinationRootVosPath;
+        }
+
+    }
 
     public static class ArchiveRequest {
 
diff --git a/src/main/java/it/inaf/oats/vospace/JobService.java b/src/main/java/it/inaf/oats/vospace/JobService.java
index 7d0d971..1642941 100644
--- a/src/main/java/it/inaf/oats/vospace/JobService.java
+++ b/src/main/java/it/inaf/oats/vospace/JobService.java
@@ -190,10 +190,6 @@ public class JobService {
         CompletableFuture.runAsync(() -> {
             handleJobErrors(jobSummary, job -> {
                 copyService.processCopyNodes(transfer, jobSummary.getJobId(), user);
-                // add file service copy logic
-                
-                // the file service part will unlock nodes and set job phase
-                // to completed
                 
                 return null;
             });
-- 
GitLab