From 11f3844d639c442f4b6f81a30c8b09ddad5a491d Mon Sep 17 00:00:00 2001 From: Myles Date: Fri, 18 Mar 2016 18:14:58 +0000 Subject: [PATCH] Use GSON instead, should fix memory leak issue with JSON. Also make sure that we use a copy of players for the bossbar. --- pom.xml | 14 ++++++++++ .../us/myles/ViaVersion/boss/ViaBossBar.java | 7 ++--- .../transformers/OutgoingTransformer.java | 27 ++++++++++--------- 3 files changed, 30 insertions(+), 18 deletions(-) diff --git a/pom.xml b/pom.xml index 9edad01e1..518a2e605 100644 --- a/pom.xml +++ b/pom.xml @@ -101,6 +101,10 @@ org.spacehq.opennbt us.myles.viaversion.libs.opennbt + + com.google.gson + us.myles.viaversion.libs.gson + @@ -162,6 +166,15 @@ true + + + com.google.code.gson + gson + 2.6.2 + compile + true + + io.netty @@ -170,6 +183,7 @@ provided true + org.projectlombok diff --git a/src/main/java/us/myles/ViaVersion/boss/ViaBossBar.java b/src/main/java/us/myles/ViaVersion/boss/ViaBossBar.java index e398cdee9..a9d80e08d 100644 --- a/src/main/java/us/myles/ViaVersion/boss/ViaBossBar.java +++ b/src/main/java/us/myles/ViaVersion/boss/ViaBossBar.java @@ -15,10 +15,7 @@ import us.myles.ViaVersion.packets.PacketType; import us.myles.ViaVersion.transformers.OutgoingTransformer; import us.myles.ViaVersion.util.PacketUtil; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; +import java.util.*; @Getter public class ViaBossBar implements BossBar { @@ -142,7 +139,7 @@ public class ViaBossBar implements BossBar { private void sendPacket(UpdateAction action) { ByteBuf buf = getPacket(action); - for (UUID uuid : players) + for (UUID uuid : new ArrayList<>(players)) sendPacket(uuid, buf); } diff --git a/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java b/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java index ba1851f18..cee828de3 100644 --- a/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java +++ b/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java @@ -1,11 +1,11 @@ package us.myles.ViaVersion.transformers; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; import io.netty.buffer.ByteBuf; import org.bukkit.Material; import org.bukkit.entity.EntityType; -import org.json.simple.JSONObject; -import org.json.simple.parser.JSONParser; -import org.json.simple.parser.ParseException; import org.spacehq.opennbt.tag.builtin.CompoundTag; import org.spacehq.opennbt.tag.builtin.StringTag; import us.myles.ViaVersion.CancelException; @@ -34,6 +34,7 @@ import static us.myles.ViaVersion.util.PacketUtil.*; public class OutgoingTransformer { + private static Gson gson = new GsonBuilder().create(); private final ViaVersionPlugin plugin = (ViaVersionPlugin) ViaVersion.getInstance(); @@ -56,16 +57,16 @@ public class OutgoingTransformer { line = "{\"text\":\"\"}"; } else { if ((!line.startsWith("\"") || !line.endsWith("\"")) && (!line.startsWith("{") || !line.endsWith("}"))) { - JSONObject obj = new JSONObject(); - obj.put("text", line); - return obj.toJSONString(); + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("text", line); + return gson.toJson(jsonObject); } if (line.startsWith("\"") && line.endsWith("\"")) { line = "{\"text\":" + line + "}"; } } try { - new JSONParser().parse(line); + gson.fromJson(line, JsonObject.class); } catch (Exception e) { System.out.println("Invalid JSON String: \"" + line + "\" Please report this issue to the ViaVersion Github: " + e.getMessage()); return "{\"text\":\"\"}"; @@ -297,12 +298,12 @@ public class OutgoingTransformer { if (packet == PacketType.STATUS_RESPONSE) { String originalStatus = PacketUtil.readString(input); try { - JSONObject json = (JSONObject) new JSONParser().parse(originalStatus); - JSONObject version = (JSONObject) json.get("version"); - if ((long) version.get("protocol") != 9999) //Fix ServerListPlus custom outdated message - version.put("protocol", info.getProtocol()); - PacketUtil.writeString(json.toJSONString(), output); - } catch (ParseException e) { + JsonObject jsonObject = gson.fromJson(originalStatus, JsonObject.class); + JsonObject version = jsonObject.get("version").getAsJsonObject(); + if (version.get("protocol").getAsInt() != 9999) //Fix ServerListPlus custom outdated message + version.addProperty("protocol", info.getProtocol()); + PacketUtil.writeString(gson.toJson(jsonObject), output); + } catch (Exception e) { e.printStackTrace(); } return;