From 0f933c16829a16de7d486c25154af6f1dbe90b70 Mon Sep 17 00:00:00 2001
From: Sonia Zorba <sonia.zorba@inaf.it>
Date: Wed, 28 Jul 2021 15:29:06 +0200
Subject: [PATCH] Set transfer target element as string instead of list of
 strings again. Used view with include param instead of custom protocol for
 async recall operations

---
 .../ui/controller/DownloadController.java     |  3 +--
 .../vospace/ui/controller/JobController.java  | 27 +++++++++++++------
 .../ui/controller/NodesController.java        |  7 +++--
 .../ui/controller/UploadController.java       |  2 +-
 .../vospace/ui/client/VOSpaceClientTest.java  |  6 ++---
 .../ui/controller/JobControllerTest.java      |  7 ++++-
 6 files changed, 33 insertions(+), 19 deletions(-)

diff --git a/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/controller/DownloadController.java b/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/controller/DownloadController.java
index 71fadfa..1282fd3 100644
--- a/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/controller/DownloadController.java
+++ b/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/controller/DownloadController.java
@@ -12,7 +12,6 @@ import it.inaf.ia2.vospace.ui.client.VOSpaceClient;
 import it.inaf.ia2.vospace.ui.exception.PermissionDeniedException;
 import it.inaf.oats.vospace.datamodel.NodeUtils;
 import static it.inaf.oats.vospace.datamodel.NodeUtils.urlEncodePath;
-import java.util.Arrays;
 import javax.servlet.http.HttpServletRequest;
 import net.ivoa.xml.vospace.v2.Protocol;
 import net.ivoa.xml.vospace.v2.Transfer;
