From 951abcb7ab686c99f9a9cdb239a548b08bbd3b40 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebastian=20Ho=C3=9F?= Date: Mon, 5 Dec 2022 09:42:41 +0100 Subject: [PATCH] add support for gson serialization --- .idea/inspectionProfiles/storage-units.java.xml | 2 +- README.md | 22 +++++++++ pom.xml | 1 + storage-units-gson/pom.xml | 47 +++++++++++++++++++ storage-units-gson/src/main/java/module-info.java | 15 +++++++ .../gson/BinaryStorageUnitDeserializer.java | 29 ++++++++++++ .../gson/DecimalStorageUnitDeserializer.java | 29 ++++++++++++ .../storageunits/gson/StorageUnitSerializer.java | 29 ++++++++++++ .../wtf/metio/storageunits/gson/package-info.java | 10 +++++ .../gson/BinaryDeserializationTest.java | 37 +++++++++++++++ .../gson/DecimalDeserializationTest.java | 37 +++++++++++++++ .../gson/StorageUnitSerializerTest.java | 52 ++++++++++++++++++++++ 12 files changed, 309 insertions(+), 1 deletion(-) create mode 100644 storage-units-gson/pom.xml create mode 100644 storage-units-gson/src/main/java/module-info.java create mode 100644 storage-units-gson/src/main/java/wtf/metio/storageunits/gson/BinaryStorageUnitDeserializer.java create mode 100644 storage-units-gson/src/main/java/wtf/metio/storageunits/gson/DecimalStorageUnitDeserializer.java create mode 100644 storage-units-gson/src/main/java/wtf/metio/storageunits/gson/StorageUnitSerializer.java create mode 100644 storage-units-gson/src/main/java/wtf/metio/storageunits/gson/package-info.java create mode 100644 storage-units-gson/src/test/java/wtf/metio/storageunits/gson/BinaryDeserializationTest.java create mode 100644 storage-units-gson/src/test/java/wtf/metio/storageunits/gson/DecimalDeserializationTest.java create mode 100644 storage-units-gson/src/test/java/wtf/metio/storageunits/gson/StorageUnitSerializerTest.java diff --git a/.idea/inspectionProfiles/storage-units.java.xml b/.idea/inspectionProfiles/storage-units.java.xml index 977fac4..169bf0c 100644 --- a/.idea/inspectionProfiles/storage-units.java.xml +++ b/.idea/inspectionProfiles/storage-units.java.xml @@ -124,7 +124,7 @@ diff --git a/README.md b/README.md index 79d8f7d..c8dddb6 100644 --- a/README.md +++ b/README.md @@ -278,6 +278,20 @@ public class HardDisk implements Serializable { } ``` +#### GSON + +Use a [GSON](https://github.com/google/gson) serializer/deserializer like this: + +```java +import static wtf.metio.storageunits.gson.*; + +new GsonBuilder() + .registerTypeHierarchyAdapter(StorageUnit.class, new StorageUnitSerializer()) + .registerTypeHierarchyAdapter(StorageUnit.class, new BinaryStorageUnitDeserializer()) + .registerTypeHierarchyAdapter(StorageUnit.class, new DecimalStorageUnitDeserializer()) + .create(); +``` + #### Jackson Use the provided `StorageUnitModule` like this: @@ -394,6 +408,14 @@ To use this project just declare the following dependency inside your POM: + + + wtf.metio.storage-units + storage-units-gson + ${version.storage-units} + + + wtf.metio.storage-units diff --git a/pom.xml b/pom.xml index c3cd49e..6f7b91d 100755 --- a/pom.xml +++ b/pom.xml @@ -42,6 +42,7 @@ storage-units-dozer storage-units-eclipselink + storage-units-gson storage-units-jackson storage-units-jakarta storage-units-mapstruct diff --git a/storage-units-gson/pom.xml b/storage-units-gson/pom.xml new file mode 100644 index 0000000..bf469f3 --- /dev/null +++ b/storage-units-gson/pom.xml @@ -0,0 +1,47 @@ + + + + 4.0.0 + + + + + + + wtf.metio.storage-units + storage-units.java + 9999.99.99-SNAPSHOT + + + + + + + storage-units-gson + + + + + + Storage Units :: GSON + + + + wtf.metio.storage-units + storage-units-model + ${project.version} + + + com.google.code.gson + gson + + + org.jspecify + jspecify + + + diff --git a/storage-units-gson/src/main/java/module-info.java b/storage-units-gson/src/main/java/module-info.java new file mode 100644 index 0000000..61ed53e --- /dev/null +++ b/storage-units-gson/src/main/java/module-info.java @@ -0,0 +1,15 @@ +/* + * SPDX-FileCopyrightText: The Storage-Units Authors + * SPDX-License-Identifier: 0BSD + */ +/** + * Module for GSON support. + */ +@org.jspecify.nullness.NullMarked +module wtf.metio.storageunits.gson { + + requires wtf.metio.storageunits.model; + requires com.google.gson; + requires org.jspecify; + +} diff --git a/storage-units-gson/src/main/java/wtf/metio/storageunits/gson/BinaryStorageUnitDeserializer.java b/storage-units-gson/src/main/java/wtf/metio/storageunits/gson/BinaryStorageUnitDeserializer.java new file mode 100644 index 0000000..50d70e9 --- /dev/null +++ b/storage-units-gson/src/main/java/wtf/metio/storageunits/gson/BinaryStorageUnitDeserializer.java @@ -0,0 +1,29 @@ +/* + * SPDX-FileCopyrightText: The Storage-Units Authors + * SPDX-License-Identifier: 0BSD + */ +package wtf.metio.storageunits.gson; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; +import wtf.metio.storageunits.model.StorageUnit; +import wtf.metio.storageunits.model.StorageUnits; + +import java.lang.reflect.Type; + +/** + * Deserializes value back into binary storage units. + */ +public final class BinaryStorageUnitDeserializer implements JsonDeserializer> { + + @Override + public StorageUnit deserialize( + final JsonElement json, + final Type typeOfT, + final JsonDeserializationContext context) throws JsonParseException { + return StorageUnits.parse(json.getAsJsonPrimitive().getAsString()).asBestMatchingBinaryUnit(); + } + +} diff --git a/storage-units-gson/src/main/java/wtf/metio/storageunits/gson/DecimalStorageUnitDeserializer.java b/storage-units-gson/src/main/java/wtf/metio/storageunits/gson/DecimalStorageUnitDeserializer.java new file mode 100644 index 0000000..0546598 --- /dev/null +++ b/storage-units-gson/src/main/java/wtf/metio/storageunits/gson/DecimalStorageUnitDeserializer.java @@ -0,0 +1,29 @@ +/* + * SPDX-FileCopyrightText: The Storage-Units Authors + * SPDX-License-Identifier: 0BSD + */ +package wtf.metio.storageunits.gson; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; +import wtf.metio.storageunits.model.StorageUnit; +import wtf.metio.storageunits.model.StorageUnits; + +import java.lang.reflect.Type; + +/** + * Deserializes value back into decimal storage units. + */ +public final class DecimalStorageUnitDeserializer implements JsonDeserializer> { + + @Override + public StorageUnit deserialize( + final JsonElement json, + final Type typeOfT, + final JsonDeserializationContext context) throws JsonParseException { + return StorageUnits.parse(json.getAsJsonPrimitive().getAsString()).asBestMatchingDecimalUnit(); + } + +} diff --git a/storage-units-gson/src/main/java/wtf/metio/storageunits/gson/StorageUnitSerializer.java b/storage-units-gson/src/main/java/wtf/metio/storageunits/gson/StorageUnitSerializer.java new file mode 100644 index 0000000..c5414af --- /dev/null +++ b/storage-units-gson/src/main/java/wtf/metio/storageunits/gson/StorageUnitSerializer.java @@ -0,0 +1,29 @@ +/* + * SPDX-FileCopyrightText: The Storage-Units Authors + * SPDX-License-Identifier: 0BSD + */ + +package wtf.metio.storageunits.gson; + +import com.google.gson.JsonElement; +import com.google.gson.JsonPrimitive; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; +import wtf.metio.storageunits.model.StorageUnit; + +import java.lang.reflect.Type; + +/** + * Serializes storage units into strings. + */ +public final class StorageUnitSerializer implements JsonSerializer> { + + @Override + public JsonElement serialize( + final StorageUnit src, + final Type typeOfSrc, + final JsonSerializationContext context) { + return new JsonPrimitive(src.inByte().toString()); + } + +} diff --git a/storage-units-gson/src/main/java/wtf/metio/storageunits/gson/package-info.java b/storage-units-gson/src/main/java/wtf/metio/storageunits/gson/package-info.java new file mode 100644 index 0000000..4ce305a --- /dev/null +++ b/storage-units-gson/src/main/java/wtf/metio/storageunits/gson/package-info.java @@ -0,0 +1,10 @@ +/* + * SPDX-FileCopyrightText: The Storage-Units Authors + * SPDX-License-Identifier: 0BSD + */ +/** + * Serialization support for GSON. + * + * @see GSON Homepage + */ +package wtf.metio.storageunits.gson; diff --git a/storage-units-gson/src/test/java/wtf/metio/storageunits/gson/BinaryDeserializationTest.java b/storage-units-gson/src/test/java/wtf/metio/storageunits/gson/BinaryDeserializationTest.java new file mode 100644 index 0000000..93dce17 --- /dev/null +++ b/storage-units-gson/src/test/java/wtf/metio/storageunits/gson/BinaryDeserializationTest.java @@ -0,0 +1,37 @@ +/* + * SPDX-FileCopyrightText: The Storage-Units Authors + * SPDX-License-Identifier: 0BSD + */ +package wtf.metio.storageunits.gson; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import wtf.metio.storageunits.model.StorageUnit; + +class BinaryDeserializationTest { + + private Gson gson; + + @BeforeEach + void setUp() { + gson = new GsonBuilder() + .registerTypeHierarchyAdapter(StorageUnit.class, new BinaryStorageUnitDeserializer()) + .create(); + } + + @Test + void deserializeStorageUnit() { + // given + final String input = "1024"; + + // when + final StorageUnit unit = gson.fromJson(input, StorageUnit.class); + + // then + Assertions.assertEquals("1.00 KiB", unit.toString()); + } + +} diff --git a/storage-units-gson/src/test/java/wtf/metio/storageunits/gson/DecimalDeserializationTest.java b/storage-units-gson/src/test/java/wtf/metio/storageunits/gson/DecimalDeserializationTest.java new file mode 100644 index 0000000..cb5c9ff --- /dev/null +++ b/storage-units-gson/src/test/java/wtf/metio/storageunits/gson/DecimalDeserializationTest.java @@ -0,0 +1,37 @@ +/* + * SPDX-FileCopyrightText: The Storage-Units Authors + * SPDX-License-Identifier: 0BSD + */ +package wtf.metio.storageunits.gson; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import wtf.metio.storageunits.model.StorageUnit; + +class DecimalDeserializationTest { + + private Gson gson; + + @BeforeEach + void setUp() { + gson = new GsonBuilder() + .registerTypeHierarchyAdapter(StorageUnit.class, new DecimalStorageUnitDeserializer()) + .create(); + } + + @Test + void deserializeStorageUnit() { + // given + final String input = "1000"; + + // when + final StorageUnit unit = gson.fromJson(input, StorageUnit.class); + + // then + Assertions.assertEquals("1.00 kB", unit.toString()); + } + +} diff --git a/storage-units-gson/src/test/java/wtf/metio/storageunits/gson/StorageUnitSerializerTest.java b/storage-units-gson/src/test/java/wtf/metio/storageunits/gson/StorageUnitSerializerTest.java new file mode 100644 index 0000000..8b9d5b6 --- /dev/null +++ b/storage-units-gson/src/test/java/wtf/metio/storageunits/gson/StorageUnitSerializerTest.java @@ -0,0 +1,52 @@ +/* + * SPDX-FileCopyrightText: The Storage-Units Authors + * SPDX-License-Identifier: 0BSD + */ + +package wtf.metio.storageunits.gson; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import wtf.metio.storageunits.model.Kibibyte; +import wtf.metio.storageunits.model.StorageUnit; +import wtf.metio.storageunits.model.StorageUnits; + +class StorageUnitSerializerTest { + + private Gson gson; + + @BeforeEach + void setUp() { + gson = new GsonBuilder() + .registerTypeHierarchyAdapter(StorageUnit.class, new StorageUnitSerializer()) + .create(); + } + + @Test + void serializeStorageUnit() { + // given + final StorageUnit unit = StorageUnits.kibibyte(1L); + + // when + final String output = gson.toJson(unit); + + // then + Assertions.assertEquals("\"1024\"", output); + } + + @Test + void serializeNonStorageUnit() { + // given + final String input = "abc"; + + // when + final String output = gson.toJson(input); + + // then + Assertions.assertEquals("\"abc\"", output); + } + +} -- 2.11.4.GIT