Loading src/main/java/it/inaf/oats/vospace/JobService.java +25 −1 Original line number Diff line number Diff line Loading @@ -26,7 +26,21 @@ public class JobService { copyNode } public void startJob(JobSummary job) { public void setJobPhase(JobSummary job, String phase) { // TODO: check allowed job phase transitions switch (phase) { case "RUN": startJob(job); break; case "ABORT": throw new UnsupportedOperationException("Not implemented yet"); default: throw new IllegalArgumentException("Invalid phase parameter: " + phase); } } private void startJob(JobSummary job) { switch (getJobType(job)) { case pullToVoSpace: Loading Loading @@ -58,4 +72,14 @@ public class JobService { return JobType.valueOf(transfer.getDirection()); } /** * Synchronous transfer endpoint creates a job that is immediately set to * completed. */ public void createSyncJobResult(JobSummary job) { job.setPhase(ExecutionPhase.COMPLETED); uriService.setSyncTransferEndpoints(job); jobDAO.createJob(job); } } src/main/java/it/inaf/oats/vospace/TransferController.java +52 −23 Original line number Diff line number Diff line Loading @@ -35,26 +35,32 @@ public class TransferController { @PostMapping(value = "/transfers", consumes = {MediaType.APPLICATION_XML_VALUE, MediaType.TEXT_XML_VALUE, MediaType.APPLICATION_JSON_VALUE}, produces = {MediaType.APPLICATION_XML_VALUE, MediaType.TEXT_XML_VALUE, MediaType.APPLICATION_JSON_VALUE}) public ResponseEntity<?> postTransfer(@RequestBody Transfer transfer, public ResponseEntity<?> postAsyncTransfer(@RequestBody Transfer transfer, @RequestParam(value = "PHASE", required = false) Optional<String> phase, User principal) { String jobId = UUID.randomUUID().toString().replace("-", ""); JobSummary jobSummary = new JobSummary(); jobSummary.setJobId(jobId); jobSummary.setOwnerId(principal.getName()); jobSummary.setPhase(ExecutionPhase.PENDING); JobSummary.JobInfo jobInfo = new JobSummary.JobInfo(); jobInfo.getAny().add(transfer); jobSummary.setJobInfo(jobInfo); JobSummary jobSummary = newJobSummary(transfer, principal); jobDAO.createJob(jobSummary); if (phase.isPresent() && "RUN".equals(phase.get())) { jobService.startJob(jobSummary); if (phase.isPresent()) { jobService.setJobPhase(jobSummary, phase.get()); } return getJobRedirect(jobId); return getJobRedirect(jobSummary.getJobId()); } @PostMapping(value = "/synctrans", consumes = {MediaType.APPLICATION_XML_VALUE, MediaType.TEXT_XML_VALUE, MediaType.APPLICATION_JSON_VALUE}, produces = {MediaType.APPLICATION_XML_VALUE, MediaType.TEXT_XML_VALUE, MediaType.APPLICATION_JSON_VALUE}) public ResponseEntity<?> postSyncTransfer(@RequestBody Transfer transfer, User principal) { JobSummary jobSummary = newJobSummary(transfer, principal); jobService.createSyncJobResult(jobSummary); HttpHeaders headers = new HttpHeaders(); headers.set("Location", request.getContextPath() + "/transfers/" + jobSummary.getJobId() + "/results/transferDetails"); return new ResponseEntity<>(headers, HttpStatus.SEE_OTHER); } @GetMapping(value = "/transfers/{jobId}", produces = {MediaType.APPLICATION_XML_VALUE, MediaType.TEXT_XML_VALUE, MediaType.APPLICATION_JSON_VALUE}) Loading @@ -70,22 +76,45 @@ public class TransferController { return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); } // TODO: check allowed job phase transitions switch (phase) { case "RUN": jobService.startJob(job); break; case "ABORT": throw new UnsupportedOperationException("Not implemented yet"); default: throw new IllegalArgumentException("Invalid phase parameter: " + phase); return getJobRedirect(job.getJobId()); }).orElse(ResponseEntity.notFound().build()); } @GetMapping(value = "/transfers/{jobId}/results/transferDetails", produces = {MediaType.APPLICATION_XML_VALUE, MediaType.TEXT_XML_VALUE, MediaType.APPLICATION_JSON_VALUE}) public ResponseEntity<?> getTransferDetails(@PathVariable("jobId") String jobId, User principal) { return jobDAO.getJob(jobId).map(job -> { if (!job.getOwnerId().equals(principal.getName())) { return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); } return getJobRedirect(job.getJobId()); // TODO: check type return ResponseEntity.ok((Transfer) (job.getJobInfo().getAny().get(0))); }).orElse(ResponseEntity.notFound().build()); } @GetMapping(value = "/transfers/{jobId}/phase", produces = MediaType.TEXT_PLAIN_VALUE) public ResponseEntity<?> getTransferJobPhase(@PathVariable("jobId") String jobId, User principal) { // TODO: error handling return ResponseEntity.ok(jobDAO.getJob(jobId).get().getPhase().toString()); } private JobSummary newJobSummary(Transfer transfer, User principal) { String jobId = UUID.randomUUID().toString().replace("-", ""); JobSummary jobSummary = new JobSummary(); jobSummary.setJobId(jobId); jobSummary.setOwnerId(principal.getName()); jobSummary.setPhase(ExecutionPhase.PENDING); JobSummary.JobInfo jobInfo = new JobSummary.JobInfo(); jobInfo.getAny().add(transfer); jobSummary.setJobInfo(jobInfo); return jobSummary; } private ResponseEntity<?> getJobRedirect(String jobId) { HttpHeaders headers = new HttpHeaders(); headers.set("Location", request.getContextPath() + "/transfers/" + jobId); Loading src/main/java/it/inaf/oats/vospace/UriService.java +20 −4 Original line number Diff line number Diff line Loading @@ -6,6 +6,7 @@ import java.util.List; import net.ivoa.xml.uws.v1.JobSummary; import net.ivoa.xml.uws.v1.ResultReference; import net.ivoa.xml.vospace.v2.Node; import net.ivoa.xml.vospace.v2.Protocol; import net.ivoa.xml.vospace.v2.Transfer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; Loading @@ -28,16 +29,26 @@ public class UriService { List<ResultReference> results = new ArrayList<>(); ResultReference result = new ResultReference(); result.setHref(getUri(job)); result.setHref(getEndpoint(job)); results.add(result); job.setResults(results); } private String getUri(JobSummary job) { public void setSyncTransferEndpoints(JobSummary job) { // TODO add checks on data type Transfer transfer = (Transfer) job.getJobInfo().getAny().get(0); Transfer transfer = getTransfer(job); Protocol protocol = new Protocol(); protocol.setUri("ivo://ivoa.net/vospace/core#httpget"); protocol.setEndpoint(getEndpoint(job)); transfer.getProtocols().add(protocol); } private String getEndpoint(JobSummary job) { Transfer transfer = getTransfer(job); String relativePath = transfer.getTarget().substring("vos://".length() + authority.length()); Loading @@ -49,4 +60,9 @@ public class UriService { // TODO add token for authenticated access return fileServiceUrl + relativePath + "?jobId=" + job.getJobId(); } private Transfer getTransfer(JobSummary job) { // TODO add checks on data type return (Transfer) job.getJobInfo().getAny().get(0); } } Loading
src/main/java/it/inaf/oats/vospace/JobService.java +25 −1 Original line number Diff line number Diff line Loading @@ -26,7 +26,21 @@ public class JobService { copyNode } public void startJob(JobSummary job) { public void setJobPhase(JobSummary job, String phase) { // TODO: check allowed job phase transitions switch (phase) { case "RUN": startJob(job); break; case "ABORT": throw new UnsupportedOperationException("Not implemented yet"); default: throw new IllegalArgumentException("Invalid phase parameter: " + phase); } } private void startJob(JobSummary job) { switch (getJobType(job)) { case pullToVoSpace: Loading Loading @@ -58,4 +72,14 @@ public class JobService { return JobType.valueOf(transfer.getDirection()); } /** * Synchronous transfer endpoint creates a job that is immediately set to * completed. */ public void createSyncJobResult(JobSummary job) { job.setPhase(ExecutionPhase.COMPLETED); uriService.setSyncTransferEndpoints(job); jobDAO.createJob(job); } }
src/main/java/it/inaf/oats/vospace/TransferController.java +52 −23 Original line number Diff line number Diff line Loading @@ -35,26 +35,32 @@ public class TransferController { @PostMapping(value = "/transfers", consumes = {MediaType.APPLICATION_XML_VALUE, MediaType.TEXT_XML_VALUE, MediaType.APPLICATION_JSON_VALUE}, produces = {MediaType.APPLICATION_XML_VALUE, MediaType.TEXT_XML_VALUE, MediaType.APPLICATION_JSON_VALUE}) public ResponseEntity<?> postTransfer(@RequestBody Transfer transfer, public ResponseEntity<?> postAsyncTransfer(@RequestBody Transfer transfer, @RequestParam(value = "PHASE", required = false) Optional<String> phase, User principal) { String jobId = UUID.randomUUID().toString().replace("-", ""); JobSummary jobSummary = new JobSummary(); jobSummary.setJobId(jobId); jobSummary.setOwnerId(principal.getName()); jobSummary.setPhase(ExecutionPhase.PENDING); JobSummary.JobInfo jobInfo = new JobSummary.JobInfo(); jobInfo.getAny().add(transfer); jobSummary.setJobInfo(jobInfo); JobSummary jobSummary = newJobSummary(transfer, principal); jobDAO.createJob(jobSummary); if (phase.isPresent() && "RUN".equals(phase.get())) { jobService.startJob(jobSummary); if (phase.isPresent()) { jobService.setJobPhase(jobSummary, phase.get()); } return getJobRedirect(jobId); return getJobRedirect(jobSummary.getJobId()); } @PostMapping(value = "/synctrans", consumes = {MediaType.APPLICATION_XML_VALUE, MediaType.TEXT_XML_VALUE, MediaType.APPLICATION_JSON_VALUE}, produces = {MediaType.APPLICATION_XML_VALUE, MediaType.TEXT_XML_VALUE, MediaType.APPLICATION_JSON_VALUE}) public ResponseEntity<?> postSyncTransfer(@RequestBody Transfer transfer, User principal) { JobSummary jobSummary = newJobSummary(transfer, principal); jobService.createSyncJobResult(jobSummary); HttpHeaders headers = new HttpHeaders(); headers.set("Location", request.getContextPath() + "/transfers/" + jobSummary.getJobId() + "/results/transferDetails"); return new ResponseEntity<>(headers, HttpStatus.SEE_OTHER); } @GetMapping(value = "/transfers/{jobId}", produces = {MediaType.APPLICATION_XML_VALUE, MediaType.TEXT_XML_VALUE, MediaType.APPLICATION_JSON_VALUE}) Loading @@ -70,22 +76,45 @@ public class TransferController { return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); } // TODO: check allowed job phase transitions switch (phase) { case "RUN": jobService.startJob(job); break; case "ABORT": throw new UnsupportedOperationException("Not implemented yet"); default: throw new IllegalArgumentException("Invalid phase parameter: " + phase); return getJobRedirect(job.getJobId()); }).orElse(ResponseEntity.notFound().build()); } @GetMapping(value = "/transfers/{jobId}/results/transferDetails", produces = {MediaType.APPLICATION_XML_VALUE, MediaType.TEXT_XML_VALUE, MediaType.APPLICATION_JSON_VALUE}) public ResponseEntity<?> getTransferDetails(@PathVariable("jobId") String jobId, User principal) { return jobDAO.getJob(jobId).map(job -> { if (!job.getOwnerId().equals(principal.getName())) { return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); } return getJobRedirect(job.getJobId()); // TODO: check type return ResponseEntity.ok((Transfer) (job.getJobInfo().getAny().get(0))); }).orElse(ResponseEntity.notFound().build()); } @GetMapping(value = "/transfers/{jobId}/phase", produces = MediaType.TEXT_PLAIN_VALUE) public ResponseEntity<?> getTransferJobPhase(@PathVariable("jobId") String jobId, User principal) { // TODO: error handling return ResponseEntity.ok(jobDAO.getJob(jobId).get().getPhase().toString()); } private JobSummary newJobSummary(Transfer transfer, User principal) { String jobId = UUID.randomUUID().toString().replace("-", ""); JobSummary jobSummary = new JobSummary(); jobSummary.setJobId(jobId); jobSummary.setOwnerId(principal.getName()); jobSummary.setPhase(ExecutionPhase.PENDING); JobSummary.JobInfo jobInfo = new JobSummary.JobInfo(); jobInfo.getAny().add(transfer); jobSummary.setJobInfo(jobInfo); return jobSummary; } private ResponseEntity<?> getJobRedirect(String jobId) { HttpHeaders headers = new HttpHeaders(); headers.set("Location", request.getContextPath() + "/transfers/" + jobId); Loading
src/main/java/it/inaf/oats/vospace/UriService.java +20 −4 Original line number Diff line number Diff line Loading @@ -6,6 +6,7 @@ import java.util.List; import net.ivoa.xml.uws.v1.JobSummary; import net.ivoa.xml.uws.v1.ResultReference; import net.ivoa.xml.vospace.v2.Node; import net.ivoa.xml.vospace.v2.Protocol; import net.ivoa.xml.vospace.v2.Transfer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; Loading @@ -28,16 +29,26 @@ public class UriService { List<ResultReference> results = new ArrayList<>(); ResultReference result = new ResultReference(); result.setHref(getUri(job)); result.setHref(getEndpoint(job)); results.add(result); job.setResults(results); } private String getUri(JobSummary job) { public void setSyncTransferEndpoints(JobSummary job) { // TODO add checks on data type Transfer transfer = (Transfer) job.getJobInfo().getAny().get(0); Transfer transfer = getTransfer(job); Protocol protocol = new Protocol(); protocol.setUri("ivo://ivoa.net/vospace/core#httpget"); protocol.setEndpoint(getEndpoint(job)); transfer.getProtocols().add(protocol); } private String getEndpoint(JobSummary job) { Transfer transfer = getTransfer(job); String relativePath = transfer.getTarget().substring("vos://".length() + authority.length()); Loading @@ -49,4 +60,9 @@ public class UriService { // TODO add token for authenticated access return fileServiceUrl + relativePath + "?jobId=" + job.getJobId(); } private Transfer getTransfer(JobSummary job) { // TODO add checks on data type return (Transfer) job.getJobInfo().getAny().get(0); } }