@@ -52,7 +51,7 @@ public class DownloadController {
 
         Transfer transfer = new Transfer();
         transfer.setDirection("pullFromVoSpace");
-        transfer.setTarget(Arrays.asList("vos://" + authority + urlEncodePath(path)));
+        transfer.setTarget("vos://" + authority + urlEncodePath(path));
 
         Protocol protocol = new Protocol();
         protocol.setUri("ivo://ivoa.net/vospace/core#httpget");
diff --git a/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/controller/JobController.java b/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/controller/JobController.java
index 352507f..d185feb 100644
--- a/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/controller/JobController.java
+++ b/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/controller/JobController.java
@@ -8,15 +8,16 @@ package it.inaf.ia2.vospace.ui.controller;
 import it.inaf.ia2.vospace.ui.client.VOSpaceClient;
 import it.inaf.ia2.vospace.ui.data.Job;
 import it.inaf.ia2.vospace.ui.exception.BadRequestException;
+import it.inaf.oats.vospace.datamodel.Views;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.CompletableFuture;
-import java.util.stream.Collectors;
 import net.ivoa.xml.uws.v1.ErrorType;
 import net.ivoa.xml.uws.v1.ExecutionPhase;
 import net.ivoa.xml.uws.v1.JobSummary;
-import net.ivoa.xml.vospace.v2.Protocol;
+import net.ivoa.xml.vospace.v2.Param;
 import net.ivoa.xml.vospace.v2.Transfer;
+import net.ivoa.xml.vospace.v2.View;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -46,15 +47,25 @@ public class JobController extends BaseController {
             throw new BadRequestException("Received empty list of nodes");
         }
 
-        List<String> targets = paths.stream().map(p -> "vos://" + authority + p).collect(Collectors.toList());
-
         Transfer transfer = new Transfer();
         transfer.setDirection("pullToVoSpace");
-        transfer.setTarget(targets);
-        Protocol protocol = new Protocol();
 
-        protocol.setUri("ia2:async-recall");
-        transfer.getProtocols().add(protocol);
+        View view = new View();
+        view.setUri(Views.ASYNC_RECALL_VIEW_URI);
+        transfer.setView(view);
+
+        if (paths.size() == 1) {
+            transfer.setTarget("vos://" + authority + paths.get(0));
+        } else {
+            String parent = paths.get(0).substring(0, paths.get(0).lastIndexOf("/"));
+            transfer.setTarget("vos://" + authority + parent);
+            for (String path : paths) {
+                Param param = new Param();
+                param.setUri(Views.ASYNC_RECALL_VIEW_URI + "/include");
+                param.setValue(path.substring(parent.length() + 1));
+                view.getParam().add(param);
+            }
+        }
 
         JobSummary job = client.startTransferJob(transfer);
 
diff --git a/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/controller/NodesController.java b/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/controller/NodesController.java
index bdcda11..5560317 100644
--- a/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/controller/NodesController.java
+++ b/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/controller/NodesController.java
@@ -14,7 +14,6 @@ import it.inaf.ia2.vospace.ui.service.MainNodesHtmlGenerator;
 import it.inaf.ia2.vospace.ui.service.MoveNodeModalHtmlGenerator;
 import it.inaf.oats.vospace.datamodel.NodeUtils;
 import static it.inaf.oats.vospace.datamodel.NodeUtils.urlEncodePath;
-import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
@@ -161,10 +160,10 @@ public class NodesController extends BaseController {
         transfer.setView(view);
 
         if (paths.size() == 1) {
-            transfer.setTarget(Arrays.asList("vos://" + authority + paths.get(0)));
+            transfer.setTarget("vos://" + authority + paths.get(0));
         } else {
             String parent = getCommonParent(paths);
-            transfer.setTarget(Arrays.asList("vos://" + authority + parent));
+            transfer.setTarget("vos://" + authority + parent);
             for (String path : paths) {
                 String childName = path.substring(parent.length() + 1);
                 Param param = new Param();
@@ -211,7 +210,7 @@ public class NodesController extends BaseController {
         String direction = urlEncodePath(getRequiredParam(params, "direction"));
 
         Transfer transfer = new Transfer();
-        transfer.setTarget(Arrays.asList("vos://" + authority + target));
+        transfer.setTarget("vos://" + authority + target);
         transfer.setDirection("vos://" + authority + direction);
 
         JobSummary job = client.startTransferJob(transfer);
diff --git a/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/controller/UploadController.java b/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/controller/UploadController.java
index a77fc82..fb9a422 100644
--- a/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/controller/UploadController.java
+++ b/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/controller/UploadController.java
@@ -99,7 +99,7 @@ public class UploadController extends BaseController {
 
         Transfer transfer = new Transfer();
         transfer.setDirection("pushToVoSpace");
-        transfer.setTarget(Arrays.asList(uri));
+        transfer.setTarget(uri);
 
         Protocol protocol = new Protocol();
         protocol.setUri("ivo://ivoa.net/vospace/core#httpput");
diff --git a/vospace-ui-backend/src/test/java/it/inaf/ia2/vospace/ui/client/VOSpaceClientTest.java b/vospace-ui-backend/src/test/java/it/inaf/ia2/vospace/ui/client/VOSpaceClientTest.java
index 2fa498d..11a0b2a 100644
--- a/vospace-ui-backend/src/test/java/it/inaf/ia2/vospace/ui/client/VOSpaceClientTest.java
+++ b/vospace-ui-backend/src/test/java/it/inaf/ia2/vospace/ui/client/VOSpaceClientTest.java
@@ -120,7 +120,7 @@ public class VOSpaceClientTest {
 
         Transfer transfer = new Transfer();
         transfer.setDirection("pushToVoSpace");
-        transfer.setTarget(Arrays.asList("vos://ia2.inaf.it!vospace/mynode"));
+        transfer.setTarget("vos://ia2.inaf.it!vospace/mynode");
 
         Protocol protocol = new Protocol();
         protocol.setUri("ivo://ivoa.net/vospace/core#httpput");
@@ -137,7 +137,7 @@ public class VOSpaceClientTest {
 
         Transfer transfer = new Transfer();
         transfer.setDirection("pushToVoSpace");
-        transfer.setTarget(Arrays.asList("vos://ia2.inaf.it!vospace/mynode"));
+        transfer.setTarget("vos://ia2.inaf.it!vospace/mynode");
 
         Protocol protocol = new Protocol();
         protocol.setUri("ivo://ivoa.net/vospace/core#httpput");
@@ -166,7 +166,7 @@ public class VOSpaceClientTest {
 
         Transfer transfer = new Transfer();
         transfer.setDirection("pushToVoSpace");
-        transfer.setTarget(Arrays.asList("vos://ia2.inaf.it!vospace/mynode"));
+        transfer.setTarget("vos://ia2.inaf.it!vospace/mynode");
 
         Protocol protocol = new Protocol();
         protocol.setUri("ivo://ivoa.net/vospace/core#httpput");
diff --git a/vospace-ui-backend/src/test/java/it/inaf/ia2/vospace/ui/controller/JobControllerTest.java b/vospace-ui-backend/src/test/java/it/inaf/ia2/vospace/ui/controller/JobControllerTest.java
index b4209c9..00b1a26 100644
--- a/vospace-ui-backend/src/test/java/it/inaf/ia2/vospace/ui/controller/JobControllerTest.java
+++ b/vospace-ui-backend/src/test/java/it/inaf/ia2/vospace/ui/controller/JobControllerTest.java
@@ -13,6 +13,7 @@ import net.ivoa.xml.uws.v1.ErrorSummary;
 import net.ivoa.xml.uws.v1.ErrorType;
 import net.ivoa.xml.uws.v1.ExecutionPhase;
 import net.ivoa.xml.uws.v1.JobSummary;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.fail;
 import org.junit.jupiter.api.Test;
@@ -67,7 +68,11 @@ public class JobControllerTest {
         job.setPhase(ExecutionPhase.PENDING);
 
         when(client.startTransferJob(argThat(transfer -> {
-            return transfer.getTarget().size() > 1;
+            assertEquals(2, transfer.getView().getParam().size());
+            assertEquals("vos://example.com!vospace/path/to", transfer.getTarget());
+            assertEquals("file1", transfer.getView().getParam().get(0).getValue());
+            assertEquals("file2", transfer.getView().getParam().get(1).getValue());
+            return true;
         }))).thenReturn(job);
 
         when(client.getFileServiceEndpoint(any())).thenReturn("http://file-service/path/to/file");
-- 
GitLab