From 87409e43070186e73387a493879e5c5ca6f479f5 Mon Sep 17 00:00:00 2001 From: kuroppoi <68156848+kuroppoi@users.noreply.github.com> Date: Fri, 9 Jul 2021 01:55:49 +0200 Subject: [PATCH] Switched to static JsonHelper class from numerous ObjectMappers --- .../brainwine/gameserver/GameConfiguration.java | 14 ++------------ .../gameserver/entity/player/PlayerManager.java | 11 +++-------- .../brainwine/gameserver/loot/LootManager.java | 5 ++--- .../brainwine/gameserver/prefab/PrefabManager.java | 8 +++----- .../gameserver/server/pipeline/MessageEncoder.java | 6 ++---- .../java/brainwine/gameserver/util/MapHelper.java | 6 +++--- .../main/java/brainwine/gameserver/zone/Zone.java | 9 +++------ .../brainwine/gameserver/zone/ZoneManager.java | 8 ++------ .../zone/gen/CaveDecoratorListDeserializer.java | 11 +++-------- .../gameserver/zone/gen/StaticZoneGenerator.java | 9 ++------- 10 files changed, 25 insertions(+), 62 deletions(-) diff --git a/gameserver/src/main/java/brainwine/gameserver/GameConfiguration.java b/gameserver/src/main/java/brainwine/gameserver/GameConfiguration.java index f5634b0..145d484 100644 --- a/gameserver/src/main/java/brainwine/gameserver/GameConfiguration.java +++ b/gameserver/src/main/java/brainwine/gameserver/GameConfiguration.java @@ -16,10 +16,7 @@ import org.yaml.snakeyaml.LoaderOptions; import org.yaml.snakeyaml.Yaml; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.InjectableValues; -import com.fasterxml.jackson.databind.MapperFeature; -import com.fasterxml.jackson.databind.ObjectMapper; import brainwine.gameserver.command.CommandManager; import brainwine.gameserver.entity.player.Player; @@ -27,12 +24,12 @@ import brainwine.gameserver.item.Item; import brainwine.gameserver.item.ItemRegistry; import brainwine.gameserver.util.MapHelper; import brainwine.gameserver.util.VersionUtils; +import brainwine.shared.JsonHelper; @SuppressWarnings("unchecked") public class GameConfiguration { private static final Logger logger = LogManager.getLogger(); - private static final ObjectMapper mapper = new ObjectMapper(); private static final Map baseConfig = new HashMap(); private static final Map> configUpdates = new HashMap<>(); private static final Map> versionedConfigs = new HashMap<>(); @@ -41,9 +38,6 @@ public class GameConfiguration { public static void init() { long startTime = System.currentTimeMillis(); logger.info("Loading game configuration ..."); - mapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE, true); - mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true); - mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS, true); LoaderOptions options = new LoaderOptions(); options.setMaxAliasesForCollections(Short.MAX_VALUE); yaml = new Yaml(options); @@ -157,12 +151,8 @@ public class GameConfiguration { // Register item if(config.containsKey("code")) { - InjectableValues.Std injectableValues = new InjectableValues.Std(); - injectableValues.addValue("name", name); - mapper.setInjectableValues(injectableValues); - try { - Item item = mapper.readValue(mapper.writer().writeValueAsString(config), Item.class); + Item item = JsonHelper.readValue(config, Item.class, new InjectableValues.Std().addValue("name", name)); ItemRegistry.registerItem(item); } catch (JsonProcessingException e) { logger.fatal("Failed to register item {}", name, e); diff --git a/gameserver/src/main/java/brainwine/gameserver/entity/player/PlayerManager.java b/gameserver/src/main/java/brainwine/gameserver/entity/player/PlayerManager.java index 3ae386c..a86a679 100644 --- a/gameserver/src/main/java/brainwine/gameserver/entity/player/PlayerManager.java +++ b/gameserver/src/main/java/brainwine/gameserver/entity/player/PlayerManager.java @@ -13,11 +13,11 @@ import org.apache.logging.log4j.Logger; import org.mindrot.jbcrypt.BCrypt; import com.fasterxml.jackson.databind.InjectableValues; -import com.fasterxml.jackson.databind.ObjectMapper; import brainwine.gameserver.GameServer; import brainwine.gameserver.server.pipeline.Connection; import brainwine.gameserver.zone.Zone; +import brainwine.shared.JsonHelper; public class PlayerManager { @@ -51,13 +51,9 @@ public class PlayerManager { private void loadPlayer(File file) { String id = file.getName().replace(".json", ""); - ObjectMapper mapper = new ObjectMapper(); - InjectableValues.Std injectableValues = new InjectableValues.Std(); - injectableValues.addValue("documentId", id); - mapper.setInjectableValues(injectableValues); try { - Player player = mapper.readValue(file, Player.class); + Player player = JsonHelper.readValue(file, Player.class, new InjectableValues.Std().addValue("documentId", id)); if(player.getZone() == null) { player.setZone(GameServer.getInstance().getZoneManager().getRandomZone()); @@ -85,10 +81,9 @@ public class PlayerManager { public void savePlayer(Player player) { File file = new File("players", player.getDocumentId() + ".json"); - ObjectMapper mapper = new ObjectMapper(); try { - mapper.writerWithDefaultPrettyPrinter().writeValue(file, player); + JsonHelper.writeValue(file, player); } catch(Exception e) { logger.error("Could not save player id {}", player.getDocumentId(), e); } diff --git a/gameserver/src/main/java/brainwine/gameserver/loot/LootManager.java b/gameserver/src/main/java/brainwine/gameserver/loot/LootManager.java index 0de23b4..b0cdd6b 100644 --- a/gameserver/src/main/java/brainwine/gameserver/loot/LootManager.java +++ b/gameserver/src/main/java/brainwine/gameserver/loot/LootManager.java @@ -13,10 +13,10 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; import brainwine.gameserver.util.WeightedList; import brainwine.gameserver.zone.Biome; +import brainwine.shared.JsonHelper; public class LootManager { @@ -29,7 +29,6 @@ public class LootManager { private void loadLootTables() { logger.info("Loading loot tables ..."); - ObjectMapper mapper = new ObjectMapper(); File file = new File("loottables.json"); try { @@ -37,7 +36,7 @@ public class LootManager { Files.copy(LootManager.class.getResourceAsStream("/loottables.json"), file.toPath()); } - Map> loot = mapper.readValue(file, new TypeReference>>(){}); + Map> loot = JsonHelper.readValue(file, new TypeReference>>(){}); lootTables.putAll(loot); } catch (IOException e) { logger.error("Failed to load loot tables", e); diff --git a/gameserver/src/main/java/brainwine/gameserver/prefab/PrefabManager.java b/gameserver/src/main/java/brainwine/gameserver/prefab/PrefabManager.java index f810b1b..2d27da2 100644 --- a/gameserver/src/main/java/brainwine/gameserver/prefab/PrefabManager.java +++ b/gameserver/src/main/java/brainwine/gameserver/prefab/PrefabManager.java @@ -13,15 +13,13 @@ import org.msgpack.unpacker.BufferUnpacker; import org.reflections.Reflections; import org.reflections.scanners.ResourcesScanner; -import com.fasterxml.jackson.databind.ObjectMapper; - import brainwine.gameserver.msgpack.MessagePackHelper; +import brainwine.shared.JsonHelper; public class PrefabManager { private static final Logger logger = LogManager.getLogger(); private final File dataDir = new File("prefabs"); - private final ObjectMapper mapper = new ObjectMapper(); private final Map prefabs = new HashMap<>(); public PrefabManager() { @@ -65,7 +63,7 @@ public class PrefabManager { File configFile = new File(file, "config.json"); try { - Prefab prefab = mapper.readValue(configFile, Prefab.class); + Prefab prefab = JsonHelper.readValue(configFile, Prefab.class); BufferUnpacker unpacker = MessagePackHelper.readFile(new File(file, "blocks.cmp")); unpacker.read(prefab); unpacker.close(); @@ -89,7 +87,7 @@ public class PrefabManager { File outputDir = new File(dataDir, name); outputDir.mkdirs(); MessagePackHelper.writeToFile(new File(outputDir, "blocks.cmp"), structure); - mapper.writerWithDefaultPrettyPrinter().writeValue(new File(outputDir, "config.json"), structure); + JsonHelper.writeValue(new File(outputDir, "config.json"), structure); } public Prefab getPrefab(String name) { diff --git a/gameserver/src/main/java/brainwine/gameserver/server/pipeline/MessageEncoder.java b/gameserver/src/main/java/brainwine/gameserver/server/pipeline/MessageEncoder.java index 0250669..2a8d5e8 100644 --- a/gameserver/src/main/java/brainwine/gameserver/server/pipeline/MessageEncoder.java +++ b/gameserver/src/main/java/brainwine/gameserver/server/pipeline/MessageEncoder.java @@ -7,19 +7,17 @@ import java.util.List; import org.msgpack.packer.BufferPacker; -import com.fasterxml.jackson.databind.ObjectMapper; - import brainwine.gameserver.msgpack.MessagePackHelper; import brainwine.gameserver.server.Message; import brainwine.gameserver.server.NetworkRegistry; import brainwine.gameserver.util.ZipUtils; +import brainwine.shared.JsonHelper; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToByteEncoder; public class MessageEncoder extends MessageToByteEncoder { - private static final ObjectMapper mapper = new ObjectMapper(); private final Connection connection; public MessageEncoder(Connection connection) { @@ -45,7 +43,7 @@ public class MessageEncoder extends MessageToByteEncoder { data.add(field.get(in)); } - bytes = mapper.writer().writeValueAsString(data).getBytes(); + bytes = JsonHelper.writeValueAsBytes(data); } else { BufferPacker packer = MessagePackHelper.createBufferPacker(); in.pack(packer); diff --git a/gameserver/src/main/java/brainwine/gameserver/util/MapHelper.java b/gameserver/src/main/java/brainwine/gameserver/util/MapHelper.java index e2d5dec..f872e07 100644 --- a/gameserver/src/main/java/brainwine/gameserver/util/MapHelper.java +++ b/gameserver/src/main/java/brainwine/gameserver/util/MapHelper.java @@ -10,17 +10,17 @@ import org.apache.logging.log4j.Logger; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; + +import brainwine.shared.JsonHelper; @SuppressWarnings("unchecked") public class MapHelper { private static final Logger logger = LogManager.getLogger(); - private static final ObjectMapper mapper = new ObjectMapper(); public static Map copy(Map map) { try { - return mapper.readValue(mapper.writeValueAsString(map), new TypeReference>(){}); + return JsonHelper.readValue(map, new TypeReference>(){}); } catch (JsonProcessingException e) { logger.error("Map copy failed", e); } diff --git a/gameserver/src/main/java/brainwine/gameserver/zone/Zone.java b/gameserver/src/main/java/brainwine/gameserver/zone/Zone.java index 93c1168..438d634 100644 --- a/gameserver/src/main/java/brainwine/gameserver/zone/Zone.java +++ b/gameserver/src/main/java/brainwine/gameserver/zone/Zone.java @@ -25,7 +25,6 @@ import com.fasterxml.jackson.annotation.JacksonInject; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIncludeProperties; import com.fasterxml.jackson.annotation.JsonValue; -import com.fasterxml.jackson.databind.ObjectMapper; import brainwine.gameserver.GameServer; import brainwine.gameserver.entity.Entity; @@ -53,6 +52,7 @@ import brainwine.gameserver.server.messages.ZoneExploredMessage; import brainwine.gameserver.server.messages.ZoneStatusMessage; import brainwine.gameserver.util.MapHelper; import brainwine.gameserver.util.MathUtils; +import brainwine.shared.JsonHelper; @JsonIncludeProperties({"name", "biome", "width", "height"}) public class Zone { @@ -142,7 +142,6 @@ public class Zone { } public void load() throws Exception { - ObjectMapper mapper = new ObjectMapper(); pendingSunlight.clear(); File dataDir = new File("zones", documentId); File shapeFile = new File(dataDir, "shape.cmp"); @@ -151,19 +150,17 @@ public class Zone { unpacker.read(sunlight); pendingSunlight.addAll(Arrays.asList(unpacker.read(Integer[].class))); unpacker.read(chunksExplored); - setMetaBlocks(mapper.readerForListOf(MetaBlock.class).readValue(new File(dataDir, "metablocks.json"))); + setMetaBlocks(JsonHelper.readList(new File(dataDir, "metablocks.json"), MetaBlock.class)); indexDungeons(); } public void save() throws Exception { File dataDir = new File("zones", documentId); dataDir.mkdirs(); - ObjectMapper mapper = new ObjectMapper(); - mapper.writerWithDefaultPrettyPrinter().writeValue(new File(dataDir, "config.json"), this); chunkManager.saveModifiedChunks(); removeInactiveChunks(); MessagePackHelper.writeToFile(new File(dataDir, "shape.cmp"), surface, sunlight, pendingSunlight, chunksExplored); - mapper.writerWithDefaultPrettyPrinter().writeValue(new File(dataDir, "metablocks.json"), metaBlocks.values()); + JsonHelper.writeValue(new File(dataDir, "metablocks.json"), metaBlocks.values()); } /** diff --git a/gameserver/src/main/java/brainwine/gameserver/zone/ZoneManager.java b/gameserver/src/main/java/brainwine/gameserver/zone/ZoneManager.java index 9d0da7c..5c27dab 100644 --- a/gameserver/src/main/java/brainwine/gameserver/zone/ZoneManager.java +++ b/gameserver/src/main/java/brainwine/gameserver/zone/ZoneManager.java @@ -15,10 +15,10 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.fasterxml.jackson.databind.InjectableValues; -import com.fasterxml.jackson.databind.ObjectMapper; import brainwine.gameserver.zone.gen.AsyncZoneGenerator; import brainwine.gameserver.zone.gen.StaticZoneGenerator; +import brainwine.shared.JsonHelper; public class ZoneManager { @@ -78,14 +78,10 @@ public class ZoneManager { private void loadZone(File file) { String id = file.getName(); - ObjectMapper mapper = new ObjectMapper(); - InjectableValues.Std injectableValues = new InjectableValues.Std(); - injectableValues.addValue("documentId", id); - mapper.setInjectableValues(injectableValues); try { File configFile = new File(file, "config.json"); - Zone zone = mapper.readValue(configFile, Zone.class); + Zone zone = JsonHelper.readValue(configFile, Zone.class, new InjectableValues.Std().addValue("documentId", id)); zone.load(); putZone(zone); } catch (Exception e) { diff --git a/gameserver/src/main/java/brainwine/gameserver/zone/gen/CaveDecoratorListDeserializer.java b/gameserver/src/main/java/brainwine/gameserver/zone/gen/CaveDecoratorListDeserializer.java index 54d7e43..063959a 100644 --- a/gameserver/src/main/java/brainwine/gameserver/zone/gen/CaveDecoratorListDeserializer.java +++ b/gameserver/src/main/java/brainwine/gameserver/zone/gen/CaveDecoratorListDeserializer.java @@ -9,13 +9,11 @@ import java.util.Map.Entry; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.MapperFeature; -import com.fasterxml.jackson.databind.ObjectMapper; import brainwine.gameserver.zone.gen.models.CaveType; +import brainwine.shared.JsonHelper; /** * It's a bit hack-ish, but it works. @@ -25,16 +23,13 @@ public class CaveDecoratorListDeserializer extends JsonDeserializer deserialize(JsonParser parser, DeserializationContext ctx) throws IOException, JsonProcessingException { List list = new ArrayList<>(); - ObjectMapper mapper = new ObjectMapper(); - mapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE, true); - mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS, true); JsonNode node = parser.readValueAsTree(); Iterator> it = node.fields(); while(it.hasNext()) { Entry entry = it.next(); - CaveType type = mapper.readValue(String.format("\"%s\"", entry.getKey()), CaveType.class); - CaveDecorator decorator = mapper.readValue(entry.getValue().toString(), type.getDecoratorType()); + CaveType type = JsonHelper.readValue(String.format("\"%s\"", entry.getKey()), CaveType.class); + CaveDecorator decorator = JsonHelper.readValue(entry.getValue().toString(), type.getDecoratorType()); list.add(decorator); } diff --git a/gameserver/src/main/java/brainwine/gameserver/zone/gen/StaticZoneGenerator.java b/gameserver/src/main/java/brainwine/gameserver/zone/gen/StaticZoneGenerator.java index 20f7420..db49f26 100644 --- a/gameserver/src/main/java/brainwine/gameserver/zone/gen/StaticZoneGenerator.java +++ b/gameserver/src/main/java/brainwine/gameserver/zone/gen/StaticZoneGenerator.java @@ -12,12 +12,10 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.MapperFeature; -import com.fasterxml.jackson.databind.ObjectMapper; import brainwine.gameserver.zone.Biome; import brainwine.gameserver.zone.Zone; +import brainwine.shared.JsonHelper; public class StaticZoneGenerator { @@ -56,16 +54,13 @@ public class StaticZoneGenerator { public static void init() { logger.info("Loading zone generator configurations ..."); File file = new File("generators.json"); - ObjectMapper mapper = new ObjectMapper(); - mapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE, true); - mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS, true); try { if(!file.exists()) { Files.copy(StaticZoneGenerator.class.getResourceAsStream("/generators.json"), file.toPath()); } - Map configs = mapper.readValue(new File("generators.json"), new TypeReference>(){}); + Map configs = JsonHelper.readValue(new File("generators.json"), new TypeReference>(){}); for(Entry entry : configs.entrySet()) { generators.put(entry.getKey(), new ZoneGenerator(entry.getValue()));