From 694578bf4434a08698280c72932bc6fe537be4e8 Mon Sep 17 00:00:00 2001 From: Patrick Austin Date: Mon, 17 Mar 2025 10:11:29 +0000 Subject: [PATCH 1/2] Accept filename FormParam on queue endpoints #69 --- .../topcat/web/rest/UserResource.java | 33 +++++++++++-------- .../icatproject/topcat/UserResourceTest.java | 4 +-- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/icatproject/topcat/web/rest/UserResource.java b/src/main/java/org/icatproject/topcat/web/rest/UserResource.java index 5f447d9a..65abdf81 100644 --- a/src/main/java/org/icatproject/topcat/web/rest/UserResource.java +++ b/src/main/java/org/icatproject/topcat/web/rest/UserResource.java @@ -877,7 +877,8 @@ private long submitDownload(IdsClient idsClient, Download download, DownloadStat @Path("/queue/visit") public Response queueVisitId(@FormParam("facilityName") String facilityName, @FormParam("sessionId") String sessionId, @FormParam("transport") String transport, - @FormParam("email") String email, @FormParam("visitId") String visitId) throws TopcatException { + @FormParam("fileName") String fileName, @FormParam("email") String email, + @FormParam("visitId") String visitId) throws TopcatException { logger.info("queueVisitId called"); validateTransport(transport); @@ -927,9 +928,12 @@ public Response queueVisitId(@FormParam("facilityName") String facilityName, downloads.add(newDownload); int part = 1; + if (fileName == null) { + fileName = facilityName + "_" + visitId; + } for (Download download : downloads) { - String filename = formatQueuedFilename(facilityName, visitId, part, downloads.size()); - download.setFileName(filename); + String partFilename = formatQueuedFilename(fileName, part, downloads.size()); + download.setFileName(partFilename); downloadId = submitDownload(idsClient, download, DownloadStatus.PAUSED); jsonArrayBuilder.add(downloadId); part += 1; @@ -955,7 +959,8 @@ public Response queueVisitId(@FormParam("facilityName") String facilityName, @Path("/queue/files") public Response queueFiles(@FormParam("facilityName") String facilityName, @FormParam("sessionId") String sessionId, @FormParam("transport") String transport, - @FormParam("email") String email, @FormParam("files") List files) throws TopcatException, UnsupportedEncodingException { + @FormParam("fileName") String fileName, @FormParam("email") String email, + @FormParam("files") List files) throws TopcatException, UnsupportedEncodingException { logger.info("queueFiles called"); validateTransport(transport); @@ -1000,9 +1005,12 @@ public Response queueFiles(@FormParam("facilityName") String facilityName, downloads.add(newDownload); int part = 1; + if (fileName == null) { + fileName = facilityName + "_files"; + } for (Download download : downloads) { - String filename = formatQueuedFilename(facilityName, "files", part, downloads.size()); - download.setFileName(filename); + String partFilename = formatQueuedFilename(fileName, part, downloads.size()); + download.setFileName(partFilename); downloadId = submitDownload(idsClient, download, DownloadStatus.PAUSED); jsonArrayBuilder.add(downloadId); part += 1; @@ -1014,13 +1022,12 @@ public Response queueFiles(@FormParam("facilityName") String facilityName, /** * Format the filename for a queued Download, possibly one part of many. * - * @param facilityName ICAT Facility.name - * @param visitId ICAT Investigation.visitId - * @param part 1 indexed part of the overall request - * @param size Number of parts in the overall request + * @param filename Root of the formatted filename, either user specified or defaulted. + * @param part 1 indexed part of the overall request + * @param size Number of parts in the overall request * @return Formatted filename */ - private static String formatQueuedFilename(String facilityName, String visitId, int part, int size) { + private static String formatQueuedFilename(String filename, int part, int size) { String partString = String.valueOf(part); String sizeString = String.valueOf(size); StringBuilder partBuilder = new StringBuilder(); @@ -1030,9 +1037,7 @@ private static String formatQueuedFilename(String facilityName, String visitId, partBuilder.append(partString); StringBuilder filenameBuilder = new StringBuilder(); - filenameBuilder.append(facilityName); - filenameBuilder.append("_"); - filenameBuilder.append(visitId); + filenameBuilder.append(filename); filenameBuilder.append("_part_"); filenameBuilder.append(partBuilder); filenameBuilder.append("_of_"); diff --git a/src/test/java/org/icatproject/topcat/UserResourceTest.java b/src/test/java/org/icatproject/topcat/UserResourceTest.java index 949f25f3..483b8b58 100644 --- a/src/test/java/org/icatproject/topcat/UserResourceTest.java +++ b/src/test/java/org/icatproject/topcat/UserResourceTest.java @@ -281,7 +281,7 @@ public void testQueueVisitId() throws Exception { String transport = "http"; String email = ""; String visitId = "Proposal 0 - 0 0"; - Response response = userResource.queueVisitId(facilityName, sessionId, transport, email, visitId); + Response response = userResource.queueVisitId(facilityName, sessionId, transport, null, email, visitId); assertEquals(200, response.getStatus()); JsonArray downloadIdsArray = Utils.parseJsonArray(response.getEntity().toString()); @@ -327,7 +327,7 @@ public void testQueueFiles() throws Exception { for (JsonObject datafile : datafiles) { files.add(datafile.getString("location")); } - Response response = userResource.queueFiles(facilityName, sessionId, transport, email, files); + Response response = userResource.queueFiles(facilityName, sessionId, transport, null, email, files); assertEquals(200, response.getStatus()); JsonArray downloadIdsArray = Utils.parseJsonArray(response.getEntity().toString()); From 311302f91a316364be5c23b2916b1a908f42378e Mon Sep 17 00:00:00 2001 From: Patrick Austin Date: Thu, 20 Mar 2025 09:34:42 +0000 Subject: [PATCH 2/2] Add fileName to queue endpoint docstrings and improve log messages --- .../icatproject/topcat/web/rest/UserResource.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/icatproject/topcat/web/rest/UserResource.java b/src/main/java/org/icatproject/topcat/web/rest/UserResource.java index 65abdf81..fbbfebdd 100644 --- a/src/main/java/org/icatproject/topcat/web/rest/UserResource.java +++ b/src/main/java/org/icatproject/topcat/web/rest/UserResource.java @@ -868,6 +868,8 @@ private long submitDownload(IdsClient idsClient, Download download, DownloadStat * @param facilityName ICAT Facility.name * @param sessionId ICAT sessionId * @param transport Transport mechanism to use + * @param fileName Optional name to use as the root for each individual part + * Download. Defaults to facilityName_visitId. * @param email Optional email to notify upon completion * @param visitId ICAT Investigation.visitId to submit * @return Array of Download ids @@ -880,7 +882,7 @@ public Response queueVisitId(@FormParam("facilityName") String facilityName, @FormParam("fileName") String fileName, @FormParam("email") String email, @FormParam("visitId") String visitId) throws TopcatException { - logger.info("queueVisitId called"); + logger.info("queueVisitId called for {}", visitId); validateTransport(transport); String icatUrl = getIcatUrl(facilityName); @@ -949,6 +951,8 @@ public Response queueVisitId(@FormParam("facilityName") String facilityName, * @param facilityName ICAT Facility.name * @param sessionId ICAT sessionId * @param transport Transport mechanism to use + * @param fileName Optional name to use as the root for each individual part + * Download. Defaults to facilityName_visitId. * @param email Optional email to notify upon completion * @param files ICAT Datafile.locations to download * @return Array of Download ids @@ -962,11 +966,11 @@ public Response queueFiles(@FormParam("facilityName") String facilityName, @FormParam("fileName") String fileName, @FormParam("email") String email, @FormParam("files") List files) throws TopcatException, UnsupportedEncodingException { - logger.info("queueFiles called"); - validateTransport(transport); - if (files.size() == 0) { + if (files == null || files.size() == 0) { throw new BadRequestException("At least one Datafile.location required"); } + logger.info("queueFiles called for {} files", files.size()); + validateTransport(transport); String icatUrl = getIcatUrl(facilityName); IcatClient icatClient = new IcatClient(icatUrl, sessionId);