From 970bffb49e35dc1b706c90bef13e1259242776b8 Mon Sep 17 00:00:00 2001 From: leguan Date: Mon, 2 Feb 2026 20:04:23 +0100 Subject: [PATCH 1/2] feat: add enum support --- .../net/staticstudios/data/DataManager.java | 9 ++++++ .../java/net/staticstudios/data/EnumTest.java | 28 +++++++++++++++++++ .../data/mock/account/AccountStatus.java | 26 +++++++++++++++++ 3 files changed, 63 insertions(+) create mode 100644 core/src/test/java/net/staticstudios/data/EnumTest.java create mode 100644 core/src/test/java/net/staticstudios/data/mock/account/AccountStatus.java diff --git a/core/src/main/java/net/staticstudios/data/DataManager.java b/core/src/main/java/net/staticstudios/data/DataManager.java index 11bbae9b..23d55325 100644 --- a/core/src/main/java/net/staticstudios/data/DataManager.java +++ b/core/src/main/java/net/staticstudios/data/DataManager.java @@ -1431,6 +1431,9 @@ public T deserialize(Class clazz, Object serialized) { if (serialized == null || Primitives.isPrimitive(clazz)) { return (T) serialized; } + if (clazz.isEnum()) { + return (T) Enum.valueOf((Class) clazz, serialized.toString()); + } return (T) deserialize(getValueSerializer(clazz), serialized); } @@ -1438,6 +1441,9 @@ public T serialize(Object deserialized) { if (deserialized == null || Primitives.isPrimitive(deserialized.getClass())) { return (T) deserialized; } + if (deserialized instanceof Enum) { + return (T) ((Enum) deserialized).name(); + } return (T) serialize(getValueSerializer(deserialized.getClass()), deserialized); } @@ -1453,6 +1459,9 @@ public Class getSerializedType(Class clazz) { if (Primitives.isPrimitive(clazz)) { return clazz; } + if (clazz.isEnum()) { + return String.class; + } ValueSerializer serializer = getValueSerializer(clazz); return serializer.getSerializedType(); } diff --git a/core/src/test/java/net/staticstudios/data/EnumTest.java b/core/src/test/java/net/staticstudios/data/EnumTest.java new file mode 100644 index 00000000..648ff5d6 --- /dev/null +++ b/core/src/test/java/net/staticstudios/data/EnumTest.java @@ -0,0 +1,28 @@ +package net.staticstudios.data; + +import net.staticstudios.data.misc.DataTest; +import net.staticstudios.data.mock.account.AccountStatus; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertSame; + +public class EnumTest extends DataTest { + + @Test + public void testEnums() { + DataManager dataManager = getMockEnvironments().getFirst().dataManager(); + dataManager.load(AccountStatus.class); + dataManager.finishLoading(); + + AccountStatus status = AccountStatus.builder(dataManager) + .id(1) + .insert(InsertMode.SYNC); + + assertSame(AccountStatus.Status.ACTIVE, status.getStatus()); + + status.setStatus(AccountStatus.Status.INACTIVE); + + assertSame(AccountStatus.Status.INACTIVE, status.getStatus()); + + } +} diff --git a/core/src/test/java/net/staticstudios/data/mock/account/AccountStatus.java b/core/src/test/java/net/staticstudios/data/mock/account/AccountStatus.java new file mode 100644 index 00000000..7c7076cf --- /dev/null +++ b/core/src/test/java/net/staticstudios/data/mock/account/AccountStatus.java @@ -0,0 +1,26 @@ +package net.staticstudios.data.mock.account; + +import net.staticstudios.data.*; + +@Data( schema = "public", table = "test_account_status") +public class AccountStatus extends UniqueData { + + @IdColumn(name = "id") + public PersistentValue id; + @Column(name = "status") + + @DefaultValue("ACTIVE") + public PersistentValue status; + + public Status getStatus() { + return status.get(); + } + + public void setStatus(Status status) { + this.status.set(status); + } + + public enum Status { + ACTIVE, INACTIVE + } +} From 7684615189ed74a35eb5ba31bf91237d57eb147f Mon Sep 17 00:00:00 2001 From: leguan Date: Mon, 2 Feb 2026 21:04:41 +0100 Subject: [PATCH 2/2] prioritize value serializers over enums --- .../net/staticstudios/data/DataManager.java | 32 +++++++++++++++---- 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/net/staticstudios/data/DataManager.java b/core/src/main/java/net/staticstudios/data/DataManager.java index 23d55325..7bfda4b8 100644 --- a/core/src/main/java/net/staticstudios/data/DataManager.java +++ b/core/src/main/java/net/staticstudios/data/DataManager.java @@ -1423,28 +1423,42 @@ public void registerValueSerializer(ValueSerializer serializer) { return s; } } - - throw new IllegalStateException("No ValueSerializer registered for type " + deserializedType.getName()); + return null; } public T deserialize(Class clazz, Object serialized) { if (serialized == null || Primitives.isPrimitive(clazz)) { return (T) serialized; } + + ValueSerializer valueSerializer = getValueSerializer(clazz); + if (valueSerializer != null) { + return (T) deserialize(valueSerializer, serialized); + } + if (clazz.isEnum()) { return (T) Enum.valueOf((Class) clazz, serialized.toString()); } - return (T) deserialize(getValueSerializer(clazz), serialized); + + throw new IllegalStateException("No suitable deserializer found for type " + clazz.getName()); } public T serialize(Object deserialized) { if (deserialized == null || Primitives.isPrimitive(deserialized.getClass())) { return (T) deserialized; } + + ValueSerializer valueSerializer = getValueSerializer(deserialized.getClass()); + if (valueSerializer != null) { + return (T) serialize(valueSerializer, deserialized); + } + if (deserialized instanceof Enum) { return (T) ((Enum) deserialized).name(); } - return (T) serialize(getValueSerializer(deserialized.getClass()), deserialized); + + throw new IllegalStateException("No suitable deserializer found for type " + deserialized.getClass().getName()); + } private D deserialize(ValueSerializer serializer, Object serialized) { @@ -1459,11 +1473,17 @@ public Class getSerializedType(Class clazz) { if (Primitives.isPrimitive(clazz)) { return clazz; } + + ValueSerializer serializer = getValueSerializer(clazz); + if (serializer != null) { + return serializer.getSerializedType(); + } + if (clazz.isEnum()) { return String.class; } - ValueSerializer serializer = getValueSerializer(clazz); - return serializer.getSerializedType(); + + throw new IllegalStateException("No suitable serializer found for type " + clazz.getName()); } public T copy(T value, Class dataType) {