From 3836ea4253f4f3cd156f634634e0b805f6189c95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Germ=C3=A1n=20Saracca?= Date: Thu, 31 Jul 2025 09:59:31 -0300 Subject: [PATCH 01/16] feat: add isDefault field to JSON output --- .../java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java index 592a893083c..d6772561a5f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java @@ -1569,6 +1569,7 @@ public static JsonObjectBuilder jsonTemplate(Template template) { return jsonObjectBuilder() .add("id", template.getId()) .add("name", template.getName()) + .add("isDefault", template.isIsDefaultForDataverse()) .add("usageCount", template.getUsageCount()) .add("createTime", template.getCreateTime().toString()) .add("createDate", template.getCreateDate()) From 42693d24b77c361c861b6691697e1dad608e070b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Germ=C3=A1n=20Saracca?= Date: Thu, 31 Jul 2025 09:59:49 -0300 Subject: [PATCH 02/16] test: assert isDefault property --- src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java index 3e1a160c9f2..4f9fbae7ffc 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java @@ -2335,6 +2335,7 @@ public void testCreateAndGetTemplates() { ); createTemplateResponse.then().assertThat().statusCode(OK.getStatusCode()) .body("data.name", equalTo("Dataverse template")) + .body("data.isDefault", equalTo(true)) .body("data.usageCount", equalTo(0)) .body("data.termsOfUseAndAccess.license.name", equalTo("CC0 1.0")) .body("data.datasetFields.citation.fields.size()", equalTo(1)) @@ -2358,6 +2359,7 @@ public void testCreateAndGetTemplates() { getTemplateResponse.then().assertThat().statusCode(OK.getStatusCode()) .body("data.size()", equalTo(1)) .body("data[0].name", equalTo("Dataverse template")) + .body("data[0].isDefault", equalTo(true)) .body("data[0].usageCount", equalTo(0)) .body("data[0].termsOfUseAndAccess.license.name", equalTo("CC0 1.0")) .body("data[0].datasetFields.citation.fields.size()", equalTo(1)) From 6d2247974baa31194b4859ad4b02a63b4846e137 Mon Sep 17 00:00:00 2001 From: GPortas Date: Thu, 28 Aug 2025 15:19:04 +0100 Subject: [PATCH 03/16] Fixed: null check in jsonTermsOfUseAndAccess for license --- .../java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java index 561b5e73cce..cf2515596b5 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java @@ -1603,9 +1603,10 @@ public static JsonObjectBuilder jsonTemplate(Template template) { } public static JsonObjectBuilder jsonTermsOfUseAndAccess(TermsOfUseAndAccess termsOfUseAndAccess) { + License license = termsOfUseAndAccess.getLicense(); return jsonObjectBuilder() .add("id", termsOfUseAndAccess.getId()) - .add("license", json(termsOfUseAndAccess.getLicense())) + .add("license", license != null ? json(license) : null) .add("termsOfUse", termsOfUseAndAccess.getTermsOfUse()) .add("termsOfAccess", termsOfUseAndAccess.getTermsOfAccess()) .add("confidentialityDeclaration", termsOfUseAndAccess.getConfidentialityDeclaration()) From 45dfbc73da9b96c53345c525a28ad5e3ca046a62 Mon Sep 17 00:00:00 2001 From: GPortas Date: Thu, 28 Aug 2025 15:33:41 +0100 Subject: [PATCH 04/16] Added: unit tests for JsonPrinter.jsonTermsOfUseAndAccess --- .../dataverse/util/json/JsonPrinterTest.java | 77 +++++++++++++++++-- 1 file changed, 70 insertions(+), 7 deletions(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/util/json/JsonPrinterTest.java b/src/test/java/edu/harvard/iq/dataverse/util/json/JsonPrinterTest.java index 36ff11fe4bb..9728ae907b7 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/json/JsonPrinterTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/json/JsonPrinterTest.java @@ -7,6 +7,7 @@ import edu.harvard.iq.dataverse.authorization.users.PrivateUrlUser; import edu.harvard.iq.dataverse.dataset.DatasetType; import edu.harvard.iq.dataverse.dataverse.featured.DataverseFeaturedItem; +import edu.harvard.iq.dataverse.license.License; import edu.harvard.iq.dataverse.mocks.MockDatasetFieldSvc; import edu.harvard.iq.dataverse.pidproviders.doi.AbstractDOIProvider; import edu.harvard.iq.dataverse.privateurl.PrivateUrl; @@ -16,13 +17,7 @@ import java.sql.Timestamp; import java.time.Instant; import java.time.LocalDate; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Set; +import java.util.*; import jakarta.json.JsonArrayBuilder; import jakarta.json.JsonObject; @@ -485,6 +480,74 @@ public void testDatasetWithNondefaultType() { assertEquals(sut, result); } + @Test + public void testJsonTermsOfUseAndAccess() { + // Setup a test TermsOfUseAndAccess + TermsOfUseAndAccess termsOfUseAndAccess = new TermsOfUseAndAccess(); + termsOfUseAndAccess.setId(1L); + termsOfUseAndAccess.setTermsOfUse("Test Terms of Use"); + termsOfUseAndAccess.setTermsOfAccess("Test Terms of Access"); + termsOfUseAndAccess.setConfidentialityDeclaration("Test Confidentiality Declaration"); + termsOfUseAndAccess.setSpecialPermissions("Test Special Permissions"); + termsOfUseAndAccess.setRestrictions("Test Restrictions"); + termsOfUseAndAccess.setCitationRequirements("Test Citation Requirements"); + termsOfUseAndAccess.setDepositorRequirements("Test Depositor Requirements"); + termsOfUseAndAccess.setConditions("Test Conditions"); + termsOfUseAndAccess.setDisclaimer("Test Disclaimer"); + termsOfUseAndAccess.setDataAccessPlace("Test Data Access Place"); + termsOfUseAndAccess.setOriginalArchive("Test Original Archive"); + termsOfUseAndAccess.setAvailabilityStatus("Test Availability Status"); + termsOfUseAndAccess.setSizeOfCollection("Test Size of Collection"); + termsOfUseAndAccess.setStudyCompletion("Test Study Completion"); + + JsonObjectBuilder job = JsonPrinter.jsonTermsOfUseAndAccess(termsOfUseAndAccess); + assertNotNull(job); + JsonObject jsonObject = job.build(); + + // Assert all fields are present and correct + assertEquals(termsOfUseAndAccess.getId().longValue(), jsonObject.getJsonNumber("id").longValue()); + assertEquals(termsOfUseAndAccess.getTermsOfUse(), jsonObject.getString("termsOfUse")); + assertEquals(termsOfUseAndAccess.getTermsOfAccess(), jsonObject.getString("termsOfAccess")); + assertEquals(termsOfUseAndAccess.getConfidentialityDeclaration(), jsonObject.getString("confidentialityDeclaration")); + assertEquals(termsOfUseAndAccess.getSpecialPermissions(), jsonObject.getString("specialPermissions")); + assertEquals(termsOfUseAndAccess.getRestrictions(), jsonObject.getString("restrictions")); + assertEquals(termsOfUseAndAccess.getCitationRequirements(), jsonObject.getString("citationRequirements")); + assertEquals(termsOfUseAndAccess.getDepositorRequirements(), jsonObject.getString("depositorRequirements")); + assertEquals(termsOfUseAndAccess.getConditions(), jsonObject.getString("conditions")); + assertEquals(termsOfUseAndAccess.getDisclaimer(), jsonObject.getString("disclaimer")); + assertEquals(termsOfUseAndAccess.getDataAccessPlace(), jsonObject.getString("dataAccessPlace")); + assertEquals(termsOfUseAndAccess.getOriginalArchive(), jsonObject.getString("originalArchive")); + assertEquals(termsOfUseAndAccess.getAvailabilityStatus(), jsonObject.getString("availabilityStatus")); + assertEquals(termsOfUseAndAccess.getSizeOfCollection(), jsonObject.getString("sizeOfCollection")); + assertEquals(termsOfUseAndAccess.getStudyCompletion(), jsonObject.getString("studyCompletion")); + + // Assert license is null + assertNull(jsonObject.getJsonObject("license")); + + // Test with a license + long testLicenseId = 1L; + termsOfUseAndAccess.setLicense(createLicense(testLicenseId)); + job = JsonPrinter.jsonTermsOfUseAndAccess(termsOfUseAndAccess); + assertNotNull(job); + jsonObject = job.build(); + assertFalse(jsonObject.isNull("license")); + assertEquals(testLicenseId, jsonObject.getJsonObject("license").getJsonNumber("id").longValue()); + } + + private License createLicense(long id) { + License license = new License(); + license.setId(id); + license.setName("Test License " + id); + license.setShortDescription("Short description for license " + id); + try { + license.setUri(new java.net.URI("http://test.org/" + id)); + } catch (java.net.URISyntaxException e) { + e.printStackTrace(); + } + license.setActive(true); + return license; + } + private Dataverse createDataverse(long id) { Dataverse dataverse = new Dataverse(); dataverse.setId(id); From d744bf777c0a0246e746368b1b0dc9c9a544d6c8 Mon Sep 17 00:00:00 2001 From: GPortas Date: Thu, 28 Aug 2025 15:53:39 +0100 Subject: [PATCH 05/16] Added: unit tests for JsonPrinter.jsonTemplate --- .../dataverse/util/json/JsonPrinterTest.java | 91 ++++++++++++++++++- 1 file changed, 87 insertions(+), 4 deletions(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/util/json/JsonPrinterTest.java b/src/test/java/edu/harvard/iq/dataverse/util/json/JsonPrinterTest.java index 9728ae907b7..e3dcfadeca5 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/json/JsonPrinterTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/json/JsonPrinterTest.java @@ -18,11 +18,9 @@ import java.time.Instant; import java.time.LocalDate; import java.util.*; +import java.util.stream.Collectors; -import jakarta.json.JsonArrayBuilder; -import jakarta.json.JsonObject; -import jakarta.json.JsonObjectBuilder; -import jakarta.json.JsonString; +import jakarta.json.*; import edu.harvard.iq.dataverse.util.BundleUtil; import org.assertj.core.util.Lists; @@ -534,6 +532,91 @@ public void testJsonTermsOfUseAndAccess() { assertEquals(testLicenseId, jsonObject.getJsonObject("license").getJsonNumber("id").longValue()); } + @Test + public void testJsonTemplate() { + // Setup a test Template + Template template = createTemplateWithEmptyFields(); + JsonObjectBuilder job = JsonPrinter.jsonTemplate(template); + assertNotNull(job); + JsonObject jsonObject = job.build(); + + // Assert all fields are present and correct, skipping the ID since it is not set. + assertEquals(template.getName(), jsonObject.getString("name")); + assertEquals(template.isIsDefaultForDataverse(), jsonObject.getBoolean("isDefault")); + assertEquals(template.getUsageCount().longValue(), jsonObject.getJsonNumber("usageCount").longValue()); + assertEquals(template.getCreateTime().toString(), jsonObject.getString("createTime")); + assertEquals(template.getCreateDate(), jsonObject.getString("createDate")); + assertEquals(template.getDataverse().getAlias(), jsonObject.getString("dataverseAlias")); + + // Verify termsOfUseAndAccess field by checking a sub-field + JsonObject termsJson = jsonObject.getJsonObject("termsOfUseAndAccess"); + assertNotNull(termsJson); + assertEquals(template.getTermsOfUseAndAccess().getTermsOfUse(), termsJson.getString("termsOfUse")); + + // Verify datasetFields field is an empty JSON object + JsonObject datasetFieldsJson = jsonObject.getJsonObject("datasetFields"); + assertNotNull(datasetFieldsJson); + assertTrue(datasetFieldsJson.isEmpty()); + + // Verify instructions map properties are correct regardless of order + JsonArray instructionsJson = jsonObject.getJsonArray("instructions"); + assertEquals(2, instructionsJson.size()); + + Map instructionsMap = instructionsJson.stream() + .map(jsonValue -> (JsonObject) jsonValue) + .collect(Collectors.toMap( + obj -> obj.getString("instructionField"), + obj -> obj.getString("instructionText") + )); + + assertEquals("Enter the author's name here.", instructionsMap.get("author")); + assertEquals("Provide a title for the dataset.", instructionsMap.get("title")); + } + + private Template createTemplateWithEmptyFields() { + // Setup a test Dataverse + Dataverse dataverse = new Dataverse(); + dataverse.setAlias("test-dataverse"); + + // Setup a test TermsOfUseAndAccess + TermsOfUseAndAccess termsOfUseAndAccess = new TermsOfUseAndAccess(); + termsOfUseAndAccess.setId(1L); + termsOfUseAndAccess.setTermsOfUse("Test Terms of Use"); + termsOfUseAndAccess.setTermsOfAccess("Test Terms of Access"); + termsOfUseAndAccess.setConfidentialityDeclaration("Test Confidentiality Declaration"); + termsOfUseAndAccess.setSpecialPermissions("Test Special Permissions"); + termsOfUseAndAccess.setRestrictions("Test Restrictions"); + termsOfUseAndAccess.setCitationRequirements("Test Citation Requirements"); + termsOfUseAndAccess.setDepositorRequirements("Test Depositor Requirements"); + termsOfUseAndAccess.setConditions("Test Conditions"); + termsOfUseAndAccess.setDisclaimer("Test Disclaimer"); + termsOfUseAndAccess.setDataAccessPlace("Test Data Access Place"); + termsOfUseAndAccess.setOriginalArchive("Test Original Archive"); + termsOfUseAndAccess.setAvailabilityStatus("Test Availability Status"); + termsOfUseAndAccess.setSizeOfCollection("Test Size of Collection"); + termsOfUseAndAccess.setStudyCompletion("Test Study Completion"); + + // Setup a test Template + Template template = new Template(); + template.setName("Test Template"); + template.setIsDefaultForDataverse(true); + template.setUsageCount(5L); + template.setCreateTime(new Timestamp(new Date().getTime())); + template.setTermsOfUseAndAccess(termsOfUseAndAccess); + template.setDataverse(dataverse); + + // Set an empty list of DatasetFields to avoid the loop in jsonByBlocks + template.setDatasetFields(new ArrayList<>()); + + // Add test instructions map + Map instructionsMap = Map.of( + "author", "Enter the author's name here.", + "title", "Provide a title for the dataset." + ); + template.setInstructionsMap(instructionsMap); + return template; + } + private License createLicense(long id) { License license = new License(); license.setId(id); From e3460804ba761ed2b00bb665079a815c84e1c8e6 Mon Sep 17 00:00:00 2001 From: GPortas Date: Mon, 1 Sep 2025 10:53:03 +0100 Subject: [PATCH 06/16] Fixed: marking default template in ListDataverseTemplatesCommand --- .../impl/ListDataverseTemplatesCommand.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/ListDataverseTemplatesCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/ListDataverseTemplatesCommand.java index f1104b5af15..467ae25e93e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/ListDataverseTemplatesCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/ListDataverseTemplatesCommand.java @@ -26,14 +26,22 @@ public ListDataverseTemplatesCommand(DataverseRequest request, Dataverse dataver @Override public List