GsonAgent/src/main/java/cn/citycraft/GsonAgent/nms/JsonObjectHandle.java

132 lines
3.6 KiB
Java

package cn.citycraft.GsonAgent.nms;
import java.lang.reflect.Field;
import java.util.AbstractMap;
import java.util.Map;
import java.util.Set;
import cn.citycraft.GsonAgent.api.JsonObject;
import cn.citycraft.GsonAgent.api.utils.Utils;
import net.minecraft.util.com.google.gson.internal.LinkedTreeMap;
/**
*
* @since 2016年1月5日 下午1:49:41
* @author 喵♂呜
*/
public class JsonObjectHandle extends JsonElementHandle implements JsonObject {
private static Field membersField;
static {
try {
membersField = net.minecraft.util.com.google.gson.JsonObject.class.getDeclaredField("members");
membersField.setAccessible(true);
} catch (final Exception e) {
e.printStackTrace();
}
}
private final net.minecraft.util.com.google.gson.JsonObject handle;
private AbstractMap<String, net.minecraft.util.com.google.gson.JsonElement> members;
public JsonObjectHandle() {
this(new net.minecraft.util.com.google.gson.JsonObject());
}
@SuppressWarnings("unchecked")
protected JsonObjectHandle(final net.minecraft.util.com.google.gson.JsonObject handle) {
this.handle = handle;
try {
members = (AbstractMap<String, net.minecraft.util.com.google.gson.JsonElement>) membersField.get(this.handle);
} catch (final Exception e) {
e.printStackTrace();
}
}
@Override
public void add(final String property, final cn.citycraft.GsonAgent.api.JsonElement value) {
handle.add(property, ((JsonElementHandle) value).getHandle());
}
@Override
public void addProperty(final String property, final Boolean value) {
handle.addProperty(property, value);
}
@Override
public void addProperty(final String property, final Character value) {
handle.addProperty(property, value);
}
@Override
public void addProperty(final String property, final Number value) {
handle.addProperty(property, value);
}
@Override
public void addProperty(final String property, final String value) {
handle.addProperty(property, value);
}
@Override
public cn.citycraft.GsonAgent.api.JsonObject deepCopy() {
return new JsonObjectHandle(Utils.deepCopyObject(this.handle));
}
@Override
public Set<Map.Entry<String, cn.citycraft.GsonAgent.api.JsonElement>> entrySet() {
try {
final Map<String, cn.citycraft.GsonAgent.api.JsonElement> result = new LinkedTreeMap<>();
for (final Map.Entry<String, net.minecraft.util.com.google.gson.JsonElement> entry : members.entrySet()) {
result.put(entry.getKey(), new JsonElementHandle(entry.getValue()));
}
return result.entrySet();
} catch (final Exception e) {
e.printStackTrace();
}
return null;
}
@Override
public boolean equals(final Object o) {
return handle.equals(o);
}
@Override
public JsonElementHandle get(final String memberName) {
return new JsonElementHandle(handle.get(memberName));
}
@Override
public JsonArrayHandle getAsJsonArray(final String memberName) {
return new JsonArrayHandle(handle.getAsJsonArray(memberName));
}
@Override
public JsonObjectHandle getAsJsonObject(final String memberName) {
return new JsonObjectHandle(handle.getAsJsonObject(memberName));
}
@Override
public JsonPrimitiveHandle getAsJsonPrimitive(final String memberName) {
return new JsonPrimitiveHandle(handle.getAsJsonPrimitive(memberName));
}
@Override
public boolean has(final String memberName) {
return handle.has(memberName);
}
@Override
public int hashCode() {
return handle.hashCode();
}
@Override
public JsonElementHandle remove(final String property) {
return new JsonElementHandle(handle.remove(property));
}
}