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