From 240cd25cf4711cd6fc682007169d94e9905bd976 Mon Sep 17 00:00:00 2001 From: nick Date: Mon, 4 Dec 2023 15:26:07 +0200 Subject: [PATCH 1/2] tbel fix_bug tbDate parse toString with Object Mapper --- .../thingsboard/script/api/tbel/TbDateTest.java | 17 +++++++++++++++++ .../thingsboard/common/util/JacksonUtil.java | 7 +++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbDateTest.java b/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbDateTest.java index ea951d8a51..ecb08b925c 100644 --- a/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbDateTest.java +++ b/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbDateTest.java @@ -15,6 +15,8 @@ */ package org.thingsboard.script.api.tbel; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; @@ -782,4 +784,19 @@ class TbDateTest { Assert.assertEquals(d.getSeconds(), d.getUTCSeconds()); Assert.assertEquals(d.getMilliseconds(), d.getUTCMilliseconds()); } + + @Test + public void tbDateSerializedPMapperTest() { + String stringDateUTC = "2023-09-06T01:04:05.345Z"; + TbDate expectedDate = new TbDate(stringDateUTC); + String serializedTbDate = JacksonUtil.toString(expectedDate); + JsonNode tbDateNode = JacksonUtil.toJsonNode(serializedTbDate); + Assert.assertNotNull(tbDateNode); + ((ObjectNode) tbDateNode).put("test", (String) null); + serializedTbDate = JacksonUtil.toString(tbDateNode); + TbDate actualDate = JacksonUtil.fromStringIgnoreUnknownProperties(serializedTbDate, TbDate.class); + Assert.assertNotNull(actualDate); + Assert.assertEquals(expectedDate.toString(), actualDate.toString()); + Assert.assertEquals(expectedDate.getInstant(), actualDate.getInstant()); + } } diff --git a/common/util/src/main/java/org/thingsboard/common/util/JacksonUtil.java b/common/util/src/main/java/org/thingsboard/common/util/JacksonUtil.java index 499c0b55a5..17eb664399 100644 --- a/common/util/src/main/java/org/thingsboard/common/util/JacksonUtil.java +++ b/common/util/src/main/java/org/thingsboard/common/util/JacksonUtil.java @@ -52,7 +52,9 @@ import java.util.regex.Pattern; */ public class JacksonUtil { - public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper() + .registerModule(new JavaTimeModule()) + .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); public static final ObjectMapper PRETTY_SORTED_JSON_MAPPER = JsonMapper.builder() .enable(SerializationFeature.INDENT_OUTPUT) .configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true) @@ -64,7 +66,8 @@ public class JacksonUtil { .build(); public static final ObjectMapper IGNORE_UNKNOWN_PROPERTIES_JSON_MAPPER = JsonMapper.builder() .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) - .build(); + .build() + .registerModule(new JavaTimeModule()); public static ObjectMapper getObjectMapperWithJavaTimeModule() { return new ObjectMapper().registerModule(new JavaTimeModule()); From bc5a1b4be9ed7ead4e676c3189c3cc1ebce32afe Mon Sep 17 00:00:00 2001 From: nick Date: Mon, 4 Dec 2023 22:22:31 +0200 Subject: [PATCH 2/2] tbel fix_bug tbDate Default zoneId - ZoneId.systemDefault() --- .../thingsboard/script/api/tbel/TbDate.java | 2 +- .../script/api/tbel/TbDateTest.java | 25 ++++++++++++++----- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbDate.java b/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbDate.java index 71ee73de30..2cfd8db09f 100644 --- a/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbDate.java +++ b/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbDate.java @@ -58,7 +58,7 @@ public class TbDate implements Serializable, Cloneable { } public TbDate(String s, String pattern, Locale locale) { - instant = parseInstant(s, pattern, locale, zoneIdUTC); + instant = parseInstant(s, pattern, locale, ZoneId.systemDefault()); } public TbDate(String s, String pattern, Locale locale, String zoneIdStr) { ZoneId zoneId = ZoneId.of(zoneIdStr); diff --git a/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbDateTest.java b/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbDateTest.java index ecb08b925c..5fd5fea277 100644 --- a/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbDateTest.java +++ b/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbDateTest.java @@ -153,15 +153,25 @@ class TbDateTest { @Test void testToLocaleDateString() { - String s = "09:15:30 PM, Sun 10/09/2022"; + String s = "02:15:30 PM, Sun 10/09/2022"; String pattern = "hh:mm:ss a, EEE M/d/uuuu"; TbDate d = new TbDate(s, pattern, Locale.US); - Assert.assertEquals("2022-10-09T21:15:30Z", d.toISOString()); + // tz = local + int localOffsetHrs = ZoneId.systemDefault().getRules().getOffset(d.getInstant()).getTotalSeconds()/60/60; + int hrs = 14 - localOffsetHrs; + String expected = "2022-10-09T" + hrs + ":15:30Z"; + Assert.assertEquals(expected, d.toISOString()); + // tz = "-04:00" + s = "2023-08-06T04:04:05.00-04:00"; + d = new TbDate(s); + Assert.assertEquals("2023-08-06T08:04:05Z", d.toISOString()); + + s = "02:15:30 PM, Sun 10/09/2022"; d = new TbDate(s, pattern, Locale.US, "-04:00"); - Assert.assertEquals("2022-10-10T01:15:30Z", d.toISOString()); + Assert.assertEquals("2022-10-09T18:15:30Z", d.toISOString()); d = new TbDate(s, pattern, Locale.US, "America/New_York"); - Assert.assertEquals("2022-10-10T01:15:30Z", d.toISOString()); + Assert.assertEquals("2022-10-09T18:15:30Z", d.toISOString()); // tz = "+02:00" /** * For Java 11: @@ -173,10 +183,13 @@ class TbDateTest { d = new TbDate(s, pattern, Locale.GERMAN, ZoneId.of("Europe/Berlin")); Assert.assertEquals("2022-10-09T19:15:30Z", d.toISOString()); - s = "09:15:30 пп, середа, 4 жовтня 2023 р."; + s = "02:15:30 пп, середа, 4 жовтня 2023 р."; pattern = "hh:mm:ss a, EEEE, d MMMM y 'р.'"; d = new TbDate(s, pattern, Locale.forLanguageTag("uk-UA")); - Assert.assertEquals("2023-10-04T21:15:30Z", d.toISOString()); + localOffsetHrs = ZoneId.systemDefault().getRules().getOffset(d.getInstant()).getTotalSeconds()/60/60; + hrs = 14 - localOffsetHrs; + expected = "2023-10-04T" + hrs + ":15:30Z"; + Assert.assertEquals(expected, d.toISOString()); d = new TbDate(1693962245000L); Assert.assertEquals("2023-09-06T01:04:05Z", d.toISOString());