diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index ecf1325..0000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,9 +0,0 @@ -version: 2 -updates: -- package-ecosystem: maven - directory: "/" - schedule: - interval: monthly - time: "04:00" - open-pull-requests-limit: 10 - diff --git a/README.md b/README.md index 2441ed4..22dcc1d 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,8 @@ A library with common Java types that are mostly immutable value objects. [![Java Development Kit 17](https://img.shields.io/badge/JDK-17-green.svg)](https://openjdk.java.net/projects/jdk/17/) ## Versions -- 0.10.0 = See [Release Notes](release-notes.md) +- [0.11.0](release-notes.md#0110) +- [0.10.0](release-notes.md#0100) - 0.9.0 = **Java 17** - 0.8.0 = **Java 11** with new **jakarta** namespace - 0.7.x = **Java 11** before namespace change from 'javax' to 'jakarta' diff --git a/common/pom.xml b/common/pom.xml index acf989e..47f4125 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -7,7 +7,7 @@ org.fuin.objects4j objects4j-parent - 0.10.0 + 0.11.0-SNAPSHOT ../pom.xml diff --git a/common/src/main/java/org/fuin/objects4j/common/ValueObjectConverter.java b/common/src/main/java/org/fuin/objects4j/common/ValueObjectConverter.java index 0532030..c7f3e69 100644 --- a/common/src/main/java/org/fuin/objects4j/common/ValueObjectConverter.java +++ b/common/src/main/java/org/fuin/objects4j/common/ValueObjectConverter.java @@ -17,8 +17,6 @@ */ package org.fuin.objects4j.common; -import org.fuin.objects4j.common.ValueObjectWithBaseType; - /** * Converts a value object into it's base type and back. * diff --git a/common/src/test/java/org/fuin/objects4j/common/FileExistsValidatorTest.java b/common/src/test/java/org/fuin/objects4j/common/FileExistsValidatorTest.java index 5b6e7f4..1126d8b 100644 --- a/common/src/test/java/org/fuin/objects4j/common/FileExistsValidatorTest.java +++ b/common/src/test/java/org/fuin/objects4j/common/FileExistsValidatorTest.java @@ -42,11 +42,8 @@ public final class FileExistsValidatorTest { public final void setUp() throws IOException { testee = new FileExistsValidator(); existingFile = new File(Utils4J.getTempDir(), "FileExistsValidatorTest_File"); - final OutputStream out = new FileOutputStream(existingFile); - try { + try (final OutputStream out = new FileOutputStream(existingFile)) { out.write("Test".getBytes()); - } finally { - out.close(); } existingDir = new File(Utils4J.getTempDir(), "FileExistsValidatorTest_Dir"); existingDir.mkdir(); diff --git a/common/src/test/java/org/fuin/objects4j/common/HasPublicStaticIsValidMethodValidatorTest.java b/common/src/test/java/org/fuin/objects4j/common/HasPublicStaticIsValidMethodValidatorTest.java index fcc5b97..820cc70 100644 --- a/common/src/test/java/org/fuin/objects4j/common/HasPublicStaticIsValidMethodValidatorTest.java +++ b/common/src/test/java/org/fuin/objects4j/common/HasPublicStaticIsValidMethodValidatorTest.java @@ -149,6 +149,7 @@ public static boolean isValid(String str) { @HasPublicStaticIsValidMethod public static final class MyClassNotStatic { + @SuppressWarnings("java:S1172") // Unused method parameter is ok here public boolean isValid(String str) { return true; } diff --git a/common/src/test/java/org/fuin/objects4j/common/HasPublicStaticValueOfMethodValidatorTest.java b/common/src/test/java/org/fuin/objects4j/common/HasPublicStaticValueOfMethodValidatorTest.java index 60ffa11..fbfcf1a 100644 --- a/common/src/test/java/org/fuin/objects4j/common/HasPublicStaticValueOfMethodValidatorTest.java +++ b/common/src/test/java/org/fuin/objects4j/common/HasPublicStaticValueOfMethodValidatorTest.java @@ -182,6 +182,7 @@ public static Integer valueOf(String str) { @HasPublicStaticValueOfMethod public static final class MyClassWrongReturnValue { + @SuppressWarnings("java:S1172") // Unused method parameter is ok here public static MyClassWrongReturnValue valueOf(String str) { return new MyClassWrongReturnValue(); } diff --git a/common/src/test/java/org/fuin/objects4j/common/IsDirectoryValidatorTest.java b/common/src/test/java/org/fuin/objects4j/common/IsDirectoryValidatorTest.java index 18702cb..23b1570 100644 --- a/common/src/test/java/org/fuin/objects4j/common/IsDirectoryValidatorTest.java +++ b/common/src/test/java/org/fuin/objects4j/common/IsDirectoryValidatorTest.java @@ -41,11 +41,8 @@ public final class IsDirectoryValidatorTest { public final void setUp() throws IOException { testee = new IsDirectoryValidator(); existingFile = new File(Utils4J.getTempDir(), "IsDirectoryValidatorTest_File"); - final OutputStream out = new FileOutputStream(existingFile); - try { + try (final OutputStream out = new FileOutputStream(existingFile)) { out.write("Test".getBytes()); - } finally { - out.close(); } existingDir = new File(Utils4J.getTempDir(), "IsDirectoryValidatorTest_Dir"); existingDir.mkdir(); diff --git a/common/src/test/java/org/fuin/objects4j/common/IsFileValidatorTest.java b/common/src/test/java/org/fuin/objects4j/common/IsFileValidatorTest.java index 4a4474d..71a48b2 100644 --- a/common/src/test/java/org/fuin/objects4j/common/IsFileValidatorTest.java +++ b/common/src/test/java/org/fuin/objects4j/common/IsFileValidatorTest.java @@ -41,11 +41,8 @@ public final class IsFileValidatorTest { public final void setUp() throws IOException { testee = new IsFileValidator(); existingFile = new File(Utils4J.getTempDir(), "IsFileValidatorTest_File"); - final OutputStream out = new FileOutputStream(existingFile); - try { + try (final OutputStream out = new FileOutputStream(existingFile)) { out.write("Test".getBytes()); - } finally { - out.close(); } existingDir = new File(Utils4J.getTempDir(), "IsFileValidatorTest_Dir"); existingDir.mkdir(); diff --git a/core/pom.xml b/core/pom.xml index f8c4660..e544b0c 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -7,7 +7,7 @@ org.fuin.objects4j objects4j-parent - 0.10.0 + 0.11.0-SNAPSHOT ../pom.xml diff --git a/core/src/test/java/org/fuin/objects4j/core/CurrencyAmountTest.java b/core/src/test/java/org/fuin/objects4j/core/CurrencyAmountTest.java index fe75d4c..6591fe5 100644 --- a/core/src/test/java/org/fuin/objects4j/core/CurrencyAmountTest.java +++ b/core/src/test/java/org/fuin/objects4j/core/CurrencyAmountTest.java @@ -42,6 +42,7 @@ void testEqualsHashCode() { } @Test + @SuppressWarnings("java:S117") // Underscore in var name is ok here void testCompareTo() { final CurrencyAmount eur123_2 = new CurrencyAmount(bd(123, 2), cu("EUR")); diff --git a/core/src/test/java/org/fuin/objects4j/core/UUIDStrValidatorTest.java b/core/src/test/java/org/fuin/objects4j/core/UUIDStrValidatorTest.java index d61a7c5..0c01085 100644 --- a/core/src/test/java/org/fuin/objects4j/core/UUIDStrValidatorTest.java +++ b/core/src/test/java/org/fuin/objects4j/core/UUIDStrValidatorTest.java @@ -44,7 +44,6 @@ public final void tearDown() { @Test void testValidConstantLowerCase() { - final String value = "089ba5d3-1027-421d-add7-7e65f95b6ed6"; assertThat(testee.isValid(value, null)).isTrue(); assertThat(UUIDStrValidator.parseArg("a", value)).isEqualTo(UUID.fromString(value)); @@ -53,7 +52,7 @@ void testValidConstantLowerCase() { @Test void testValidConstantUpperCase() { - final String value = "089ba5d3-1027-421d-add7-7e65f95b6ed6"; + final String value = "089BA5D3-1027-421D-ADD7-7E65F95B6ED6"; assertThat(testee.isValid(value, null)).isTrue(); assertThat(UUIDStrValidator.parseArg("a", value)).isEqualTo(UUID.fromString(value)); } @@ -117,10 +116,5 @@ void testInvalidSpecialCharacters() { } - @Test - void testParseArg() { - - } - } // CHECKSTYLE:ON diff --git a/jackson/pom.xml b/jackson/pom.xml index a7de977..2bb410b 100644 --- a/jackson/pom.xml +++ b/jackson/pom.xml @@ -7,7 +7,7 @@ org.fuin.objects4j objects4j-parent - 0.10.0 + 0.11.0-SNAPSHOT ../pom.xml @@ -17,6 +17,11 @@ + + org.fuin + utils4j + + org.fuin.objects4j objects4j-common @@ -103,12 +108,6 @@ test - - org.fuin - utils4j - test - - diff --git a/jackson/src/main/java/org/fuin/objects4j/jackson/CurrencyAmountJacksonDeserializer.java b/jackson/src/main/java/org/fuin/objects4j/jackson/CurrencyAmountJacksonDeserializer.java deleted file mode 100644 index ff42338..0000000 --- a/jackson/src/main/java/org/fuin/objects4j/jackson/CurrencyAmountJacksonDeserializer.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (C) 2015 Michael Schnell. All rights reserved. - * http://www.fuin.org/ - * - * This library is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by the Free - * Software Foundation; either version 3 of the License, or (at your option) any - * later version. - * - * This library is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this library. If not, see http://www.gnu.org/licenses/. - */ -package org.fuin.objects4j.jackson; - -import org.fuin.objects4j.core.CurrencyAmount; - -import javax.annotation.concurrent.ThreadSafe; - -/** - * Converts a String to a {@link CurrencyAmount}. - */ -@ThreadSafe -public final class CurrencyAmountJacksonDeserializer extends ValueObjectStringJacksonDeserializer { - - /** - * Default constructor. - */ - public CurrencyAmountJacksonDeserializer() { - super(CurrencyAmount.class, CurrencyAmount::valueOf); - } - -} diff --git a/jackson/src/main/java/org/fuin/objects4j/jackson/CurrencyAmountJacksonSerializer.java b/jackson/src/main/java/org/fuin/objects4j/jackson/CurrencyAmountJacksonSerializer.java deleted file mode 100644 index 8a1bd4c..0000000 --- a/jackson/src/main/java/org/fuin/objects4j/jackson/CurrencyAmountJacksonSerializer.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (C) 2015 Michael Schnell. All rights reserved. - * http://www.fuin.org/ - * - * This library is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by the Free - * Software Foundation; either version 3 of the License, or (at your option) any - * later version. - * - * This library is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this library. If not, see http://www.gnu.org/licenses/. - */ -package org.fuin.objects4j.jackson; - -import org.fuin.objects4j.core.CurrencyAmount; - -import javax.annotation.concurrent.ThreadSafe; - -/** - * Converts a {@link CurrencyAmount} to String. - */ -@ThreadSafe -public final class CurrencyAmountJacksonSerializer extends ValueObjectStringJacksonSerializer { - - /** - * Default constructor. - */ - public CurrencyAmountJacksonSerializer() { - super(CurrencyAmount.class, CurrencyAmount::valueOf); - } - -} diff --git a/jackson/src/main/java/org/fuin/objects4j/jackson/DayOfTheWeekJacksonDeserializer.java b/jackson/src/main/java/org/fuin/objects4j/jackson/DayOfTheWeekJacksonDeserializer.java deleted file mode 100644 index 78047e7..0000000 --- a/jackson/src/main/java/org/fuin/objects4j/jackson/DayOfTheWeekJacksonDeserializer.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (C) 2015 Michael Schnell. All rights reserved. - * http://www.fuin.org/ - *

- * This library is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by the Free - * Software Foundation; either version 3 of the License, or (at your option) any - * later version. - *

- * This library is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - *

- * You should have received a copy of the GNU Lesser General Public License - * along with this library. If not, see http://www.gnu.org/licenses/. - */ -package org.fuin.objects4j.jackson; - -import org.fuin.objects4j.core.DayOfTheWeek; - -import javax.annotation.concurrent.ThreadSafe; - -/** - * Converts a String to a {@link DayOfTheWeek}. - */ -@ThreadSafe -public final class DayOfTheWeekJacksonDeserializer extends ValueObjectStringJacksonDeserializer { - - /** - * Default constructor. - */ - public DayOfTheWeekJacksonDeserializer() { - super(DayOfTheWeek.class, DayOfTheWeek::valueOf); - } - -} diff --git a/jackson/src/main/java/org/fuin/objects4j/jackson/DayOfTheWeekJacksonSerializer.java b/jackson/src/main/java/org/fuin/objects4j/jackson/DayOfTheWeekJacksonSerializer.java deleted file mode 100644 index 491e7d8..0000000 --- a/jackson/src/main/java/org/fuin/objects4j/jackson/DayOfTheWeekJacksonSerializer.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (C) 2015 Michael Schnell. All rights reserved. - * http://www.fuin.org/ - * - * This library is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by the Free - * Software Foundation; either version 3 of the License, or (at your option) any - * later version. - * - * This library is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this library. If not, see http://www.gnu.org/licenses/. - */ -package org.fuin.objects4j.jackson; - -import org.fuin.objects4j.core.DayOfTheWeek; - -import javax.annotation.concurrent.ThreadSafe; - -/** - * Converts a {@link DayOfTheWeek} from/to String. - */ -@ThreadSafe -public final class DayOfTheWeekJacksonSerializer extends ValueObjectStringJacksonSerializer { - - /** - * Default constructor. - */ - public DayOfTheWeekJacksonSerializer() { - super(DayOfTheWeek.class, DayOfTheWeek::valueOf); - } - -} diff --git a/jackson/src/main/java/org/fuin/objects4j/jackson/DayOpeningHoursJacksonDeserializer.java b/jackson/src/main/java/org/fuin/objects4j/jackson/DayOpeningHoursJacksonDeserializer.java deleted file mode 100644 index 9a73c38..0000000 --- a/jackson/src/main/java/org/fuin/objects4j/jackson/DayOpeningHoursJacksonDeserializer.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (C) 2015 Michael Schnell. All rights reserved. - * http://www.fuin.org/ - *

- * This library is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by the Free - * Software Foundation; either version 3 of the License, or (at your option) any - * later version. - *

- * This library is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - *

- * You should have received a copy of the GNU Lesser General Public License - * along with this library. If not, see http://www.gnu.org/licenses/. - */ -package org.fuin.objects4j.jackson; - -import org.fuin.objects4j.core.DayOpeningHours; - -import javax.annotation.concurrent.ThreadSafe; - -/** - * Converts a String to a {@link DayOpeningHours}. - */ -@ThreadSafe -public final class DayOpeningHoursJacksonDeserializer extends ValueObjectStringJacksonDeserializer { - - /** - * Default constructor. - */ - public DayOpeningHoursJacksonDeserializer() { - super(DayOpeningHours.class, DayOpeningHours::valueOf); - } - -} diff --git a/jackson/src/main/java/org/fuin/objects4j/jackson/DayOpeningHoursJacksonSerializer.java b/jackson/src/main/java/org/fuin/objects4j/jackson/DayOpeningHoursJacksonSerializer.java deleted file mode 100644 index d3b8791..0000000 --- a/jackson/src/main/java/org/fuin/objects4j/jackson/DayOpeningHoursJacksonSerializer.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (C) 2015 Michael Schnell. All rights reserved. - * http://www.fuin.org/ - * - * This library is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by the Free - * Software Foundation; either version 3 of the License, or (at your option) any - * later version. - * - * This library is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this library. If not, see http://www.gnu.org/licenses/. - */ -package org.fuin.objects4j.jackson; - -import org.fuin.objects4j.core.DayOpeningHours; - -import javax.annotation.concurrent.ThreadSafe; - -/** - * Converts a {@link DayOpeningHours} into a String. - */ -@ThreadSafe -public final class DayOpeningHoursJacksonSerializer extends ValueObjectStringJacksonSerializer { - - /** - * Default constructor. - */ - public DayOpeningHoursJacksonSerializer() { - super(DayOpeningHours.class, DayOpeningHours::valueOf); - } - -} diff --git a/jackson/src/main/java/org/fuin/objects4j/jackson/EmailAddressJacksonDeserializer.java b/jackson/src/main/java/org/fuin/objects4j/jackson/EmailAddressJacksonDeserializer.java deleted file mode 100644 index b2a58b9..0000000 --- a/jackson/src/main/java/org/fuin/objects4j/jackson/EmailAddressJacksonDeserializer.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (C) 2015 Michael Schnell. All rights reserved. - * http://www.fuin.org/ - *

- * This library is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by the Free - * Software Foundation; either version 3 of the License, or (at your option) any - * later version. - *

- * This library is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - *

- * You should have received a copy of the GNU Lesser General Public License - * along with this library. If not, see http://www.gnu.org/licenses/. - */ -package org.fuin.objects4j.jackson; - -import org.fuin.objects4j.core.EmailAddress; - -import javax.annotation.concurrent.ThreadSafe; - -/** - * Converts a String to a {@link EmailAddress}. - */ -@ThreadSafe -public final class EmailAddressJacksonDeserializer extends ValueObjectStringJacksonDeserializer { - - /** - * Default constructor. - */ - public EmailAddressJacksonDeserializer() { - super(EmailAddress.class, EmailAddress::valueOf); - } - -} diff --git a/jackson/src/main/java/org/fuin/objects4j/jackson/EmailAddressJacksonSerializer.java b/jackson/src/main/java/org/fuin/objects4j/jackson/EmailAddressJacksonSerializer.java deleted file mode 100644 index e6765cc..0000000 --- a/jackson/src/main/java/org/fuin/objects4j/jackson/EmailAddressJacksonSerializer.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (C) 2015 Michael Schnell. All rights reserved. - * http://www.fuin.org/ - *

- * This library is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by the Free - * Software Foundation; either version 3 of the License, or (at your option) any - * later version. - *

- * This library is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - *

- * You should have received a copy of the GNU Lesser General Public License - * along with this library. If not, see http://www.gnu.org/licenses/. - */ -package org.fuin.objects4j.jackson; - -import org.fuin.objects4j.core.EmailAddress; - -import javax.annotation.concurrent.ThreadSafe; - -/** - * Converts a {@link EmailAddress} into a String. - */ -@ThreadSafe -public final class EmailAddressJacksonSerializer extends ValueObjectStringJacksonSerializer { - - /** - * Default constructor. - */ - public EmailAddressJacksonSerializer() { - super(EmailAddress.class, EmailAddress::valueOf); - } - -} diff --git a/jackson/src/main/java/org/fuin/objects4j/jackson/HourJacksonDeserializer.java b/jackson/src/main/java/org/fuin/objects4j/jackson/HourJacksonDeserializer.java deleted file mode 100644 index d655365..0000000 --- a/jackson/src/main/java/org/fuin/objects4j/jackson/HourJacksonDeserializer.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (C) 2015 Michael Schnell. All rights reserved. - * http://www.fuin.org/ - *

- * This library is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by the Free - * Software Foundation; either version 3 of the License, or (at your option) any - * later version. - *

- * This library is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - *

- * You should have received a copy of the GNU Lesser General Public License - * along with this library. If not, see http://www.gnu.org/licenses/. - */ -package org.fuin.objects4j.jackson; - -import org.fuin.objects4j.core.Hour; - -import javax.annotation.concurrent.ThreadSafe; - -/** - * Converts a String to a {@link Hour}. - */ -@ThreadSafe -public final class HourJacksonDeserializer extends ValueObjectStringJacksonDeserializer { - - /** - * Default constructor. - */ - public HourJacksonDeserializer() { - super(Hour.class, Hour::valueOf); - } - -} diff --git a/jackson/src/main/java/org/fuin/objects4j/jackson/HourJacksonSerializer.java b/jackson/src/main/java/org/fuin/objects4j/jackson/HourJacksonSerializer.java deleted file mode 100644 index d34c78e..0000000 --- a/jackson/src/main/java/org/fuin/objects4j/jackson/HourJacksonSerializer.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (C) 2015 Michael Schnell. All rights reserved. - * http://www.fuin.org/ - * - * This library is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by the Free - * Software Foundation; either version 3 of the License, or (at your option) any - * later version. - * - * This library is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this library. If not, see http://www.gnu.org/licenses/. - */ -package org.fuin.objects4j.jackson; - -import org.fuin.objects4j.core.Hour; - -import javax.annotation.concurrent.ThreadSafe; - -/** - * Converts a {@link Hour} into a String. - */ -@ThreadSafe -public final class HourJacksonSerializer extends ValueObjectStringJacksonSerializer { - - /** - * Default constructor. - */ - public HourJacksonSerializer() { - super(Hour.class, Hour::valueOf); - } - -} diff --git a/jackson/src/main/java/org/fuin/objects4j/jackson/HourRangeJacksonDeserializer.java b/jackson/src/main/java/org/fuin/objects4j/jackson/HourRangeJacksonDeserializer.java deleted file mode 100644 index cae4e3c..0000000 --- a/jackson/src/main/java/org/fuin/objects4j/jackson/HourRangeJacksonDeserializer.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (C) 2015 Michael Schnell. All rights reserved. - * http://www.fuin.org/ - *

- * This library is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by the Free - * Software Foundation; either version 3 of the License, or (at your option) any - * later version. - *

- * This library is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - *

- * You should have received a copy of the GNU Lesser General Public License - * along with this library. If not, see http://www.gnu.org/licenses/. - */ -package org.fuin.objects4j.jackson; - -import org.fuin.objects4j.core.HourRange; - -import javax.annotation.concurrent.ThreadSafe; - -/** - * Converts a String to a {@link HourRange}. - */ -@ThreadSafe -public final class HourRangeJacksonDeserializer extends ValueObjectStringJacksonDeserializer { - - /** - * Default constructor. - */ - public HourRangeJacksonDeserializer() { - super(HourRange.class, HourRange::valueOf); - } - -} diff --git a/jackson/src/main/java/org/fuin/objects4j/jackson/HourRangeJacksonSerializer.java b/jackson/src/main/java/org/fuin/objects4j/jackson/HourRangeJacksonSerializer.java deleted file mode 100644 index 8851bc8..0000000 --- a/jackson/src/main/java/org/fuin/objects4j/jackson/HourRangeJacksonSerializer.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (C) 2015 Michael Schnell. All rights reserved. - * http://www.fuin.org/ - * - * This library is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by the Free - * Software Foundation; either version 3 of the License, or (at your option) any - * later version. - * - * This library is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this library. If not, see http://www.gnu.org/licenses/. - */ -package org.fuin.objects4j.jackson; - -import org.fuin.objects4j.core.HourRange; - -import javax.annotation.concurrent.ThreadSafe; - -/** - * Converts a {@link HourRange} into a String. - */ -@ThreadSafe -public final class HourRangeJacksonSerializer extends ValueObjectStringJacksonSerializer { - - /** - * Default constructor. - */ - public HourRangeJacksonSerializer() { - super(HourRange.class, HourRange::valueOf); - } - -} diff --git a/jackson/src/main/java/org/fuin/objects4j/jackson/HourRangesJacksonDeserializer.java b/jackson/src/main/java/org/fuin/objects4j/jackson/HourRangesJacksonDeserializer.java deleted file mode 100644 index 4e13e35..0000000 --- a/jackson/src/main/java/org/fuin/objects4j/jackson/HourRangesJacksonDeserializer.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (C) 2015 Michael Schnell. All rights reserved. - * http://www.fuin.org/ - *

- * This library is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by the Free - * Software Foundation; either version 3 of the License, or (at your option) any - * later version. - *

- * This library is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - *

- * You should have received a copy of the GNU Lesser General Public License - * along with this library. If not, see http://www.gnu.org/licenses/. - */ -package org.fuin.objects4j.jackson; - -import org.fuin.objects4j.core.HourRanges; - -import javax.annotation.concurrent.ThreadSafe; - -/** - * Converts a String to a {@link HourRanges}. - */ -@ThreadSafe -public final class HourRangesJacksonDeserializer extends ValueObjectStringJacksonDeserializer { - - /** - * Default constructor. - */ - public HourRangesJacksonDeserializer() { - super(HourRanges.class, HourRanges::valueOf); - } - -} diff --git a/jackson/src/main/java/org/fuin/objects4j/jackson/HourRangesJacksonSerializer.java b/jackson/src/main/java/org/fuin/objects4j/jackson/HourRangesJacksonSerializer.java deleted file mode 100644 index 52b4d03..0000000 --- a/jackson/src/main/java/org/fuin/objects4j/jackson/HourRangesJacksonSerializer.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (C) 2015 Michael Schnell. All rights reserved. - * http://www.fuin.org/ - * - * This library is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by the Free - * Software Foundation; either version 3 of the License, or (at your option) any - * later version. - * - * This library is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this library. If not, see http://www.gnu.org/licenses/. - */ -package org.fuin.objects4j.jackson; - -import org.fuin.objects4j.core.HourRanges; - -import javax.annotation.concurrent.ThreadSafe; - -/** - * Converts {@link HourRanges} into a String. - */ -@ThreadSafe -public final class HourRangesJacksonSerializer extends ValueObjectStringJacksonSerializer { - - /** - * Default constructor. - */ - public HourRangesJacksonSerializer() { - super(HourRanges.class, HourRanges::valueOf); - } - -} diff --git a/jackson/src/main/java/org/fuin/objects4j/jackson/ImmutableObjectMapper.java b/jackson/src/main/java/org/fuin/objects4j/jackson/ImmutableObjectMapper.java new file mode 100644 index 0000000..5000da2 --- /dev/null +++ b/jackson/src/main/java/org/fuin/objects4j/jackson/ImmutableObjectMapper.java @@ -0,0 +1,145 @@ +package org.fuin.objects4j.jackson; + +import com.fasterxml.jackson.databind.Module; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectReader; +import com.fasterxml.jackson.databind.ObjectWriter; + +import javax.annotation.concurrent.NotThreadSafe; +import javax.annotation.concurrent.ThreadSafe; +import java.util.Objects; + +/** + * Thread-safe access to Jackson's {@link com.fasterxml.jackson.databind.ObjectMapper}. + * + * @param objectMapper Mapper that provides the reader and writer. + */ +@ThreadSafe +public record ImmutableObjectMapper(ObjectMapper objectMapper) { + + /** + * Thread-safe reader. + * + * @return Reader. + */ + public ObjectReader reader() { + return objectMapper.reader(); + } + + /** + * Thread-safe writer. + * + * @return Writer. + */ + public ObjectWriter writer() { + return objectMapper.writer(); + } + + /** + * Helper to allow late initialization of the mapper. + *

+ * To make the provider thread-safe for processing you need to finalize the instance + * by calling the {@link #mapper()} once your application startup has finished. + * For Spring and Quarkus a good option is to have another "@ApplicationScope" + * bean with a "@PostConstruct" method that will do it. + *

+ */ + @NotThreadSafe + public static final class Provider { + + private final Builder builder; + + private ImmutableObjectMapper mapper; + + /** + * Constructor with builder. + * + * @param builder Builder to use. + */ + public Provider(Builder builder) { + this.builder = Objects.requireNonNull(builder, "builder==null"); + } + + /** + * Returns the mapper. The instance will be built on first access. + * + * @return Instance. + */ + public ImmutableObjectMapper mapper() { + if (mapper == null) { + mapper = builder.build(); + } + return mapper; + } + + /** + * Convenience method to return the reader. + * + * @return Reader. + */ + public ObjectReader reader() { + return mapper().reader(); + } + + /** + * Convenience method to return the writer. + * + * @return Writer. + */ + public ObjectWriter writer() { + return mapper().writer(); + } + + } + + /** + * Builds an instance of the outer class. + */ + @NotThreadSafe + public static final class Builder { + + private final ObjectMapper mapper; + + private boolean built; + + /** + * Constructor with mapper. + * + * @param mapper Delegate. + */ + public Builder(ObjectMapper mapper) { + this.mapper = Objects.requireNonNull(mapper, "mapper==null"); + built = false; + } + + /** + * Registers a module. + * + * @param module Module to register. + */ + public void registerModule(Module module) { + ensureNotBuilt(); + mapper.registerModule(module); + } + + /** + * Creates an immutable object mapper. After calling this method the builder cannot be used anymore. + * + * @return Instance. + */ + public ImmutableObjectMapper build() { + ensureNotBuilt(); + built = true; + return new ImmutableObjectMapper(mapper); + } + + private void ensureNotBuilt() { + if (built) { + throw new IllegalStateException("The object mapper was already built. Modifications are not allowed anymore."); + } + } + + } + + +} diff --git a/jackson/src/main/java/org/fuin/objects4j/jackson/LocaleJacksonDeserializer.java b/jackson/src/main/java/org/fuin/objects4j/jackson/LocaleJacksonDeserializer.java index e12eb6c..6510ae2 100644 --- a/jackson/src/main/java/org/fuin/objects4j/jackson/LocaleJacksonDeserializer.java +++ b/jackson/src/main/java/org/fuin/objects4j/jackson/LocaleJacksonDeserializer.java @@ -25,7 +25,6 @@ import javax.annotation.concurrent.ThreadSafe; import java.io.IOException; -import java.util.Currency; import java.util.Locale; /** @@ -38,7 +37,7 @@ public final class LocaleJacksonDeserializer extends StdDeserializer { * Default constructor. */ public LocaleJacksonDeserializer() { - super(Currency.class); + super(Locale.class); } @Override diff --git a/jackson/src/main/java/org/fuin/objects4j/jackson/MultiDayOfTheWeekJacksonDeserializer.java b/jackson/src/main/java/org/fuin/objects4j/jackson/MultiDayOfTheWeekJacksonDeserializer.java deleted file mode 100644 index 6b51b84..0000000 --- a/jackson/src/main/java/org/fuin/objects4j/jackson/MultiDayOfTheWeekJacksonDeserializer.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (C) 2015 Michael Schnell. All rights reserved. - * http://www.fuin.org/ - * - * This library is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by the Free - * Software Foundation; either version 3 of the License, or (at your option) any - * later version. - * - * This library is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this library. If not, see http://www.gnu.org/licenses/. - */ -package org.fuin.objects4j.jackson; - -import org.fuin.objects4j.core.MultiDayOfTheWeek; - -import javax.annotation.concurrent.ThreadSafe; - -/** - * Converts String to a {@link MultiDayOfTheWeek}. - */ -@ThreadSafe -public final class MultiDayOfTheWeekJacksonDeserializer extends ValueObjectStringJacksonDeserializer { - - /** - * Default constructor. - */ - public MultiDayOfTheWeekJacksonDeserializer() { - super(MultiDayOfTheWeek.class, MultiDayOfTheWeek::valueOf); - } - -} diff --git a/jackson/src/main/java/org/fuin/objects4j/jackson/MultiDayOfTheWeekJacksonSerializer.java b/jackson/src/main/java/org/fuin/objects4j/jackson/MultiDayOfTheWeekJacksonSerializer.java deleted file mode 100644 index f31a27a..0000000 --- a/jackson/src/main/java/org/fuin/objects4j/jackson/MultiDayOfTheWeekJacksonSerializer.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (C) 2015 Michael Schnell. All rights reserved. - * http://www.fuin.org/ - * - * This library is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by the Free - * Software Foundation; either version 3 of the License, or (at your option) any - * later version. - * - * This library is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this library. If not, see http://www.gnu.org/licenses/. - */ -package org.fuin.objects4j.jackson; - -import org.fuin.objects4j.core.MultiDayOfTheWeek; - -import javax.annotation.concurrent.ThreadSafe; - -/** - * Converts {@link MultiDayOfTheWeek} into a String. - */ -@ThreadSafe -public final class MultiDayOfTheWeekJacksonSerializer extends ValueObjectStringJacksonSerializer { - - /** - * Default constructor. - */ - public MultiDayOfTheWeekJacksonSerializer() { - super(MultiDayOfTheWeek.class, MultiDayOfTheWeek::valueOf); - } - -} diff --git a/jackson/src/main/java/org/fuin/objects4j/jackson/Objects4JJacksonAdapterModule.java b/jackson/src/main/java/org/fuin/objects4j/jackson/Objects4JJacksonAdapterModule.java deleted file mode 100644 index a6fd38c..0000000 --- a/jackson/src/main/java/org/fuin/objects4j/jackson/Objects4JJacksonAdapterModule.java +++ /dev/null @@ -1,77 +0,0 @@ -package org.fuin.objects4j.jackson; - -import com.fasterxml.jackson.core.Version; -import com.fasterxml.jackson.databind.Module; -import com.fasterxml.jackson.databind.module.SimpleDeserializers; -import com.fasterxml.jackson.databind.module.SimpleSerializers; -import org.fuin.objects4j.core.CurrencyAmount; -import org.fuin.objects4j.core.DayOfTheWeek; -import org.fuin.objects4j.core.DayOpeningHours; -import org.fuin.objects4j.core.EmailAddress; -import org.fuin.objects4j.core.Hour; -import org.fuin.objects4j.core.HourRange; -import org.fuin.objects4j.core.HourRanges; -import org.fuin.objects4j.core.MultiDayOfTheWeek; -import org.fuin.objects4j.core.PasswordSha512; -import org.fuin.objects4j.core.UserName; -import org.fuin.objects4j.core.WeeklyOpeningHours; - -import java.util.Currency; -import java.util.Locale; -import java.util.UUID; - -/** - * Module that registers the adapters for the package. - */ -public class Objects4JJacksonAdapterModule extends Module { - - @Override - public String getModuleName() { - return "Objects4JModule"; - } - - @Override - public void setupModule(Module.SetupContext context) { - - final SimpleSerializers serializers = new SimpleSerializers(); - serializers.addSerializer(new CurrencyAmountJacksonSerializer()); - serializers.addSerializer(new CurrencyJacksonSerializer()); - serializers.addSerializer(new DayOfTheWeekJacksonSerializer()); - serializers.addSerializer(new DayOpeningHoursJacksonSerializer()); - serializers.addSerializer(new EmailAddressJacksonSerializer()); - serializers.addSerializer(new HourJacksonSerializer()); - serializers.addSerializer(new HourRangeJacksonSerializer()); - serializers.addSerializer(new HourRangesJacksonSerializer()); - serializers.addSerializer(new LocaleJacksonSerializer()); - serializers.addSerializer(new MultiDayOfTheWeekJacksonSerializer()); - serializers.addSerializer(new PasswordSha512JacksonSerializer()); - serializers.addSerializer(new UserNameJacksonSerializer()); - serializers.addSerializer(new UUIDJacksonSerializer()); - serializers.addSerializer(new WeeklyOpeningHoursJacksonSerializer()); - context.addSerializers(serializers); - - final SimpleDeserializers deserializers = new SimpleDeserializers(); - deserializers.addDeserializer(CurrencyAmount.class, new CurrencyAmountJacksonDeserializer()); - deserializers.addDeserializer(Currency.class, new CurrencyJacksonDeserializer()); - deserializers.addDeserializer(DayOfTheWeek.class, new DayOfTheWeekJacksonDeserializer()); - deserializers.addDeserializer(DayOpeningHours.class, new DayOpeningHoursJacksonDeserializer()); - deserializers.addDeserializer(EmailAddress.class, new EmailAddressJacksonDeserializer()); - deserializers.addDeserializer(Hour.class, new HourJacksonDeserializer()); - deserializers.addDeserializer(HourRange.class, new HourRangeJacksonDeserializer()); - deserializers.addDeserializer(HourRanges.class, new HourRangesJacksonDeserializer()); - deserializers.addDeserializer(Locale.class, new LocaleJacksonDeserializer()); - deserializers.addDeserializer(MultiDayOfTheWeek.class, new MultiDayOfTheWeekJacksonDeserializer()); - deserializers.addDeserializer(PasswordSha512.class, new PasswordSha512JacksonDeserializer()); - deserializers.addDeserializer(UserName.class, new UserNameJacksonDeserializer()); - deserializers.addDeserializer(UUID.class, new UUIDJacksonDeserializer()); - deserializers.addDeserializer(WeeklyOpeningHours.class, new WeeklyOpeningHoursJacksonDeserializer()); - context.addDeserializers(deserializers); - } - - @Override - public Version version() { - // Don't forget to change from release to SNAPSHOT and back! - return new Version(0, 10, 0, null); - } - -} \ No newline at end of file diff --git a/jackson/src/main/java/org/fuin/objects4j/jackson/Objects4JJacksonModule.java b/jackson/src/main/java/org/fuin/objects4j/jackson/Objects4JJacksonModule.java new file mode 100644 index 0000000..1593757 --- /dev/null +++ b/jackson/src/main/java/org/fuin/objects4j/jackson/Objects4JJacksonModule.java @@ -0,0 +1,78 @@ +package org.fuin.objects4j.jackson; + +import com.fasterxml.jackson.core.Version; +import com.fasterxml.jackson.databind.Module; +import com.fasterxml.jackson.databind.module.SimpleDeserializers; +import com.fasterxml.jackson.databind.module.SimpleSerializers; +import org.fuin.objects4j.core.CurrencyAmount; +import org.fuin.objects4j.core.DayOfTheWeek; +import org.fuin.objects4j.core.DayOpeningHours; +import org.fuin.objects4j.core.EmailAddress; +import org.fuin.objects4j.core.Hour; +import org.fuin.objects4j.core.HourRange; +import org.fuin.objects4j.core.HourRanges; +import org.fuin.objects4j.core.MultiDayOfTheWeek; +import org.fuin.objects4j.core.PasswordSha512; +import org.fuin.objects4j.core.UserName; +import org.fuin.objects4j.core.WeeklyOpeningHours; + +import java.util.Currency; +import java.util.Locale; +import java.util.UUID; + +/** + * Module that registers the adapters for the package. + */ +public class Objects4JJacksonModule extends Module { + + @Override + public String getModuleName() { + return "Objects4JModule"; + } + + @Override + public void setupModule(Module.SetupContext context) { + + final SimpleSerializers serializers = new SimpleSerializers(); + serializers.addSerializer(new ValueObjectStringJacksonSerializer<>(CurrencyAmount.class)); + serializers.addSerializer(new CurrencyJacksonSerializer()); + serializers.addSerializer(new ValueObjectStringJacksonSerializer<>(DayOfTheWeek.class)); + serializers.addSerializer(new ValueObjectStringJacksonSerializer<>(DayOpeningHours.class)); + serializers.addSerializer(new ValueObjectStringJacksonSerializer<>(EmailAddress.class)); + serializers.addSerializer(new ValueObjectStringJacksonSerializer<>(Hour.class)); + serializers.addSerializer(new ValueObjectStringJacksonSerializer<>(HourRange.class)); + serializers.addSerializer(new ValueObjectStringJacksonSerializer<>(HourRanges.class)); + serializers.addSerializer(new LocaleJacksonSerializer()); + serializers.addSerializer(new ValueObjectStringJacksonSerializer<>(MultiDayOfTheWeek.class)); + serializers.addSerializer(new ValueObjectStringJacksonSerializer<>(PasswordSha512.class)); + serializers.addSerializer(new ValueObjectStringJacksonSerializer<>(UserName.class)); + serializers.addSerializer(new UUIDJacksonSerializer()); + serializers.addSerializer(new ValueObjectStringJacksonSerializer<>(WeeklyOpeningHours.class)); + context.addSerializers(serializers); + + final SimpleDeserializers deserializers = new SimpleDeserializers(); + deserializers.addDeserializer(CurrencyAmount.class, new ValueObjectStringJacksonDeserializer<>(CurrencyAmount.class, CurrencyAmount::valueOf)); + deserializers.addDeserializer(Currency.class, new CurrencyJacksonDeserializer()); + deserializers.addDeserializer(DayOfTheWeek.class, new ValueObjectStringJacksonDeserializer<>(DayOfTheWeek.class, DayOfTheWeek::valueOf)); + deserializers.addDeserializer(DayOpeningHours.class, new ValueObjectStringJacksonDeserializer<>(DayOpeningHours.class, DayOpeningHours::valueOf)); + deserializers.addDeserializer(EmailAddress.class, new ValueObjectStringJacksonDeserializer<>(EmailAddress.class, EmailAddress::valueOf)); + deserializers.addDeserializer(Hour.class, new ValueObjectStringJacksonDeserializer<>(Hour.class, Hour::valueOf)); + deserializers.addDeserializer(HourRange.class, new ValueObjectStringJacksonDeserializer<>(HourRange.class, HourRange::valueOf)); + deserializers.addDeserializer(HourRanges.class, new ValueObjectStringJacksonDeserializer<>(HourRanges.class, HourRanges::valueOf)); + deserializers.addDeserializer(Locale.class, new LocaleJacksonDeserializer()); + deserializers.addDeserializer(MultiDayOfTheWeek.class, new ValueObjectStringJacksonDeserializer<>(MultiDayOfTheWeek.class, MultiDayOfTheWeek::valueOf)); + deserializers.addDeserializer(PasswordSha512.class, new ValueObjectStringJacksonDeserializer<>(PasswordSha512.class, PasswordSha512::valueOf)); + deserializers.addDeserializer(UserName.class, new ValueObjectStringJacksonDeserializer<>(UserName.class, UserName::valueOf)); + deserializers.addDeserializer(UUID.class, new UUIDJacksonDeserializer()); + deserializers.addDeserializer(WeeklyOpeningHours.class, new ValueObjectStringJacksonDeserializer<>(WeeklyOpeningHours.class, WeeklyOpeningHours::valueOf)); + context.addDeserializers(deserializers); + } + + @Override + public Version version() { + // Don't forget to change from release to SNAPSHOT and back! + return new Version(0, 11, 0, "SNAPSHOT", + "org.fuin.objects4j", "objects4j-jackson"); + } + +} \ No newline at end of file diff --git a/jackson/src/main/java/org/fuin/objects4j/jackson/Objects4JacksonUtils.java b/jackson/src/main/java/org/fuin/objects4j/jackson/Objects4JacksonUtils.java new file mode 100644 index 0000000..5b32dc4 --- /dev/null +++ b/jackson/src/main/java/org/fuin/objects4j/jackson/Objects4JacksonUtils.java @@ -0,0 +1,140 @@ +/** + * Copyright (C) 2015 Michael Schnell. All rights reserved. + * http://www.fuin.org/ + *

+ * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 3 of the License, or (at your option) any + * later version. + *

+ * This library is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + *

+ * You should have received a copy of the GNU Lesser General Public License + * along with this library. If not, see http://www.gnu.org/licenses/. + */ +package org.fuin.objects4j.jackson; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.JsonSerializer; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * Utilities for the Jackson serialization module. + */ +public final class Objects4JacksonUtils { + + /** + * Private utility constructor. + */ + private Objects4JacksonUtils() { + throw new UnsupportedOperationException("Creating instances of a utility class is not allowed."); + } + + /** + * Creates all available Jakcson serializers necessary for the ESC implementation. + * + * @return New array with serializers. + */ + public static JsonSerializer[] joinJacksonSerializers(final JsonSerializer[] serializersA, + final JsonSerializer... serializersB) { + return joinJacksonSerializerArrays(serializersA, serializersB); + } + + /** + * Creates all available JSON-B serializers necessary for the ESC implementation. + * + * @return New array with serializers. + */ + public static JsonSerializer[] joinJacksonSerializerArrays(final JsonSerializer[]... serializerArrays) { + final List> all = joinArrays(serializerArrays); + return all.toArray(new JsonSerializer[0]); + } + + /** + * Creates all available JSON-B deserializers necessary for the ESC implementation. + * + * @return New array with deserializers. + */ + public static JsonDeserializer[] joinJacksonDeserializers(final JsonDeserializer[] deserializersA, + final JsonDeserializer... deserializersB) { + return joinJacksonDeserializerArrays(deserializersA, deserializersB); + } + + /** + * Creates all available JSON-B deserializers necessary for the ESC implementation. + * + * @return New array with deserializers. + */ + public static JsonDeserializer[] joinJacksonDeserializerArrays(final JsonDeserializer[]... deserializerArrays) { + final List> all = joinArrays(deserializerArrays); + return all.toArray(new JsonDeserializer[0]); + } + + /** + * Creates all available JSON-B serializers necessary for the ESC implementation. + * + * @return New array with serializers. + */ + @SafeVarargs + static List joinArrays(final T[]... arrays) { + final List all = new ArrayList<>(); + for (final T[] array : arrays) { + all.addAll(Arrays.asList(array)); + } + return all; + } + + /** + * Deserializes a node to the given type. + * + * @param jp Parser used for reading JSON content + * @param ctxt Context that can be used to access information about this deserialization activity. + * @param fqnClassName Fullyqualified name of the expected class. + * @param node Node with object. + * @param Expected type. + * @return Deserialized instance. + */ + @SuppressWarnings("unchecked") + public static T deserialize(JsonParser jp, DeserializationContext ctxt, String fqnClassName, JsonNode node) { + try { + final Class clasz = (Class) Class.forName(fqnClassName); + return deserialize(jp, ctxt, clasz, node); + } catch (final ClassNotFoundException ex) { + throw new IllegalStateException("The class '" + fqnClassName + "' needed to deserialize the node is unknwon: " + node, ex); + } + } + + /** + * Deserializes a node to the given type. + * + * @param jp Parser used for reading JSON content + * @param ctxt Context that can be used to access information about this deserialization activity. + * @param clasz Expected class. + * @param node Node with object. + * @param Expected type. + * @return Deserialized instance. + */ + @SuppressWarnings("unchecked") + public static T deserialize(JsonParser jp, DeserializationContext ctxt, Class clasz, JsonNode node) { + try { + final JavaType javaType = ctxt.getTypeFactory().constructType(clasz); + final JsonDeserializer deserializer = ctxt.findRootValueDeserializer(javaType); + final JsonParser parser = node.traverse(jp.getCodec()); + parser.nextToken(); + return (T) deserializer.deserialize(parser, ctxt); + } catch (final Exception ex) { + throw new IllegalStateException("Failed to deserialize '" + clasz.getName() + "' from: " + node, ex); + } + } + +} diff --git a/jackson/src/main/java/org/fuin/objects4j/jackson/PasswordSha512JacksonDeserializer.java b/jackson/src/main/java/org/fuin/objects4j/jackson/PasswordSha512JacksonDeserializer.java deleted file mode 100644 index a564b67..0000000 --- a/jackson/src/main/java/org/fuin/objects4j/jackson/PasswordSha512JacksonDeserializer.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (C) 2015 Michael Schnell. All rights reserved. - * http://www.fuin.org/ - * - * This library is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by the Free - * Software Foundation; either version 3 of the License, or (at your option) any - * later version. - * - * This library is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this library. If not, see http://www.gnu.org/licenses/. - */ -package org.fuin.objects4j.jackson; - -import org.fuin.objects4j.core.PasswordSha512; - -import javax.annotation.concurrent.ThreadSafe; - -/** - * Converts a String to a {@link PasswordSha512}. - */ -@ThreadSafe -public class PasswordSha512JacksonDeserializer extends ValueObjectStringJacksonDeserializer { - - /** - * Default constructor. - */ - public PasswordSha512JacksonDeserializer() { - super(PasswordSha512.class, PasswordSha512::valueOf); - } - -} diff --git a/jackson/src/main/java/org/fuin/objects4j/jackson/PasswordSha512JacksonSerializer.java b/jackson/src/main/java/org/fuin/objects4j/jackson/PasswordSha512JacksonSerializer.java deleted file mode 100644 index b4b0c64..0000000 --- a/jackson/src/main/java/org/fuin/objects4j/jackson/PasswordSha512JacksonSerializer.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (C) 2015 Michael Schnell. All rights reserved. - * http://www.fuin.org/ - * - * This library is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by the Free - * Software Foundation; either version 3 of the License, or (at your option) any - * later version. - * - * This library is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this library. If not, see http://www.gnu.org/licenses/. - */ -package org.fuin.objects4j.jackson; - -import org.fuin.objects4j.core.PasswordSha512; - -import javax.annotation.concurrent.ThreadSafe; - -/** - * Converts a {@link PasswordSha512} into a String. - */ -@ThreadSafe -public class PasswordSha512JacksonSerializer extends ValueObjectStringJacksonSerializer { - - /** - * Default constructor. - */ - public PasswordSha512JacksonSerializer() { - super(PasswordSha512.class, PasswordSha512::valueOf); - } - -} diff --git a/jackson/src/main/java/org/fuin/objects4j/jackson/UserNameJacksonDeserializer.java b/jackson/src/main/java/org/fuin/objects4j/jackson/UserNameJacksonDeserializer.java deleted file mode 100644 index f335673..0000000 --- a/jackson/src/main/java/org/fuin/objects4j/jackson/UserNameJacksonDeserializer.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (C) 2015 Michael Schnell. All rights reserved. - * http://www.fuin.org/ - *

- * This library is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by the Free - * Software Foundation; either version 3 of the License, or (at your option) any - * later version. - *

- * This library is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - *

- * You should have received a copy of the GNU Lesser General Public License - * along with this library. If not, see http://www.gnu.org/licenses/. - */ -package org.fuin.objects4j.jackson; - -import org.fuin.objects4j.core.UserName; - -import javax.annotation.concurrent.ThreadSafe; - -/** - * Converts a String to a {@link UserName}. - */ -@ThreadSafe -public final class UserNameJacksonDeserializer extends ValueObjectStringJacksonDeserializer { - - /** - * Default constructor. - */ - public UserNameJacksonDeserializer() { - super(UserName.class, UserName::valueOf); - } - -} diff --git a/jackson/src/main/java/org/fuin/objects4j/jackson/UserNameJacksonSerializer.java b/jackson/src/main/java/org/fuin/objects4j/jackson/UserNameJacksonSerializer.java deleted file mode 100644 index 49e7c87..0000000 --- a/jackson/src/main/java/org/fuin/objects4j/jackson/UserNameJacksonSerializer.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (C) 2015 Michael Schnell. All rights reserved. - * http://www.fuin.org/ - * - * This library is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by the Free - * Software Foundation; either version 3 of the License, or (at your option) any - * later version. - * - * This library is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this library. If not, see http://www.gnu.org/licenses/. - */ -package org.fuin.objects4j.jackson; - -import org.fuin.objects4j.core.UserName; - -import javax.annotation.concurrent.ThreadSafe; - -/** - * Converts {@link UserName} into a String. - */ -@ThreadSafe -public final class UserNameJacksonSerializer extends ValueObjectStringJacksonSerializer { - - /** - * Default constructor. - */ - public UserNameJacksonSerializer() { - super(UserName.class, UserName::valueOf); - } - -} diff --git a/jackson/src/main/java/org/fuin/objects4j/jackson/ValueObjectStringJacksonDeserializer.java b/jackson/src/main/java/org/fuin/objects4j/jackson/ValueObjectStringJacksonDeserializer.java index ecde819..e859bc6 100644 --- a/jackson/src/main/java/org/fuin/objects4j/jackson/ValueObjectStringJacksonDeserializer.java +++ b/jackson/src/main/java/org/fuin/objects4j/jackson/ValueObjectStringJacksonDeserializer.java @@ -23,8 +23,8 @@ import com.fasterxml.jackson.databind.deser.std.StdDeserializer; import jakarta.validation.constraints.NotNull; import org.fuin.objects4j.common.Contract; -import org.fuin.objects4j.common.AsStringCapable; import org.fuin.objects4j.common.ValueOfCapable; +import org.fuin.utils4j.TestOmitted; import java.io.IOException; @@ -33,7 +33,8 @@ * * @param Type to convert. */ -public abstract class ValueObjectStringJacksonDeserializer extends StdDeserializer { +@TestOmitted("Already tested with other classes") +public final class ValueObjectStringJacksonDeserializer extends StdDeserializer { private final ValueOfCapable vop; @@ -42,7 +43,8 @@ public abstract class ValueObjectStringJacksonDeserializer clasz, @NotNull final ValueOfCapable vop) { + public ValueObjectStringJacksonDeserializer(@NotNull final Class clasz, + @NotNull final ValueOfCapable vop) { super(clasz); Contract.requireArgNotNull("vop", vop); this.vop = vop; diff --git a/jackson/src/main/java/org/fuin/objects4j/jackson/ValueObjectStringJacksonSerializer.java b/jackson/src/main/java/org/fuin/objects4j/jackson/ValueObjectStringJacksonSerializer.java index d6251c2..c94209d 100644 --- a/jackson/src/main/java/org/fuin/objects4j/jackson/ValueObjectStringJacksonSerializer.java +++ b/jackson/src/main/java/org/fuin/objects4j/jackson/ValueObjectStringJacksonSerializer.java @@ -22,7 +22,7 @@ import com.fasterxml.jackson.databind.ser.std.StdSerializer; import jakarta.validation.constraints.NotNull; import org.fuin.objects4j.common.AsStringCapable; -import org.fuin.objects4j.common.ValueOfCapable; +import org.fuin.utils4j.TestOmitted; import java.io.IOException; @@ -31,14 +31,13 @@ * * @param Type to convert. */ -public abstract class ValueObjectStringJacksonSerializer extends StdSerializer { +@TestOmitted("Already tested with other classes") +public final class ValueObjectStringJacksonSerializer extends StdSerializer { /** * Constructor with mandatory data. - * - * @param vop Provides a valueOf method. */ - public ValueObjectStringJacksonSerializer(@NotNull final Class clasz, @NotNull final ValueOfCapable vop) { + public ValueObjectStringJacksonSerializer(@NotNull final Class clasz) { super(clasz); } diff --git a/jackson/src/main/java/org/fuin/objects4j/jackson/WeeklyOpeningHoursJacksonDeserializer.java b/jackson/src/main/java/org/fuin/objects4j/jackson/WeeklyOpeningHoursJacksonDeserializer.java deleted file mode 100644 index b79af65..0000000 --- a/jackson/src/main/java/org/fuin/objects4j/jackson/WeeklyOpeningHoursJacksonDeserializer.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (C) 2015 Michael Schnell. All rights reserved. - * http://www.fuin.org/ - *

- * This library is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by the Free - * Software Foundation; either version 3 of the License, or (at your option) any - * later version. - *

- * This library is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - *

- * You should have received a copy of the GNU Lesser General Public License - * along with this library. If not, see http://www.gnu.org/licenses/. - */ -package org.fuin.objects4j.jackson; - -import org.fuin.objects4j.core.WeeklyOpeningHours; - -import javax.annotation.concurrent.ThreadSafe; - -/** - * Converts String to a {@link WeeklyOpeningHours}. - */ -@ThreadSafe -public final class WeeklyOpeningHoursJacksonDeserializer extends ValueObjectStringJacksonDeserializer { - - /** - * Default constructor. - */ - public WeeklyOpeningHoursJacksonDeserializer() { - super(WeeklyOpeningHours.class, WeeklyOpeningHours::valueOf); - } - -} diff --git a/jackson/src/main/java/org/fuin/objects4j/jackson/WeeklyOpeningHoursJacksonSerializer.java b/jackson/src/main/java/org/fuin/objects4j/jackson/WeeklyOpeningHoursJacksonSerializer.java deleted file mode 100644 index ae2766e..0000000 --- a/jackson/src/main/java/org/fuin/objects4j/jackson/WeeklyOpeningHoursJacksonSerializer.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (C) 2015 Michael Schnell. All rights reserved. - * http://www.fuin.org/ - * - * This library is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by the Free - * Software Foundation; either version 3 of the License, or (at your option) any - * later version. - * - * This library is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this library. If not, see http://www.gnu.org/licenses/. - */ -package org.fuin.objects4j.jackson; - -import org.fuin.objects4j.core.WeeklyOpeningHours; - -import javax.annotation.concurrent.ThreadSafe; - -/** - * Converts {@link WeeklyOpeningHours} into a String. - */ -@ThreadSafe -public final class WeeklyOpeningHoursJacksonSerializer extends ValueObjectStringJacksonSerializer { - - /** - * Default constructor. - */ - public WeeklyOpeningHoursJacksonSerializer() { - super(WeeklyOpeningHours.class, WeeklyOpeningHours::valueOf); - } - -} diff --git a/jackson/src/main/resources/META-INF/services/com.fasterxml.jackson.databind.Module b/jackson/src/main/resources/META-INF/services/com.fasterxml.jackson.databind.Module index 8f83398..2084454 100644 --- a/jackson/src/main/resources/META-INF/services/com.fasterxml.jackson.databind.Module +++ b/jackson/src/main/resources/META-INF/services/com.fasterxml.jackson.databind.Module @@ -1 +1 @@ -org.fuin.objects4j.jackson.Objects4JJacksonAdapterModule \ No newline at end of file +org.fuin.objects4j.jackson.Objects4JJacksonModule \ No newline at end of file diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/AnyStr.java b/jackson/src/test/java/org/fuin/objects4j/jackson/AnyStr.java deleted file mode 100644 index 79c1db5..0000000 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/AnyStr.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.fuin.objects4j.jackson; - -import org.fuin.objects4j.common.Contract; -import org.fuin.objects4j.core.AbstractStringValueObject; -import org.fuin.utils4j.TestOmitted; - -import java.io.Serial; - -/** - * Test implementation for a {@link AbstractStringValueObject}. - */ -@TestOmitted("Only a test class") -public final class AnyStr extends AbstractStringValueObject { - - @Serial - private static final long serialVersionUID = 1L; - - private final String str; - - /** - * Constructor with manadatory data. - * - * @param str - * String. - */ - public AnyStr(final String str) { - super(); - Contract.requireArgNotNull("str", str); - this.str = str; - } - - @Override - public String asBaseType() { - return str; - } - - /** - * Converts a given string into an instance of this class. - * - * @param str - * String to convert. - * - * @return New instance. - */ - public static AnyStr valueOf(String str) { - return new AnyStr(str); - } - -} \ No newline at end of file diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/AnyStrJacksonDeserializer.java b/jackson/src/test/java/org/fuin/objects4j/jackson/AnyStrJacksonDeserializer.java deleted file mode 100644 index fc7bedf..0000000 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/AnyStrJacksonDeserializer.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.fuin.objects4j.jackson; - -import org.fuin.utils4j.TestOmitted; - -/** - * Test implementation for a {@link ValueObjectStringJacksonDeserializer}. - */ -@TestOmitted("Only a test class") -public class AnyStrJacksonDeserializer extends ValueObjectStringJacksonDeserializer { - - /** - * Default constructor. - */ - public AnyStrJacksonDeserializer() { - super(AnyStr.class, AnyStr::valueOf); - } - -} \ No newline at end of file diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/AnyStrJacksonSerializer.java b/jackson/src/test/java/org/fuin/objects4j/jackson/AnyStrJacksonSerializer.java deleted file mode 100644 index b697c92..0000000 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/AnyStrJacksonSerializer.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.fuin.objects4j.jackson; - -import org.fuin.utils4j.TestOmitted; - -/** - * Test implementation for a {@link ValueObjectStringJacksonSerializer}. - */ -@TestOmitted("Only a test class") -public class AnyStrJacksonSerializer extends ValueObjectStringJacksonSerializer { - - /** - * Default constructor. - */ - public AnyStrJacksonSerializer() { - super(AnyStr.class, AnyStr::valueOf); - } - -} \ No newline at end of file diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/ArchitectureTest.java b/jackson/src/test/java/org/fuin/objects4j/jackson/ArchitectureTest.java index 9bf0407..48328fc 100644 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/ArchitectureTest.java +++ b/jackson/src/test/java/org/fuin/objects4j/jackson/ArchitectureTest.java @@ -46,9 +46,14 @@ class ArchitectureTest { .should() .onlyDependOnClassesThat() .resideInAnyPackage(JACKSON_PACKAGE, COMMON_PACKAGE, CORE_PACKAGE, - "java.lang..", "java.util..", "java.io", - "jakarta.validation..", "jakarta.annotation..", "com.fasterxml.jackson..", - "javax.annotation.concurrent"); + "java.lang..", + "java.util..", + "java.io", + "jakarta.validation..", + "jakarta.annotation..", + "com.fasterxml.jackson..", + "javax.annotation.concurrent", + "org.fuin.utils4j.."); } diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/BaseTest.java b/jackson/src/test/java/org/fuin/objects4j/jackson/BaseTest.java index d62eac1..f50f7af 100644 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/BaseTest.java +++ b/jackson/src/test/java/org/fuin/objects4j/jackson/BaseTest.java @@ -22,7 +22,7 @@ import com.tngtech.archunit.lang.ArchRule; import org.fuin.units4j.archunit.Units4JConditions; -@AnalyzeClasses(packagesOf = CurrencyAmountJacksonSerializer.class) +@AnalyzeClasses(packagesOf = BaseTest.class) public class BaseTest { @ArchTest diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/CurrencyAmountJacksonDeserializerTest.java b/jackson/src/test/java/org/fuin/objects4j/jackson/CurrencyAmountJacksonDeserializerTest.java index b3135bb..822b29b 100644 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/CurrencyAmountJacksonDeserializerTest.java +++ b/jackson/src/test/java/org/fuin/objects4j/jackson/CurrencyAmountJacksonDeserializerTest.java @@ -18,7 +18,6 @@ package org.fuin.objects4j.jackson; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import org.fuin.objects4j.core.CurrencyAmount; import org.junit.jupiter.api.Test; @@ -26,7 +25,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; /** - * Test for the {@link CurrencyAmountJacksonDeserializer} class. + * Test for {@link CurrencyAmount} deserialization. */ class CurrencyAmountJacksonDeserializerTest { diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/CurrencyAmountJacksonSerializerTest.java b/jackson/src/test/java/org/fuin/objects4j/jackson/CurrencyAmountJacksonSerializerTest.java index 70414f1..1722876 100644 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/CurrencyAmountJacksonSerializerTest.java +++ b/jackson/src/test/java/org/fuin/objects4j/jackson/CurrencyAmountJacksonSerializerTest.java @@ -18,14 +18,13 @@ package org.fuin.objects4j.jackson; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import org.fuin.objects4j.core.CurrencyAmount; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; /** - * Test for the {@link CurrencyAmountJacksonSerializer} class. + * Test for {@link CurrencyAmount} serialization. */ class CurrencyAmountJacksonSerializerTest { diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/CurrencyJacksonDeserializerTest.java b/jackson/src/test/java/org/fuin/objects4j/jackson/CurrencyJacksonDeserializerTest.java index 2a0f935..e0640e5 100644 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/CurrencyJacksonDeserializerTest.java +++ b/jackson/src/test/java/org/fuin/objects4j/jackson/CurrencyJacksonDeserializerTest.java @@ -18,7 +18,6 @@ package org.fuin.objects4j.jackson; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import java.util.Currency; diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/CurrencyJacksonSerializerTest.java b/jackson/src/test/java/org/fuin/objects4j/jackson/CurrencyJacksonSerializerTest.java index 5e1fee1..e6392a5 100644 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/CurrencyJacksonSerializerTest.java +++ b/jackson/src/test/java/org/fuin/objects4j/jackson/CurrencyJacksonSerializerTest.java @@ -18,7 +18,6 @@ package org.fuin.objects4j.jackson; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import java.util.Currency; diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/Data.java b/jackson/src/test/java/org/fuin/objects4j/jackson/Data.java index aa7959f..0816618 100644 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/Data.java +++ b/jackson/src/test/java/org/fuin/objects4j/jackson/Data.java @@ -18,8 +18,6 @@ package org.fuin.objects4j.jackson; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; import org.fuin.objects4j.core.CurrencyAmount; import org.fuin.objects4j.core.DayOfTheWeek; import org.fuin.objects4j.core.DayOpeningHours; @@ -43,67 +41,34 @@ @TestOmitted("Only a test class") public class Data { - @JsonSerialize(using = EmailAddressJacksonSerializer.class) - @JsonDeserialize(using = EmailAddressJacksonDeserializer.class) public EmailAddress email; - @JsonSerialize(using = PasswordSha512JacksonSerializer.class) - @JsonDeserialize(using = PasswordSha512JacksonDeserializer.class) public PasswordSha512 passwordSha512; - @JsonSerialize(using = UserNameJacksonSerializer.class) - @JsonDeserialize(using = UserNameJacksonDeserializer.class) public UserName userName; - @JsonSerialize(using = UUIDJacksonSerializer.class) - @JsonDeserialize(using = UUIDJacksonDeserializer.class) public UUID uuid; @JsonProperty("ca") - @JsonSerialize(using = CurrencyAmountJacksonSerializer.class) - @JsonDeserialize(using = CurrencyAmountJacksonDeserializer.class) public CurrencyAmount currencyAmount; @JsonProperty("c") - @JsonSerialize(using = CurrencyJacksonSerializer.class) - @JsonDeserialize(using = CurrencyJacksonDeserializer.class) public Currency currency; - @JsonProperty("any-str") - @JsonSerialize(using = AnyStrJacksonSerializer.class) - @JsonDeserialize(using = AnyStrJacksonDeserializer.class) - public AnyStr anyStr; - - @JsonSerialize(using = HourJacksonSerializer.class) - @JsonDeserialize(using = HourJacksonDeserializer.class) public Hour hour; - @JsonSerialize(using = HourRangeJacksonSerializer.class) - @JsonDeserialize(using = HourRangeJacksonDeserializer.class) public HourRange hourRange; - @JsonSerialize(using = HourRangesJacksonSerializer.class) - @JsonDeserialize(using = HourRangesJacksonDeserializer.class) public HourRanges hourRanges; - @JsonSerialize(using = DayOfTheWeekJacksonSerializer.class) - @JsonDeserialize(using = DayOfTheWeekJacksonDeserializer.class) public DayOfTheWeek dayOfTheWeek; - @JsonSerialize(using = MultiDayOfTheWeekJacksonSerializer.class) - @JsonDeserialize(using = MultiDayOfTheWeekJacksonDeserializer.class) public MultiDayOfTheWeek multiDayOfTheWeek; - @JsonSerialize(using = DayOpeningHoursJacksonSerializer.class) - @JsonDeserialize(using = DayOpeningHoursJacksonDeserializer.class) public DayOpeningHours dayOpeningHours; - @JsonSerialize(using = WeeklyOpeningHoursJacksonSerializer.class) - @JsonDeserialize(using = WeeklyOpeningHoursJacksonDeserializer.class) public WeeklyOpeningHours weeklyOpeningHours; - @JsonSerialize(using = LocaleJacksonSerializer.class) - @JsonDeserialize(using = LocaleJacksonDeserializer.class) public Locale locale; } diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/DayOfTheWeekJacksonDeserializerTest.java b/jackson/src/test/java/org/fuin/objects4j/jackson/DayOfTheWeekJacksonDeserializerTest.java index 032e56e..b40208c 100644 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/DayOfTheWeekJacksonDeserializerTest.java +++ b/jackson/src/test/java/org/fuin/objects4j/jackson/DayOfTheWeekJacksonDeserializerTest.java @@ -26,7 +26,7 @@ /** - * Test for the {@link DayOfTheWeekJacksonDeserializer} class. + * Test for {@link DayOfTheWeek} deserialization. */ public class DayOfTheWeekJacksonDeserializerTest { diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/DayOfTheWeekJacksonSerializerTest.java b/jackson/src/test/java/org/fuin/objects4j/jackson/DayOfTheWeekJacksonSerializerTest.java index f4c85ec..55fb088 100644 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/DayOfTheWeekJacksonSerializerTest.java +++ b/jackson/src/test/java/org/fuin/objects4j/jackson/DayOfTheWeekJacksonSerializerTest.java @@ -25,7 +25,7 @@ /** - * Test for the {@link DayOfTheWeekJacksonSerializer} class. + * Test for {@link DayOfTheWeek} serialization. */ public class DayOfTheWeekJacksonSerializerTest { diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/DayOpeningHoursJacksonDeserializerTest.java b/jackson/src/test/java/org/fuin/objects4j/jackson/DayOpeningHoursJacksonDeserializerTest.java index e29d75d..50fff61 100644 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/DayOpeningHoursJacksonDeserializerTest.java +++ b/jackson/src/test/java/org/fuin/objects4j/jackson/DayOpeningHoursJacksonDeserializerTest.java @@ -26,7 +26,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; /** - * Test for the {@link DayOpeningHoursJacksonDeserializer} class. + * Test for {@link DayOpeningHours} deserialization. */ public class DayOpeningHoursJacksonDeserializerTest { diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/DayOpeningHoursJacksonSerializerTest.java b/jackson/src/test/java/org/fuin/objects4j/jackson/DayOpeningHoursJacksonSerializerTest.java index 05ce03c..dea561b 100644 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/DayOpeningHoursJacksonSerializerTest.java +++ b/jackson/src/test/java/org/fuin/objects4j/jackson/DayOpeningHoursJacksonSerializerTest.java @@ -18,15 +18,13 @@ package org.fuin.objects4j.jackson; import com.fasterxml.jackson.core.JsonProcessingException; -import org.fuin.objects4j.common.ConstraintViolationException; import org.fuin.objects4j.core.DayOpeningHours; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; /** - * Test for the {@link DayOpeningHoursJacksonSerializer} class. + * Test for {@link DayOpeningHours} serialization. */ public class DayOpeningHoursJacksonSerializerTest { diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/EmailAddressJacksonDeserializerTest.java b/jackson/src/test/java/org/fuin/objects4j/jackson/EmailAddressJacksonDeserializerTest.java index 00f826b..44222b0 100644 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/EmailAddressJacksonDeserializerTest.java +++ b/jackson/src/test/java/org/fuin/objects4j/jackson/EmailAddressJacksonDeserializerTest.java @@ -26,7 +26,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; /** - * Test for the {@link EmailAddressJacksonDeserializer} class. + * Test for the {@link EmailAddress} deserialization. */ public class EmailAddressJacksonDeserializerTest { diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/EmailAddressJacksonSerializerTest.java b/jackson/src/test/java/org/fuin/objects4j/jackson/EmailAddressJacksonSerializerTest.java index 77b5639..4bb8896 100644 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/EmailAddressJacksonSerializerTest.java +++ b/jackson/src/test/java/org/fuin/objects4j/jackson/EmailAddressJacksonSerializerTest.java @@ -24,7 +24,7 @@ import static org.assertj.core.api.Assertions.assertThat; /** - * Test for the {@link EmailAddressJacksonSerializer} class. + * Test for {@link EmailAddress} serialization. */ public class EmailAddressJacksonSerializerTest { diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/HourJacksonDeserializerTest.java b/jackson/src/test/java/org/fuin/objects4j/jackson/HourJacksonDeserializerTest.java index c0503bc..8e22693 100644 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/HourJacksonDeserializerTest.java +++ b/jackson/src/test/java/org/fuin/objects4j/jackson/HourJacksonDeserializerTest.java @@ -26,7 +26,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; /** - * Test for the {@link HourJacksonDeserializer} class. + * Test for {@link Hour} deserialization. */ public class HourJacksonDeserializerTest { diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/HourJacksonSerializerTest.java b/jackson/src/test/java/org/fuin/objects4j/jackson/HourJacksonSerializerTest.java index 96af327..07f1325 100644 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/HourJacksonSerializerTest.java +++ b/jackson/src/test/java/org/fuin/objects4j/jackson/HourJacksonSerializerTest.java @@ -24,7 +24,7 @@ import static org.assertj.core.api.Assertions.assertThat; /** - * Test for the {@link HourJacksonSerializer} class. + * Test for {@link Hour} serialization. */ public class HourJacksonSerializerTest { diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/HourRangeJacksonDeserializerTest.java b/jackson/src/test/java/org/fuin/objects4j/jackson/HourRangeJacksonDeserializerTest.java index cf90927..2dcc704 100644 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/HourRangeJacksonDeserializerTest.java +++ b/jackson/src/test/java/org/fuin/objects4j/jackson/HourRangeJacksonDeserializerTest.java @@ -26,7 +26,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; /** - * Test for the {@link HourRangeJacksonDeserializer} class. + * Test for {@link HourRange} deserialization. */ public class HourRangeJacksonDeserializerTest { diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/HourRangeJacksonSerializerTest.java b/jackson/src/test/java/org/fuin/objects4j/jackson/HourRangeJacksonSerializerTest.java index c1f48af..0850ea1 100644 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/HourRangeJacksonSerializerTest.java +++ b/jackson/src/test/java/org/fuin/objects4j/jackson/HourRangeJacksonSerializerTest.java @@ -24,7 +24,7 @@ import static org.assertj.core.api.Assertions.assertThat; /** - * Test for the {@link HourRangeJacksonSerializer} class. + * Test for {@link HourRange} serialization. */ public class HourRangeJacksonSerializerTest { diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/HourRangesJacksonDeserializerTest.java b/jackson/src/test/java/org/fuin/objects4j/jackson/HourRangesJacksonDeserializerTest.java index b64bd0d..b299206 100644 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/HourRangesJacksonDeserializerTest.java +++ b/jackson/src/test/java/org/fuin/objects4j/jackson/HourRangesJacksonDeserializerTest.java @@ -26,7 +26,7 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThat; /** - * Test for the {@link HourRangesJacksonDeserializer} class. + * Test for {@link HourRanges} deserialization. */ public class HourRangesJacksonDeserializerTest { diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/HourRangesJacksonSerializerTest.java b/jackson/src/test/java/org/fuin/objects4j/jackson/HourRangesJacksonSerializerTest.java index b4ee8cd..8ebc23a 100644 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/HourRangesJacksonSerializerTest.java +++ b/jackson/src/test/java/org/fuin/objects4j/jackson/HourRangesJacksonSerializerTest.java @@ -18,15 +18,13 @@ package org.fuin.objects4j.jackson; import com.fasterxml.jackson.core.JsonProcessingException; -import org.fuin.objects4j.common.ConstraintViolationException; import org.fuin.objects4j.core.HourRanges; import org.junit.jupiter.api.Test; -import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; /** - * Test for the {@link HourRangesJacksonSerializer} class. + * Test for {@link HourRanges} serialization. */ public class HourRangesJacksonSerializerTest { diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/ImmutableObjectMapperTest.java b/jackson/src/test/java/org/fuin/objects4j/jackson/ImmutableObjectMapperTest.java new file mode 100644 index 0000000..0555e30 --- /dev/null +++ b/jackson/src/test/java/org/fuin/objects4j/jackson/ImmutableObjectMapperTest.java @@ -0,0 +1,54 @@ +package org.fuin.objects4j.jackson; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; +import org.fuin.objects4j.core.EmailAddress; +import org.junit.jupiter.api.Test; + +import java.io.IOException; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +/** + * Test for the {@link ImmutableObjectMapper.Builder} class. + */ +class ImmutableObjectMapperTest { + + @Test + void testProvider() throws IOException { + + final ImmutableObjectMapper.Builder builder = new ImmutableObjectMapper.Builder(new ObjectMapper()); + final ImmutableObjectMapper.Provider provider = new ImmutableObjectMapper.Provider(builder); + builder.registerModule(new Objects4JJacksonModule()); + + final EmailAddress emailAddress = new EmailAddress("oh-no@mowhere.com"); + String str = provider.writer().writeValueAsString(emailAddress); + assertThat(str).isEqualTo("\"oh-no@mowhere.com\""); + assertThat(provider.reader().readValue(str, EmailAddress.class)).isEqualTo(emailAddress); + + assertThatThrownBy(() -> builder.registerModule(new SimpleModule("Bar"))) + .isInstanceOf(IllegalStateException.class) + .hasMessage("The object mapper was already built. Modifications are not allowed anymore."); + + } + + @Test + void testBuilder() throws IOException { + + final ImmutableObjectMapper.Builder builder = new ImmutableObjectMapper.Builder(new ObjectMapper()); + builder.registerModule(new Objects4JJacksonModule()); + final ImmutableObjectMapper mapper = builder.build(); + + assertThatThrownBy(() -> builder.registerModule(new SimpleModule("Bar"))) + .isInstanceOf(IllegalStateException.class) + .hasMessage("The object mapper was already built. Modifications are not allowed anymore."); + + final EmailAddress emailAddress = new EmailAddress("oh-no@mowhere.com"); + String str = mapper.writer().writeValueAsString(emailAddress); + assertThat(str).isEqualTo("\"oh-no@mowhere.com\""); + assertThat(mapper.reader().readValue(str, EmailAddress.class)).isEqualTo(emailAddress); + + } + +} \ No newline at end of file diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/JacksonHelper.java b/jackson/src/test/java/org/fuin/objects4j/jackson/JacksonHelper.java index b888912..bc23ccf 100644 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/JacksonHelper.java +++ b/jackson/src/test/java/org/fuin/objects4j/jackson/JacksonHelper.java @@ -40,7 +40,7 @@ private JacksonHelper() { */ public static String toJson(final T obj) { try { - final ObjectMapper mapper = new ObjectMapper(); + final ObjectMapper mapper = new ObjectMapper().registerModule(new Objects4JJacksonModule()); mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); return mapper.writeValueAsString(obj); } catch (JsonProcessingException e) { @@ -57,7 +57,7 @@ public static String toJson(final T obj) { */ public static T fromJson(final String json, final Class clasz) { try { - final ObjectMapper mapper = new ObjectMapper(); + final ObjectMapper mapper = new ObjectMapper().registerModule(new Objects4JJacksonModule()); return mapper.readValue(json, clasz); } catch (final JsonProcessingException ex) { throw new RuntimeException(ex); diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/LocaleJacksonSerializerTest.java b/jackson/src/test/java/org/fuin/objects4j/jackson/LocaleJacksonSerializerTest.java index ff13756..4e0fcae 100644 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/LocaleJacksonSerializerTest.java +++ b/jackson/src/test/java/org/fuin/objects4j/jackson/LocaleJacksonSerializerTest.java @@ -18,12 +18,10 @@ package org.fuin.objects4j.jackson; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import java.util.Locale; -import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; /** diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/MultiDayOfTheWeekJacksonDeserializerTest.java b/jackson/src/test/java/org/fuin/objects4j/jackson/MultiDayOfTheWeekJacksonDeserializerTest.java index 44bf8f3..efc275f 100644 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/MultiDayOfTheWeekJacksonDeserializerTest.java +++ b/jackson/src/test/java/org/fuin/objects4j/jackson/MultiDayOfTheWeekJacksonDeserializerTest.java @@ -26,7 +26,7 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThat; /** - * Test for the {@link MultiDayOfTheWeekJacksonDeserializer} class. + * Test for {@link MultiDayOfTheWeek} deserialization. */ public class MultiDayOfTheWeekJacksonDeserializerTest { diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/MultiDayOfTheWeekJacksonSerializerTest.java b/jackson/src/test/java/org/fuin/objects4j/jackson/MultiDayOfTheWeekJacksonSerializerTest.java index 03f4c16..c996955 100644 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/MultiDayOfTheWeekJacksonSerializerTest.java +++ b/jackson/src/test/java/org/fuin/objects4j/jackson/MultiDayOfTheWeekJacksonSerializerTest.java @@ -24,7 +24,7 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThat; /** - * Test for the {@link MultiDayOfTheWeekJacksonSerializer} class. + * Test for {@link MultiDayOfTheWeek} serialization. */ public class MultiDayOfTheWeekJacksonSerializerTest { diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/Objects4JJacksonAdapterModuleTest.java b/jackson/src/test/java/org/fuin/objects4j/jackson/Objects4JJacksonModuleTest.java similarity index 51% rename from jackson/src/test/java/org/fuin/objects4j/jackson/Objects4JJacksonAdapterModuleTest.java rename to jackson/src/test/java/org/fuin/objects4j/jackson/Objects4JJacksonModuleTest.java index 236bbd9..cb9e10a 100644 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/Objects4JJacksonAdapterModuleTest.java +++ b/jackson/src/test/java/org/fuin/objects4j/jackson/Objects4JJacksonModuleTest.java @@ -1,10 +1,10 @@ package org.fuin.objects4j.jackson; /** - * Test for the {@link Objects4JJacksonAdapterModule} class. + * Test for the {@link Objects4JJacksonModule} class. */ @SuppressWarnings("java:S2187") -class Objects4JJacksonAdapterModuleTest { +class Objects4JJacksonModuleTest { // Nothing to test yet diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/Objects4JacksonUtilsTest.java b/jackson/src/test/java/org/fuin/objects4j/jackson/Objects4JacksonUtilsTest.java new file mode 100644 index 0000000..9318c67 --- /dev/null +++ b/jackson/src/test/java/org/fuin/objects4j/jackson/Objects4JacksonUtilsTest.java @@ -0,0 +1,248 @@ +/** + * Copyright (C) 2015 Michael Schnell. All rights reserved. + * http://www.fuin.org/ + *

+ * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 3 of the License, or (at your option) any + * later version. + *

+ * This library is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + *

+ * You should have received a copy of the GNU Lesser General Public License + * along with this library. If not, see http://www.gnu.org/licenses/. + */ +package org.fuin.objects4j.jackson; + +import com.fasterxml.jackson.core.JacksonException; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.Version; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.Module; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; +import com.fasterxml.jackson.databind.module.SimpleDeserializers; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.util.Currency; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests the {@link Objects4JacksonUtils} class. + */ +@SuppressWarnings("java:S1186") // Methods should not be empty is fine here for the test +public class Objects4JacksonUtilsTest { + + @Test + public void testJacksonJacksonSerializers() { + + final JsonSerializer a = new JsonSerializer() { + @Override + public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + } + }; + final JsonSerializer b = new JsonSerializer() { + @Override + public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + } + }; + final JsonSerializer c = new JsonSerializer() { + @Override + public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + } + }; + final JsonSerializer d = new JsonSerializer() { + @Override + public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + } + }; + + assertThat(Objects4JacksonUtils.joinJacksonSerializers(new JsonSerializer[]{})).isEmpty(); + assertThat(Objects4JacksonUtils.joinJacksonSerializers(new JsonSerializer[]{}, a)).containsExactly(a); + assertThat(Objects4JacksonUtils.joinJacksonSerializers(new JsonSerializer[]{a}, b)).containsExactly(a, b); + assertThat(Objects4JacksonUtils.joinJacksonSerializers(new JsonSerializer[]{a, b}, c)).containsExactly(a, b, c); + assertThat(Objects4JacksonUtils.joinJacksonSerializers(new JsonSerializer[]{a, b}, c, d)).containsExactly(a, b, c, d); + + } + + @Test + public void testJoinJacksonSerializerArrays() { + + final JsonSerializer a = new JsonSerializer() { + @Override + public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + } + }; + final JsonSerializer b = new JsonSerializer() { + @Override + public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + } + }; + final JsonSerializer c = new JsonSerializer() { + @Override + public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + } + }; + final JsonSerializer d = new JsonSerializer() { + @Override + public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + } + }; + + assertThat(Objects4JacksonUtils.joinJacksonSerializerArrays(new JsonSerializer[]{})).isEmpty(); + assertThat(Objects4JacksonUtils.joinJacksonSerializerArrays(new JsonSerializer[]{}, new JsonSerializer[]{a})).containsExactly(a); + assertThat(Objects4JacksonUtils.joinJacksonSerializerArrays(new JsonSerializer[]{a}, new JsonSerializer[]{b})).contains(a, b); + assertThat(Objects4JacksonUtils.joinJacksonSerializerArrays(new JsonSerializer[]{a, b}, new JsonSerializer[]{c})).contains(a, b, c); + assertThat(Objects4JacksonUtils.joinJacksonSerializerArrays(new JsonSerializer[]{a, b}, new JsonSerializer[]{c, d})).contains(a, b, c, d); + assertThat(Objects4JacksonUtils.joinJacksonSerializerArrays(new JsonSerializer[]{a}, new JsonSerializer[]{b}, new JsonSerializer[]{c})).contains(a, b, c); + + } + + @Test + public void testJoinJacksonDeserializers() { + + final JsonDeserializer a = new JsonDeserializer() { + @Override + public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JacksonException { + return null; + } + }; + final JsonDeserializer b = new JsonDeserializer() { + @Override + public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JacksonException { + return null; + } + }; + final JsonDeserializer c = new JsonDeserializer() { + @Override + public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JacksonException { + return null; + } + }; + final JsonDeserializer d = new JsonDeserializer() { + @Override + public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JacksonException { + return null; + } + }; + + assertThat(Objects4JacksonUtils.joinJacksonDeserializers(new JsonDeserializer[]{})).isEmpty(); + assertThat(Objects4JacksonUtils.joinJacksonDeserializers(new JsonDeserializer[]{}, a)).containsExactly(a); + assertThat(Objects4JacksonUtils.joinJacksonDeserializers(new JsonDeserializer[]{a}, b)).containsExactly(a, b); + assertThat(Objects4JacksonUtils.joinJacksonDeserializers(new JsonDeserializer[]{a, b}, c)).containsExactly(a, b, c); + assertThat(Objects4JacksonUtils.joinJacksonDeserializers(new JsonDeserializer[]{a, b}, c, d)).containsExactly(a, b, c, d); + + } + + @Test + public void testJoinJacksonDeserializerArrays() { + + final JsonDeserializer a = new JsonDeserializer() { + @Override + public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JacksonException { + return null; + } + }; + final JsonDeserializer b = new JsonDeserializer() { + @Override + public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JacksonException { + return null; + } + }; + final JsonDeserializer c = new JsonDeserializer() { + @Override + public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JacksonException { + return null; + } + }; + final JsonDeserializer d = new JsonDeserializer() { + @Override + public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JacksonException { + return null; + } + }; + + assertThat(Objects4JacksonUtils.joinJacksonDeserializerArrays(new JsonDeserializer[]{})).isEmpty(); + assertThat(Objects4JacksonUtils.joinJacksonDeserializerArrays(new JsonDeserializer[]{}, new JsonDeserializer[]{a})).containsExactly(a); + assertThat(Objects4JacksonUtils.joinJacksonDeserializerArrays(new JsonDeserializer[]{a}, new JsonDeserializer[]{b})).contains(a, b); + assertThat(Objects4JacksonUtils.joinJacksonDeserializerArrays(new JsonDeserializer[]{a, b}, new JsonDeserializer[]{c})).contains(a, b, c); + assertThat(Objects4JacksonUtils.joinJacksonDeserializerArrays(new JsonDeserializer[]{a, b}, new JsonDeserializer[]{c, d})).contains(a, b, c, d); + assertThat(Objects4JacksonUtils.joinJacksonDeserializerArrays(new JsonDeserializer[]{a}, new JsonDeserializer[]{b}, new JsonDeserializer[]{c})).contains(a, b, c); + + } + + @Test + public void testDeserialize() throws JsonProcessingException { + final ObjectMapper mapper = new ObjectMapper().registerModule(new TestModule()); + final ContainerExample example = mapper.readValue(""" + { + "className" : "org.fuin.objects4j.jackson.Objects4JacksonUtilsTest$Foo", + "instance" : { + "name" : "Bar" + } + } + """, ContainerExample.class); + assertThat(example).isNotNull(); + assertThat(example.className()).isEqualTo(Foo.class.getName()); + assertThat(example.instance()).isInstanceOf(Foo.class); + assertThat(((Foo) example.instance()).name()).isEqualTo("Bar"); + } + + public record ContainerExample(String className, Object instance) { + } + + public record Foo(String name) { + } + + public static final class ContainerExampleDeserializer extends StdDeserializer { + + public ContainerExampleDeserializer() { + super(Currency.class); + } + + @Override + public ContainerExample deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException { + final JsonNode node = jp.getCodec().readTree(jp); + final String className = node.get("className").asText(); + final JsonNode instanceNode = node.get("instance"); + final Object instance = Objects4JacksonUtils.deserialize(jp, ctxt, className, instanceNode); + return new ContainerExample(className, instance); + } + + } + + public static final class TestModule extends Module { + + @Override + public String getModuleName() { + return "TestModule"; + } + + @Override + public Version version() { + return new Version(1, 0, 0, null, + "foo", "bar"); + } + + @Override + public void setupModule(SetupContext context) { + final SimpleDeserializers deserializers = new SimpleDeserializers(); + deserializers.addDeserializer(ContainerExample.class, new ContainerExampleDeserializer()); + context.addDeserializers(deserializers); + } + + } + +} + diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/PasswordSha512JacksonDeserializerTest.java b/jackson/src/test/java/org/fuin/objects4j/jackson/PasswordSha512JacksonDeserializerTest.java index 577495b..c98f654 100644 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/PasswordSha512JacksonDeserializerTest.java +++ b/jackson/src/test/java/org/fuin/objects4j/jackson/PasswordSha512JacksonDeserializerTest.java @@ -26,7 +26,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; /** - * Test for the {@link PasswordSha512JacksonDeserializer} class. + * Test for {@link PasswordSha512} deserialization. */ public class PasswordSha512JacksonDeserializerTest { diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/PasswordSha512JacksonSerializerTest.java b/jackson/src/test/java/org/fuin/objects4j/jackson/PasswordSha512JacksonSerializerTest.java index 7bf68be..8493a12 100644 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/PasswordSha512JacksonSerializerTest.java +++ b/jackson/src/test/java/org/fuin/objects4j/jackson/PasswordSha512JacksonSerializerTest.java @@ -18,15 +18,13 @@ package org.fuin.objects4j.jackson; import com.fasterxml.jackson.core.JsonProcessingException; -import org.fuin.objects4j.common.ConstraintViolationException; import org.fuin.objects4j.core.PasswordSha512; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; /** - * Test for the {@link PasswordSha512JacksonSerializer} class. + * Test for {@link PasswordSha512} serialization. */ public class PasswordSha512JacksonSerializerTest { diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/UUIDJacksonSerializerTest.java b/jackson/src/test/java/org/fuin/objects4j/jackson/UUIDJacksonSerializerTest.java index 458e368..3a2521c 100644 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/UUIDJacksonSerializerTest.java +++ b/jackson/src/test/java/org/fuin/objects4j/jackson/UUIDJacksonSerializerTest.java @@ -18,13 +18,11 @@ package org.fuin.objects4j.jackson; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; /** * Test for the {@link UUIDJacksonSerializer} class. diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/UserNameJacksonDeserializerTest.java b/jackson/src/test/java/org/fuin/objects4j/jackson/UserNameJacksonDeserializerTest.java index 2ddd5b2..a9453cc 100644 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/UserNameJacksonDeserializerTest.java +++ b/jackson/src/test/java/org/fuin/objects4j/jackson/UserNameJacksonDeserializerTest.java @@ -26,7 +26,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; /** - * Test for the {@link UserNameJacksonDeserializer} class. + * Test for {@link UserName} deserialization. */ public class UserNameJacksonDeserializerTest { diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/UserNameJacksonSerializerTest.java b/jackson/src/test/java/org/fuin/objects4j/jackson/UserNameJacksonSerializerTest.java index 2fea62d..e41ebfe 100644 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/UserNameJacksonSerializerTest.java +++ b/jackson/src/test/java/org/fuin/objects4j/jackson/UserNameJacksonSerializerTest.java @@ -18,15 +18,13 @@ package org.fuin.objects4j.jackson; import com.fasterxml.jackson.core.JsonProcessingException; -import org.fuin.objects4j.common.ConstraintViolationException; import org.fuin.objects4j.core.UserName; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; /** - * Test for the {@link UserNameJacksonSerializer} class. + * Test for {@link UserName} serialization. */ public class UserNameJacksonSerializerTest { diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/ValueObjectStringJacksonDeserializerTest.java b/jackson/src/test/java/org/fuin/objects4j/jackson/ValueObjectStringJacksonDeserializerTest.java deleted file mode 100644 index 9c1c675..0000000 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/ValueObjectStringJacksonDeserializerTest.java +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Copyright (C) 2013 Future Invent Informationsmanagement GmbH. All rights - * reserved. - *

- * This library is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by the Free - * Software Foundation; either version 3 of the License, or (at your option) any - * later version. - *

- * This library is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - *

- * You should have received a copy of the GNU Lesser General Public License - * along with this library. If not, see . - */ -package org.fuin.objects4j.jackson; - -import com.fasterxml.jackson.core.JsonProcessingException; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Test for the {@link ValueObjectStringJacksonDeserializer} class. - */ -public class ValueObjectStringJacksonDeserializerTest { - - private static final String JSON = "{\"any-str\":\"abcd1234\"}"; - - @Test - public final void testMarshalUnmarshal() throws JsonProcessingException { - - final Data data = JacksonHelper.fromJson(JSON, Data.class); - assertThat(data.anyStr).isNotNull(); - assertThat(data.anyStr).isEqualTo(new AnyStr("abcd1234")); - - } - -} diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/ValueObjectStringJacksonSerializerTest.java b/jackson/src/test/java/org/fuin/objects4j/jackson/ValueObjectStringJacksonSerializerTest.java deleted file mode 100644 index c926283..0000000 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/ValueObjectStringJacksonSerializerTest.java +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Copyright (C) 2013 Future Invent Informationsmanagement GmbH. All rights - * reserved. - *

- * This library is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by the Free - * Software Foundation; either version 3 of the License, or (at your option) any - * later version. - *

- * This library is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - *

- * You should have received a copy of the GNU Lesser General Public License - * along with this library. If not, see . - */ -package org.fuin.objects4j.jackson; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Test for the {@link ValueObjectStringJacksonSerializer} class. - */ -public class ValueObjectStringJacksonSerializerTest { - - private static final String JSON = "{\"any-str\":\"abcd1234\"}"; - - @Test - public final void testMarshal() throws JsonProcessingException { - - final Data data = new Data(); - data.anyStr = new AnyStr("abcd1234"); - assertThat(JacksonHelper.toJson(data)).isEqualTo(JSON); - - } - -} diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/WeeklyOpeningHoursJacksonDeserializerTest.java b/jackson/src/test/java/org/fuin/objects4j/jackson/WeeklyOpeningHoursJacksonDeserializerTest.java index cd0acce..6ffb7e7 100644 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/WeeklyOpeningHoursJacksonDeserializerTest.java +++ b/jackson/src/test/java/org/fuin/objects4j/jackson/WeeklyOpeningHoursJacksonDeserializerTest.java @@ -26,7 +26,7 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThat; /** - * Test for the {@link WeeklyOpeningHoursJacksonDeserializer} class. + * Test for {@link WeeklyOpeningHours} deserialization. */ public class WeeklyOpeningHoursJacksonDeserializerTest { diff --git a/jackson/src/test/java/org/fuin/objects4j/jackson/WeeklyOpeningHoursJacksonSerializerTest.java b/jackson/src/test/java/org/fuin/objects4j/jackson/WeeklyOpeningHoursJacksonSerializerTest.java index bd95170..b4e8cbb 100644 --- a/jackson/src/test/java/org/fuin/objects4j/jackson/WeeklyOpeningHoursJacksonSerializerTest.java +++ b/jackson/src/test/java/org/fuin/objects4j/jackson/WeeklyOpeningHoursJacksonSerializerTest.java @@ -18,15 +18,13 @@ package org.fuin.objects4j.jackson; import com.fasterxml.jackson.core.JsonProcessingException; -import org.fuin.objects4j.common.ConstraintViolationException; import org.fuin.objects4j.core.WeeklyOpeningHours; import org.junit.jupiter.api.Test; -import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; /** - * Test for the {@link WeeklyOpeningHoursJacksonSerializer} class. + * Test for {@link WeeklyOpeningHours} serialization. */ public class WeeklyOpeningHoursJacksonSerializerTest { diff --git a/jacoco/pom.xml b/jacoco/pom.xml index 4d3f981..389a788 100644 --- a/jacoco/pom.xml +++ b/jacoco/pom.xml @@ -7,7 +7,7 @@ org.fuin.objects4j objects4j-parent - 0.10.0 + 0.11.0-SNAPSHOT ../pom.xml @@ -40,6 +40,11 @@ objects4j-jsonb + + org.fuin.objects4j + objects4j-jackson + + org.fuin.objects4j objects4j-ui diff --git a/jaxb/pom.xml b/jaxb/pom.xml index a445462..3fb821c 100644 --- a/jaxb/pom.xml +++ b/jaxb/pom.xml @@ -7,7 +7,7 @@ org.fuin.objects4j objects4j-parent - 0.10.0 + 0.11.0-SNAPSHOT ../pom.xml diff --git a/jaxb/src/test/java/org/fuin/objects4j/jaxb/CurrencyAmountXmlAdapterTest.java b/jaxb/src/test/java/org/fuin/objects4j/jaxb/CurrencyAmountXmlAdapterTest.java index c618eb7..9861353 100644 --- a/jaxb/src/test/java/org/fuin/objects4j/jaxb/CurrencyAmountXmlAdapterTest.java +++ b/jaxb/src/test/java/org/fuin/objects4j/jaxb/CurrencyAmountXmlAdapterTest.java @@ -29,8 +29,6 @@ public class CurrencyAmountXmlAdapterTest { private static final String XML = XML_PREFIX + ""; - private static final String JSON = "{\"ca\":\"1234.56 EUR\"}"; - @Test public final void testMarshalJaxb() throws JAXBException { diff --git a/jaxb/src/test/java/org/fuin/objects4j/jaxb/DayOfTheWeekXmlAdapterTest.java b/jaxb/src/test/java/org/fuin/objects4j/jaxb/DayOfTheWeekXmlAdapterTest.java index bf94d90..e54d18e 100644 --- a/jaxb/src/test/java/org/fuin/objects4j/jaxb/DayOfTheWeekXmlAdapterTest.java +++ b/jaxb/src/test/java/org/fuin/objects4j/jaxb/DayOfTheWeekXmlAdapterTest.java @@ -29,8 +29,6 @@ public class DayOfTheWeekXmlAdapterTest { private static final String XML = XML_PREFIX + ""; - private static final String JSON = "{\"dayOfTheWeek\":\"FRI\"}"; - @Test public final void testMarshal() throws JAXBException { diff --git a/jaxb/src/test/java/org/fuin/objects4j/jaxb/DayOpeningHoursXmlAdapterTest.java b/jaxb/src/test/java/org/fuin/objects4j/jaxb/DayOpeningHoursXmlAdapterTest.java index 9d62bc5..35c65c7 100644 --- a/jaxb/src/test/java/org/fuin/objects4j/jaxb/DayOpeningHoursXmlAdapterTest.java +++ b/jaxb/src/test/java/org/fuin/objects4j/jaxb/DayOpeningHoursXmlAdapterTest.java @@ -30,8 +30,6 @@ public class DayOpeningHoursXmlAdapterTest { private static final String XML = XML_PREFIX + ""; - private static final String JSON = "{\"dayOpeningHours\":\"MON 00:00-24:00\"}"; - @Test public final void testMarshal() throws JAXBException { diff --git a/jaxb/src/test/java/org/fuin/objects4j/jaxb/EmailAddressXmlAdapterTest.java b/jaxb/src/test/java/org/fuin/objects4j/jaxb/EmailAddressXmlAdapterTest.java index 81923e2..5d7cc3b 100644 --- a/jaxb/src/test/java/org/fuin/objects4j/jaxb/EmailAddressXmlAdapterTest.java +++ b/jaxb/src/test/java/org/fuin/objects4j/jaxb/EmailAddressXmlAdapterTest.java @@ -30,8 +30,6 @@ public class EmailAddressXmlAdapterTest { private static final String XML = XML_PREFIX + ""; - private static final String JSON = "{\"email\":\"a@b.c\"}"; - @Test public final void testMarshal() throws JAXBException { diff --git a/jaxb/src/test/java/org/fuin/objects4j/jaxb/HourXmlAdapterTest.java b/jaxb/src/test/java/org/fuin/objects4j/jaxb/HourXmlAdapterTest.java index e3fa637..203e27c 100644 --- a/jaxb/src/test/java/org/fuin/objects4j/jaxb/HourXmlAdapterTest.java +++ b/jaxb/src/test/java/org/fuin/objects4j/jaxb/HourXmlAdapterTest.java @@ -30,8 +30,6 @@ public class HourXmlAdapterTest { private static final String XML = XML_PREFIX + ""; - private static final String JSON = "{\"hour\":\"23:59\"}"; - @Test public final void testMarshal() throws JAXBException { diff --git a/jpa/pom.xml b/jpa/pom.xml index 45a16f9..f512fde 100644 --- a/jpa/pom.xml +++ b/jpa/pom.xml @@ -7,7 +7,7 @@ org.fuin.objects4j objects4j-parent - 0.10.0 + 0.11.0-SNAPSHOT ../pom.xml diff --git a/jpa/src/test/java/org/fuin/objects4j/jpa/CurrencyAmountParentEntity.java b/jpa/src/test/java/org/fuin/objects4j/jpa/CurrencyAmountParentEntity.java index 543535c..5cd6634 100644 --- a/jpa/src/test/java/org/fuin/objects4j/jpa/CurrencyAmountParentEntity.java +++ b/jpa/src/test/java/org/fuin/objects4j/jpa/CurrencyAmountParentEntity.java @@ -18,7 +18,6 @@ package org.fuin.objects4j.jpa; import jakarta.persistence.AttributeOverride; -import jakarta.persistence.AttributeOverrides; import jakarta.persistence.Basic; import jakarta.persistence.Column; import jakarta.persistence.Convert; @@ -36,9 +35,8 @@ public class CurrencyAmountParentEntity { // @formatter:off @Embedded - @AttributeOverrides({ - @AttributeOverride(name = "amount", column = @Column(name = "AMOUNT", precision = 12, scale = 2, nullable = true)), - @AttributeOverride(name = "currency", column = @Column(name = "CURRENCY", columnDefinition = "varchar(255)", nullable = true)) }) + @AttributeOverride(name = "amount", column = @Column(name = "AMOUNT", precision = 12, scale = 2, nullable = true)) + @AttributeOverride(name = "currency", column = @Column(name = "CURRENCY", columnDefinition = "varchar(255)", nullable = true)) // @formatter:on private CurrencyAmount amount; diff --git a/jpa/src/test/java/org/fuin/objects4j/jpa/CurrencyAmountTest.java b/jpa/src/test/java/org/fuin/objects4j/jpa/CurrencyAmountTest.java index 08ade7b..d4d6944 100644 --- a/jpa/src/test/java/org/fuin/objects4j/jpa/CurrencyAmountTest.java +++ b/jpa/src/test/java/org/fuin/objects4j/jpa/CurrencyAmountTest.java @@ -72,16 +72,4 @@ private Object executeSingleResult(String sql) { return query.getSingleResult(); } - private static Currency cu(String code) { - return Currency.getInstance(code); - } - - private static BigDecimal bd(int number, int scale) { - return new BigDecimal(number).setScale(scale, RoundingMode.HALF_UP); - } - - private static BigDecimal bd(double number, int scale) { - return new BigDecimal(number).setScale(scale, RoundingMode.HALF_UP); - } - } diff --git a/jpa/src/test/java/org/fuin/objects4j/jpa/CurrencyParentEntity.java b/jpa/src/test/java/org/fuin/objects4j/jpa/CurrencyParentEntity.java index 4058999..6d35917 100644 --- a/jpa/src/test/java/org/fuin/objects4j/jpa/CurrencyParentEntity.java +++ b/jpa/src/test/java/org/fuin/objects4j/jpa/CurrencyParentEntity.java @@ -17,7 +17,6 @@ */ package org.fuin.objects4j.jpa; -import jakarta.persistence.Basic; import jakarta.persistence.Column; import jakarta.persistence.Convert; import jakarta.persistence.Entity; diff --git a/jsonb/pom.xml b/jsonb/pom.xml index 4a0c51c..38a854f 100644 --- a/jsonb/pom.xml +++ b/jsonb/pom.xml @@ -7,7 +7,7 @@ org.fuin.objects4j objects4j-parent - 0.10.0 + 0.11.0-SNAPSHOT ../pom.xml diff --git a/jsonb/src/main/java/org/fuin/objects4j/jsonb/JsonbProvider.java b/jsonb/src/main/java/org/fuin/objects4j/jsonb/JsonbProvider.java new file mode 100644 index 0000000..9f67c15 --- /dev/null +++ b/jsonb/src/main/java/org/fuin/objects4j/jsonb/JsonbProvider.java @@ -0,0 +1,58 @@ +package org.fuin.objects4j.jsonb; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; + +import javax.annotation.concurrent.NotThreadSafe; +import java.util.Objects; + +/** + * Helper to allow late initialization of the JSON-B instance. + *

+ * To make the provider thread-safe for processing you need to finalize the instance + * by calling the {@link #jsonb()} once your application startup has finished. + * For Spring and Quarkus a good option is to have another "@ApplicationScope" + * bean with a "@PostConstruct" method that will do it. + *

+ */ +@NotThreadSafe +public final class JsonbProvider implements AutoCloseable { + + private final JsonbConfig config; + + private Jsonb jsonb; + + /** + * Constructor with config. + * + * @param config Config to use. + */ + public JsonbProvider(JsonbConfig config) { + this.config = Objects.requireNonNull(config, "config==null"); + } + + /** + * Returns the JSON-B instance. It will be built on first access. + * + * @return Instance. + */ + public Jsonb jsonb() { + if (jsonb == null) { + jsonb = JsonbBuilder.create(config); + } + return jsonb; + } + + @Override + public void close() { + if (jsonb != null) { + try { + jsonb.close(); + } catch (final Exception ex) { + throw new IllegalStateException("Failed to close JSON-B instance", ex); + } + } + } + +} diff --git a/jsonb/src/test/java/org/fuin/objects4j/jsonb/JsonbProviderTest.java b/jsonb/src/test/java/org/fuin/objects4j/jsonb/JsonbProviderTest.java new file mode 100644 index 0000000..dd414d1 --- /dev/null +++ b/jsonb/src/test/java/org/fuin/objects4j/jsonb/JsonbProviderTest.java @@ -0,0 +1,32 @@ +package org.fuin.objects4j.jsonb; + +import jakarta.json.bind.JsonbConfig; +import org.fuin.objects4j.core.EmailAddress; +import org.junit.jupiter.api.Test; + +import java.io.IOException; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Test for the {@link JsonbProvider} class. + */ +class JsonbProviderTest { + + @Test + void testProvider() throws IOException { + + final JsonbConfig config = new JsonbConfig(); + try (final JsonbProvider provider = new JsonbProvider(config)) { + config.withAdapters(JsonbUtils.getJsonbAdapterArray()); + + final EmailAddress emailAddress = new EmailAddress("oh-no@mowhere.com"); + String str = provider.jsonb().toJson(emailAddress); + assertThat(str).isEqualTo("\"oh-no@mowhere.com\""); + assertThat(provider.jsonb().fromJson(str, EmailAddress.class)).isEqualTo(emailAddress); + + } + } + + +} \ No newline at end of file diff --git a/junit/pom.xml b/junit/pom.xml index f97d539..62d5072 100644 --- a/junit/pom.xml +++ b/junit/pom.xml @@ -7,7 +7,7 @@ org.fuin.objects4j objects4j-parent - 0.10.0 + 0.11.0-SNAPSHOT ../pom.xml diff --git a/pom.xml b/pom.xml index f18bc43..cea2d03 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ org.fuin.objects4j objects4j-parent pom - 0.10.0 + 0.11.0-SNAPSHOT A library with common Java types that are mostly immutable value objects. http://www.fuin.org/objects4j/ @@ -89,7 +89,7 @@ org.fuin utils4j - 0.14.0 + 0.15.0 @@ -397,8 +397,8 @@ jsonb junit jacoco - quarkus - spring-boot + quarkus-test + spring-boot-test diff --git a/quarkus/pom.xml b/quarkus-test/pom.xml similarity index 99% rename from quarkus/pom.xml rename to quarkus-test/pom.xml index 076528f..2ed9d1e 100644 --- a/quarkus/pom.xml +++ b/quarkus-test/pom.xml @@ -7,7 +7,7 @@ org.fuin.objects4j objects4j-parent - 0.10.0 + 0.11.0-SNAPSHOT ../pom.xml diff --git a/quarkus/src/main/java/org/fuin/objects4j/quarkus/Data.java b/quarkus-test/src/main/java/org/fuin/objects4j/quarkus/Data.java similarity index 100% rename from quarkus/src/main/java/org/fuin/objects4j/quarkus/Data.java rename to quarkus-test/src/main/java/org/fuin/objects4j/quarkus/Data.java diff --git a/quarkus/src/main/java/org/fuin/objects4j/quarkus/DataResource.java b/quarkus-test/src/main/java/org/fuin/objects4j/quarkus/DataResource.java similarity index 100% rename from quarkus/src/main/java/org/fuin/objects4j/quarkus/DataResource.java rename to quarkus-test/src/main/java/org/fuin/objects4j/quarkus/DataResource.java diff --git a/quarkus/src/main/java/org/fuin/objects4j/quarkus/QuarkusApp.java b/quarkus-test/src/main/java/org/fuin/objects4j/quarkus/QuarkusApp.java similarity index 100% rename from quarkus/src/main/java/org/fuin/objects4j/quarkus/QuarkusApp.java rename to quarkus-test/src/main/java/org/fuin/objects4j/quarkus/QuarkusApp.java diff --git a/quarkus/src/main/resources/application.properties b/quarkus-test/src/main/resources/application.properties similarity index 100% rename from quarkus/src/main/resources/application.properties rename to quarkus-test/src/main/resources/application.properties diff --git a/quarkus/src/test/java/org/fuin/objects4j/quarkus/MariaDbResource.java b/quarkus-test/src/test/java/org/fuin/objects4j/quarkus/MariaDbResource.java similarity index 100% rename from quarkus/src/test/java/org/fuin/objects4j/quarkus/MariaDbResource.java rename to quarkus-test/src/test/java/org/fuin/objects4j/quarkus/MariaDbResource.java diff --git a/quarkus/src/test/java/org/fuin/objects4j/quarkus/QuarkusAppTest.java b/quarkus-test/src/test/java/org/fuin/objects4j/quarkus/QuarkusAppTest.java similarity index 100% rename from quarkus/src/test/java/org/fuin/objects4j/quarkus/QuarkusAppTest.java rename to quarkus-test/src/test/java/org/fuin/objects4j/quarkus/QuarkusAppTest.java diff --git a/release-notes.md b/release-notes.md index 5030c3d..9ac6d88 100644 --- a/release-notes.md +++ b/release-notes.md @@ -1,5 +1,11 @@ # Release Notes +## 0.11.0 +- Removed unnecessary Jackson serializer/deserializer classes +- Added new [Objects4JacksonUtils](jackson/src/main/java/org/fuin/objects4j/jackson/Objects4JacksonUtils.java) utility class +- Added new [ImmutableObjectMapper](jackson/src/main/java/org/fuin/objects4j/jackson/ImmutableObjectMapper.java) to allow thread-safe access and late creation. +- Added new [JsonbProvider](jsonb/src/main/java/org/fuin/objects4j/jsonb/JsonbProvider.java) to allow late creation. + ## 0.10.0 ### General diff --git a/spring-boot/pom.xml b/spring-boot-test/pom.xml similarity index 99% rename from spring-boot/pom.xml rename to spring-boot-test/pom.xml index ebb7a6a..4c512db 100644 --- a/spring-boot/pom.xml +++ b/spring-boot-test/pom.xml @@ -7,7 +7,7 @@ org.fuin.objects4j objects4j-parent - 0.10.0 + 0.11.0-SNAPSHOT ../pom.xml diff --git a/spring-boot/src/main/java/org/fuin/objects4j/springboot/Data.java b/spring-boot-test/src/main/java/org/fuin/objects4j/springboot/Data.java similarity index 100% rename from spring-boot/src/main/java/org/fuin/objects4j/springboot/Data.java rename to spring-boot-test/src/main/java/org/fuin/objects4j/springboot/Data.java diff --git a/spring-boot/src/main/java/org/fuin/objects4j/springboot/DataResource.java b/spring-boot-test/src/main/java/org/fuin/objects4j/springboot/DataResource.java similarity index 100% rename from spring-boot/src/main/java/org/fuin/objects4j/springboot/DataResource.java rename to spring-boot-test/src/main/java/org/fuin/objects4j/springboot/DataResource.java diff --git a/spring-boot/src/main/java/org/fuin/objects4j/springboot/SpringBootApp.java b/spring-boot-test/src/main/java/org/fuin/objects4j/springboot/SpringBootApp.java similarity index 100% rename from spring-boot/src/main/java/org/fuin/objects4j/springboot/SpringBootApp.java rename to spring-boot-test/src/main/java/org/fuin/objects4j/springboot/SpringBootApp.java diff --git a/spring-boot/src/main/java/org/fuin/objects4j/springboot/SpringBootConfig.java b/spring-boot-test/src/main/java/org/fuin/objects4j/springboot/SpringBootConfig.java similarity index 80% rename from spring-boot/src/main/java/org/fuin/objects4j/springboot/SpringBootConfig.java rename to spring-boot-test/src/main/java/org/fuin/objects4j/springboot/SpringBootConfig.java index ac70166..21c3fc5 100644 --- a/spring-boot/src/main/java/org/fuin/objects4j/springboot/SpringBootConfig.java +++ b/spring-boot-test/src/main/java/org/fuin/objects4j/springboot/SpringBootConfig.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.ObjectMapper; -import org.fuin.objects4j.jackson.Objects4JJacksonAdapterModule; +import org.fuin.objects4j.jackson.Objects4JJacksonModule; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; @@ -15,7 +15,7 @@ public class SpringBootConfig { public ObjectMapper jsonMapper() { return new ObjectMapper() .setSerializationInclusion(JsonInclude.Include.NON_NULL) - .registerModule(new Objects4JJacksonAdapterModule()); + .registerModule(new Objects4JJacksonModule()); } } diff --git a/spring-boot/src/main/resources/application.properties b/spring-boot-test/src/main/resources/application.properties similarity index 100% rename from spring-boot/src/main/resources/application.properties rename to spring-boot-test/src/main/resources/application.properties diff --git a/spring-boot/src/test/java/org/fuin/objects4j/springboot/SpringBootAppTest.java b/spring-boot-test/src/test/java/org/fuin/objects4j/springboot/SpringBootAppTest.java similarity index 100% rename from spring-boot/src/test/java/org/fuin/objects4j/springboot/SpringBootAppTest.java rename to spring-boot-test/src/test/java/org/fuin/objects4j/springboot/SpringBootAppTest.java diff --git a/src/main/resources/.gitkeep b/src/main/resources/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/test/resources/.gitkeep b/src/test/resources/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/ui/pom.xml b/ui/pom.xml index 33362d6..3b8604b 100644 --- a/ui/pom.xml +++ b/ui/pom.xml @@ -7,7 +7,7 @@ org.fuin.objects4j objects4j-parent - 0.10.0 + 0.11.0-SNAPSHOT ../pom.xml diff --git a/ui/src/main/java/org/fuin/objects4j/ui/AnnotationAnalyzer.java b/ui/src/main/java/org/fuin/objects4j/ui/AnnotationAnalyzer.java index 546173d..5632ca3 100644 --- a/ui/src/main/java/org/fuin/objects4j/ui/AnnotationAnalyzer.java +++ b/ui/src/main/java/org/fuin/objects4j/ui/AnnotationAnalyzer.java @@ -386,6 +386,7 @@ private static String name(@NotNull final Class clasz) { return name; } + @SuppressWarnings("java:S101") // We don't care here about class name private static final class UNKNOWN_CLASS { } diff --git a/ui/src/test/java/org/fuin/objects4j/ui/UsageExamples.java b/ui/src/test/java/org/fuin/objects4j/ui/UsageExamples.java index f29a718..0795f48 100644 --- a/ui/src/test/java/org/fuin/objects4j/ui/UsageExamples.java +++ b/ui/src/test/java/org/fuin/objects4j/ui/UsageExamples.java @@ -40,6 +40,7 @@ public class UsageExamples { * @throws Exception * Something went wrong. */ + @SuppressWarnings("java:S125") // Code is commented out intentionally public static void main(String[] args) throws Exception { AnnotationAnalyzer analyzer = new AnnotationAnalyzer();