diff --git a/src/main/java/it/inaf/oats/vospace/CopyService.java b/src/main/java/it/inaf/oats/vospace/CopyService.java index 38972478d61fc8d82f3a17ae232a4cc9a1cce62f..a2cd3ed03cb37db77ba72663203d27caf3adbe87 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 83a8f1b3a888406d158334adf6b944f18b6b9835..f23a4b293c6496f8802ae2c017af658fa00f3fbe 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 7d0d971ce672b19c460b4c24617ba6e411c9d805..164294106469ab1e83f3bece715574552c88a3bc 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; });