From 037df57c9c09645fcd8c7a5301f80d46e5352770 Mon Sep 17 00:00:00 2001 From: MBuczkowski2025 Date: Mon, 10 Aug 2026 18:05:42 +0200 Subject: [PATCH 01/13] BAEL-7805 new module and code added --- json-modules/gson-4/gson-module-opens/pom.xml | 16 ++++++ .../java/gson/exception/ConferencePojo.java | 23 +++++++++ .../gson/exception/ConferencePojoAdapter.java | 40 +++++++++++++++ .../gson/exception/ConferencePojoPublic.java | 7 +++ .../ConferencePojoWithValidation.java | 23 +++++++++ .../java/gson/exception/ConferenceRecord.java | 5 ++ .../ConferenceRecordWithValidation.java | 10 ++++ .../java/gson/exception/GsonModuleMain.java | 32 ++++++++++++ .../src/main/java/module-info.java | 8 +++ .../ConferencePojoValidationTest.java | 47 +++++++++++++++++ .../ConferenceRecordValidationTest.java | 33 ++++++++++++ .../exception/ModularGsonWithAdapterTest.java | 25 +++++++++ .../ModularStructureConfirmationTest.java | 16 ++++++ json-modules/gson-4/gson-module/pom.xml | 15 ++++++ .../java/gson/exception/ConferencePojo.java | 23 +++++++++ .../gson/exception/ConferencePojoAdapter.java | 40 +++++++++++++++ .../gson/exception/ConferencePojoPublic.java | 7 +++ .../ConferencePojoWithValidation.java | 23 +++++++++ .../ConferencePojoWithValidationAdapter.java | 36 +++++++++++++ .../java/gson/exception/ConferenceRecord.java | 5 ++ .../ConferenceRecordWithValidation.java | 10 ++++ .../java/gson/exception/GsonModuleMain.java | 32 ++++++++++++ .../src/main/java/module-info.java | 6 +++ .../ConferenceRecordValidationTest.java | 33 ++++++++++++ .../java/gson/exception/ModularGsonTest.java | 49 ++++++++++++++++++ .../exception/ModularGsonWithAdapterTest.java | 25 +++++++++ .../ModularStructureConfirmationTest.java | 16 ++++++ json-modules/gson-4/pom.xml | 51 +++++++++++++++++++ json-modules/pom.xml | 1 + 29 files changed, 657 insertions(+) create mode 100644 json-modules/gson-4/gson-module-opens/pom.xml create mode 100644 json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojo.java create mode 100644 json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojoAdapter.java create mode 100644 json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojoPublic.java create mode 100644 json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojoWithValidation.java create mode 100644 json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferenceRecord.java create mode 100644 json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferenceRecordWithValidation.java create mode 100644 json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/GsonModuleMain.java create mode 100644 json-modules/gson-4/gson-module-opens/src/main/java/module-info.java create mode 100644 json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ConferencePojoValidationTest.java create mode 100644 json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ConferenceRecordValidationTest.java create mode 100644 json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularGsonWithAdapterTest.java create mode 100644 json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularStructureConfirmationTest.java create mode 100644 json-modules/gson-4/gson-module/pom.xml create mode 100644 json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferencePojo.java create mode 100644 json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferencePojoAdapter.java create mode 100644 json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferencePojoPublic.java create mode 100644 json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferencePojoWithValidation.java create mode 100644 json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferencePojoWithValidationAdapter.java create mode 100644 json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferenceRecord.java create mode 100644 json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferenceRecordWithValidation.java create mode 100644 json-modules/gson-4/gson-module/src/main/java/gson/exception/GsonModuleMain.java create mode 100644 json-modules/gson-4/gson-module/src/main/java/module-info.java create mode 100644 json-modules/gson-4/gson-module/src/test/java/gson/exception/ConferenceRecordValidationTest.java create mode 100644 json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonTest.java create mode 100644 json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonWithAdapterTest.java create mode 100644 json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularStructureConfirmationTest.java create mode 100644 json-modules/gson-4/pom.xml diff --git a/json-modules/gson-4/gson-module-opens/pom.xml b/json-modules/gson-4/gson-module-opens/pom.xml new file mode 100644 index 000000000000..1e134e9ced2e --- /dev/null +++ b/json-modules/gson-4/gson-module-opens/pom.xml @@ -0,0 +1,16 @@ + + + 4.0.0 + + + com.baeldung + gson-4 + 1.0.0-SNAPSHOT + + + gson-module-opens + jar + + diff --git a/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojo.java b/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojo.java new file mode 100644 index 000000000000..a84dee83c861 --- /dev/null +++ b/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojo.java @@ -0,0 +1,23 @@ +package gson.exception; + +public class ConferencePojo { + + private String name; + private int numberOfParticipants; + + public String getName() { + return name; + } + + public int getNumberOfParticipants() { + return numberOfParticipants; + } + + public void setName(String name) { + this.name = name; + } + + public void setNumberOfParticipants(int numberOfParticipants) { + this.numberOfParticipants = numberOfParticipants; + } +} diff --git a/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojoAdapter.java b/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojoAdapter.java new file mode 100644 index 000000000000..7973212d3413 --- /dev/null +++ b/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojoAdapter.java @@ -0,0 +1,40 @@ +package gson.exception; + +import java.io.IOException; + +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; + +public class ConferencePojoAdapter extends TypeAdapter { + + @Override + public void write(JsonWriter out, ConferencePojo value) throws IOException { + throw new UnsupportedOperationException("This adapter is for deserialization only!"); + } + + @Override + public ConferencePojo read(JsonReader in) throws IOException { + String name = null; + int numberOfParticipants = 0; + + in.beginObject(); + while (in.hasNext()) { + String key = in.nextName(); + if ("name".equals(key)) { + name = in.nextString(); + } else if ("numberOfParticipants".equals(key)) { + numberOfParticipants = in.nextInt(); + } else { + in.skipValue(); + } + } + in.endObject(); + + ConferencePojo result = new ConferencePojo(); + result.setName(name); + result.setNumberOfParticipants(numberOfParticipants); + + return result; + } +} diff --git a/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojoPublic.java b/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojoPublic.java new file mode 100644 index 000000000000..2c91707bb67d --- /dev/null +++ b/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojoPublic.java @@ -0,0 +1,7 @@ +package gson.exception; + +public class ConferencePojoPublic { + + public String name; + public int numberOfParticipants; +} diff --git a/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojoWithValidation.java b/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojoWithValidation.java new file mode 100644 index 000000000000..dd1bcc999484 --- /dev/null +++ b/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojoWithValidation.java @@ -0,0 +1,23 @@ +package gson.exception; + +public class ConferencePojoWithValidation { + + private String name; + private int numberOfParticipants; + + public ConferencePojoWithValidation(String name, int numberOfParticipants) { + if (name == null || name.isBlank()) { + throw new IllegalArgumentException("The conference name cannot be left blank!"); + } + this.name = name; + this.numberOfParticipants = numberOfParticipants; + } + + public String getName() { + return name; + } + + public int getNumberOfParticipants() { + return numberOfParticipants; + } +} diff --git a/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferenceRecord.java b/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferenceRecord.java new file mode 100644 index 000000000000..efe6128c7c35 --- /dev/null +++ b/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferenceRecord.java @@ -0,0 +1,5 @@ +package gson.exception; + +public record ConferenceRecord(String name, int numberOfParticipants) { + +} diff --git a/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferenceRecordWithValidation.java b/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferenceRecordWithValidation.java new file mode 100644 index 000000000000..cfbc7c066284 --- /dev/null +++ b/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferenceRecordWithValidation.java @@ -0,0 +1,10 @@ +package gson.exception; + +public record ConferenceRecordWithValidation(String name, int numberOfParticipants) { + + public ConferenceRecordWithValidation { + if (name == null || name.isBlank()) { + throw new IllegalArgumentException("The conference name cannot be left blank!"); + } + } +} diff --git a/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/GsonModuleMain.java b/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/GsonModuleMain.java new file mode 100644 index 000000000000..342edeaa8ad1 --- /dev/null +++ b/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/GsonModuleMain.java @@ -0,0 +1,32 @@ +package gson.exception; + +import com.google.gson.Gson; + +public class GsonModuleMain { + + public static void main(String[] args) { + + String moduleName = GsonModuleMain.class.getModule() + .getName(); + + System.out.println("--- Checking execution path ---"); + if (moduleName == null) { + System.out.println("Mode: [ Class Path ] (Class in the Unnamed Module)"); + } else { + System.out.println("Mode: [ Module Path ] - Module name: " + moduleName); + } + System.out.println("----------------------------------------"); + System.out.println("--- Checking JPMS reflection ---"); + + Gson gson = new Gson(); + String json = "{\"name\":\"Java Conference\"}"; + + try { + ConferencePojo pojo = gson.fromJson(json, ConferencePojo.class); + System.out.println("Deserialization successful! Object " + pojo); + } catch (Exception e) { + System.out.println("Expected exception caught!"); + e.printStackTrace(); + } + } +} diff --git a/json-modules/gson-4/gson-module-opens/src/main/java/module-info.java b/json-modules/gson-4/gson-module-opens/src/main/java/module-info.java new file mode 100644 index 000000000000..a9be6e505c54 --- /dev/null +++ b/json-modules/gson-4/gson-module-opens/src/main/java/module-info.java @@ -0,0 +1,8 @@ +module gson.exception { + + requires com.google.gson; + + opens gson.exception to com.google.gson; + + exports gson.exception; +} diff --git a/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ConferencePojoValidationTest.java b/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ConferencePojoValidationTest.java new file mode 100644 index 000000000000..9b86c9ccc806 --- /dev/null +++ b/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ConferencePojoValidationTest.java @@ -0,0 +1,47 @@ +package gson.exception; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import com.google.gson.Gson; + +public class ConferencePojoValidationTest { + + private final Gson gson = new Gson(); + + @Test + public void givenGson_whenEmptyJson_ThenSetNull() { + final Gson gson = new Gson(); + + String emptyJson = "{}"; + + ConferencePojoWithValidation result = gson.fromJson(emptyJson, ConferencePojoWithValidation.class); + + assertNotNull(result); + assertNull(result.getName()); + } + + @ParameterizedTest + @ValueSource(strings = { + "{\"name\":\"\"}", // Empty String + "{\"name\":\" \"}" // Space only + }) + public void givenGson_whenEmptyString_ThenNoValidation(String badJson) { + final Gson gson = new Gson(); + + ConferencePojoWithValidation result = gson.fromJson(badJson, ConferencePojoWithValidation.class); + + assertNotNull(result); + + if (badJson.contains("\" \"")) { + assertEquals(" ", result.getName()); + } else { + assertEquals("", result.getName()); + } + } +} diff --git a/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ConferenceRecordValidationTest.java b/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ConferenceRecordValidationTest.java new file mode 100644 index 000000000000..6dcee73aedf3 --- /dev/null +++ b/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ConferenceRecordValidationTest.java @@ -0,0 +1,33 @@ +package gson.exception; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import com.google.gson.Gson; + +public class ConferenceRecordValidationTest { + + @ParameterizedTest + @ValueSource(strings = { + "{}", // Case 1: Empty JSON + "{\"nazwa\":null}", // Case 2: Explicit null in JSON + "{\"nazwa\":\"\"}", // Case 3: Empty String "" + "{\"nazwa\":\" \"}" // Case 4: String contains only space " " + }) + public void givenGson_WhenRecord_ThenValidation(String badJson) { + + final Gson gson = new Gson(); + + RuntimeException exception = assertThrows(RuntimeException.class, () -> { + gson.fromJson(badJson, ConferenceRecordWithValidation.class); + }); + + Throwable rootCause = exception.getCause(); + assertInstanceOf(IllegalArgumentException.class, rootCause); + assertEquals("The conference name cannot be left blank!", rootCause.getMessage()); + } +} diff --git a/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularGsonWithAdapterTest.java b/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularGsonWithAdapterTest.java new file mode 100644 index 000000000000..e3e4eb4b8814 --- /dev/null +++ b/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularGsonWithAdapterTest.java @@ -0,0 +1,25 @@ +package gson.exception; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import org.junit.jupiter.api.Test; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; // Wymagany nowy import + +public class ModularGsonWithAdapterTest { + + @Test + void whenAdapterForPojo_thenSuccess() { + final Gson gson = new GsonBuilder().registerTypeAdapter(ConferencePojo.class, new ConferencePojoAdapter()) + .create(); + + final String jsonInput = "{\"name\":\"Java Conference\", \"numberOfParticipants\":100}"; + + ConferencePojo result = gson.fromJson(jsonInput, ConferencePojo.class); + + assertNotNull(result); + assertEquals("Java Conference", result.getName()); + } +} diff --git a/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularStructureConfirmationTest.java b/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularStructureConfirmationTest.java new file mode 100644 index 000000000000..13bb58c3c5f6 --- /dev/null +++ b/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularStructureConfirmationTest.java @@ -0,0 +1,16 @@ +package gson.exception; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +class ModularStructureConfirmationTest { + + @Test + void whenModular_thenSuccess() { + Module module = this.getClass() + .getModule(); + assertTrue(module.isNamed(), "Test run on Classpath, JPMS strong encapsulation won't work!"); + } + +} diff --git a/json-modules/gson-4/gson-module/pom.xml b/json-modules/gson-4/gson-module/pom.xml new file mode 100644 index 000000000000..b1d66b6173c6 --- /dev/null +++ b/json-modules/gson-4/gson-module/pom.xml @@ -0,0 +1,15 @@ + + + 4.0.0 + + + com.baeldung + gson-4 + 1.0.0-SNAPSHOT + + + gson-module + jar + diff --git a/json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferencePojo.java b/json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferencePojo.java new file mode 100644 index 000000000000..a84dee83c861 --- /dev/null +++ b/json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferencePojo.java @@ -0,0 +1,23 @@ +package gson.exception; + +public class ConferencePojo { + + private String name; + private int numberOfParticipants; + + public String getName() { + return name; + } + + public int getNumberOfParticipants() { + return numberOfParticipants; + } + + public void setName(String name) { + this.name = name; + } + + public void setNumberOfParticipants(int numberOfParticipants) { + this.numberOfParticipants = numberOfParticipants; + } +} diff --git a/json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferencePojoAdapter.java b/json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferencePojoAdapter.java new file mode 100644 index 000000000000..7973212d3413 --- /dev/null +++ b/json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferencePojoAdapter.java @@ -0,0 +1,40 @@ +package gson.exception; + +import java.io.IOException; + +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; + +public class ConferencePojoAdapter extends TypeAdapter { + + @Override + public void write(JsonWriter out, ConferencePojo value) throws IOException { + throw new UnsupportedOperationException("This adapter is for deserialization only!"); + } + + @Override + public ConferencePojo read(JsonReader in) throws IOException { + String name = null; + int numberOfParticipants = 0; + + in.beginObject(); + while (in.hasNext()) { + String key = in.nextName(); + if ("name".equals(key)) { + name = in.nextString(); + } else if ("numberOfParticipants".equals(key)) { + numberOfParticipants = in.nextInt(); + } else { + in.skipValue(); + } + } + in.endObject(); + + ConferencePojo result = new ConferencePojo(); + result.setName(name); + result.setNumberOfParticipants(numberOfParticipants); + + return result; + } +} diff --git a/json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferencePojoPublic.java b/json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferencePojoPublic.java new file mode 100644 index 000000000000..2c91707bb67d --- /dev/null +++ b/json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferencePojoPublic.java @@ -0,0 +1,7 @@ +package gson.exception; + +public class ConferencePojoPublic { + + public String name; + public int numberOfParticipants; +} diff --git a/json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferencePojoWithValidation.java b/json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferencePojoWithValidation.java new file mode 100644 index 000000000000..dd1bcc999484 --- /dev/null +++ b/json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferencePojoWithValidation.java @@ -0,0 +1,23 @@ +package gson.exception; + +public class ConferencePojoWithValidation { + + private String name; + private int numberOfParticipants; + + public ConferencePojoWithValidation(String name, int numberOfParticipants) { + if (name == null || name.isBlank()) { + throw new IllegalArgumentException("The conference name cannot be left blank!"); + } + this.name = name; + this.numberOfParticipants = numberOfParticipants; + } + + public String getName() { + return name; + } + + public int getNumberOfParticipants() { + return numberOfParticipants; + } +} diff --git a/json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferencePojoWithValidationAdapter.java b/json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferencePojoWithValidationAdapter.java new file mode 100644 index 000000000000..2b72bcdf06ad --- /dev/null +++ b/json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferencePojoWithValidationAdapter.java @@ -0,0 +1,36 @@ +package gson.exception; + +import java.io.IOException; + +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; + +public class ConferencePojoWithValidationAdapter extends TypeAdapter { + + @Override + public void write(JsonWriter out, ConferencePojoWithValidation value) throws IOException { + throw new UnsupportedOperationException("This adapter is for deserialization only!"); + } + + @Override + public ConferencePojoWithValidation read(JsonReader in) throws IOException { + String name = null; + int numberOfParticipants = 0; + + in.beginObject(); + while (in.hasNext()) { + String key = in.nextName(); + if ("name".equals(key)) { + name = in.nextString(); + } else if ("numberOfParticipants".equals(key)) { + numberOfParticipants = in.nextInt(); + } else { + in.skipValue(); + } + } + in.endObject(); + + return new ConferencePojoWithValidation(name, numberOfParticipants); + } +} diff --git a/json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferenceRecord.java b/json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferenceRecord.java new file mode 100644 index 000000000000..efe6128c7c35 --- /dev/null +++ b/json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferenceRecord.java @@ -0,0 +1,5 @@ +package gson.exception; + +public record ConferenceRecord(String name, int numberOfParticipants) { + +} diff --git a/json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferenceRecordWithValidation.java b/json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferenceRecordWithValidation.java new file mode 100644 index 000000000000..cfbc7c066284 --- /dev/null +++ b/json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferenceRecordWithValidation.java @@ -0,0 +1,10 @@ +package gson.exception; + +public record ConferenceRecordWithValidation(String name, int numberOfParticipants) { + + public ConferenceRecordWithValidation { + if (name == null || name.isBlank()) { + throw new IllegalArgumentException("The conference name cannot be left blank!"); + } + } +} diff --git a/json-modules/gson-4/gson-module/src/main/java/gson/exception/GsonModuleMain.java b/json-modules/gson-4/gson-module/src/main/java/gson/exception/GsonModuleMain.java new file mode 100644 index 000000000000..342edeaa8ad1 --- /dev/null +++ b/json-modules/gson-4/gson-module/src/main/java/gson/exception/GsonModuleMain.java @@ -0,0 +1,32 @@ +package gson.exception; + +import com.google.gson.Gson; + +public class GsonModuleMain { + + public static void main(String[] args) { + + String moduleName = GsonModuleMain.class.getModule() + .getName(); + + System.out.println("--- Checking execution path ---"); + if (moduleName == null) { + System.out.println("Mode: [ Class Path ] (Class in the Unnamed Module)"); + } else { + System.out.println("Mode: [ Module Path ] - Module name: " + moduleName); + } + System.out.println("----------------------------------------"); + System.out.println("--- Checking JPMS reflection ---"); + + Gson gson = new Gson(); + String json = "{\"name\":\"Java Conference\"}"; + + try { + ConferencePojo pojo = gson.fromJson(json, ConferencePojo.class); + System.out.println("Deserialization successful! Object " + pojo); + } catch (Exception e) { + System.out.println("Expected exception caught!"); + e.printStackTrace(); + } + } +} diff --git a/json-modules/gson-4/gson-module/src/main/java/module-info.java b/json-modules/gson-4/gson-module/src/main/java/module-info.java new file mode 100644 index 000000000000..07bba8400deb --- /dev/null +++ b/json-modules/gson-4/gson-module/src/main/java/module-info.java @@ -0,0 +1,6 @@ +module gson.exception { + + requires com.google.gson; + + exports gson.exception; +} diff --git a/json-modules/gson-4/gson-module/src/test/java/gson/exception/ConferenceRecordValidationTest.java b/json-modules/gson-4/gson-module/src/test/java/gson/exception/ConferenceRecordValidationTest.java new file mode 100644 index 000000000000..29b5686d45d0 --- /dev/null +++ b/json-modules/gson-4/gson-module/src/test/java/gson/exception/ConferenceRecordValidationTest.java @@ -0,0 +1,33 @@ +package gson.exception; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import com.google.gson.Gson; + +public class ConferenceRecordValidationTest { + + @ParameterizedTest + @ValueSource(strings = { + "{}", // Empty JSON + "{\"nazwa\":null}", // Explicit null in JSON + "{\"nazwa\":\"\"}", // Empty String "" + "{\"nazwa\":\" \"}" // String contains only space " " + }) + public void givenGson_WhenRecord_ThenValidation(String badJson) { + + final Gson gson = new Gson(); + + RuntimeException exception = assertThrows(RuntimeException.class, () -> { + gson.fromJson(badJson, ConferenceRecordWithValidation.class); + }); + + Throwable rootCause = exception.getCause(); + assertInstanceOf(IllegalArgumentException.class, rootCause); + assertEquals("The conference name cannot be left blank!", rootCause.getMessage()); + } +} diff --git a/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonTest.java b/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonTest.java new file mode 100644 index 000000000000..bd6a1fe45ae5 --- /dev/null +++ b/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonTest.java @@ -0,0 +1,49 @@ +package gson.exception; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.junit.jupiter.api.Test; + +import com.google.gson.Gson; + +public class ModularGsonTest { + + @Test + public void givenModularAndExportedPackage_whenDeserializingPojo_thenJsonIOException() { + String json = "{\"name\":\"Java Conference\",\"numberOfParticipants\":150}"; + final Gson gson = new Gson(); + + assertThrows(com.google.gson.JsonIOException.class, () -> { + gson.fromJson(json, ConferencePojo.class); + }); + } + + @Test + public void givenModularAndExportedPackage_whenDeserializingRecord_thenSuccess() { + String json = "{\"name\":\"Java Conference\",\"numberOfParticipants\":150}"; + final Gson gson = new Gson(); + + ConferenceRecord result = assertDoesNotThrow(() -> { + return gson.fromJson(json, ConferenceRecord.class); + }); + + assertNotNull(result); + assertEquals("Java Conference", result.name()); + } + + @Test + public void givenModularAndExportedPackage_whenDeserializingPublicPojo_thenSuccess() { + String json = "{\"name\":\"Java Conference\",\"numberOfParticipants\":150}"; + final Gson gson = new Gson(); + + ConferencePojoPublic result = assertDoesNotThrow(() -> { + return gson.fromJson(json, ConferencePojoPublic.class); + }); + + assertNotNull(result); + assertEquals("Java Conference", result.name); + } +} diff --git a/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonWithAdapterTest.java b/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonWithAdapterTest.java new file mode 100644 index 000000000000..e3e4eb4b8814 --- /dev/null +++ b/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonWithAdapterTest.java @@ -0,0 +1,25 @@ +package gson.exception; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import org.junit.jupiter.api.Test; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; // Wymagany nowy import + +public class ModularGsonWithAdapterTest { + + @Test + void whenAdapterForPojo_thenSuccess() { + final Gson gson = new GsonBuilder().registerTypeAdapter(ConferencePojo.class, new ConferencePojoAdapter()) + .create(); + + final String jsonInput = "{\"name\":\"Java Conference\", \"numberOfParticipants\":100}"; + + ConferencePojo result = gson.fromJson(jsonInput, ConferencePojo.class); + + assertNotNull(result); + assertEquals("Java Conference", result.getName()); + } +} diff --git a/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularStructureConfirmationTest.java b/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularStructureConfirmationTest.java new file mode 100644 index 000000000000..13bb58c3c5f6 --- /dev/null +++ b/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularStructureConfirmationTest.java @@ -0,0 +1,16 @@ +package gson.exception; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +class ModularStructureConfirmationTest { + + @Test + void whenModular_thenSuccess() { + Module module = this.getClass() + .getModule(); + assertTrue(module.isNamed(), "Test run on Classpath, JPMS strong encapsulation won't work!"); + } + +} diff --git a/json-modules/gson-4/pom.xml b/json-modules/gson-4/pom.xml new file mode 100644 index 000000000000..5a6e4bf25df3 --- /dev/null +++ b/json-modules/gson-4/pom.xml @@ -0,0 +1,51 @@ + + + 4.0.0 + gson-4 + pom + gson-4 + + + json-modules + com.baeldung + 1.0.0-SNAPSHOT + + + + gson-module + gson-module-opens + + + + 2.14.0 + 5.11.0 + 17 + 17 + 17 + UTF-8 + + + + + com.google.code.gson + gson + ${gson-version} + + + org.junit.jupiter + junit-jupiter-api + ${junit-jupiter-version} + test + + + org.junit.jupiter + junit-jupiter-engine + ${junit-jupiter-version} + test + + + + + diff --git a/json-modules/pom.xml b/json-modules/pom.xml index 59f7feebc6cf..3751b3e91d94 100644 --- a/json-modules/pom.xml +++ b/json-modules/pom.xml @@ -25,6 +25,7 @@ gson gson-2 gson-3 + gson-4 From 8680734e32a76864c4a05fb7ddf13f3342ca6ca7 Mon Sep 17 00:00:00 2001 From: MBuczkowski2025 Date: Mon, 10 Aug 2026 18:21:48 +0200 Subject: [PATCH 02/13] BAEL-7805 removing unnecessary files, format checking --- .../java/gson/exception/ConferencePojo.java | 4 +- .../gson/exception/ConferencePojoAdapter.java | 40 --------- .../gson/exception/ConferencePojoPublic.java | 7 -- .../java/gson/exception/ConferenceRecord.java | 5 -- .../ConferenceRecordWithValidation.java | 10 --- .../src/main/java/module-info.java | 2 +- .../ConferencePojoValidationTest.java | 3 +- .../ConferenceRecordValidationTest.java | 33 -------- .../exception/ModularGsonWithAdapterTest.java | 25 ------ .../java/gson/exception/ConferencePojo.java | 4 +- .../ConferenceRecordValidationTest.java | 9 +- json-modules/gson-4/pom.xml | 84 +++++++++---------- 12 files changed, 52 insertions(+), 174 deletions(-) delete mode 100644 json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojoAdapter.java delete mode 100644 json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojoPublic.java delete mode 100644 json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferenceRecord.java delete mode 100644 json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferenceRecordWithValidation.java delete mode 100644 json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ConferenceRecordValidationTest.java delete mode 100644 json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularGsonWithAdapterTest.java diff --git a/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojo.java b/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojo.java index a84dee83c861..e10425669823 100644 --- a/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojo.java +++ b/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojo.java @@ -12,11 +12,11 @@ public String getName() { public int getNumberOfParticipants() { return numberOfParticipants; } - + public void setName(String name) { this.name = name; } - + public void setNumberOfParticipants(int numberOfParticipants) { this.numberOfParticipants = numberOfParticipants; } diff --git a/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojoAdapter.java b/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojoAdapter.java deleted file mode 100644 index 7973212d3413..000000000000 --- a/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojoAdapter.java +++ /dev/null @@ -1,40 +0,0 @@ -package gson.exception; - -import java.io.IOException; - -import com.google.gson.TypeAdapter; -import com.google.gson.stream.JsonReader; -import com.google.gson.stream.JsonWriter; - -public class ConferencePojoAdapter extends TypeAdapter { - - @Override - public void write(JsonWriter out, ConferencePojo value) throws IOException { - throw new UnsupportedOperationException("This adapter is for deserialization only!"); - } - - @Override - public ConferencePojo read(JsonReader in) throws IOException { - String name = null; - int numberOfParticipants = 0; - - in.beginObject(); - while (in.hasNext()) { - String key = in.nextName(); - if ("name".equals(key)) { - name = in.nextString(); - } else if ("numberOfParticipants".equals(key)) { - numberOfParticipants = in.nextInt(); - } else { - in.skipValue(); - } - } - in.endObject(); - - ConferencePojo result = new ConferencePojo(); - result.setName(name); - result.setNumberOfParticipants(numberOfParticipants); - - return result; - } -} diff --git a/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojoPublic.java b/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojoPublic.java deleted file mode 100644 index 2c91707bb67d..000000000000 --- a/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojoPublic.java +++ /dev/null @@ -1,7 +0,0 @@ -package gson.exception; - -public class ConferencePojoPublic { - - public String name; - public int numberOfParticipants; -} diff --git a/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferenceRecord.java b/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferenceRecord.java deleted file mode 100644 index efe6128c7c35..000000000000 --- a/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferenceRecord.java +++ /dev/null @@ -1,5 +0,0 @@ -package gson.exception; - -public record ConferenceRecord(String name, int numberOfParticipants) { - -} diff --git a/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferenceRecordWithValidation.java b/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferenceRecordWithValidation.java deleted file mode 100644 index cfbc7c066284..000000000000 --- a/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferenceRecordWithValidation.java +++ /dev/null @@ -1,10 +0,0 @@ -package gson.exception; - -public record ConferenceRecordWithValidation(String name, int numberOfParticipants) { - - public ConferenceRecordWithValidation { - if (name == null || name.isBlank()) { - throw new IllegalArgumentException("The conference name cannot be left blank!"); - } - } -} diff --git a/json-modules/gson-4/gson-module-opens/src/main/java/module-info.java b/json-modules/gson-4/gson-module-opens/src/main/java/module-info.java index a9be6e505c54..a5045129e6ec 100644 --- a/json-modules/gson-4/gson-module-opens/src/main/java/module-info.java +++ b/json-modules/gson-4/gson-module-opens/src/main/java/module-info.java @@ -5,4 +5,4 @@ opens gson.exception to com.google.gson; exports gson.exception; -} +} \ No newline at end of file diff --git a/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ConferencePojoValidationTest.java b/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ConferencePojoValidationTest.java index 9b86c9ccc806..b29be0d6319f 100644 --- a/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ConferencePojoValidationTest.java +++ b/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ConferencePojoValidationTest.java @@ -27,8 +27,7 @@ public void givenGson_whenEmptyJson_ThenSetNull() { } @ParameterizedTest - @ValueSource(strings = { - "{\"name\":\"\"}", // Empty String + @ValueSource(strings = { "{\"name\":\"\"}", // Empty String "{\"name\":\" \"}" // Space only }) public void givenGson_whenEmptyString_ThenNoValidation(String badJson) { diff --git a/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ConferenceRecordValidationTest.java b/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ConferenceRecordValidationTest.java deleted file mode 100644 index 6dcee73aedf3..000000000000 --- a/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ConferenceRecordValidationTest.java +++ /dev/null @@ -1,33 +0,0 @@ -package gson.exception; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertInstanceOf; -import static org.junit.jupiter.api.Assertions.assertThrows; - -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; - -import com.google.gson.Gson; - -public class ConferenceRecordValidationTest { - - @ParameterizedTest - @ValueSource(strings = { - "{}", // Case 1: Empty JSON - "{\"nazwa\":null}", // Case 2: Explicit null in JSON - "{\"nazwa\":\"\"}", // Case 3: Empty String "" - "{\"nazwa\":\" \"}" // Case 4: String contains only space " " - }) - public void givenGson_WhenRecord_ThenValidation(String badJson) { - - final Gson gson = new Gson(); - - RuntimeException exception = assertThrows(RuntimeException.class, () -> { - gson.fromJson(badJson, ConferenceRecordWithValidation.class); - }); - - Throwable rootCause = exception.getCause(); - assertInstanceOf(IllegalArgumentException.class, rootCause); - assertEquals("The conference name cannot be left blank!", rootCause.getMessage()); - } -} diff --git a/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularGsonWithAdapterTest.java b/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularGsonWithAdapterTest.java deleted file mode 100644 index e3e4eb4b8814..000000000000 --- a/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularGsonWithAdapterTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package gson.exception; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; - -import org.junit.jupiter.api.Test; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; // Wymagany nowy import - -public class ModularGsonWithAdapterTest { - - @Test - void whenAdapterForPojo_thenSuccess() { - final Gson gson = new GsonBuilder().registerTypeAdapter(ConferencePojo.class, new ConferencePojoAdapter()) - .create(); - - final String jsonInput = "{\"name\":\"Java Conference\", \"numberOfParticipants\":100}"; - - ConferencePojo result = gson.fromJson(jsonInput, ConferencePojo.class); - - assertNotNull(result); - assertEquals("Java Conference", result.getName()); - } -} diff --git a/json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferencePojo.java b/json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferencePojo.java index a84dee83c861..e10425669823 100644 --- a/json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferencePojo.java +++ b/json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferencePojo.java @@ -12,11 +12,11 @@ public String getName() { public int getNumberOfParticipants() { return numberOfParticipants; } - + public void setName(String name) { this.name = name; } - + public void setNumberOfParticipants(int numberOfParticipants) { this.numberOfParticipants = numberOfParticipants; } diff --git a/json-modules/gson-4/gson-module/src/test/java/gson/exception/ConferenceRecordValidationTest.java b/json-modules/gson-4/gson-module/src/test/java/gson/exception/ConferenceRecordValidationTest.java index 29b5686d45d0..2085aaf7d459 100644 --- a/json-modules/gson-4/gson-module/src/test/java/gson/exception/ConferenceRecordValidationTest.java +++ b/json-modules/gson-4/gson-module/src/test/java/gson/exception/ConferenceRecordValidationTest.java @@ -12,11 +12,10 @@ public class ConferenceRecordValidationTest { @ParameterizedTest - @ValueSource(strings = { - "{}", // Empty JSON - "{\"nazwa\":null}", // Explicit null in JSON - "{\"nazwa\":\"\"}", // Empty String "" - "{\"nazwa\":\" \"}" // String contains only space " " + @ValueSource(strings = { "{}", // Empty JSON + "{\"nazwa\":null}", // Explicit null in JSON + "{\"nazwa\":\"\"}", // Empty String "" + "{\"nazwa\":\" \"}" // String contains only space " " }) public void givenGson_WhenRecord_ThenValidation(String badJson) { diff --git a/json-modules/gson-4/pom.xml b/json-modules/gson-4/pom.xml index 5a6e4bf25df3..8e2d8b17f4cd 100644 --- a/json-modules/gson-4/pom.xml +++ b/json-modules/gson-4/pom.xml @@ -1,51 +1,51 @@ - 4.0.0 - gson-4 - pom - gson-4 + xmlns:xsi="http://w3.org" + xsi:schemaLocation="http://apache.org http://apache.org"> + 4.0.0 + gson-4 + pom + gson-4 - - json-modules - com.baeldung - 1.0.0-SNAPSHOT - + + json-modules + com.baeldung + 1.0.0-SNAPSHOT + - - gson-module - gson-module-opens - + + gson-module + gson-module-opens + - - 2.14.0 - 5.11.0 - 17 - 17 - 17 - UTF-8 - + + 2.14.0 + 5.11.0 + 17 + 17 + 17 + UTF-8 + - - - com.google.code.gson - gson - ${gson-version} - - - org.junit.jupiter - junit-jupiter-api - ${junit-jupiter-version} - test - - - org.junit.jupiter - junit-jupiter-engine - ${junit-jupiter-version} - test - - + + + com.google.code.gson + gson + ${gson-version} + + + org.junit.jupiter + junit-jupiter-api + ${junit-jupiter-version} + test + + + org.junit.jupiter + junit-jupiter-engine + ${junit-jupiter-version} + test + + From ef3482d77f89ede38a969f5419ea41bf929f53fd Mon Sep 17 00:00:00 2001 From: MBuczkowski2025 Date: Mon, 10 Aug 2026 18:45:02 +0200 Subject: [PATCH 03/13] BAEL-7805 minor fixes --- .../src/main/java/gson/exception/GsonModuleMain.java | 3 --- .../java/gson/exception/ConferencePojoValidationTest.java | 4 ++-- .../src/main/java/gson/exception/GsonModuleMain.java | 3 --- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/GsonModuleMain.java b/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/GsonModuleMain.java index 342edeaa8ad1..ec16107213ea 100644 --- a/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/GsonModuleMain.java +++ b/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/GsonModuleMain.java @@ -9,14 +9,11 @@ public static void main(String[] args) { String moduleName = GsonModuleMain.class.getModule() .getName(); - System.out.println("--- Checking execution path ---"); if (moduleName == null) { System.out.println("Mode: [ Class Path ] (Class in the Unnamed Module)"); } else { System.out.println("Mode: [ Module Path ] - Module name: " + moduleName); } - System.out.println("----------------------------------------"); - System.out.println("--- Checking JPMS reflection ---"); Gson gson = new Gson(); String json = "{\"name\":\"Java Conference\"}"; diff --git a/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ConferencePojoValidationTest.java b/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ConferencePojoValidationTest.java index b29be0d6319f..8ccadea78a30 100644 --- a/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ConferencePojoValidationTest.java +++ b/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ConferencePojoValidationTest.java @@ -27,8 +27,8 @@ public void givenGson_whenEmptyJson_ThenSetNull() { } @ParameterizedTest - @ValueSource(strings = { "{\"name\":\"\"}", // Empty String - "{\"name\":\" \"}" // Space only + @ValueSource(strings = { "{\"name\":\"\"}", // Empty String + "{\"name\":\" \"}" // Space only }) public void givenGson_whenEmptyString_ThenNoValidation(String badJson) { final Gson gson = new Gson(); diff --git a/json-modules/gson-4/gson-module/src/main/java/gson/exception/GsonModuleMain.java b/json-modules/gson-4/gson-module/src/main/java/gson/exception/GsonModuleMain.java index 342edeaa8ad1..ec16107213ea 100644 --- a/json-modules/gson-4/gson-module/src/main/java/gson/exception/GsonModuleMain.java +++ b/json-modules/gson-4/gson-module/src/main/java/gson/exception/GsonModuleMain.java @@ -9,14 +9,11 @@ public static void main(String[] args) { String moduleName = GsonModuleMain.class.getModule() .getName(); - System.out.println("--- Checking execution path ---"); if (moduleName == null) { System.out.println("Mode: [ Class Path ] (Class in the Unnamed Module)"); } else { System.out.println("Mode: [ Module Path ] - Module name: " + moduleName); } - System.out.println("----------------------------------------"); - System.out.println("--- Checking JPMS reflection ---"); Gson gson = new Gson(); String json = "{\"name\":\"Java Conference\"}"; From 3753c062bb0ddea6574251d87d315b418506aeb5 Mon Sep 17 00:00:00 2001 From: MBuczkowski2025 Date: Mon, 17 Aug 2026 18:12:43 +0200 Subject: [PATCH 04/13] BAEL-7805 changes after Code Review --- json-modules/gson-4/gson-module-opens/pom.xml | 5 ++-- .../ModularStructureConfirmationTest.java | 2 +- json-modules/gson-4/gson-module/pom.xml | 5 ++-- .../java/gson/exception/ModularGsonTest.java | 3 ++- .../exception/ModularGsonWithAdapterTest.java | 2 +- .../ModularStructureConfirmationTest.java | 2 +- json-modules/gson-4/pom.xml | 23 ++++--------------- 7 files changed, 13 insertions(+), 29 deletions(-) diff --git a/json-modules/gson-4/gson-module-opens/pom.xml b/json-modules/gson-4/gson-module-opens/pom.xml index 1e134e9ced2e..2be112fa19b8 100644 --- a/json-modules/gson-4/gson-module-opens/pom.xml +++ b/json-modules/gson-4/gson-module-opens/pom.xml @@ -1,7 +1,6 @@ - + 4.0.0 diff --git a/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularStructureConfirmationTest.java b/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularStructureConfirmationTest.java index 13bb58c3c5f6..25bb5a2890ea 100644 --- a/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularStructureConfirmationTest.java +++ b/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularStructureConfirmationTest.java @@ -1,6 +1,6 @@ package gson.exception; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.Test; diff --git a/json-modules/gson-4/gson-module/pom.xml b/json-modules/gson-4/gson-module/pom.xml index b1d66b6173c6..def51e551bff 100644 --- a/json-modules/gson-4/gson-module/pom.xml +++ b/json-modules/gson-4/gson-module/pom.xml @@ -1,7 +1,6 @@ - + 4.0.0 diff --git a/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonTest.java b/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonTest.java index bd6a1fe45ae5..8704ce930125 100644 --- a/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonTest.java +++ b/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonTest.java @@ -8,6 +8,7 @@ import org.junit.jupiter.api.Test; import com.google.gson.Gson; +import com.google.gson.JsonIOException; public class ModularGsonTest { @@ -16,7 +17,7 @@ public void givenModularAndExportedPackage_whenDeserializingPojo_thenJsonIOExcep String json = "{\"name\":\"Java Conference\",\"numberOfParticipants\":150}"; final Gson gson = new Gson(); - assertThrows(com.google.gson.JsonIOException.class, () -> { + assertThrows(JsonIOException.class, () -> { gson.fromJson(json, ConferencePojo.class); }); } diff --git a/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonWithAdapterTest.java b/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonWithAdapterTest.java index e3e4eb4b8814..9db0ea352a46 100644 --- a/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonWithAdapterTest.java +++ b/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonWithAdapterTest.java @@ -6,7 +6,7 @@ import org.junit.jupiter.api.Test; import com.google.gson.Gson; -import com.google.gson.GsonBuilder; // Wymagany nowy import +import com.google.gson.GsonBuilder; public class ModularGsonWithAdapterTest { diff --git a/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularStructureConfirmationTest.java b/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularStructureConfirmationTest.java index 13bb58c3c5f6..25bb5a2890ea 100644 --- a/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularStructureConfirmationTest.java +++ b/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularStructureConfirmationTest.java @@ -1,6 +1,6 @@ package gson.exception; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.Test; diff --git a/json-modules/gson-4/pom.xml b/json-modules/gson-4/pom.xml index 8e2d8b17f4cd..fcedc6b21de1 100644 --- a/json-modules/gson-4/pom.xml +++ b/json-modules/gson-4/pom.xml @@ -1,7 +1,6 @@ - + 4.0.0 gson-4 pom @@ -19,31 +18,17 @@ - 2.14.0 - 5.11.0 + 2.14.0 17 17 17 - UTF-8 com.google.code.gson gson - ${gson-version} - - - org.junit.jupiter - junit-jupiter-api - ${junit-jupiter-version} - test - - - org.junit.jupiter - junit-jupiter-engine - ${junit-jupiter-version} - test + ${gson.version} From ad79e4be19bb375e769346f3c023c2bf3f50bb08 Mon Sep 17 00:00:00 2001 From: MBuczkowski2025 Date: Mon, 17 Aug 2026 18:20:58 +0200 Subject: [PATCH 05/13] BAEL-7805 validaton code and tests removed --- .../ConferencePojoValidationTest.java | 46 ------------------- .../ConferencePojoWithValidation.java | 23 ---------- .../ConferencePojoWithValidationAdapter.java | 36 --------------- .../ConferenceRecordWithValidation.java | 10 ---- .../ConferenceRecordValidationTest.java | 32 ------------- 5 files changed, 147 deletions(-) delete mode 100644 json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ConferencePojoValidationTest.java delete mode 100644 json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferencePojoWithValidation.java delete mode 100644 json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferencePojoWithValidationAdapter.java delete mode 100644 json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferenceRecordWithValidation.java delete mode 100644 json-modules/gson-4/gson-module/src/test/java/gson/exception/ConferenceRecordValidationTest.java diff --git a/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ConferencePojoValidationTest.java b/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ConferencePojoValidationTest.java deleted file mode 100644 index 8ccadea78a30..000000000000 --- a/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ConferencePojoValidationTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package gson.exception; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; - -import com.google.gson.Gson; - -public class ConferencePojoValidationTest { - - private final Gson gson = new Gson(); - - @Test - public void givenGson_whenEmptyJson_ThenSetNull() { - final Gson gson = new Gson(); - - String emptyJson = "{}"; - - ConferencePojoWithValidation result = gson.fromJson(emptyJson, ConferencePojoWithValidation.class); - - assertNotNull(result); - assertNull(result.getName()); - } - - @ParameterizedTest - @ValueSource(strings = { "{\"name\":\"\"}", // Empty String - "{\"name\":\" \"}" // Space only - }) - public void givenGson_whenEmptyString_ThenNoValidation(String badJson) { - final Gson gson = new Gson(); - - ConferencePojoWithValidation result = gson.fromJson(badJson, ConferencePojoWithValidation.class); - - assertNotNull(result); - - if (badJson.contains("\" \"")) { - assertEquals(" ", result.getName()); - } else { - assertEquals("", result.getName()); - } - } -} diff --git a/json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferencePojoWithValidation.java b/json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferencePojoWithValidation.java deleted file mode 100644 index dd1bcc999484..000000000000 --- a/json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferencePojoWithValidation.java +++ /dev/null @@ -1,23 +0,0 @@ -package gson.exception; - -public class ConferencePojoWithValidation { - - private String name; - private int numberOfParticipants; - - public ConferencePojoWithValidation(String name, int numberOfParticipants) { - if (name == null || name.isBlank()) { - throw new IllegalArgumentException("The conference name cannot be left blank!"); - } - this.name = name; - this.numberOfParticipants = numberOfParticipants; - } - - public String getName() { - return name; - } - - public int getNumberOfParticipants() { - return numberOfParticipants; - } -} diff --git a/json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferencePojoWithValidationAdapter.java b/json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferencePojoWithValidationAdapter.java deleted file mode 100644 index 2b72bcdf06ad..000000000000 --- a/json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferencePojoWithValidationAdapter.java +++ /dev/null @@ -1,36 +0,0 @@ -package gson.exception; - -import java.io.IOException; - -import com.google.gson.TypeAdapter; -import com.google.gson.stream.JsonReader; -import com.google.gson.stream.JsonWriter; - -public class ConferencePojoWithValidationAdapter extends TypeAdapter { - - @Override - public void write(JsonWriter out, ConferencePojoWithValidation value) throws IOException { - throw new UnsupportedOperationException("This adapter is for deserialization only!"); - } - - @Override - public ConferencePojoWithValidation read(JsonReader in) throws IOException { - String name = null; - int numberOfParticipants = 0; - - in.beginObject(); - while (in.hasNext()) { - String key = in.nextName(); - if ("name".equals(key)) { - name = in.nextString(); - } else if ("numberOfParticipants".equals(key)) { - numberOfParticipants = in.nextInt(); - } else { - in.skipValue(); - } - } - in.endObject(); - - return new ConferencePojoWithValidation(name, numberOfParticipants); - } -} diff --git a/json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferenceRecordWithValidation.java b/json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferenceRecordWithValidation.java deleted file mode 100644 index cfbc7c066284..000000000000 --- a/json-modules/gson-4/gson-module/src/main/java/gson/exception/ConferenceRecordWithValidation.java +++ /dev/null @@ -1,10 +0,0 @@ -package gson.exception; - -public record ConferenceRecordWithValidation(String name, int numberOfParticipants) { - - public ConferenceRecordWithValidation { - if (name == null || name.isBlank()) { - throw new IllegalArgumentException("The conference name cannot be left blank!"); - } - } -} diff --git a/json-modules/gson-4/gson-module/src/test/java/gson/exception/ConferenceRecordValidationTest.java b/json-modules/gson-4/gson-module/src/test/java/gson/exception/ConferenceRecordValidationTest.java deleted file mode 100644 index 2085aaf7d459..000000000000 --- a/json-modules/gson-4/gson-module/src/test/java/gson/exception/ConferenceRecordValidationTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package gson.exception; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertInstanceOf; -import static org.junit.jupiter.api.Assertions.assertThrows; - -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; - -import com.google.gson.Gson; - -public class ConferenceRecordValidationTest { - - @ParameterizedTest - @ValueSource(strings = { "{}", // Empty JSON - "{\"nazwa\":null}", // Explicit null in JSON - "{\"nazwa\":\"\"}", // Empty String "" - "{\"nazwa\":\" \"}" // String contains only space " " - }) - public void givenGson_WhenRecord_ThenValidation(String badJson) { - - final Gson gson = new Gson(); - - RuntimeException exception = assertThrows(RuntimeException.class, () -> { - gson.fromJson(badJson, ConferenceRecordWithValidation.class); - }); - - Throwable rootCause = exception.getCause(); - assertInstanceOf(IllegalArgumentException.class, rootCause); - assertEquals("The conference name cannot be left blank!", rootCause.getMessage()); - } -} From e3eaa0d45ed560c23a090a874efcd7bdef1d266f Mon Sep 17 00:00:00 2001 From: MBuczkowski2025 Date: Mon, 17 Aug 2026 18:34:27 +0200 Subject: [PATCH 06/13] BAEL-7805 changes after Code Review, cont. --- .../ConferencePojoWithValidation.java | 23 ---------------- .../gson/exception/ModularOpensGsonTest.java | 26 +++++++++++++++++++ .../java/gson/exception/ModularGsonTest.java | 6 ++--- .../exception/ModularGsonWithAdapterTest.java | 3 ++- 4 files changed, 31 insertions(+), 27 deletions(-) delete mode 100644 json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojoWithValidation.java create mode 100644 json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularOpensGsonTest.java diff --git a/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojoWithValidation.java b/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojoWithValidation.java deleted file mode 100644 index dd1bcc999484..000000000000 --- a/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojoWithValidation.java +++ /dev/null @@ -1,23 +0,0 @@ -package gson.exception; - -public class ConferencePojoWithValidation { - - private String name; - private int numberOfParticipants; - - public ConferencePojoWithValidation(String name, int numberOfParticipants) { - if (name == null || name.isBlank()) { - throw new IllegalArgumentException("The conference name cannot be left blank!"); - } - this.name = name; - this.numberOfParticipants = numberOfParticipants; - } - - public String getName() { - return name; - } - - public int getNumberOfParticipants() { - return numberOfParticipants; - } -} diff --git a/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularOpensGsonTest.java b/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularOpensGsonTest.java new file mode 100644 index 000000000000..5a800a2d8459 --- /dev/null +++ b/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularOpensGsonTest.java @@ -0,0 +1,26 @@ +package gson.exception; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import org.junit.jupiter.api.Test; + +import com.google.gson.Gson; + +class ModularOpensGsonTest { + + @Test + void givenModularAndOpens_whenDeserializingPojo_thenSuccess() { + String json = "{\"name\":\"Java Conference\",\"numberOfParticipants\":150}"; + Gson gson = new Gson(); + + ConferencePojo result = assertDoesNotThrow(() -> { + return gson.fromJson(json, ConferencePojo.class); + }); + + assertNotNull(result); + assertEquals("Java Conference", result.getName()); + } + +} diff --git a/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonTest.java b/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonTest.java index 8704ce930125..c68d119502db 100644 --- a/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonTest.java +++ b/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonTest.java @@ -13,7 +13,7 @@ public class ModularGsonTest { @Test - public void givenModularAndExportedPackage_whenDeserializingPojo_thenJsonIOException() { + void givenModularAndExportedPackage_whenDeserializingPojo_thenJsonIOException() { String json = "{\"name\":\"Java Conference\",\"numberOfParticipants\":150}"; final Gson gson = new Gson(); @@ -23,7 +23,7 @@ public void givenModularAndExportedPackage_whenDeserializingPojo_thenJsonIOExcep } @Test - public void givenModularAndExportedPackage_whenDeserializingRecord_thenSuccess() { + void givenModularAndExportedPackage_whenDeserializingRecord_thenSuccess() { String json = "{\"name\":\"Java Conference\",\"numberOfParticipants\":150}"; final Gson gson = new Gson(); @@ -36,7 +36,7 @@ public void givenModularAndExportedPackage_whenDeserializingRecord_thenSuccess() } @Test - public void givenModularAndExportedPackage_whenDeserializingPublicPojo_thenSuccess() { + void givenModularAndExportedPackage_whenDeserializingPublicPojo_thenSuccess() { String json = "{\"name\":\"Java Conference\",\"numberOfParticipants\":150}"; final Gson gson = new Gson(); diff --git a/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonWithAdapterTest.java b/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonWithAdapterTest.java index 9db0ea352a46..60ca2bea7b5f 100644 --- a/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonWithAdapterTest.java +++ b/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonWithAdapterTest.java @@ -12,7 +12,8 @@ public class ModularGsonWithAdapterTest { @Test void whenAdapterForPojo_thenSuccess() { - final Gson gson = new GsonBuilder().registerTypeAdapter(ConferencePojo.class, new ConferencePojoAdapter()) + Gson gson = new GsonBuilder() + .registerTypeAdapter(ConferencePojo.class, new ConferencePojoAdapter()) .create(); final String jsonInput = "{\"name\":\"Java Conference\", \"numberOfParticipants\":100}"; From a461a1d4240927c647de6a95c1078135df3e2eb8 Mon Sep 17 00:00:00 2001 From: MBuczkowski2025 Date: Mon, 17 Aug 2026 18:40:06 +0200 Subject: [PATCH 07/13] BAEL-7805 changes after Code Review, cont. --- ...{ModularOpensGsonTest.java => ModularOpensGsonUnitTest.java} | 2 +- ...ationTest.java => ModularStructureConfirmationUnitTest.java} | 2 +- .../{ModularGsonTest.java => ModularGsonUnitTest.java} | 2 +- ...WithAdapterTest.java => ModularGsonWithAdapterUnitTest.java} | 2 +- ...ationTest.java => ModularStructureConfirmationUnitTest.java} | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) rename json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/{ModularOpensGsonTest.java => ModularOpensGsonUnitTest.java} (95%) rename json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/{ModularStructureConfirmationTest.java => ModularStructureConfirmationUnitTest.java} (88%) rename json-modules/gson-4/gson-module/src/test/java/gson/exception/{ModularGsonTest.java => ModularGsonUnitTest.java} (97%) rename json-modules/gson-4/gson-module/src/test/java/gson/exception/{ModularGsonWithAdapterTest.java => ModularGsonWithAdapterUnitTest.java} (94%) rename json-modules/gson-4/gson-module/src/test/java/gson/exception/{ModularStructureConfirmationTest.java => ModularStructureConfirmationUnitTest.java} (88%) diff --git a/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularOpensGsonTest.java b/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularOpensGsonUnitTest.java similarity index 95% rename from json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularOpensGsonTest.java rename to json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularOpensGsonUnitTest.java index 5a800a2d8459..eaea47f71452 100644 --- a/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularOpensGsonTest.java +++ b/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularOpensGsonUnitTest.java @@ -8,7 +8,7 @@ import com.google.gson.Gson; -class ModularOpensGsonTest { +class ModularOpensGsonUnitTest { @Test void givenModularAndOpens_whenDeserializingPojo_thenSuccess() { diff --git a/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularStructureConfirmationTest.java b/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularStructureConfirmationUnitTest.java similarity index 88% rename from json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularStructureConfirmationTest.java rename to json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularStructureConfirmationUnitTest.java index 25bb5a2890ea..7d1a8e3e3022 100644 --- a/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularStructureConfirmationTest.java +++ b/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularStructureConfirmationUnitTest.java @@ -4,7 +4,7 @@ import org.junit.jupiter.api.Test; -class ModularStructureConfirmationTest { +class ModularStructureConfirmationUnitTest { @Test void whenModular_thenSuccess() { diff --git a/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonTest.java b/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonUnitTest.java similarity index 97% rename from json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonTest.java rename to json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonUnitTest.java index c68d119502db..1e41cbe66788 100644 --- a/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonTest.java +++ b/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonUnitTest.java @@ -10,7 +10,7 @@ import com.google.gson.Gson; import com.google.gson.JsonIOException; -public class ModularGsonTest { +public class ModularGsonUnitTest { @Test void givenModularAndExportedPackage_whenDeserializingPojo_thenJsonIOException() { diff --git a/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonWithAdapterTest.java b/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonWithAdapterUnitTest.java similarity index 94% rename from json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonWithAdapterTest.java rename to json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonWithAdapterUnitTest.java index 60ca2bea7b5f..1a26db75bbf5 100644 --- a/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonWithAdapterTest.java +++ b/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonWithAdapterUnitTest.java @@ -8,7 +8,7 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; -public class ModularGsonWithAdapterTest { +public class ModularGsonWithAdapterUnitTest { @Test void whenAdapterForPojo_thenSuccess() { diff --git a/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularStructureConfirmationTest.java b/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularStructureConfirmationUnitTest.java similarity index 88% rename from json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularStructureConfirmationTest.java rename to json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularStructureConfirmationUnitTest.java index 25bb5a2890ea..7d1a8e3e3022 100644 --- a/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularStructureConfirmationTest.java +++ b/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularStructureConfirmationUnitTest.java @@ -4,7 +4,7 @@ import org.junit.jupiter.api.Test; -class ModularStructureConfirmationTest { +class ModularStructureConfirmationUnitTest { @Test void whenModular_thenSuccess() { From be445b02c3cf47fcf5e379c59f8efac76d14aa1e Mon Sep 17 00:00:00 2001 From: MBuczkowski2025 Date: Mon, 17 Aug 2026 18:59:55 +0200 Subject: [PATCH 08/13] BAEL-7805 changes after Code Review, cont. --- .../main/java/gson/exception/GsonModuleMain.java | 14 +++++++++----- .../src/main/java/module-info.java | 1 + .../ModularStructureConfirmationUnitTest.java | 3 ++- .../main/java/gson/exception/GsonModuleMain.java | 12 ++++++++---- .../gson-module/src/main/java/module-info.java | 1 + .../ModularStructureConfirmationUnitTest.java | 2 +- 6 files changed, 22 insertions(+), 11 deletions(-) diff --git a/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/GsonModuleMain.java b/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/GsonModuleMain.java index ec16107213ea..a959ffbba7fd 100644 --- a/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/GsonModuleMain.java +++ b/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/GsonModuleMain.java @@ -1,18 +1,22 @@ package gson.exception; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.google.gson.Gson; public class GsonModuleMain { public static void main(String[] args) { - + Logger log = LoggerFactory.getLogger(GsonModuleMain.class); String moduleName = GsonModuleMain.class.getModule() .getName(); if (moduleName == null) { - System.out.println("Mode: [ Class Path ] (Class in the Unnamed Module)"); + log.info("Mode: [ Class Path ] (Class in the Unnamed Module)"); } else { - System.out.println("Mode: [ Module Path ] - Module name: " + moduleName); + log.info("Mode: [ Module Path ] - Module name: " + moduleName); } Gson gson = new Gson(); @@ -20,9 +24,9 @@ public static void main(String[] args) { try { ConferencePojo pojo = gson.fromJson(json, ConferencePojo.class); - System.out.println("Deserialization successful! Object " + pojo); + log.info("Deserialization successful! Object " + pojo); } catch (Exception e) { - System.out.println("Expected exception caught!"); + log.info("Expected exception caught!"); e.printStackTrace(); } } diff --git a/json-modules/gson-4/gson-module-opens/src/main/java/module-info.java b/json-modules/gson-4/gson-module-opens/src/main/java/module-info.java index a5045129e6ec..073dbc9dfa81 100644 --- a/json-modules/gson-4/gson-module-opens/src/main/java/module-info.java +++ b/json-modules/gson-4/gson-module-opens/src/main/java/module-info.java @@ -1,6 +1,7 @@ module gson.exception { requires com.google.gson; + requires org.slf4j; opens gson.exception to com.google.gson; diff --git a/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularStructureConfirmationUnitTest.java b/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularStructureConfirmationUnitTest.java index 7d1a8e3e3022..dc31e51aa561 100644 --- a/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularStructureConfirmationUnitTest.java +++ b/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/ModularStructureConfirmationUnitTest.java @@ -7,9 +7,10 @@ class ModularStructureConfirmationUnitTest { @Test - void whenModular_thenSuccess() { + void whenModular_thenModuleIsNamed() { Module module = this.getClass() .getModule(); + assertTrue(module.isNamed(), "Test run on Classpath, JPMS strong encapsulation won't work!"); } diff --git a/json-modules/gson-4/gson-module/src/main/java/gson/exception/GsonModuleMain.java b/json-modules/gson-4/gson-module/src/main/java/gson/exception/GsonModuleMain.java index ec16107213ea..f3fa8f853f30 100644 --- a/json-modules/gson-4/gson-module/src/main/java/gson/exception/GsonModuleMain.java +++ b/json-modules/gson-4/gson-module/src/main/java/gson/exception/GsonModuleMain.java @@ -1,18 +1,22 @@ package gson.exception; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.google.gson.Gson; public class GsonModuleMain { public static void main(String[] args) { + Logger log = LoggerFactory.getLogger(GsonModuleMain.class); String moduleName = GsonModuleMain.class.getModule() .getName(); if (moduleName == null) { - System.out.println("Mode: [ Class Path ] (Class in the Unnamed Module)"); + log.info("Mode: [ Class Path ] (Class in the Unnamed Module)"); } else { - System.out.println("Mode: [ Module Path ] - Module name: " + moduleName); + log.info("Mode: [ Module Path ] - Module name: " + moduleName); } Gson gson = new Gson(); @@ -20,9 +24,9 @@ public static void main(String[] args) { try { ConferencePojo pojo = gson.fromJson(json, ConferencePojo.class); - System.out.println("Deserialization successful! Object " + pojo); + log.info("Deserialization successful! Object " + pojo); } catch (Exception e) { - System.out.println("Expected exception caught!"); + log.info("Expected exception caught!"); e.printStackTrace(); } } diff --git a/json-modules/gson-4/gson-module/src/main/java/module-info.java b/json-modules/gson-4/gson-module/src/main/java/module-info.java index 07bba8400deb..9401a2cc7bc5 100644 --- a/json-modules/gson-4/gson-module/src/main/java/module-info.java +++ b/json-modules/gson-4/gson-module/src/main/java/module-info.java @@ -1,6 +1,7 @@ module gson.exception { requires com.google.gson; + requires org.slf4j; exports gson.exception; } diff --git a/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularStructureConfirmationUnitTest.java b/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularStructureConfirmationUnitTest.java index 7d1a8e3e3022..db9e41ac851b 100644 --- a/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularStructureConfirmationUnitTest.java +++ b/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularStructureConfirmationUnitTest.java @@ -7,7 +7,7 @@ class ModularStructureConfirmationUnitTest { @Test - void whenModular_thenSuccess() { + void whenModular_thenModuleIsNamed() { Module module = this.getClass() .getModule(); assertTrue(module.isNamed(), "Test run on Classpath, JPMS strong encapsulation won't work!"); From 88a9b488228aa7e85c45a4e53347c64129cef5ce Mon Sep 17 00:00:00 2001 From: MBuczkowski2025 Date: Mon, 17 Aug 2026 19:05:46 +0200 Subject: [PATCH 09/13] BAEL-7805 changes after Code Review, cont. --- .../src/test/java/gson/exception/ModularGsonUnitTest.java | 6 +++--- .../java/gson/exception/ModularGsonWithAdapterUnitTest.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonUnitTest.java b/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonUnitTest.java index 1e41cbe66788..5fc9e79b4e91 100644 --- a/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonUnitTest.java +++ b/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonUnitTest.java @@ -15,7 +15,7 @@ public class ModularGsonUnitTest { @Test void givenModularAndExportedPackage_whenDeserializingPojo_thenJsonIOException() { String json = "{\"name\":\"Java Conference\",\"numberOfParticipants\":150}"; - final Gson gson = new Gson(); + Gson gson = new Gson(); assertThrows(JsonIOException.class, () -> { gson.fromJson(json, ConferencePojo.class); @@ -25,7 +25,7 @@ void givenModularAndExportedPackage_whenDeserializingPojo_thenJsonIOException() @Test void givenModularAndExportedPackage_whenDeserializingRecord_thenSuccess() { String json = "{\"name\":\"Java Conference\",\"numberOfParticipants\":150}"; - final Gson gson = new Gson(); + Gson gson = new Gson(); ConferenceRecord result = assertDoesNotThrow(() -> { return gson.fromJson(json, ConferenceRecord.class); @@ -38,7 +38,7 @@ void givenModularAndExportedPackage_whenDeserializingRecord_thenSuccess() { @Test void givenModularAndExportedPackage_whenDeserializingPublicPojo_thenSuccess() { String json = "{\"name\":\"Java Conference\",\"numberOfParticipants\":150}"; - final Gson gson = new Gson(); + Gson gson = new Gson(); ConferencePojoPublic result = assertDoesNotThrow(() -> { return gson.fromJson(json, ConferencePojoPublic.class); diff --git a/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonWithAdapterUnitTest.java b/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonWithAdapterUnitTest.java index 1a26db75bbf5..80b03af6cd6a 100644 --- a/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonWithAdapterUnitTest.java +++ b/json-modules/gson-4/gson-module/src/test/java/gson/exception/ModularGsonWithAdapterUnitTest.java @@ -16,7 +16,7 @@ void whenAdapterForPojo_thenSuccess() { .registerTypeAdapter(ConferencePojo.class, new ConferencePojoAdapter()) .create(); - final String jsonInput = "{\"name\":\"Java Conference\", \"numberOfParticipants\":100}"; + String jsonInput = "{\"name\":\"Java Conference\", \"numberOfParticipants\":100}"; ConferencePojo result = gson.fromJson(jsonInput, ConferencePojo.class); From af29485c6acaab24b56cfe683f4c43b70d7de081 Mon Sep 17 00:00:00 2001 From: MBuczkowski2025 Date: Wed, 19 Aug 2026 20:28:37 +0200 Subject: [PATCH 10/13] BAEL-7805 pom.xml fix. --- json-modules/gson-4/pom.xml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/json-modules/gson-4/pom.xml b/json-modules/gson-4/pom.xml index fcedc6b21de1..e484a8ff2265 100644 --- a/json-modules/gson-4/pom.xml +++ b/json-modules/gson-4/pom.xml @@ -18,9 +18,7 @@ - 2.14.0 - 17 - 17 + 2.10.1 17 From 2c42e301de12584de711b2330d85e68a883a1a5a Mon Sep 17 00:00:00 2001 From: MBuczkowski2025 Date: Wed, 19 Aug 2026 20:32:59 +0200 Subject: [PATCH 11/13] BAEL-7805 adding class and tests for LocalDate --- .../exception/ConferencePojoWithDate.java | 34 ++++++++++++++ .../exception/PojoWithLocalDateUnitTest.java | 45 +++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojoWithDate.java create mode 100644 json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/PojoWithLocalDateUnitTest.java diff --git a/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojoWithDate.java b/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojoWithDate.java new file mode 100644 index 000000000000..88916ccd6f3b --- /dev/null +++ b/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/ConferencePojoWithDate.java @@ -0,0 +1,34 @@ +package gson.exception; + +import java.time.LocalDate; + +public class ConferencePojoWithDate { + + private String name; + private int numberOfParticipants; + private LocalDate conferenceStart; + + public String getName() { + return name; + } + + public int getNumberOfParticipants() { + return numberOfParticipants; + } + + public void setName(String name) { + this.name = name; + } + + public void setNumberOfParticipants(int numberOfParticipants) { + this.numberOfParticipants = numberOfParticipants; + } + + public LocalDate getConferenceStart() { + return conferenceStart; + } + + public void setConferenceStart(LocalDate conferenceStart) { + this.conferenceStart = conferenceStart; + } +} diff --git a/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/PojoWithLocalDateUnitTest.java b/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/PojoWithLocalDateUnitTest.java new file mode 100644 index 000000000000..24d16ad7c13c --- /dev/null +++ b/json-modules/gson-4/gson-module-opens/src/test/java/gson/exception/PojoWithLocalDateUnitTest.java @@ -0,0 +1,45 @@ +package gson.exception; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.time.LocalDate; + +import org.junit.jupiter.api.Test; + +import com.google.gson.Gson; +import com.google.gson.JsonSyntaxException; + +class PojoWithLocalDateUnitTest { + + @Test + void whenObjectDateFormat_thenSuccessfulDeserialization() { + String correctJson = "{" + + "\"name\":\"Java Conference\"," + + "\"numberOfParticipants\":500," + + "\"conferenceStart\":{\"year\":2026,\"month\":8,\"day\":17}" + + "}"; + + Gson gson = new Gson(); + ConferencePojoWithDate result = gson.fromJson(correctJson, ConferencePojoWithDate.class); + + LocalDate excpectedDate = LocalDate.of(2026, 8, 17); + assertEquals(excpectedDate, result.getConferenceStart(), "Date should be the same as in JSON"); + } + + @Test + void whenISOTextFormat_thenJsonSyntaxException() { + + String wrongDateInJson = "{" + + "\"name\":\"Java Conference\"," + + "\"numberOfParticipants\":500," + + "\"conferenceStart\":\"2026-08-17\"" + + "}"; + + Gson gson = new Gson(); + assertThrows(JsonSyntaxException.class, () -> { + gson.fromJson(wrongDateInJson, ConferencePojoWithDate.class); + }, "JsonSyntaxException was expected due to an incompatible date format"); + + } +} From 91375815b0240d6adc2f51ebe96ddad326866ffb Mon Sep 17 00:00:00 2001 From: MBuczkowski2025 Date: Wed, 19 Aug 2026 20:41:16 +0200 Subject: [PATCH 12/13] BAEL-7805 fix Gson version --- json-modules/gson-4/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/json-modules/gson-4/pom.xml b/json-modules/gson-4/pom.xml index e484a8ff2265..bea764b429ba 100644 --- a/json-modules/gson-4/pom.xml +++ b/json-modules/gson-4/pom.xml @@ -18,7 +18,7 @@ - 2.10.1 + 2.14.0 17 From 31bc8dddcd238a0d3ab73c86b5b11a040b6bdead Mon Sep 17 00:00:00 2001 From: MBuczkowski2025 Date: Thu, 20 Aug 2026 19:02:26 +0200 Subject: [PATCH 13/13] BAEL-7805 minor fixes --- .../src/main/java/gson/exception/GsonModuleMain.java | 7 +++++-- .../src/main/java/gson/exception/GsonModuleMain.java | 3 ++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/GsonModuleMain.java b/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/GsonModuleMain.java index a959ffbba7fd..efc7faa67a8e 100644 --- a/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/GsonModuleMain.java +++ b/json-modules/gson-4/gson-module-opens/src/main/java/gson/exception/GsonModuleMain.java @@ -1,5 +1,6 @@ package gson.exception; +import java.time.LocalDate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -8,8 +9,10 @@ public class GsonModuleMain { + static Logger log = LoggerFactory.getLogger(GsonModuleMain.class); + public static void main(String[] args) { - Logger log = LoggerFactory.getLogger(GsonModuleMain.class); + String moduleName = GsonModuleMain.class.getModule() .getName(); @@ -18,7 +21,7 @@ public static void main(String[] args) { } else { log.info("Mode: [ Module Path ] - Module name: " + moduleName); } - + LocalDate excpectedDate = LocalDate.of(2026, 8, 17); Gson gson = new Gson(); String json = "{\"name\":\"Java Conference\"}"; diff --git a/json-modules/gson-4/gson-module/src/main/java/gson/exception/GsonModuleMain.java b/json-modules/gson-4/gson-module/src/main/java/gson/exception/GsonModuleMain.java index f3fa8f853f30..c2c0dae8c204 100644 --- a/json-modules/gson-4/gson-module/src/main/java/gson/exception/GsonModuleMain.java +++ b/json-modules/gson-4/gson-module/src/main/java/gson/exception/GsonModuleMain.java @@ -7,8 +7,9 @@ public class GsonModuleMain { + static Logger log = LoggerFactory.getLogger(GsonModuleMain.class); + public static void main(String[] args) { - Logger log = LoggerFactory.getLogger(GsonModuleMain.class); String moduleName = GsonModuleMain.class.getModule() .getName();