From ed147202c1d22962487bd8dabcd6d103e3df10ae Mon Sep 17 00:00:00 2001 From: Steven Winship <39765413+stevenwinship@users.noreply.github.com> Date: Fri, 10 Apr 2026 15:06:54 -0400 Subject: [PATCH 1/2] ''API inconsistency for release time between JsonParser and JsonPrinter --- .../11594-release-time-inconsistency-api.md | 2 + .../iq/dataverse/util/json/JsonParser.java | 8 +++- .../dataverse/util/json/JsonParserTest.java | 37 +++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 doc/release-notes/11594-release-time-inconsistency-api.md diff --git a/doc/release-notes/11594-release-time-inconsistency-api.md b/doc/release-notes/11594-release-time-inconsistency-api.md new file mode 100644 index 00000000000..f3d84c26450 --- /dev/null +++ b/doc/release-notes/11594-release-time-inconsistency-api.md @@ -0,0 +1,2 @@ +## Bug +API inconsistency for release time between JsonParser/JsonPrinter has been addressed. For backward compatibility new "releaseTime" and original "releaseDate" will be allowed in the Json giving preferance to the new "releaseTime" field. Also, "releaseTime" field will populate the db with date/time. The original "releaseDate" field will continue to truncated to the date only. diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonParser.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonParser.java index 7f3db716456..b6b7bbbf9d7 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonParser.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonParser.java @@ -460,7 +460,13 @@ public DatasetVersion parseDatasetVersion(JsonObject obj, DatasetVersion dsv) th if (versionStateStr != null) { dsv.setVersionState(DatasetVersion.VersionState.valueOf(versionStateStr)); } - dsv.setReleaseTime(parseDate(obj.getString("releaseDate", null))); + // Checking "releaseTime" to be consistent with JsonPrinter which outputs this field as 'releaseTime' with full timestamp + if (obj.containsKey("releaseTime")) { + dsv.setReleaseTime(parseTime(obj.getString("releaseTime", null))); + } else { + // Accept 'releaseDate' to remain backward compatible. This truncates to date only! + dsv.setReleaseTime(parseDate(obj.getString("releaseDate", null))); + } dsv.setLastUpdateTime(parseTime(obj.getString("lastUpdateTime", null))); dsv.setCreateTime(parseTime(obj.getString("createTime", null))); dsv.setArchiveTime(parseTime(obj.getString("archiveTime", null))); diff --git a/src/test/java/edu/harvard/iq/dataverse/util/json/JsonParserTest.java b/src/test/java/edu/harvard/iq/dataverse/util/json/JsonParserTest.java index 262aa38d5d0..03f897a50f5 100644 --- a/src/test/java/edu/harvard/iq/dataverse/util/json/JsonParserTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/util/json/JsonParserTest.java @@ -21,6 +21,7 @@ import edu.harvard.iq.dataverse.engine.command.DataverseRequest; import edu.harvard.iq.dataverse.license.LicenseServiceBean; import edu.harvard.iq.dataverse.mocks.MockDatasetFieldSvc; +import edu.harvard.iq.dataverse.pidproviders.doi.AbstractDOIProvider; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Assumptions; @@ -43,6 +44,7 @@ import java.io.StringReader; import java.math.BigDecimal; import java.text.ParseException; +import java.time.Instant; import java.util.*; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -929,4 +931,39 @@ public void testGuestbookResponse() throws JsonParseException { assertTrue(e.getMessage().contains("Guestbook Response entry is required but not present")); } } + + // Testing that output of JsonPrinter can be used as input to JsonParser + // Additional tests can be added but this was created for Issue: API inconsistency for release time between JsonParser/JsonPrinter #11594 + @Test + public void testDatasetVersionJsonPrinterJsonParser() throws JsonParseException { + // Set up to prevent NullPointerExceptions + String sut = "foobar"; + DatasetType foobar = new DatasetType(); + foobar.setName(sut); + TermsOfUseAndAccess termsOfUseAndAccess = new TermsOfUseAndAccess(); + termsOfUseAndAccess.setTermsOfUse("TOU"); + settingsSvc = new MockSettingsSvc(); + DatasetType datasetType = new DatasetType(); + datasetType.setName(DatasetType.DEFAULT_DATASET_TYPE); + datasetType.setId(1l); + Mockito.when(datasetTypeService.getByName(DatasetType.DEFAULT_DATASET_TYPE)).thenReturn(datasetType); + JsonParser jsonParser = new JsonParser(datasetFieldTypeSvc, null, settingsSvc, licenseService, datasetTypeService); + + Dataset ds = new Dataset(); + DatasetVersion dsv1 = new DatasetVersion(); + DatasetVersion dsv2 = new DatasetVersion(); + + ds.setGlobalId(new GlobalId(AbstractDOIProvider.DOI_PROTOCOL,"10.5072","FK2/BYM3IW", "/", AbstractDOIProvider.DOI_RESOLVER_URL, null)); + ds.setDatasetType(foobar); + dsv1.setDataset(ds); + dsv1.setReleaseTime(Date.from(Instant.now())); + dsv1.setVersionState(DatasetVersion.VersionState.RELEASED); + dsv1.setTermsOfUseAndAccess(termsOfUseAndAccess); + + // Test output of JsonPrinter can be used as input to JsonParser + JsonObject json = JsonPrinter.json(dsv1, false).build(); + jsonParser.parseDatasetVersion(json, dsv2); + + assertEquals(dsv1.getReleaseTime().toString(), dsv2.getReleaseTime().toString()); + } } From 0c22d295dd27317cb11b0fe598a83b93c9e36e89 Mon Sep 17 00:00:00 2001 From: Steven Winship <39765413+stevenwinship@users.noreply.github.com> Date: Thu, 9 Jul 2026 13:33:49 -0400 Subject: [PATCH 2/2] fix typos in release note --- doc/release-notes/11594-release-time-inconsistency-api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/release-notes/11594-release-time-inconsistency-api.md b/doc/release-notes/11594-release-time-inconsistency-api.md index f3d84c26450..2b4b9f89295 100644 --- a/doc/release-notes/11594-release-time-inconsistency-api.md +++ b/doc/release-notes/11594-release-time-inconsistency-api.md @@ -1,2 +1,2 @@ ## Bug -API inconsistency for release time between JsonParser/JsonPrinter has been addressed. For backward compatibility new "releaseTime" and original "releaseDate" will be allowed in the Json giving preferance to the new "releaseTime" field. Also, "releaseTime" field will populate the db with date/time. The original "releaseDate" field will continue to truncated to the date only. +API inconsistency for release time between JsonParser/JsonPrinter has been addressed. For backward compatibility new "releaseTime" and original "releaseDate" will be allowed in the Json giving preference to the new "releaseTime" field. Also, "releaseTime" field will populate the db with date/time. The original "releaseDate" field will continue to be truncated to the date only.