From 80bdb64c66a1c4a733efe309bbfe2f192dc496e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Wed, 26 Mar 2025 10:07:52 +0100 Subject: [PATCH 01/29] fix: Update code --- pom.xml | 13 +++++++------ src/main/java/org/hisp/dhis/util/MapBuilder.java | 12 +----------- 2 files changed, 8 insertions(+), 17 deletions(-) diff --git a/pom.xml b/pom.xml index b3eb2c78..9f0b595a 100644 --- a/pom.xml +++ b/pom.xml @@ -58,14 +58,15 @@ UTF-8 UTF-8 17 - 2.13.5 - 1.19.0 + 2.18.3 + 1.20.0 2.0.17 - 1.18.30 - 3.9.1 - 5.1.4 + 1.18.36 + 3.9.9 + 5.3.1 5.12.1 3.9.4 + 3.5.2 2.18.0 3.17.0 2.43.0 @@ -205,7 +206,7 @@ org.apache.maven.plugins maven-surefire-plugin - 2.22.2 + ${maven-surefire-plugin.version} ${test.excluded.groups} false diff --git a/src/main/java/org/hisp/dhis/util/MapBuilder.java b/src/main/java/org/hisp/dhis/util/MapBuilder.java index 186e8202..eae16fbb 100644 --- a/src/main/java/org/hisp/dhis/util/MapBuilder.java +++ b/src/main/java/org/hisp/dhis/util/MapBuilder.java @@ -31,17 +31,7 @@ import java.util.Map; /** - * Builder of maps. Usage: - * - *

- * Map map = new MapBuilder()
- *   .put( "Height", 178 )
- *   .put( "Weight", 72 )
- *   .build();
- * 
- * - * @param key type. - * @param value type. + * Builder of maps. */ public class MapBuilder { private final Map map; From 499981a84d9c1ed885dfe95ffee79986daecf32b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Wed, 26 Mar 2025 10:08:27 +0100 Subject: [PATCH 02/29] fix: Update code --- src/main/java/org/hisp/dhis/util/MapBuilder.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/org/hisp/dhis/util/MapBuilder.java b/src/main/java/org/hisp/dhis/util/MapBuilder.java index eae16fbb..bc575c37 100644 --- a/src/main/java/org/hisp/dhis/util/MapBuilder.java +++ b/src/main/java/org/hisp/dhis/util/MapBuilder.java @@ -30,9 +30,7 @@ import java.util.HashMap; import java.util.Map; -/** - * Builder of maps. - */ +/** Builder of maps. */ public class MapBuilder { private final Map map; From 2884960177311ff00c9824a2d2d71754d01409d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Wed, 26 Mar 2025 10:27:43 +0100 Subject: [PATCH 03/29] fix: Update code --- .../hisp/dhis/CompleteDataSetRegistrationApiTest.java | 3 +-- src/test/java/org/hisp/dhis/DataValueSetApiTest.java | 7 ++++--- src/test/java/org/hisp/dhis/Dhis2CrudApiTest.java | 9 +++++---- src/test/java/org/hisp/dhis/TestFixture.java | 2 +- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/test/java/org/hisp/dhis/CompleteDataSetRegistrationApiTest.java b/src/test/java/org/hisp/dhis/CompleteDataSetRegistrationApiTest.java index 6cebcea7..6ea351c3 100644 --- a/src/test/java/org/hisp/dhis/CompleteDataSetRegistrationApiTest.java +++ b/src/test/java/org/hisp/dhis/CompleteDataSetRegistrationApiTest.java @@ -32,7 +32,6 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; - import java.util.List; import org.hisp.dhis.model.completedatasetregistration.CompleteDataSetRegistration; import org.hisp.dhis.model.completedatasetregistration.CompleteDataSetRegistrationImportOptions; @@ -99,7 +98,7 @@ void testGetCompleteDataSetRegistrationsWithoutDataSetIdThrowsException() { @Test void testSaveCompleteDataSetRegistrationsWithCreated() { - Dhis2 dhis2 = new Dhis2(TestFixture.LOCAL_CONFIG); + Dhis2 dhis2 = new Dhis2(TestFixture.DEFAULT_CONFIG); CompleteDataSetRegistration cdsr = getCompleteDataSetRegistration(); CompleteDataSetRegistrationImportOptions importOptions = diff --git a/src/test/java/org/hisp/dhis/DataValueSetApiTest.java b/src/test/java/org/hisp/dhis/DataValueSetApiTest.java index 8f92df09..567a6ae6 100644 --- a/src/test/java/org/hisp/dhis/DataValueSetApiTest.java +++ b/src/test/java/org/hisp/dhis/DataValueSetApiTest.java @@ -28,8 +28,9 @@ package org.hisp.dhis; import static org.hisp.dhis.util.CollectionUtils.list; -import static org.junit.jupiter.api.Assertions.*; - +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; import java.util.List; import org.hisp.dhis.model.datavalueset.DataValue; import org.hisp.dhis.model.datavalueset.DataValueSet; @@ -81,7 +82,7 @@ void testGetDataValueSetsWithoutOrgUnitThrowsException() { @Test void testSaveDataValueSets() { - Dhis2 dhis2 = new Dhis2(TestFixture.LOCAL_CONFIG); + Dhis2 dhis2 = new Dhis2(TestFixture.DEFAULT_CONFIG); DataValueSet dataValueSet = getDataValueSet(); DataValueSetImportOptions importOptions = DataValueSetImportOptions.instance(); diff --git a/src/test/java/org/hisp/dhis/Dhis2CrudApiTest.java b/src/test/java/org/hisp/dhis/Dhis2CrudApiTest.java index 29682120..5bd29928 100644 --- a/src/test/java/org/hisp/dhis/Dhis2CrudApiTest.java +++ b/src/test/java/org/hisp/dhis/Dhis2CrudApiTest.java @@ -31,7 +31,6 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; - import org.hisp.dhis.model.CategoryOption; import org.hisp.dhis.model.OrgUnit; import org.hisp.dhis.model.OrgUnitGroup; @@ -40,6 +39,7 @@ import org.hisp.dhis.response.Status; import org.hisp.dhis.response.object.ObjectResponse; import org.hisp.dhis.support.TestTags; +import org.hisp.dhis.util.UidUtils; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; @@ -49,12 +49,13 @@ class Dhis2CrudApiTest { void testCategoryOption() { Dhis2 dhis2 = new Dhis2(TestFixture.DEFAULT_CONFIG); + String uid = UidUtils.generateUid(); OrgUnit ouA = new OrgUnit("ueuQlqb8ccl", null); OrgUnit ouB = new OrgUnit("Rp268JB6Ne4", null); - String codeA = "CAT_OPT__A"; - String nameA = "Category option name__A"; - String shortNameA = "Category option short name__A"; + String codeA = "CAT_OPT__" + uid; + String nameA = "Category option name__" + uid; + String shortNameA = "Category option short name__" + uid; CategoryOption coA = new CategoryOption(); coA.setCode(codeA); diff --git a/src/test/java/org/hisp/dhis/TestFixture.java b/src/test/java/org/hisp/dhis/TestFixture.java index abbb05b5..2efa870c 100644 --- a/src/test/java/org/hisp/dhis/TestFixture.java +++ b/src/test/java/org/hisp/dhis/TestFixture.java @@ -36,7 +36,7 @@ public final class TestFixture { public static final String V40_URL = "https://play.im.dhis2.org/stable-2-41-3"; - public static final String V39_URL = "https://play.im.dhis2.org/stable-2-39-8"; + public static final String V39_URL = "https://play.im.dhis2.org/stable-2-39-9"; public static final String LOCAL_URL = "https://localhost/dhis"; From 081a28389dc3713473d1d513b243491d9c907b3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Wed, 26 Mar 2025 10:30:09 +0100 Subject: [PATCH 04/29] fix: Update code --- .../java/org/hisp/dhis/CompleteDataSetRegistrationApiTest.java | 1 + src/test/java/org/hisp/dhis/DataValueSetApiTest.java | 1 + src/test/java/org/hisp/dhis/Dhis2CrudApiTest.java | 1 + 3 files changed, 3 insertions(+) diff --git a/src/test/java/org/hisp/dhis/CompleteDataSetRegistrationApiTest.java b/src/test/java/org/hisp/dhis/CompleteDataSetRegistrationApiTest.java index 6ea351c3..92398409 100644 --- a/src/test/java/org/hisp/dhis/CompleteDataSetRegistrationApiTest.java +++ b/src/test/java/org/hisp/dhis/CompleteDataSetRegistrationApiTest.java @@ -32,6 +32,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; + import java.util.List; import org.hisp.dhis.model.completedatasetregistration.CompleteDataSetRegistration; import org.hisp.dhis.model.completedatasetregistration.CompleteDataSetRegistrationImportOptions; diff --git a/src/test/java/org/hisp/dhis/DataValueSetApiTest.java b/src/test/java/org/hisp/dhis/DataValueSetApiTest.java index 567a6ae6..5d7fd166 100644 --- a/src/test/java/org/hisp/dhis/DataValueSetApiTest.java +++ b/src/test/java/org/hisp/dhis/DataValueSetApiTest.java @@ -31,6 +31,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; + import java.util.List; import org.hisp.dhis.model.datavalueset.DataValue; import org.hisp.dhis.model.datavalueset.DataValueSet; diff --git a/src/test/java/org/hisp/dhis/Dhis2CrudApiTest.java b/src/test/java/org/hisp/dhis/Dhis2CrudApiTest.java index 5bd29928..ef0a117b 100644 --- a/src/test/java/org/hisp/dhis/Dhis2CrudApiTest.java +++ b/src/test/java/org/hisp/dhis/Dhis2CrudApiTest.java @@ -31,6 +31,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; + import org.hisp.dhis.model.CategoryOption; import org.hisp.dhis.model.OrgUnit; import org.hisp.dhis.model.OrgUnitGroup; From be831daf9ae6162506c552aeb387369f4cf58564 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Fri, 4 Apr 2025 10:33:11 +0200 Subject: [PATCH 05/29] fix: Update code --- src/main/java/org/hisp/dhis/BaseDhis2.java | 29 ++++++++++++++++------ 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/hisp/dhis/BaseDhis2.java b/src/main/java/org/hisp/dhis/BaseDhis2.java index f9a89f0c..4b15ca80 100644 --- a/src/main/java/org/hisp/dhis/BaseDhis2.java +++ b/src/main/java/org/hisp/dhis/BaseDhis2.java @@ -33,10 +33,6 @@ import static org.apache.hc.core5.http.HttpStatus.SC_UNAUTHORIZED; import static org.hisp.dhis.util.CollectionUtils.asList; import static org.hisp.dhis.util.HttpUtils.getUriAsString; - -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -50,7 +46,6 @@ import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; -import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.hc.client5.http.HttpResponseException; @@ -99,6 +94,10 @@ import org.hisp.dhis.response.object.ObjectResponse; import org.hisp.dhis.response.objects.ObjectsResponse; import org.hisp.dhis.util.HttpUtils; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; /** * @author Lars Helge Overland @@ -776,9 +775,9 @@ protected HttpPost getPostRequest(URI url, HttpEntity entity) { /** * Retrieves an object using HTTP GET. * + * @param type. * @param url the fully qualified URL. * @param type the class type of the object. - * @param type. * @return the object. * @throws Dhis2ClientException if access denied or resource not found. */ @@ -791,7 +790,7 @@ protected T getObjectFromUrl(URI url, Class type) { log("Response body: '{}'", responseBody); - return objectMapper.readValue(responseBody, type); + return deserialize(responseBody, type); } catch (IOException ex) { throw new Dhis2ClientException("Failed to fetch object", ex); } catch (ParseException ex) { @@ -852,12 +851,26 @@ private void handleErrorsForGet(CloseableHttpResponse response, String url) log("Conflict response body: '{}'", responseBody); - Response objectResponse = objectMapper.readValue(responseBody, Response.class); + Response objectResponse = deserialize(responseBody, Response.class); throw new Dhis2ClientException(objectResponse.getMessage(), code); } } + /** + * Deserializes the given JSON content to an object of the given type. + * + * @param type. + * @param content the JSON content. + * @param type the object type. + * @return an object. + * @throws IOException + */ + private T deserialize(String content, Class type) + throws IOException { + return objectMapper.readValue(content, type); + } + /** * Return an error message for the given status code. * From 299daa8f67581eb66d5879d3809e41d32b3d7b48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Fri, 4 Apr 2025 10:33:19 +0200 Subject: [PATCH 06/29] fix: Update code --- src/main/java/org/hisp/dhis/BaseDhis2.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/hisp/dhis/BaseDhis2.java b/src/main/java/org/hisp/dhis/BaseDhis2.java index 4b15ca80..c961d68a 100644 --- a/src/main/java/org/hisp/dhis/BaseDhis2.java +++ b/src/main/java/org/hisp/dhis/BaseDhis2.java @@ -33,6 +33,10 @@ import static org.apache.hc.core5.http.HttpStatus.SC_UNAUTHORIZED; import static org.hisp.dhis.util.CollectionUtils.asList; import static org.hisp.dhis.util.HttpUtils.getUriAsString; + +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -46,6 +50,7 @@ import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.hc.client5.http.HttpResponseException; @@ -94,10 +99,6 @@ import org.hisp.dhis.response.object.ObjectResponse; import org.hisp.dhis.response.objects.ObjectsResponse; import org.hisp.dhis.util.HttpUtils; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.extern.slf4j.Slf4j; /** * @author Lars Helge Overland @@ -859,15 +860,14 @@ private void handleErrorsForGet(CloseableHttpResponse response, String url) /** * Deserializes the given JSON content to an object of the given type. - * + * * @param type. * @param content the JSON content. * @param type the object type. * @return an object. * @throws IOException */ - private T deserialize(String content, Class type) - throws IOException { + private T deserialize(String content, Class type) throws IOException { return objectMapper.readValue(content, type); } From 01c4efb6e81ac534618f21ecf10a77efec2b5ee8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Fri, 4 Apr 2025 10:40:44 +0200 Subject: [PATCH 07/29] fix: Update code --- src/main/java/org/hisp/dhis/BaseDhis2.java | 15 ++++---- .../java/org/hisp/dhis/BaseDhis2Test.java | 38 +++++++++++++++++++ 2 files changed, 45 insertions(+), 8 deletions(-) create mode 100644 src/test/java/org/hisp/dhis/BaseDhis2Test.java diff --git a/src/main/java/org/hisp/dhis/BaseDhis2.java b/src/main/java/org/hisp/dhis/BaseDhis2.java index c961d68a..7e6a8aa3 100644 --- a/src/main/java/org/hisp/dhis/BaseDhis2.java +++ b/src/main/java/org/hisp/dhis/BaseDhis2.java @@ -33,10 +33,6 @@ import static org.apache.hc.core5.http.HttpStatus.SC_UNAUTHORIZED; import static org.hisp.dhis.util.CollectionUtils.asList; import static org.hisp.dhis.util.HttpUtils.getUriAsString; - -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -50,7 +46,6 @@ import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; -import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.hc.client5.http.HttpResponseException; @@ -99,6 +94,10 @@ import org.hisp.dhis.response.object.ObjectResponse; import org.hisp.dhis.response.objects.ObjectsResponse; import org.hisp.dhis.util.HttpUtils; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; /** * @author Lars Helge Overland @@ -791,7 +790,7 @@ protected T getObjectFromUrl(URI url, Class type) { log("Response body: '{}'", responseBody); - return deserialize(responseBody, type); + return readValue(responseBody, type); } catch (IOException ex) { throw new Dhis2ClientException("Failed to fetch object", ex); } catch (ParseException ex) { @@ -852,7 +851,7 @@ private void handleErrorsForGet(CloseableHttpResponse response, String url) log("Conflict response body: '{}'", responseBody); - Response objectResponse = deserialize(responseBody, Response.class); + Response objectResponse = readValue(responseBody, Response.class); throw new Dhis2ClientException(objectResponse.getMessage(), code); } @@ -867,7 +866,7 @@ private void handleErrorsForGet(CloseableHttpResponse response, String url) * @return an object. * @throws IOException */ - private T deserialize(String content, Class type) throws IOException { + protected T readValue(String content, Class type) throws IOException { return objectMapper.readValue(content, type); } diff --git a/src/test/java/org/hisp/dhis/BaseDhis2Test.java b/src/test/java/org/hisp/dhis/BaseDhis2Test.java new file mode 100644 index 00000000..d9f14294 --- /dev/null +++ b/src/test/java/org/hisp/dhis/BaseDhis2Test.java @@ -0,0 +1,38 @@ +package org.hisp.dhis; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import java.io.IOException; +import org.hisp.dhis.model.DataElement; +import org.junit.jupiter.api.Test; + +class BaseDhis2Test { + @Test + void testDeserializeString() throws IOException { + Dhis2 dhis2 = new Dhis2(TestFixture.DEFAULT_CONFIG); + + assertEquals("HkSu7IWlvrM", dhis2.readValue("HkSu7IWlvrM", String.class)); + } + + @Test + void testDeserializeObject() throws IOException { + Dhis2 dhis2 = new Dhis2(TestFixture.DEFAULT_CONFIG); + + + String content = + """ + { + "id": "fbfJHSPpUQD", + "code": "DE_359596", + "name": "ANC 1st visit", + "created": "2010-02-05T10:58:43.646", + "lastUpdated": "2022-03-22T08:59:44.053", + "shortName": "ANC 1st visit", + "aggregationType": "SUM", + "valueType": "NUMBER", + "domainType": "AGGREGATE" + } + """; + + DataElement object = dhis2.readValue(content, DataElement.class); + } +} From b44b7357cd4a48426387adb0214a1f66075ea5af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Fri, 4 Apr 2025 10:40:49 +0200 Subject: [PATCH 08/29] fix: Update code --- src/main/java/org/hisp/dhis/BaseDhis2.java | 9 ++-- .../java/org/hisp/dhis/BaseDhis2Test.java | 41 +++++++++++++++---- 2 files changed, 39 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/hisp/dhis/BaseDhis2.java b/src/main/java/org/hisp/dhis/BaseDhis2.java index 7e6a8aa3..466b067b 100644 --- a/src/main/java/org/hisp/dhis/BaseDhis2.java +++ b/src/main/java/org/hisp/dhis/BaseDhis2.java @@ -33,6 +33,10 @@ import static org.apache.hc.core5.http.HttpStatus.SC_UNAUTHORIZED; import static org.hisp.dhis.util.CollectionUtils.asList; import static org.hisp.dhis.util.HttpUtils.getUriAsString; + +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -46,6 +50,7 @@ import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.hc.client5.http.HttpResponseException; @@ -94,10 +99,6 @@ import org.hisp.dhis.response.object.ObjectResponse; import org.hisp.dhis.response.objects.ObjectsResponse; import org.hisp.dhis.util.HttpUtils; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.extern.slf4j.Slf4j; /** * @author Lars Helge Overland diff --git a/src/test/java/org/hisp/dhis/BaseDhis2Test.java b/src/test/java/org/hisp/dhis/BaseDhis2Test.java index d9f14294..4bed5764 100644 --- a/src/test/java/org/hisp/dhis/BaseDhis2Test.java +++ b/src/test/java/org/hisp/dhis/BaseDhis2Test.java @@ -1,6 +1,34 @@ +/* + * Copyright (c) 2004-2025, University of Oslo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * Neither the name of the HISP project nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ package org.hisp.dhis; import static org.junit.jupiter.api.Assertions.assertEquals; + import java.io.IOException; import org.hisp.dhis.model.DataElement; import org.junit.jupiter.api.Test; @@ -9,16 +37,15 @@ class BaseDhis2Test { @Test void testDeserializeString() throws IOException { Dhis2 dhis2 = new Dhis2(TestFixture.DEFAULT_CONFIG); - + assertEquals("HkSu7IWlvrM", dhis2.readValue("HkSu7IWlvrM", String.class)); } - + @Test void testDeserializeObject() throws IOException { Dhis2 dhis2 = new Dhis2(TestFixture.DEFAULT_CONFIG); - - - String content = + + String content = """ { "id": "fbfJHSPpUQD", @@ -30,9 +57,9 @@ void testDeserializeObject() throws IOException { "aggregationType": "SUM", "valueType": "NUMBER", "domainType": "AGGREGATE" - } + } """; - + DataElement object = dhis2.readValue(content, DataElement.class); } } From 62dfd65432805f544ee7dd0bae530c1b67f6c122 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Fri, 4 Apr 2025 10:48:35 +0200 Subject: [PATCH 09/29] fix: Update code --- .../java/org/hisp/dhis/BaseDhis2Test.java | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/hisp/dhis/BaseDhis2Test.java b/src/test/java/org/hisp/dhis/BaseDhis2Test.java index 4bed5764..d3625356 100644 --- a/src/test/java/org/hisp/dhis/BaseDhis2Test.java +++ b/src/test/java/org/hisp/dhis/BaseDhis2Test.java @@ -28,9 +28,13 @@ package org.hisp.dhis; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import java.io.IOException; +import org.hisp.dhis.model.AggregationType; +import org.hisp.dhis.model.DataDomain; import org.hisp.dhis.model.DataElement; +import org.hisp.dhis.model.ValueType; import org.junit.jupiter.api.Test; class BaseDhis2Test { @@ -38,7 +42,14 @@ class BaseDhis2Test { void testDeserializeString() throws IOException { Dhis2 dhis2 = new Dhis2(TestFixture.DEFAULT_CONFIG); - assertEquals("HkSu7IWlvrM", dhis2.readValue("HkSu7IWlvrM", String.class)); + String content = + """ + "HkSu7IWlvrM" + """; + + String string = dhis2.readValue(content, String.class); + + assertEquals("HkSu7IWlvrM", string); } @Test @@ -51,9 +62,9 @@ void testDeserializeObject() throws IOException { "id": "fbfJHSPpUQD", "code": "DE_359596", "name": "ANC 1st visit", + "shortName": "ANC 1", "created": "2010-02-05T10:58:43.646", "lastUpdated": "2022-03-22T08:59:44.053", - "shortName": "ANC 1st visit", "aggregationType": "SUM", "valueType": "NUMBER", "domainType": "AGGREGATE" @@ -61,5 +72,15 @@ void testDeserializeObject() throws IOException { """; DataElement object = dhis2.readValue(content, DataElement.class); + + assertEquals("fbfJHSPpUQD", object.getId()); + assertEquals("DE_359596", object.getCode()); + assertEquals("ANC 1st visit", object.getName()); + assertEquals("ANC 1", object.getShortName()); + assertNotNull(object.getCreated()); + assertNotNull(object.getLastUpdated()); + assertEquals(AggregationType.SUM, object.getAggregationType()); + assertEquals(ValueType.NUMBER, object.getValueType()); + assertEquals(DataDomain.AGGREGATE, object.getDomainType()); } } From 5bb4375228f57db66da2ea0c646dd7b5cb37aa4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Fri, 4 Apr 2025 10:50:06 +0200 Subject: [PATCH 10/29] fix: Update code --- src/test/java/org/hisp/dhis/BaseDhis2Test.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/test/java/org/hisp/dhis/BaseDhis2Test.java b/src/test/java/org/hisp/dhis/BaseDhis2Test.java index d3625356..bb12782c 100644 --- a/src/test/java/org/hisp/dhis/BaseDhis2Test.java +++ b/src/test/java/org/hisp/dhis/BaseDhis2Test.java @@ -29,7 +29,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; - import java.io.IOException; import org.hisp.dhis.model.AggregationType; import org.hisp.dhis.model.DataDomain; @@ -38,6 +37,9 @@ import org.junit.jupiter.api.Test; class BaseDhis2Test { + /** + * Test deserialize to string. Note that strings are considered valid JSON primitives when quoted. + */ @Test void testDeserializeString() throws IOException { Dhis2 dhis2 = new Dhis2(TestFixture.DEFAULT_CONFIG); @@ -52,6 +54,9 @@ void testDeserializeString() throws IOException { assertEquals("HkSu7IWlvrM", string); } + /** + * Test deserialize to data element. + */ @Test void testDeserializeObject() throws IOException { Dhis2 dhis2 = new Dhis2(TestFixture.DEFAULT_CONFIG); From bd8ffe28be65f1c39e241ba0a455630db335eb18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Fri, 4 Apr 2025 12:20:16 +0200 Subject: [PATCH 11/29] fix: Update code --- src/test/java/org/hisp/dhis/BaseDhis2Test.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/test/java/org/hisp/dhis/BaseDhis2Test.java b/src/test/java/org/hisp/dhis/BaseDhis2Test.java index bb12782c..ef3cdc34 100644 --- a/src/test/java/org/hisp/dhis/BaseDhis2Test.java +++ b/src/test/java/org/hisp/dhis/BaseDhis2Test.java @@ -29,6 +29,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; + import java.io.IOException; import org.hisp.dhis.model.AggregationType; import org.hisp.dhis.model.DataDomain; @@ -54,9 +55,7 @@ void testDeserializeString() throws IOException { assertEquals("HkSu7IWlvrM", string); } - /** - * Test deserialize to data element. - */ + /** Test deserialize to data element. */ @Test void testDeserializeObject() throws IOException { Dhis2 dhis2 = new Dhis2(TestFixture.DEFAULT_CONFIG); From f6e54bda2ee15b9e567faf8a8a0811e92617261c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Fri, 4 Apr 2025 12:21:54 +0200 Subject: [PATCH 12/29] fix: Update code --- src/main/java/org/hisp/dhis/BaseDhis2.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/hisp/dhis/BaseDhis2.java b/src/main/java/org/hisp/dhis/BaseDhis2.java index 344907f4..4cef804f 100644 --- a/src/main/java/org/hisp/dhis/BaseDhis2.java +++ b/src/main/java/org/hisp/dhis/BaseDhis2.java @@ -33,6 +33,10 @@ import static org.apache.hc.core5.http.HttpStatus.SC_UNAUTHORIZED; import static org.hisp.dhis.util.CollectionUtils.asList; import static org.hisp.dhis.util.HttpUtils.getUriAsString; + +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -46,6 +50,7 @@ import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.hc.client5.http.HttpResponseException; @@ -97,10 +102,6 @@ import org.hisp.dhis.response.object.ObjectResponse; import org.hisp.dhis.response.objects.ObjectsResponse; import org.hisp.dhis.util.HttpUtils; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.extern.slf4j.Slf4j; /** * @author Lars Helge Overland From e3f981b9ab57627b39980a5bdf9a71793c263d36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Fri, 4 Apr 2025 12:22:09 +0200 Subject: [PATCH 13/29] fix: Update code --- src/main/java/org/hisp/dhis/BaseDhis2.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/hisp/dhis/BaseDhis2.java b/src/main/java/org/hisp/dhis/BaseDhis2.java index 344907f4..4cef804f 100644 --- a/src/main/java/org/hisp/dhis/BaseDhis2.java +++ b/src/main/java/org/hisp/dhis/BaseDhis2.java @@ -33,6 +33,10 @@ import static org.apache.hc.core5.http.HttpStatus.SC_UNAUTHORIZED; import static org.hisp.dhis.util.CollectionUtils.asList; import static org.hisp.dhis.util.HttpUtils.getUriAsString; + +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -46,6 +50,7 @@ import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.hc.client5.http.HttpResponseException; @@ -97,10 +102,6 @@ import org.hisp.dhis.response.object.ObjectResponse; import org.hisp.dhis.response.objects.ObjectsResponse; import org.hisp.dhis.util.HttpUtils; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.extern.slf4j.Slf4j; /** * @author Lars Helge Overland From c390277de7669aba076783e8825abb4ae869921a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Fri, 11 Apr 2025 18:24:16 +0200 Subject: [PATCH 14/29] fix: Add ConfigUtils and ConfigUtilsTest --- .../java/org/hisp/dhis/util/ConfigUtils.java | 44 +++++++++++++++++++ .../org/hisp/dhis/util/ConfigUtilsTest.java | 27 ++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 src/main/java/org/hisp/dhis/util/ConfigUtils.java create mode 100644 src/test/java/org/hisp/dhis/util/ConfigUtilsTest.java diff --git a/src/main/java/org/hisp/dhis/util/ConfigUtils.java b/src/main/java/org/hisp/dhis/util/ConfigUtils.java new file mode 100644 index 00000000..d018135c --- /dev/null +++ b/src/main/java/org/hisp/dhis/util/ConfigUtils.java @@ -0,0 +1,44 @@ +package org.hisp.dhis.util; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class ConfigUtils { + /** + * Splits the given value on {@code ,} and returns the values as a list. Trims each value and + * filters out null and empty values. + * + * @param value the value. + * @return the values as a {@link List}. + */ + public static List getAsList(String value) { + List values = + new ArrayList( + Arrays.asList(StringUtils.split(ObjectUtils.firstNonNull(value, ""), ','))); + + return values.stream() + .map(String::trim) + .filter(StringUtils::isNotEmpty) + .collect(Collectors.toList()); + } + + /** + * Splits the given value on {@code ,} and returns the values as an array. Trims each value and + * filters out null and empty values. + * + * @param value the value. + * @return the values as an array. + */ + public static String[] getAsArray(String value) { + List values = getAsList(value); + + return values.toArray(String[]::new); + } +} \ No newline at end of file diff --git a/src/test/java/org/hisp/dhis/util/ConfigUtilsTest.java b/src/test/java/org/hisp/dhis/util/ConfigUtilsTest.java new file mode 100644 index 00000000..84d1b7ff --- /dev/null +++ b/src/test/java/org/hisp/dhis/util/ConfigUtilsTest.java @@ -0,0 +1,27 @@ +package org.hisp.dhis.util; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import java.util.List; +import org.junit.jupiter.api.Test; + +public class ConfigUtilsTest { + @Test + void testGetAsListA() { + List expected = + List.of("http://localhost", "http://localhost:3000", "https://localhost:3000"); + + String actual = "http://localhost,http://localhost:3000, ,, https://localhost:3000"; + + assertEquals(expected, ConfigUtils.getAsList(actual)); + assertEquals(List.of(), ConfigUtils.getAsList(null)); + assertEquals(List.of(), ConfigUtils.getAsList("")); + } + + @Test + void testGetAsArray() { + String actual = "http://localhost,http://localhost:3000, ,, https://localhost:3000"; + + assertEquals(3, ConfigUtils.getAsArray(actual).length); + assertEquals("http://localhost", ConfigUtils.getAsArray(actual)[0]); + } +} From e155590eec487dce7ef5683dbcee5bfb88ff8ce6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Fri, 11 Apr 2025 18:24:36 +0200 Subject: [PATCH 15/29] fix: Add ConfigUtils and ConfigUtilsTest --- .../java/org/hisp/dhis/util/ConfigUtils.java | 33 +++++++++++++++++-- .../org/hisp/dhis/util/ConfigUtilsTest.java | 28 ++++++++++++++++ 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/hisp/dhis/util/ConfigUtils.java b/src/main/java/org/hisp/dhis/util/ConfigUtils.java index d018135c..73ef2e44 100644 --- a/src/main/java/org/hisp/dhis/util/ConfigUtils.java +++ b/src/main/java/org/hisp/dhis/util/ConfigUtils.java @@ -1,13 +1,40 @@ +/* + * Copyright (c) 2004-2025, University of Oslo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * Neither the name of the HISP project nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ package org.hisp.dhis.util; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; -import org.apache.commons.lang3.ObjectUtils; -import org.apache.commons.lang3.StringUtils; import lombok.AccessLevel; import lombok.NoArgsConstructor; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; @NoArgsConstructor(access = AccessLevel.PRIVATE) public class ConfigUtils { @@ -41,4 +68,4 @@ public static String[] getAsArray(String value) { return values.toArray(String[]::new); } -} \ No newline at end of file +} diff --git a/src/test/java/org/hisp/dhis/util/ConfigUtilsTest.java b/src/test/java/org/hisp/dhis/util/ConfigUtilsTest.java index 84d1b7ff..3c946cd6 100644 --- a/src/test/java/org/hisp/dhis/util/ConfigUtilsTest.java +++ b/src/test/java/org/hisp/dhis/util/ConfigUtilsTest.java @@ -1,6 +1,34 @@ +/* + * Copyright (c) 2004-2025, University of Oslo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * Neither the name of the HISP project nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ package org.hisp.dhis.util; import static org.junit.jupiter.api.Assertions.assertEquals; + import java.util.List; import org.junit.jupiter.api.Test; From 76c2475c5e647d04f3250a0533b6ef6d5871b23e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Sat, 12 Apr 2025 10:02:12 +0200 Subject: [PATCH 16/29] chore: Bump version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 726d96ec..4a351058 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.hisp dhis2-java-client - 2.1.2-SNAPSHOT + 2.1.2 jar DHIS 2 API client for Java From 98bc67cfa689a24313afa0a5187aa68a9d44e3a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Sat, 12 Apr 2025 10:02:27 +0200 Subject: [PATCH 17/29] chore: Bump version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4a351058..8718be34 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.hisp dhis2-java-client - 2.1.2 + 2.1.3-SNAPSHOT jar DHIS 2 API client for Java From 27f264dd13891ecd96c4b0e640dfc3ceffdf891a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Sat, 12 Apr 2025 10:18:49 +0200 Subject: [PATCH 18/29] chore: Bump version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8718be34..4a351058 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.hisp dhis2-java-client - 2.1.3-SNAPSHOT + 2.1.2 jar DHIS 2 API client for Java From 41834a928a76a78400e14d5264cba85fd1860a4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Sat, 12 Apr 2025 15:01:25 +0200 Subject: [PATCH 19/29] fix: Update code --- .../java/org/hisp/dhis/model/event/Event.java | 28 +++++++++++++++---- .../hisp/dhis/model/event/EventDataValue.java | 9 ++++++ 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/hisp/dhis/model/event/Event.java b/src/main/java/org/hisp/dhis/model/event/Event.java index 4050b476..610de150 100644 --- a/src/main/java/org/hisp/dhis/model/event/Event.java +++ b/src/main/java/org/hisp/dhis/model/event/Event.java @@ -50,22 +50,27 @@ public class Event implements Serializable { @JsonProperty(value = "event") private String id; + /** Read-only. */ @JsonProperty private String program; + /** Read-only. */ + @JsonProperty private String trackedEntity; + @ToString.Include @JsonProperty private String programStage; - @ToString.Include @JsonProperty private String enrollment; + @ToString.Include @JsonProperty private String orgUnit; + /** Default. */ @ToString.Include @JsonProperty private String attributeOptionCombo; @JsonProperty private EventStatus status = EventStatus.ACTIVE; - @ToString.Include @JsonProperty private String orgUnit; - + /** Read-only. */ @JsonProperty private Date createdAt; @JsonProperty private Date createdAtClient; + /** Read-only. */ @JsonProperty private Date updatedAt; @JsonProperty private Date updatedAtClient; @@ -74,15 +79,26 @@ public class Event implements Serializable { @JsonProperty private Date occurredAt; + @JsonProperty private Date completedAt; + + /** Read-only. */ @JsonProperty private String completedBy; @JsonProperty private String storedBy; + /** Read-only. */ + @JsonProperty private String createdBy; + + /** Read-only. */ + @JsonProperty private String updatedBy; + + /** Read-only. */ @JsonProperty private Boolean followUp; + /** Read-only. */ @JsonProperty private Boolean deleted; - private List dataValues = new ArrayList<>(); + @JsonProperty private List dataValues = new ArrayList<>(); public Event(String id) { this.id = id; @@ -90,15 +106,15 @@ public Event(String id) { public Event( String id, - String program, String programStage, String orgUnit, + EventStatus status, Date occurredAt, List dataValues) { this(id); - this.program = program; this.programStage = programStage; this.orgUnit = orgUnit; + this.status = status; this.occurredAt = occurredAt; this.dataValues = dataValues; } diff --git a/src/main/java/org/hisp/dhis/model/event/EventDataValue.java b/src/main/java/org/hisp/dhis/model/event/EventDataValue.java index fe4a137a..3e539649 100644 --- a/src/main/java/org/hisp/dhis/model/event/EventDataValue.java +++ b/src/main/java/org/hisp/dhis/model/event/EventDataValue.java @@ -54,14 +54,23 @@ public class EventDataValue implements Serializable { @ToString.Include @JsonProperty private String value; + /** Default false. */ @JsonProperty private Boolean providedElsewhere; + /** Read-only. */ @JsonProperty private Date createdAt; + /** Read-only. */ @JsonProperty private Date updatedAt; @JsonProperty private String storedBy; + /** Read-only. */ + @JsonProperty private String createdBy; + + /** Read-only. */ + @JsonProperty private String updatedBy; + public EventDataValue(String dataElement, String value) { this.dataElement = dataElement; this.value = value; From b510e602b65cd13807cb37431a7b5ee0fe13e64c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Sun, 13 Apr 2025 21:24:45 +0200 Subject: [PATCH 20/29] fix: Update code --- .../org/hisp/dhis/util/DateTimeUtils.java | 64 ++++++++++++++++++- .../org/hisp/dhis/util/DateTimeUtilsTest.java | 11 +++- 2 files changed, 73 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/hisp/dhis/util/DateTimeUtils.java b/src/main/java/org/hisp/dhis/util/DateTimeUtils.java index dd914aca..60a1d442 100644 --- a/src/main/java/org/hisp/dhis/util/DateTimeUtils.java +++ b/src/main/java/org/hisp/dhis/util/DateTimeUtils.java @@ -29,14 +29,15 @@ import java.text.SimpleDateFormat; import java.time.DateTimeException; +import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.Date; +import org.apache.commons.lang3.StringUtils; import lombok.AccessLevel; import lombok.NoArgsConstructor; -import org.apache.commons.lang3.StringUtils; @NoArgsConstructor(access = AccessLevel.PRIVATE) public class DateTimeUtils { @@ -188,4 +189,65 @@ public static String getUtcDateTimeString(LocalDateTime dateTime) { public static String getUtcDateTimeString(Date dateTime) { return String.format("%sZ", new SimpleDateFormat(DATE_TIME_FORMAT).format(dateTime)); } + + /** + * Returns the {@link Instant} of received date param. if data is null, it also returns null + * Instant. + * + * @param date the {@link Date}. + * @return the {@link Instant} of received date param. + */ + public static Instant toInstant(Date date) { + return date != null ? date.toInstant() : null; + } + + /** + * Returns the {@link LocalDate} from a given {@link Instant}. + * + * @param instant the {@link Instant}. + * @return the {@link LocalDate}. + */ + public static LocalDate toLocalDate(Instant instant) { + return instant.atZone(ZoneId.systemDefault()).toLocalDate(); + } + + /** + * Returns a {@link java.util.Date} from a {@link java.time.LocalDate}. + * + * @param date the {@link java.time.LocalDate}. + * @return the {@link java.util.Date}. + */ + public static Date toDate(LocalDate date) { + return Date.from(date.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()); + } + + /** + * Returns a {@link java.util.Date} from a {@link java.time.LocalDateTime}. + * + * @param dateTime the {@link java.time.LocalDateTime}. + * @return the {@link java.util.Date}. + */ + public static Date toDate(LocalDateTime dateTime) { + return Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant()); + } + + /** + * Converts the given {@link Date} to a {@link LocalDate}. + * + * @param date the {@link Date}. + * @return a {@link LocalDate}. + */ + public static LocalDate toLocalDate(Date date) { + return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + } + + /** + * Converts the given {@link Date} to a {@link LocalDateTime}. + * + * @param date the {@link Date}. + * @return a {@link LocalDateTime}. + */ + public static LocalDateTime toLocalDateTime(Date date) { + return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); + } } diff --git a/src/test/java/org/hisp/dhis/util/DateTimeUtilsTest.java b/src/test/java/org/hisp/dhis/util/DateTimeUtilsTest.java index b65ef389..533cdc4c 100644 --- a/src/test/java/org/hisp/dhis/util/DateTimeUtilsTest.java +++ b/src/test/java/org/hisp/dhis/util/DateTimeUtilsTest.java @@ -31,7 +31,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; - +import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.Calendar; @@ -252,6 +252,15 @@ void convertStringToUtcDateTime() { assertNotNull(string); } + @Test + void testGetLocalDateFromInstant() { + LocalDate date1 = DateTimeUtils.toLocalDate(Instant.ofEpochSecond(1006511400L)); + LocalDate date2 = DateTimeUtils.toLocalDate(Instant.ofEpochSecond(1617532200L)); + + assertEquals("2001-11-23", date1.toString()); + assertEquals("2021-04-04", date2.toString()); + } + private Date getDate(int year, int month, int dayOfMonth, int hour, int minute, int second) { Calendar cal = Calendar.getInstance(); cal.clear(); From a7994c09833c9e155b7dca152ee232c71fc6ed2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Sun, 13 Apr 2025 21:25:03 +0200 Subject: [PATCH 21/29] fix: Update code --- src/main/java/org/hisp/dhis/util/DateTimeUtils.java | 2 +- src/test/java/org/hisp/dhis/util/DateTimeUtilsTest.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/hisp/dhis/util/DateTimeUtils.java b/src/main/java/org/hisp/dhis/util/DateTimeUtils.java index 60a1d442..1f095227 100644 --- a/src/main/java/org/hisp/dhis/util/DateTimeUtils.java +++ b/src/main/java/org/hisp/dhis/util/DateTimeUtils.java @@ -35,9 +35,9 @@ import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.Date; -import org.apache.commons.lang3.StringUtils; import lombok.AccessLevel; import lombok.NoArgsConstructor; +import org.apache.commons.lang3.StringUtils; @NoArgsConstructor(access = AccessLevel.PRIVATE) public class DateTimeUtils { diff --git a/src/test/java/org/hisp/dhis/util/DateTimeUtilsTest.java b/src/test/java/org/hisp/dhis/util/DateTimeUtilsTest.java index 533cdc4c..d4b8fcd0 100644 --- a/src/test/java/org/hisp/dhis/util/DateTimeUtilsTest.java +++ b/src/test/java/org/hisp/dhis/util/DateTimeUtilsTest.java @@ -31,6 +31,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; + import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; @@ -260,7 +261,7 @@ void testGetLocalDateFromInstant() { assertEquals("2001-11-23", date1.toString()); assertEquals("2021-04-04", date2.toString()); } - + private Date getDate(int year, int month, int dayOfMonth, int hour, int minute, int second) { Calendar cal = Calendar.getInstance(); cal.clear(); From 8b1a0f1ae7b0c91d908dfaa58527fdb83872eddb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Sun, 13 Apr 2025 21:26:10 +0200 Subject: [PATCH 22/29] fix: Update code --- src/test/java/org/hisp/dhis/util/DateTimeUtilsTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/test/java/org/hisp/dhis/util/DateTimeUtilsTest.java b/src/test/java/org/hisp/dhis/util/DateTimeUtilsTest.java index d4b8fcd0..49d653bf 100644 --- a/src/test/java/org/hisp/dhis/util/DateTimeUtilsTest.java +++ b/src/test/java/org/hisp/dhis/util/DateTimeUtilsTest.java @@ -31,7 +31,6 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; - import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; @@ -254,7 +253,7 @@ void convertStringToUtcDateTime() { } @Test - void testGetLocalDateFromInstant() { + void testToLocalDateFromInstant() { LocalDate date1 = DateTimeUtils.toLocalDate(Instant.ofEpochSecond(1006511400L)); LocalDate date2 = DateTimeUtils.toLocalDate(Instant.ofEpochSecond(1617532200L)); From 8ef4ecd693fab7c982e534c83923b004bf4bbe9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Sun, 13 Apr 2025 21:26:47 +0200 Subject: [PATCH 23/29] fix: Update code --- src/test/java/org/hisp/dhis/util/DateTimeUtilsTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/java/org/hisp/dhis/util/DateTimeUtilsTest.java b/src/test/java/org/hisp/dhis/util/DateTimeUtilsTest.java index 49d653bf..dba07e5c 100644 --- a/src/test/java/org/hisp/dhis/util/DateTimeUtilsTest.java +++ b/src/test/java/org/hisp/dhis/util/DateTimeUtilsTest.java @@ -31,6 +31,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; + import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; From e2d2bfc2ec557b0c6eefb17b3002c63d31746b1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Sun, 13 Apr 2025 21:46:46 +0200 Subject: [PATCH 24/29] fix: Update code --- src/main/java/org/hisp/dhis/util/DateTimeUtils.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/org/hisp/dhis/util/DateTimeUtils.java b/src/main/java/org/hisp/dhis/util/DateTimeUtils.java index 1f095227..d51605f7 100644 --- a/src/main/java/org/hisp/dhis/util/DateTimeUtils.java +++ b/src/main/java/org/hisp/dhis/util/DateTimeUtils.java @@ -211,6 +211,16 @@ public static LocalDate toLocalDate(Instant instant) { return instant.atZone(ZoneId.systemDefault()).toLocalDate(); } + /** + * Returns the {@link LocalDateTime} from a given {@link Instant}. + * + * @param instant the {@link Instant}. + * @return the {@link LocalDateTime}. + */ + public static LocalDateTime toLocalDateTime(Instant instant) { + return instant.atZone(ZoneId.systemDefault()).toLocalDateTime(); + } + /** * Returns a {@link java.util.Date} from a {@link java.time.LocalDate}. * From 58490927e0f1ce28985e4eca7823ac9f9b61e777 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Mon, 14 Apr 2025 10:37:10 +0200 Subject: [PATCH 25/29] fix: Update code --- src/main/java/org/hisp/dhis/BaseDhis2.java | 11 ++++++----- src/main/java/org/hisp/dhis/model/event/Event.java | 8 +------- src/test/java/org/hisp/dhis/TestFixture.java | 4 +--- 3 files changed, 8 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/hisp/dhis/BaseDhis2.java b/src/main/java/org/hisp/dhis/BaseDhis2.java index fbc04afa..eebb09e1 100644 --- a/src/main/java/org/hisp/dhis/BaseDhis2.java +++ b/src/main/java/org/hisp/dhis/BaseDhis2.java @@ -33,10 +33,6 @@ import static org.apache.hc.core5.http.HttpStatus.SC_UNAUTHORIZED; import static org.hisp.dhis.util.CollectionUtils.asList; import static org.hisp.dhis.util.HttpUtils.getUriAsString; - -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -50,7 +46,6 @@ import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; -import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.hc.client5.http.HttpResponseException; @@ -102,6 +97,11 @@ import org.hisp.dhis.response.object.ObjectResponse; import org.hisp.dhis.response.objects.ObjectsResponse; import org.hisp.dhis.util.HttpUtils; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import lombok.extern.slf4j.Slf4j; /** * @author Lars Helge Overland @@ -287,6 +287,7 @@ public BaseDhis2(Dhis2Config config) { this.config = config; this.objectMapper = new ObjectMapper(); + objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); objectMapper.setSerializationInclusion(Include.NON_NULL); objectMapper.setDateFormat(new SimpleDateFormat(DATE_FORMAT)); diff --git a/src/main/java/org/hisp/dhis/model/event/Event.java b/src/main/java/org/hisp/dhis/model/event/Event.java index 610de150..a5214da0 100644 --- a/src/main/java/org/hisp/dhis/model/event/Event.java +++ b/src/main/java/org/hisp/dhis/model/event/Event.java @@ -27,12 +27,12 @@ */ package org.hisp.dhis.model.event; -import com.fasterxml.jackson.annotation.JsonProperty; import java.io.Serializable; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; @@ -86,12 +86,6 @@ public class Event implements Serializable { @JsonProperty private String storedBy; - /** Read-only. */ - @JsonProperty private String createdBy; - - /** Read-only. */ - @JsonProperty private String updatedBy; - /** Read-only. */ @JsonProperty private Boolean followUp; diff --git a/src/test/java/org/hisp/dhis/TestFixture.java b/src/test/java/org/hisp/dhis/TestFixture.java index c92044a3..3086de9b 100644 --- a/src/test/java/org/hisp/dhis/TestFixture.java +++ b/src/test/java/org/hisp/dhis/TestFixture.java @@ -34,9 +34,7 @@ public final class TestFixture { public static final String DEV_URL = "https://play.im.dhis2.org/dev"; - public static final String V41_URL = "https://play.im.dhis2.org/stable-2-41-3"; - - public static final String V39_URL = "https://play.im.dhis2.org/stable-2-39-9"; + public static final String V41_URL = "https://play.im.dhis2.org/stable-2-41-3-1"; public static final String LOCAL_URL = "https://localhost/dhis"; From 0c1fd5877fdc48b43d26c966c7ea56918ede88be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Mon, 14 Apr 2025 10:40:15 +0200 Subject: [PATCH 26/29] fix: Update code --- src/main/java/org/hisp/dhis/BaseDhis2.java | 11 ++++++----- src/main/java/org/hisp/dhis/model/event/Event.java | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/hisp/dhis/BaseDhis2.java b/src/main/java/org/hisp/dhis/BaseDhis2.java index eebb09e1..dda0c947 100644 --- a/src/main/java/org/hisp/dhis/BaseDhis2.java +++ b/src/main/java/org/hisp/dhis/BaseDhis2.java @@ -33,6 +33,11 @@ import static org.apache.hc.core5.http.HttpStatus.SC_UNAUTHORIZED; import static org.hisp.dhis.util.CollectionUtils.asList; import static org.hisp.dhis.util.HttpUtils.getUriAsString; + +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -46,6 +51,7 @@ import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.hc.client5.http.HttpResponseException; @@ -97,11 +103,6 @@ import org.hisp.dhis.response.object.ObjectResponse; import org.hisp.dhis.response.objects.ObjectsResponse; import org.hisp.dhis.util.HttpUtils; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import lombok.extern.slf4j.Slf4j; /** * @author Lars Helge Overland diff --git a/src/main/java/org/hisp/dhis/model/event/Event.java b/src/main/java/org/hisp/dhis/model/event/Event.java index a5214da0..ec3adbb8 100644 --- a/src/main/java/org/hisp/dhis/model/event/Event.java +++ b/src/main/java/org/hisp/dhis/model/event/Event.java @@ -27,12 +27,12 @@ */ package org.hisp.dhis.model.event; +import com.fasterxml.jackson.annotation.JsonProperty; import java.io.Serializable; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Objects; -import com.fasterxml.jackson.annotation.JsonProperty; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; From bb64c75bce19591f87d575c3931dff46492b34aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Mon, 14 Apr 2025 10:47:58 +0200 Subject: [PATCH 27/29] fix: Update code --- src/main/java/org/hisp/dhis/BaseDhis2.java | 17 +--- .../java/org/hisp/dhis/util/JacksonUtils.java | 91 +++++++++++++++++++ 2 files changed, 93 insertions(+), 15 deletions(-) create mode 100644 src/main/java/org/hisp/dhis/util/JacksonUtils.java diff --git a/src/main/java/org/hisp/dhis/BaseDhis2.java b/src/main/java/org/hisp/dhis/BaseDhis2.java index dda0c947..9d0cbd3c 100644 --- a/src/main/java/org/hisp/dhis/BaseDhis2.java +++ b/src/main/java/org/hisp/dhis/BaseDhis2.java @@ -34,10 +34,7 @@ import static org.hisp.dhis.util.CollectionUtils.asList; import static org.hisp.dhis.util.HttpUtils.getUriAsString; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -45,7 +42,6 @@ import java.net.URI; import java.net.URISyntaxException; import java.nio.charset.StandardCharsets; -import java.text.SimpleDateFormat; import java.util.List; import java.util.Map; import java.util.Objects; @@ -103,6 +99,7 @@ import org.hisp.dhis.response.object.ObjectResponse; import org.hisp.dhis.response.objects.ObjectsResponse; import org.hisp.dhis.util.HttpUtils; +import org.hisp.dhis.util.JacksonUtils; /** * @author Lars Helge Overland @@ -240,9 +237,6 @@ public class BaseDhis2 { "%1$s,username,surname,firstName,email,settings,programs,dataSets,authorities,organisationUnits[%2$s]", ID_FIELDS, ORG_UNIT_FIELDS); - /** Default date format. */ - protected static final String DATE_FORMAT = "yyyy-MM-dd"; - /** Log level system property. */ private static final String LOG_LEVEL_SYSTEM_PROPERTY = "log.level.dhis2"; @@ -284,15 +278,8 @@ public class BaseDhis2 { public BaseDhis2(Dhis2Config config) { Objects.requireNonNull(config, "Config must be specified"); - this.config = config; - - this.objectMapper = new ObjectMapper(); - objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); - objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); - objectMapper.setSerializationInclusion(Include.NON_NULL); - objectMapper.setDateFormat(new SimpleDateFormat(DATE_FORMAT)); - + this.objectMapper = JacksonUtils.getObjectMapper(); this.httpClient = HttpClients.createDefault(); } diff --git a/src/main/java/org/hisp/dhis/util/JacksonUtils.java b/src/main/java/org/hisp/dhis/util/JacksonUtils.java new file mode 100644 index 00000000..aa11d1cf --- /dev/null +++ b/src/main/java/org/hisp/dhis/util/JacksonUtils.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2004-2025, University of Oslo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * Neither the name of the HISP project nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.hisp.dhis.util; + +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import java.io.IOException; +import java.io.UncheckedIOException; +import java.text.SimpleDateFormat; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class JacksonUtils { + /** Static JSON object mapper. */ + private static final ObjectMapper OBJECT_MAPPER = getObjectMapper(); + + /** Default date format. */ + private static final String DATE_FORMAT = "yyyy-MM-dd"; + + /** + * Returns an {@link ObjectMapper}. + * + * @return an {@link ObjectMapper}. + */ + public static ObjectMapper getObjectMapper() { + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + objectMapper.setSerializationInclusion(Include.NON_NULL); + objectMapper.setDateFormat(new SimpleDateFormat(DATE_FORMAT)); + return objectMapper; + } + + /** + * Serializes the given object to JSON and returns the result as a String. + * + * @param value the object value to serialize. + * @return a JSON representation of the given object as a String. + */ + public static String toJsonString(Object value) { + try { + return OBJECT_MAPPER.writeValueAsString(value); + } catch (IOException ex) { + throw new UncheckedIOException(ex); + } + } + + /** + * Deserializes the given JSON string into an object of the specified type. + * + * @param string the JSON string to deserialize. + * @param type the class of the target type. + * @param the type of the object to return. + * @return an object of type T. + */ + public static T fromJson(String string, Class type) { + try { + return OBJECT_MAPPER.readValue(string, type); + } catch (IOException ex) { + throw new UncheckedIOException(ex); + } + } +} From 33c08e2c238fbb9fc24e9a0fe69e836aee83234d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Mon, 14 Apr 2025 11:36:17 +0200 Subject: [PATCH 28/29] fix: Update code --- .../java/org/hisp/dhis/util/JacksonUtils.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/main/java/org/hisp/dhis/util/JacksonUtils.java b/src/main/java/org/hisp/dhis/util/JacksonUtils.java index aa11d1cf..7b2ad10e 100644 --- a/src/main/java/org/hisp/dhis/util/JacksonUtils.java +++ b/src/main/java/org/hisp/dhis/util/JacksonUtils.java @@ -32,6 +32,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import java.io.IOException; +import java.io.InputStream; import java.io.UncheckedIOException; import java.text.SimpleDateFormat; import lombok.AccessLevel; @@ -88,4 +89,20 @@ public static T fromJson(String string, Class type) { throw new UncheckedIOException(ex); } } + + /** + * Deserializes JSON from the given {@link InputStream} into an object of the specified type. + * + * @param input the {@link InputStream} containing JSON data. + * @param type the class of the target type. + * @param the type of the object to return. + * @return an object of type T. + */ + public static T fromJson(InputStream input, Class type) { + try { + return OBJECT_MAPPER.readValue(input, type); + } catch (IOException ex) { + throw new UncheckedIOException(ex); + } + } } From 116e8fe3b3e66e5bc02a96ab5c987e1482e11955 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Mon, 14 Apr 2025 16:16:54 +0200 Subject: [PATCH 29/29] chore: Bump version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0788874a..333265a8 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.hisp dhis2-java-client - 2.1.4-SNAPSHOT + 2.1.4 jar DHIS 2 API client for Java