From 9a52763bada847559769c0c451c9d88fa99e6f91 Mon Sep 17 00:00:00 2001 From: HuaizhiDai Date: Thu, 30 Apr 2026 15:07:27 +1000 Subject: [PATCH 1/5] accept empty suggested citation when subsetting in batch --- .../ogcapi/server/processes/RestServices.java | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/server/src/main/java/au/org/aodn/ogcapi/server/processes/RestServices.java b/server/src/main/java/au/org/aodn/ogcapi/server/processes/RestServices.java index b925d6e7..c5697f6c 100644 --- a/server/src/main/java/au/org/aodn/ogcapi/server/processes/RestServices.java +++ b/server/src/main/java/au/org/aodn/ogcapi/server/processes/RestServices.java @@ -122,11 +122,31 @@ public ResponseEntity downloadData( private String submitJob(String jobName, String jobQueue, String jobDefinition, Map parameters) { + // Filter out null or empty parameter values before submitting to AWS Batch. + // AWS Batch returns "Parameter values must be provided" when the job definition + // declares parameters but some submitted values are null/empty. + Map filteredParams = new HashMap<>(); + if (parameters != null) { + var suggestedCitation = parameters.get(DatasetDownloadEnums.Parameter.SUGGESTED_CITATION.getValue()); + // empty suggested citation is acceptable since it may be from external orgs + if (suggestedCitation == null || suggestedCitation.isEmpty()) { + log.warn("Suggested citation is null or empty for job '{}'. Submitting with as value.", jobName); + filteredParams.put(DatasetDownloadEnums.Parameter.SUGGESTED_CITATION.getValue(),""); + } + } + + if (filteredParams.isEmpty()) { + // Defensive: don't call AWS Batch with no parameters when job definition expects some. + String msg = String.format("No job parameters provided for job '%s' (queue='%s', definition='%s'). Aborting submit.", jobName, jobQueue, jobDefinition); + log.error(msg); + throw new IllegalArgumentException(msg); + } + SubmitJobRequest submitJobRequest = SubmitJobRequest.builder() .jobName(jobName) .jobQueue(jobQueue) .jobDefinition(jobDefinition) - .parameters(parameters) + .parameters(filteredParams) .build(); SubmitJobResponse submitJobResponse = batchClient.submitJob(submitJobRequest); From 7250bbdcba36ea9e265672f3a9229462bd67a313 Mon Sep 17 00:00:00 2001 From: HuaizhiDai Date: Thu, 30 Apr 2026 15:22:24 +1000 Subject: [PATCH 2/5] minor fixing --- .../aodn/ogcapi/server/processes/RestServices.java | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/server/src/main/java/au/org/aodn/ogcapi/server/processes/RestServices.java b/server/src/main/java/au/org/aodn/ogcapi/server/processes/RestServices.java index c5697f6c..c709acda 100644 --- a/server/src/main/java/au/org/aodn/ogcapi/server/processes/RestServices.java +++ b/server/src/main/java/au/org/aodn/ogcapi/server/processes/RestServices.java @@ -125,28 +125,21 @@ private String submitJob(String jobName, String jobQueue, String jobDefinition, // Filter out null or empty parameter values before submitting to AWS Batch. // AWS Batch returns "Parameter values must be provided" when the job definition // declares parameters but some submitted values are null/empty. - Map filteredParams = new HashMap<>(); if (parameters != null) { var suggestedCitation = parameters.get(DatasetDownloadEnums.Parameter.SUGGESTED_CITATION.getValue()); // empty suggested citation is acceptable since it may be from external orgs if (suggestedCitation == null || suggestedCitation.isEmpty()) { log.warn("Suggested citation is null or empty for job '{}'. Submitting with as value.", jobName); - filteredParams.put(DatasetDownloadEnums.Parameter.SUGGESTED_CITATION.getValue(),""); +// filteredParams.put(DatasetDownloadEnums.Parameter.SUGGESTED_CITATION.getValue(),""); + parameters.replace(DatasetDownloadEnums.Parameter.SUGGESTED_CITATION.getValue(), ""); } } - if (filteredParams.isEmpty()) { - // Defensive: don't call AWS Batch with no parameters when job definition expects some. - String msg = String.format("No job parameters provided for job '%s' (queue='%s', definition='%s'). Aborting submit.", jobName, jobQueue, jobDefinition); - log.error(msg); - throw new IllegalArgumentException(msg); - } - SubmitJobRequest submitJobRequest = SubmitJobRequest.builder() .jobName(jobName) .jobQueue(jobQueue) .jobDefinition(jobDefinition) - .parameters(filteredParams) + .parameters(parameters) .build(); SubmitJobResponse submitJobResponse = batchClient.submitJob(submitJobRequest); From d59ea46ea26b72f6e3e965334ce5bb27624e36c3 Mon Sep 17 00:00:00 2001 From: HuaizhiDai Date: Thu, 30 Apr 2026 15:26:25 +1000 Subject: [PATCH 3/5] remove useless code --- .../java/au/org/aodn/ogcapi/server/processes/RestServices.java | 1 - 1 file changed, 1 deletion(-) diff --git a/server/src/main/java/au/org/aodn/ogcapi/server/processes/RestServices.java b/server/src/main/java/au/org/aodn/ogcapi/server/processes/RestServices.java index c709acda..6a7ef554 100644 --- a/server/src/main/java/au/org/aodn/ogcapi/server/processes/RestServices.java +++ b/server/src/main/java/au/org/aodn/ogcapi/server/processes/RestServices.java @@ -130,7 +130,6 @@ private String submitJob(String jobName, String jobQueue, String jobDefinition, // empty suggested citation is acceptable since it may be from external orgs if (suggestedCitation == null || suggestedCitation.isEmpty()) { log.warn("Suggested citation is null or empty for job '{}'. Submitting with as value.", jobName); -// filteredParams.put(DatasetDownloadEnums.Parameter.SUGGESTED_CITATION.getValue(),""); parameters.replace(DatasetDownloadEnums.Parameter.SUGGESTED_CITATION.getValue(), ""); } } From c2e01b8f432436094ac20b765ec1f0c2418e56be Mon Sep 17 00:00:00 2001 From: HuaizhiDai Date: Fri, 1 May 2026 10:50:57 +1000 Subject: [PATCH 4/5] test case --- .../server/processes/RestServicesTest.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/server/src/test/java/au/org/aodn/ogcapi/server/processes/RestServicesTest.java b/server/src/test/java/au/org/aodn/ogcapi/server/processes/RestServicesTest.java index 04635177..7f45dc2a 100644 --- a/server/src/test/java/au/org/aodn/ogcapi/server/processes/RestServicesTest.java +++ b/server/src/test/java/au/org/aodn/ogcapi/server/processes/RestServicesTest.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import au.org.aodn.ogcapi.server.core.model.enumeration.DatasetDownloadEnums; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -92,4 +93,27 @@ public void testDownloadDataCapturesSubmitJobRequest() throws JsonProcessingExce assertEquals("non-specified", captured.parameters().get("multi_polygon")); assertEquals(ResponseEntity.ok("Job submitted with ID: " + jobId), response); } + + @Test + public void submitJobReplacesEmptySuggestedCitationWithUnavailable() throws JsonProcessingException { + // Arrange + String jobId = "67890"; + SubmitJobResponse submitJobResponse = SubmitJobResponse.builder().jobId(jobId).build(); + when(batchClient.submitJob(any(SubmitJobRequest.class))).thenReturn(submitJobResponse); + // polygons set to 'non-specified' to avoid objectMapper serialization + + // Act: pass empty suggestedCitation + ResponseEntity response = restServices.downloadData( + "test-uuid", "test-dname","2023-01-01", "2023-01-31", "non-specified", "test@example.com", + "Test Ocean Data Collection", "https://metadata.imas.utas.edu.au/.../test-uuid-123", "", "geotiff"); + + // Capture the submitted request + ArgumentCaptor captor = ArgumentCaptor.forClass(SubmitJobRequest.class); + verify(batchClient, times(1)).submitJob(captor.capture()); + SubmitJobRequest captured = captor.getValue(); + + String suggestedKey = DatasetDownloadEnums.Parameter.SUGGESTED_CITATION.getValue(); + assertEquals("", captured.parameters().get(suggestedKey)); + assertEquals(ResponseEntity.ok("Job submitted with ID: " + jobId), response); + } } From cc2476e5a1c5631c2cb615872f59ab6e422b295b Mon Sep 17 00:00:00 2001 From: HuaizhiDai Date: Fri, 1 May 2026 11:29:52 +1000 Subject: [PATCH 5/5] remove Problematic symbol --- .../au/org/aodn/ogcapi/server/processes/RestServices.java | 4 ++-- .../au/org/aodn/ogcapi/server/processes/RestServicesTest.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/server/src/main/java/au/org/aodn/ogcapi/server/processes/RestServices.java b/server/src/main/java/au/org/aodn/ogcapi/server/processes/RestServices.java index 6a7ef554..f7fc21ef 100644 --- a/server/src/main/java/au/org/aodn/ogcapi/server/processes/RestServices.java +++ b/server/src/main/java/au/org/aodn/ogcapi/server/processes/RestServices.java @@ -129,8 +129,8 @@ private String submitJob(String jobName, String jobQueue, String jobDefinition, var suggestedCitation = parameters.get(DatasetDownloadEnums.Parameter.SUGGESTED_CITATION.getValue()); // empty suggested citation is acceptable since it may be from external orgs if (suggestedCitation == null || suggestedCitation.isEmpty()) { - log.warn("Suggested citation is null or empty for job '{}'. Submitting with as value.", jobName); - parameters.replace(DatasetDownloadEnums.Parameter.SUGGESTED_CITATION.getValue(), ""); + log.warn("Suggested citation is null or empty for job '{}'. Submitting with unavailable as value.", jobName); + parameters.replace(DatasetDownloadEnums.Parameter.SUGGESTED_CITATION.getValue(), "unavailable"); } } diff --git a/server/src/test/java/au/org/aodn/ogcapi/server/processes/RestServicesTest.java b/server/src/test/java/au/org/aodn/ogcapi/server/processes/RestServicesTest.java index 7f45dc2a..3b683a0f 100644 --- a/server/src/test/java/au/org/aodn/ogcapi/server/processes/RestServicesTest.java +++ b/server/src/test/java/au/org/aodn/ogcapi/server/processes/RestServicesTest.java @@ -113,7 +113,7 @@ public void submitJobReplacesEmptySuggestedCitationWithUnavailable() throws Json SubmitJobRequest captured = captor.getValue(); String suggestedKey = DatasetDownloadEnums.Parameter.SUGGESTED_CITATION.getValue(); - assertEquals("", captured.parameters().get(suggestedKey)); + assertEquals("unavailable", captured.parameters().get(suggestedKey)); assertEquals(ResponseEntity.ok("Job submitted with ID: " + jobId), response); } }