From 5670778f9aeb22af72cc15784a017043b949bb9e Mon Sep 17 00:00:00 2001 From: kuroppoi <68156848+kuroppoi@users.noreply.github.com> Date: Sun, 9 May 2021 18:04:33 +0200 Subject: [PATCH] Default MessagePack enum values to prevent NPE --- .../gameserver/entity/FacingDirection.java | 2 ++ .../java/brainwine/gameserver/item/Layer.java | 2 ++ .../gameserver/msgpack/DefaultEnumValue.java | 10 ++++++++++ .../msgpack/templates/EnumTemplate.java | 15 +++++++++++++-- 4 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 gameserver/src/main/java/brainwine/gameserver/msgpack/DefaultEnumValue.java diff --git a/gameserver/src/main/java/brainwine/gameserver/entity/FacingDirection.java b/gameserver/src/main/java/brainwine/gameserver/entity/FacingDirection.java index f0c4543..1620085 100644 --- a/gameserver/src/main/java/brainwine/gameserver/entity/FacingDirection.java +++ b/gameserver/src/main/java/brainwine/gameserver/entity/FacingDirection.java @@ -1,11 +1,13 @@ package brainwine.gameserver.entity; +import brainwine.gameserver.msgpack.DefaultEnumValue; import brainwine.gameserver.msgpack.EnumValue; import brainwine.gameserver.msgpack.RegisterEnum; @RegisterEnum public enum FacingDirection { + @DefaultEnumValue WEST(-1), EAST(1); diff --git a/gameserver/src/main/java/brainwine/gameserver/item/Layer.java b/gameserver/src/main/java/brainwine/gameserver/item/Layer.java index 48063c1..2656579 100644 --- a/gameserver/src/main/java/brainwine/gameserver/item/Layer.java +++ b/gameserver/src/main/java/brainwine/gameserver/item/Layer.java @@ -2,6 +2,7 @@ package brainwine.gameserver.item; import com.fasterxml.jackson.annotation.JsonEnumDefaultValue; +import brainwine.gameserver.msgpack.DefaultEnumValue; import brainwine.gameserver.msgpack.RegisterEnum; @RegisterEnum @@ -12,6 +13,7 @@ public enum Layer { FRONT, LIQUID, + @DefaultEnumValue @JsonEnumDefaultValue NONE; } \ No newline at end of file diff --git a/gameserver/src/main/java/brainwine/gameserver/msgpack/DefaultEnumValue.java b/gameserver/src/main/java/brainwine/gameserver/msgpack/DefaultEnumValue.java new file mode 100644 index 0000000..8d4d35e --- /dev/null +++ b/gameserver/src/main/java/brainwine/gameserver/msgpack/DefaultEnumValue.java @@ -0,0 +1,10 @@ +package brainwine.gameserver.msgpack; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target({ElementType.FIELD, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface DefaultEnumValue {} \ No newline at end of file diff --git a/gameserver/src/main/java/brainwine/gameserver/msgpack/templates/EnumTemplate.java b/gameserver/src/main/java/brainwine/gameserver/msgpack/templates/EnumTemplate.java index 3c5fc39..fd0fc9c 100644 --- a/gameserver/src/main/java/brainwine/gameserver/msgpack/templates/EnumTemplate.java +++ b/gameserver/src/main/java/brainwine/gameserver/msgpack/templates/EnumTemplate.java @@ -13,17 +13,28 @@ import org.msgpack.template.AbstractTemplate; import org.msgpack.type.ValueType; import org.msgpack.unpacker.Unpacker; +import brainwine.gameserver.msgpack.DefaultEnumValue; import brainwine.gameserver.msgpack.EnumValue; +@SuppressWarnings("unchecked") public class EnumTemplate extends AbstractTemplate { private final Map ids = new HashMap<>(); private final Map values = new HashMap<>(); + private T defaultValue; public EnumTemplate(Class type) { T[] entries = type.getEnumConstants(); for(Field field : type.getFields()) { + if(field.getType() == type && field.isAnnotationPresent(DefaultEnumValue.class)) { + try { + defaultValue = (T)field.get(type); + } catch (IllegalArgumentException | IllegalAccessException e) { + throw new MessageTypeException(e); + } + } + if(field.isAnnotationPresent(EnumValue.class)) { try { for(T entry : entries) { @@ -85,9 +96,9 @@ public class EnumTemplate extends AbstractTemplate { ValueType next = unpacker.getNextType(); if(next == ValueType.INTEGER) { - return values.get(unpacker.readInt()); + return values.getOrDefault(unpacker.readInt(), defaultValue); } else if(next == ValueType.RAW) { - return values.get(unpacker.readString()); + return values.getOrDefault(unpacker.readString(), defaultValue); } throw new MessageTypeException("Unsupported enum id type");