diff --git a/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/client/VOSpaceClient.java b/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/client/VOSpaceClient.java index d8185b33841ae6ae949265754f581e3c9b47345f..77b347ba00d2b1f03feb623fce1f67e41f3def5f 100644 --- a/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/client/VOSpaceClient.java +++ b/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/client/VOSpaceClient.java @@ -3,6 +3,7 @@ package it.inaf.ia2.vospace.ui.client; import com.fasterxml.jackson.databind.ObjectMapper; import it.inaf.ia2.aa.data.User; import it.inaf.ia2.vospace.ui.VOSpaceUiApplication; +import it.inaf.ia2.vospace.ui.data.Job; import it.inaf.ia2.vospace.ui.exception.VOSpaceException; import java.io.IOException; import java.io.InputStream; @@ -14,15 +15,19 @@ import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpResponse.BodyHandlers; +import java.util.ArrayList; import java.util.List; import java.util.Scanner; import java.util.concurrent.CompletionException; import java.util.concurrent.ForkJoinPool; import java.util.function.Function; +import java.util.stream.Collectors; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import javax.xml.bind.JAXB; import net.ivoa.xml.uws.v1.JobSummary; +import net.ivoa.xml.uws.v1.Jobs; +import net.ivoa.xml.uws.v1.ShortJobDescription; import net.ivoa.xml.vospace.v2.Node; import net.ivoa.xml.vospace.v2.Protocol; import net.ivoa.xml.vospace.v2.Transfer; @@ -111,6 +116,21 @@ public class VOSpaceClient { return call(request, BodyHandlers.ofInputStream(), 200, res -> unmarshal(res, Node.class)); } + public List<Job> getJobs() { + + HttpRequest request = getRequest("/transfers?direction=pullToVoSpace") + .header("Accept", useJson ? "application/json" : "text/xml") + .header("Content-Type", useJson ? "application/json" : "text/xml") + .GET() + .build(); + + return call(request, BodyHandlers.ofInputStream(), 200, res -> { + return unmarshal(res, Jobs.class).getJobref().stream() + .map(jobDesc -> new Job(jobDesc)) + .collect(Collectors.toList()); + }); + } + private <T, U> U call(HttpRequest request, HttpResponse.BodyHandler<T> responseBodyHandler, int expectedStatusCode, Function<T, U> responseHandler) { try { return httpClient.sendAsync(request, responseBodyHandler) 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 520c7031c25965ddf4603fd0a2f0f5f74ef5766b..8d395da57d74d666bd8b9ad402b45b949d1b3b1c 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 @@ -158,7 +158,6 @@ public class JobController extends BaseController { @GetMapping(value = "/jobs", produces = MediaType.APPLICATION_JSON_VALUE) public List<Job> getJobs() { - // TODO - return new ArrayList<>(); + return client.getJobs(); } } diff --git a/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/data/Job.java b/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/data/Job.java index 4ea2b8c35e809939fe0a1545a057fdc228ba6bd3..180fc322c76945e2f62e6d1fdeac211398972fdb 100644 --- a/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/data/Job.java +++ b/vospace-ui-backend/src/main/java/it/inaf/ia2/vospace/ui/data/Job.java @@ -1,11 +1,15 @@ package it.inaf.ia2.vospace.ui.data; +import java.text.SimpleDateFormat; +import javax.xml.datatype.XMLGregorianCalendar; import net.ivoa.xml.uws.v1.ExecutionPhase; import net.ivoa.xml.uws.v1.JobSummary; +import net.ivoa.xml.uws.v1.ShortJobDescription; public class Job { private String id; + private String creationTime; private ExecutionPhase phase; private boolean read; @@ -14,9 +18,21 @@ public class Job { public Job(JobSummary job) { this.id = job.getJobId(); + this.creationTime = formatCreationTime(job.getCreationTime()); this.phase = job.getPhase(); } + public Job(ShortJobDescription job) { + this.id = job.getId(); + this.creationTime = formatCreationTime(job.getCreationTime()); + this.phase = job.getPhase(); + } + + private String formatCreationTime(XMLGregorianCalendar calendar) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + return sdf.format(calendar.toGregorianCalendar().getTime()); + } + public String getId() { return id; } @@ -25,6 +41,14 @@ public class Job { this.id = id; } + public String getCreationTime() { + return creationTime; + } + + public void setCreationTime(String creationTime) { + this.creationTime = creationTime; + } + public ExecutionPhase getPhase() { return phase; } diff --git a/vospace-ui-frontend/src/components/Jobs.vue b/vospace-ui-frontend/src/components/Jobs.vue index b0abb7e7cd7863a3156e8fd2aa09ee5197c48b92..7abb1eae1665dfdb4c2895129124c148ffe2b094 100644 --- a/vospace-ui-frontend/src/components/Jobs.vue +++ b/vospace-ui-frontend/src/components/Jobs.vue @@ -1,18 +1,23 @@ <template> -<table class="table b-table table-striped table-hover"> - <thead> - <tr> - <th>Id</th> - <th>Status</th> - </tr> - </thead> - <tbody> - <tr v-for="job in jobs" :key="job.id"> - <td>{{job.id}}</td> - <td>{{job.status}}</td> - </tr> - </tbody> -</table> +<div> + <h3>Async recall jobs</h3> + <table class="table b-table table-striped table-hover"> + <thead> + <tr> + <th>Creation time</th> + <th>Id</th> + <th>Phase</th> + </tr> + </thead> + <tbody> + <tr v-for="job in jobs" :key="job.id"> + <td>{{job.creationTime}}</td> + <td>{{job.id}}</td> + <td>{{job.phase}}</td> + </tr> + </tbody> + </table> +</div> </template> <script>