commit 2dc3901c06a996f7578119b7340eac9dd212ae4d Author: 502647092 Date: Wed Jan 6 11:13:42 2016 +0800 首次提交... diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..85626a7 --- /dev/null +++ b/.classpath @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..043fc2a --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +# Eclipse stuff +/.settings + +# netbeans +/nbproject + +# we use maven! +/build.xml + +# maven +/target +/repo + +# vim +.*.sw[a-p] + +# various other potential build files +/build +/bin +/dist +/manifest.mf + +/world + +# Mac filesystem dust +*.DS_Store + +# intellij +*.iml +*.ipr +*.iws +.idea/ + +# Project Stuff +/src/main/resources/Soulbound + +# Atlassian Stuff +/atlassian-ide-plugin.xml \ No newline at end of file diff --git a/.project b/.project new file mode 100644 index 0000000..6f632cd --- /dev/null +++ b/.project @@ -0,0 +1,23 @@ + + + GsonAgent + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + org.eclipse.jdt.core.javanature + + diff --git a/lib/craftbukkit-1.7.10.jar b/lib/craftbukkit-1.7.10.jar new file mode 100644 index 0000000..23109e2 Binary files /dev/null and b/lib/craftbukkit-1.7.10.jar differ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..6a0d737 --- /dev/null +++ b/pom.xml @@ -0,0 +1,56 @@ + + 4.0.0 + cn.citycraft + GsonAgent + 1.0 + GsonAgent + + ${project.name} + + + src/main/resources + true + + + + + maven-compiler-plugin + 3.1 + + 1.7 + 1.7 + + + + + + + spigot-repo + https://hub.spigotmc.org/nexus/content/groups/public/ + + + citycraft-repo + ${jenkins.url}/plugin/repository/everything/ + + + + + org.spigotmc + spigot-api + jar + 1.8.8-R0.1-SNAPSHOT + + + org.bukkit + bukkit + 1.7.10 + system + ${project.basedir}/lib/craftbukkit-1.7.10.jar + + + + UTF-8 + http://ci.citycraft.cn:8080 + + \ No newline at end of file diff --git a/src/main/java/cn/citycraft/GsonAgent/GsonAgent.java b/src/main/java/cn/citycraft/GsonAgent/GsonAgent.java new file mode 100644 index 0000000..4f35833 --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/GsonAgent.java @@ -0,0 +1,135 @@ +package cn.citycraft.GsonAgent; + +import java.io.Reader; +import java.io.Writer; + +import cn.citycraft.GsonAgent.api.Gson; +import cn.citycraft.GsonAgent.api.JsonArray; +import cn.citycraft.GsonAgent.api.JsonNull; +import cn.citycraft.GsonAgent.api.JsonObject; +import cn.citycraft.GsonAgent.api.JsonParser; +import cn.citycraft.GsonAgent.api.JsonPrimitive; +import cn.citycraft.GsonAgent.api.TypeAdapter; +import cn.citycraft.GsonAgent.api.stream.JsonReader; +import cn.citycraft.GsonAgent.api.stream.JsonWriter; +import cn.citycraft.GsonAgent.api.utils.Utils; + +/** + * Minecraft Gson代理类(用于兼容1.7-1.8Gson类库) + * 复制修改于曲尘的Gson + * + * @since 2016年1月5日 下午12:51:30 + * @author 喵♂呜,曲尘 + */ +@SuppressWarnings({ "unchecked", "rawtypes" }) +public class GsonAgent { + public static boolean newVersion = false; + private static String internalPackageName; + private static Class TypeAdapter; + + static { + internalPackageName = "cn.citycraft.PluginHelper.gsonagent."; + try { + Thread.currentThread().getContextClassLoader().loadClass("com.google.gson.Gson"); + newVersion = true; + internalPackageName += "normal."; + } catch (final Exception | Error e) { + internalPackageName += "nms."; + } + try { + TypeAdapter = getInternalClass("bind.TypeAdapter"); + } catch (final Exception e) { + e.printStackTrace(); + } + } + + /** + * 初始化GsonAgent + * + * @return 根据新老版本获得不同的实例 + */ + public static Gson newGson() { + if (newVersion) { + return new cn.citycraft.GsonAgent.normal.GsonHandle(); + } + return new cn.citycraft.GsonAgent.nms.GsonHandle(); + } + + public static JsonArray newJsonArray() { + if (newVersion) { + return new cn.citycraft.GsonAgent.normal.JsonArrayHandle(); + } + return new cn.citycraft.GsonAgent.nms.JsonArrayHandle(); + } + + public static JsonNull newJsonNull() { + if (newVersion) { + return new cn.citycraft.GsonAgent.normal.JsonNullHandle(); + } + return new cn.citycraft.GsonAgent.nms.JsonNullHandle(); + } + + public static JsonObject newJsonObject() { + if (newVersion) { + return new cn.citycraft.GsonAgent.normal.JsonObjectHandle(); + } + return new cn.citycraft.GsonAgent.nms.JsonObjectHandle(); + } + + public static JsonParser newJsonParser() { + if (newVersion) { + return new cn.citycraft.GsonAgent.normal.JsonParserHandle(); + } + return new cn.citycraft.GsonAgent.normal.JsonParserHandle(); + } + + public static JsonPrimitive newJsonPrimitive(final Boolean value) { + if (newVersion) { + return new cn.citycraft.GsonAgent.normal.JsonPrimitiveHandle(value); + } + return new cn.citycraft.GsonAgent.nms.JsonPrimitiveHandle(value); + } + + public static JsonPrimitive newJsonPrimitive(final Character value) { + if (newVersion) { + return new cn.citycraft.GsonAgent.normal.JsonPrimitiveHandle(value); + } + return new cn.citycraft.GsonAgent.nms.JsonPrimitiveHandle(value); + } + + public static JsonPrimitive newJsonPrimitive(final Number value) { + if (newVersion) { + return new cn.citycraft.GsonAgent.normal.JsonPrimitiveHandle(value); + } + return new cn.citycraft.GsonAgent.nms.JsonPrimitiveHandle(value); + } + + public static JsonPrimitive newJsonPrimitive(final String value) { + if (newVersion) { + return new cn.citycraft.GsonAgent.normal.JsonPrimitiveHandle(value); + } + return new cn.citycraft.GsonAgent.nms.JsonPrimitiveHandle(value); + } + + public static JsonReader newJsonReader(final Reader in) { + if (newVersion) { + return new cn.citycraft.GsonAgent.normal.stream.JsonReaderHandle(in); + } + return new cn.citycraft.GsonAgent.nms.stream.JsonReaderHandle(in); + } + + public static JsonWriter newJsonWriter(final Writer out) { + if (newVersion) { + return new cn.citycraft.GsonAgent.normal.stream.JsonWriterHandle(out); + } + return new cn.citycraft.GsonAgent.nms.stream.JsonWriterHandle(out); + } + + public static TypeAdapter newTypeAdapter() { + return (TypeAdapter) Utils.newInstance(TypeAdapter); + } + + private static Class getInternalClass(final String className) throws ClassNotFoundException { + return Class.forName(internalPackageName + className + "Handle"); + } +} diff --git a/src/main/java/cn/citycraft/GsonAgent/api/Gson.java b/src/main/java/cn/citycraft/GsonAgent/api/Gson.java new file mode 100644 index 0000000..1f3659c --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/api/Gson.java @@ -0,0 +1,76 @@ +package cn.citycraft.GsonAgent.api; + +import java.io.Reader; +import java.lang.reflect.Type; + +import cn.citycraft.GsonAgent.api.exception.JsonIOException; +import cn.citycraft.GsonAgent.api.exception.JsonSyntaxException; +import cn.citycraft.GsonAgent.api.reflect.TypeToken; +import cn.citycraft.GsonAgent.api.stream.JsonReader; +import cn.citycraft.GsonAgent.api.stream.JsonWriter; + +/** + * Gson代理API + * 复制修改于曲尘的Gson + * + * @since 2016年1月5日 下午12:48:43 + * @author 喵♂呜 + */ +public interface Gson { + public T fromJson(JsonElement json, Class classOfT) throws JsonSyntaxException; + + public T fromJson(JsonElement json, Type typeOfT) throws JsonSyntaxException; + + public T fromJson(JsonReader reader, Type typeOfT) throws JsonIOException, JsonSyntaxException; + + public T fromJson(Reader json, Class classOfT) throws JsonSyntaxException, JsonIOException; + + public T fromJson(Reader json, Type typeOfT) throws JsonIOException, JsonSyntaxException; + + /** + * @param result + * Json字符串 + * @param clazz + * 模型类 + * @return + */ + public T fromJson(final String result, Class clazz) throws JsonSyntaxException; + + public T fromJson(String json, Type typeOfT) throws JsonSyntaxException; + + public TypeAdapter getAdapter(Class type); + + public TypeAdapter getAdapter(TypeToken type); + + public TypeAdapter getDelegateAdapter(TypeAdapterFactory skipPast, TypeToken type); + + public String toJson(JsonElement jsonElement); + + public void toJson(JsonElement jsonElement, Appendable writer) throws JsonIOException; + + public void toJson(JsonElement jsonElement, JsonWriter writer) throws JsonIOException; + + /** + * 对象序列化成Json + * + * @param src + * 对象 + * @return 序列化后的对象 + */ + public String toJson(Object src); + + public void toJson(Object src, Appendable writer) throws JsonIOException; + + public String toJson(Object src, Type typeOfSrc); + + public void toJson(Object src, Type typeOfSrc, Appendable writer) throws JsonIOException; + + public void toJson(Object src, Type typeOfSrc, JsonWriter writer) throws JsonIOException; + + public JsonElement toJsonTree(Object src); + + public JsonElement toJsonTree(Object src, Type typeOfSrc); + + @Override + public String toString(); +} diff --git a/src/main/java/cn/citycraft/GsonAgent/api/JsonArray.java b/src/main/java/cn/citycraft/GsonAgent/api/JsonArray.java new file mode 100644 index 0000000..a8cfc29 --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/api/JsonArray.java @@ -0,0 +1,69 @@ +package cn.citycraft.GsonAgent.api; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.util.Iterator; + +/** + * JsonArray代理API + * + * @since 2016年1月5日 下午1:13:27 + * @author 喵♂呜 + */ +public abstract interface JsonArray extends JsonElement, Iterable { + public void add(JsonElement element); + + public void addAll(JsonArray array); + + @Override + public JsonArray deepCopy(); + + @Override + public boolean equals(Object o); + + public JsonElement get(int i); + + @Override + public BigDecimal getAsBigDecimal(); + + @Override + public BigInteger getAsBigInteger(); + + @Override + public boolean getAsBoolean(); + + @Override + public byte getAsByte(); + + @Override + public char getAsCharacter(); + + @Override + public double getAsDouble(); + + @Override + public float getAsFloat(); + + @Override + public int getAsInt(); + + @Override + public long getAsLong(); + + @Override + public Number getAsNumber(); + + @Override + public short getAsShort(); + + @Override + public String getAsString(); + + @Override + public int hashCode(); + + @Override + public Iterator iterator(); + + public int size(); +} diff --git a/src/main/java/cn/citycraft/GsonAgent/api/JsonElement.java b/src/main/java/cn/citycraft/GsonAgent/api/JsonElement.java new file mode 100644 index 0000000..f715503 --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/api/JsonElement.java @@ -0,0 +1,56 @@ +package cn.citycraft.GsonAgent.api; + +import java.math.BigDecimal; +import java.math.BigInteger; + +/** + * + * @since 2016年1月5日 下午1:12:35 + * @author 喵♂呜 + */ +public abstract interface JsonElement { + public JsonElement deepCopy(); + + public BigDecimal getAsBigDecimal(); + + public BigInteger getAsBigInteger(); + + public boolean getAsBoolean(); + + public byte getAsByte(); + + public char getAsCharacter(); + + public double getAsDouble(); + + public float getAsFloat(); + + public int getAsInt(); + + public JsonArray getAsJsonArray(); + + public JsonNull getAsJsonNull(); + + public JsonObject getAsJsonObject(); + + public JsonPrimitive getAsJsonPrimitive(); + + public long getAsLong(); + + public Number getAsNumber(); + + public short getAsShort(); + + public String getAsString(); + + public boolean isJsonArray(); + + public boolean isJsonNull(); + + public boolean isJsonObject(); + + public boolean isJsonPrimitive(); + + @Override + public String toString(); +} diff --git a/src/main/java/cn/citycraft/GsonAgent/api/JsonNull.java b/src/main/java/cn/citycraft/GsonAgent/api/JsonNull.java new file mode 100644 index 0000000..fb35fee --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/api/JsonNull.java @@ -0,0 +1,17 @@ +package cn.citycraft.GsonAgent.api; + +/** + * + * @since 2016年1月5日 下午1:13:43 + * @author 喵♂呜 + */ +public abstract interface JsonNull extends JsonElement { + @Override + public JsonNull deepCopy(); + + @Override + public boolean equals(Object other); + + @Override + public int hashCode(); +} diff --git a/src/main/java/cn/citycraft/GsonAgent/api/JsonObject.java b/src/main/java/cn/citycraft/GsonAgent/api/JsonObject.java new file mode 100644 index 0000000..492738c --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/api/JsonObject.java @@ -0,0 +1,44 @@ +package cn.citycraft.GsonAgent.api; + +import java.util.Map; +import java.util.Set; + +/** + * + * @since 2016年1月5日 下午1:13:20 + * @author 喵♂呜 + */ +public abstract interface JsonObject extends JsonElement { + public void add(String property, JsonElement value); + + public void addProperty(String property, Boolean value); + + public void addProperty(String property, Character value); + + public void addProperty(String property, Number value); + + public void addProperty(String property, String value); + + @Override + public JsonObject deepCopy(); + + public Set> entrySet(); + + @Override + public boolean equals(Object o); + + public JsonElement get(String memberName); + + public JsonArray getAsJsonArray(String memberName); + + public JsonObject getAsJsonObject(String memberName); + + public JsonPrimitive getAsJsonPrimitive(String memberName); + + public boolean has(String memberName); + + @Override + public int hashCode(); + + public JsonElement remove(String property); +} diff --git a/src/main/java/cn/citycraft/GsonAgent/api/JsonParser.java b/src/main/java/cn/citycraft/GsonAgent/api/JsonParser.java new file mode 100644 index 0000000..20ea7ef --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/api/JsonParser.java @@ -0,0 +1,19 @@ +package cn.citycraft.GsonAgent.api; + +import java.io.Reader; + +import cn.citycraft.GsonAgent.api.exception.JsonIOException; +import cn.citycraft.GsonAgent.api.exception.JsonSyntaxException; +import cn.citycraft.GsonAgent.api.stream.JsonReader; +import cn.citycraft.GsonAgent.api.utils.HandleInterface; + +@SuppressWarnings("rawtypes") +public abstract interface JsonParser extends HandleInterface { + + public JsonElement parse(JsonReader json) throws JsonIOException, JsonSyntaxException; + + public JsonElement parse(Reader json) throws JsonIOException, JsonSyntaxException; + + public JsonElement parse(String json) throws JsonSyntaxException; + +} diff --git a/src/main/java/cn/citycraft/GsonAgent/api/JsonPrimitive.java b/src/main/java/cn/citycraft/GsonAgent/api/JsonPrimitive.java new file mode 100644 index 0000000..fa1041b --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/api/JsonPrimitive.java @@ -0,0 +1,64 @@ +package cn.citycraft.GsonAgent.api; + +import java.math.BigDecimal; +import java.math.BigInteger; + +/** + * + * @since 2016年1月5日 下午1:13:35 + * @author 喵♂呜 + */ +public abstract interface JsonPrimitive extends JsonElement { + @Override + public JsonPrimitive deepCopy(); + + @Override + public boolean equals(Object obj); + + @Override + public BigDecimal getAsBigDecimal(); + + @Override + public BigInteger getAsBigInteger(); + + @Override + public boolean getAsBoolean(); + + @Override + public byte getAsByte(); + + @Override + public char getAsCharacter(); + + @Override + public double getAsDouble(); + + @Override + public float getAsFloat(); + + @Override + public int getAsInt(); + + @Override + public long getAsLong(); + + @Override + public Number getAsNumber(); + + @Override + public short getAsShort(); + + @Override + public String getAsString(); + + @Override + public int hashCode(); + + public boolean isBoolean(); + + public boolean isNumber(); + + public boolean isString(); + + void setValue(Object primitive); +} diff --git a/src/main/java/cn/citycraft/GsonAgent/api/TypeAdapter.java b/src/main/java/cn/citycraft/GsonAgent/api/TypeAdapter.java new file mode 100644 index 0000000..7d0c7ea --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/api/TypeAdapter.java @@ -0,0 +1,31 @@ +package cn.citycraft.GsonAgent.api; + +import java.io.IOException; +import java.io.Reader; +import java.io.Writer; + +import cn.citycraft.GsonAgent.api.stream.JsonReader; +import cn.citycraft.GsonAgent.api.stream.JsonWriter; +import cn.citycraft.GsonAgent.api.utils.HandleInterface; + +@SuppressWarnings("rawtypes") +public abstract interface TypeAdapter extends HandleInterface { + + public T fromJson(Reader in) throws IOException; + + public T fromJson(String json) throws IOException; + + public T fromJsonTree(JsonElement jsonTree); + + public TypeAdapter nullSafe(); + + public abstract T read(JsonReader paramJsonReader) throws IOException; + + public String toJson(T value) throws IOException; + + public void toJson(Writer out, T value) throws IOException; + + public JsonElement toJsonTree(T value); + + public void write(JsonWriter paramJsonWriter, T paramT) throws IOException; +} diff --git a/src/main/java/cn/citycraft/GsonAgent/api/TypeAdapterFactory.java b/src/main/java/cn/citycraft/GsonAgent/api/TypeAdapterFactory.java new file mode 100644 index 0000000..f6d48e9 --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/api/TypeAdapterFactory.java @@ -0,0 +1,8 @@ +package cn.citycraft.GsonAgent.api; + +import cn.citycraft.GsonAgent.api.reflect.TypeToken; + +public abstract interface TypeAdapterFactory { + + public abstract TypeAdapter create(Gson paramGson, TypeToken paramTypeToken); +} diff --git a/src/main/java/cn/citycraft/GsonAgent/api/bind/TypeAdapter.java b/src/main/java/cn/citycraft/GsonAgent/api/bind/TypeAdapter.java new file mode 100644 index 0000000..16c8097 --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/api/bind/TypeAdapter.java @@ -0,0 +1,33 @@ +package cn.citycraft.GsonAgent.api.bind; + +import java.io.IOException; +import java.io.Reader; +import java.io.Writer; + +import cn.citycraft.GsonAgent.api.JsonElement; +import cn.citycraft.GsonAgent.api.stream.JsonReader; +import cn.citycraft.GsonAgent.api.stream.JsonWriter; +import cn.citycraft.GsonAgent.api.utils.HandleInterface; + +@SuppressWarnings("rawtypes") +public abstract interface TypeAdapter extends HandleInterface { + + public T fromJson(Reader in) throws IOException; + + public T fromJson(String json) throws IOException; + + public T fromJsonTree(JsonElement jsonTree); + + public TypeAdapter nullSafe(); + + public abstract T read(JsonReader paramJsonReader) throws IOException; + + public String toJson(T value) throws IOException; + + public void toJson(Writer out, T value) throws IOException; + + public JsonElement toJsonTree(T value); + + public void write(JsonWriter paramJsonWriter, T paramT) throws IOException; + +} diff --git a/src/main/java/cn/citycraft/GsonAgent/api/bind/TypeAdapterFactory.java b/src/main/java/cn/citycraft/GsonAgent/api/bind/TypeAdapterFactory.java new file mode 100644 index 0000000..847cf21 --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/api/bind/TypeAdapterFactory.java @@ -0,0 +1,8 @@ +package cn.citycraft.GsonAgent.api.bind; + +import cn.citycraft.GsonAgent.api.Gson; +import cn.citycraft.GsonAgent.api.reflect.TypeToken; + +public abstract interface TypeAdapterFactory { + public abstract TypeAdapter create(Gson paramGson, TypeToken paramTypeToken); +} diff --git a/src/main/java/cn/citycraft/GsonAgent/api/exception/JsonIOException.java b/src/main/java/cn/citycraft/GsonAgent/api/exception/JsonIOException.java new file mode 100644 index 0000000..fc9b4a8 --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/api/exception/JsonIOException.java @@ -0,0 +1,18 @@ +package cn.citycraft.GsonAgent.api.exception; + +public final class JsonIOException extends JsonParseException { + + private static final long serialVersionUID = 1L; + + public JsonIOException(String msg) { + super(msg); + } + + public JsonIOException(String msg, Throwable cause) { + super(msg, cause); + } + + public JsonIOException(Throwable cause) { + super(cause); + } +} diff --git a/src/main/java/cn/citycraft/GsonAgent/api/exception/JsonParseException.java b/src/main/java/cn/citycraft/GsonAgent/api/exception/JsonParseException.java new file mode 100644 index 0000000..75b524f --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/api/exception/JsonParseException.java @@ -0,0 +1,19 @@ +package cn.citycraft.GsonAgent.api.exception; + +public class JsonParseException extends RuntimeException { + + static final long serialVersionUID = -4086729973971783390L; + + public JsonParseException(String msg) { + super(msg); + } + + public JsonParseException(String msg, Throwable cause) { + super(msg, cause); + } + + public JsonParseException(Throwable cause) { + super(cause); + } + +} diff --git a/src/main/java/cn/citycraft/GsonAgent/api/exception/JsonSyntaxException.java b/src/main/java/cn/citycraft/GsonAgent/api/exception/JsonSyntaxException.java new file mode 100644 index 0000000..9b66706 --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/api/exception/JsonSyntaxException.java @@ -0,0 +1,18 @@ +package cn.citycraft.GsonAgent.api.exception; + +public final class JsonSyntaxException extends JsonParseException { + + private static final long serialVersionUID = 1L; + + public JsonSyntaxException(String msg) { + super(msg); + } + + public JsonSyntaxException(String msg, Throwable cause) { + super(msg, cause); + } + + public JsonSyntaxException(Throwable cause) { + super(cause); + } +} diff --git a/src/main/java/cn/citycraft/GsonAgent/api/reflect/TypeToken.java b/src/main/java/cn/citycraft/GsonAgent/api/reflect/TypeToken.java new file mode 100644 index 0000000..469c63c --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/api/reflect/TypeToken.java @@ -0,0 +1,80 @@ +package cn.citycraft.GsonAgent.api.reflect; + +import java.lang.reflect.Type; + +import cn.citycraft.GsonAgent.GsonAgent; + +@SuppressWarnings({ "unchecked", "rawtypes" }) +public class TypeToken { + + private final TypeTokenAbstract internal; + + public TypeToken() { + if (GsonAgent.newVersion) { + this.internal = new cn.citycraft.GsonAgent.normal.reflect.TypeTokenHandle(); + } else { + this.internal = new cn.citycraft.GsonAgent.nms.reflect.TypeTokenHandle(); + } + } + + protected TypeToken(final TypeTokenAbstract internal) { + this.internal = internal; + } + + public static TypeToken get(final Class type) { + if (GsonAgent.newVersion) { + return new TypeToken(cn.citycraft.GsonAgent.normal.reflect.TypeTokenHandle.get(type)); + } + return new TypeToken(cn.citycraft.GsonAgent.nms.reflect.TypeTokenHandle.get(type)); + } + + public static TypeToken get(final Type type) { + if (GsonAgent.newVersion) { + return new TypeToken(cn.citycraft.GsonAgent.normal.reflect.TypeTokenHandle.get(type)); + } + return new TypeToken(cn.citycraft.GsonAgent.nms.reflect.TypeTokenHandle.get(type)); + } + + @Override + public boolean equals(final Object o) { + return this.internal.equals(o); + } + + public Object getHandle() { + return this.internal.getHandle(); + } + + public Class getRawType() { + return this.internal.getRawType(); + } + + public Type getType() { + return this.internal.getType(); + } + + @Override + public int hashCode() { + return this.internal.hashCode(); + } + + @Deprecated + public boolean isAssignableFrom(final Class cls) { + return this.internal.isAssignableFrom(cls); + } + + @Deprecated + public boolean isAssignableFrom(final Type from) { + return this.internal.isAssignableFrom(from); + } + + @Deprecated + public boolean isAssignableFrom(final TypeToken token) { + return this.internal.isAssignableFrom(token); + } + + @Override + public String toString() { + return this.internal.toString(); + } + +} diff --git a/src/main/java/cn/citycraft/GsonAgent/api/reflect/TypeTokenAbstract.java b/src/main/java/cn/citycraft/GsonAgent/api/reflect/TypeTokenAbstract.java new file mode 100644 index 0000000..34bc600 --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/api/reflect/TypeTokenAbstract.java @@ -0,0 +1,32 @@ +package cn.citycraft.GsonAgent.api.reflect; + +import java.lang.reflect.Type; + +import cn.citycraft.GsonAgent.api.utils.HandleInterface; + +@SuppressWarnings("rawtypes") +public abstract interface TypeTokenAbstract extends HandleInterface { + + @Override + public boolean equals(Object o); + + public Class getRawType(); + + public Type getType(); + + @Override + public int hashCode(); + + @Deprecated + public boolean isAssignableFrom(Class cls); + + @Deprecated + public boolean isAssignableFrom(Type from); + + @Deprecated + public boolean isAssignableFrom(TypeToken token); + + @Override + public String toString(); + +} diff --git a/src/main/java/cn/citycraft/GsonAgent/api/stream/JsonReader.java b/src/main/java/cn/citycraft/GsonAgent/api/stream/JsonReader.java new file mode 100644 index 0000000..9e36a10 --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/api/stream/JsonReader.java @@ -0,0 +1,44 @@ +package cn.citycraft.GsonAgent.api.stream; + +import java.io.IOException; + +public abstract interface JsonReader { + + public void beginArray() throws IOException; + + public void beginObject() throws IOException; + + public void close() throws IOException; + + public void endArray() throws IOException; + + public void endObject() throws IOException; + + public boolean hasNext() throws IOException; + + public boolean isLenient(); + + public boolean nextBoolean() throws IOException; + + public double nextDouble() throws IOException; + + public int nextInt() throws IOException; + + public long nextLong() throws IOException; + + public String nextName() throws IOException; + + public void nextNull() throws IOException; + + public String nextString() throws IOException; + + public JsonToken peek() throws IOException; + + public void setLenient(boolean lenient); + + public void skipValue() throws IOException; + + @Override + public String toString(); + +} diff --git a/src/main/java/cn/citycraft/GsonAgent/api/stream/JsonToken.java b/src/main/java/cn/citycraft/GsonAgent/api/stream/JsonToken.java new file mode 100644 index 0000000..73b9ea9 --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/api/stream/JsonToken.java @@ -0,0 +1,24 @@ +package cn.citycraft.GsonAgent.api.stream; + +public enum JsonToken { + + BEGIN_ARRAY, + END_ARRAY, + BEGIN_OBJECT, + END_OBJECT, + NAME, + STRING, + NUMBER, + BOOLEAN, + NULL, + END_DOCUMENT; + + public static JsonToken getByName(String name) { + for (JsonToken next : JsonToken.values()) { + if (next.name().equals(name)) { + return next; + } + } + return null; + } +} diff --git a/src/main/java/cn/citycraft/GsonAgent/api/stream/JsonWriter.java b/src/main/java/cn/citycraft/GsonAgent/api/stream/JsonWriter.java new file mode 100644 index 0000000..90c42d1 --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/api/stream/JsonWriter.java @@ -0,0 +1,55 @@ +package cn.citycraft.GsonAgent.api.stream; + +import java.io.Closeable; +import java.io.Flushable; +import java.io.IOException; + +public abstract interface JsonWriter extends Closeable, Flushable { + + public JsonWriter beginArray() throws IOException; + + public JsonWriter beginObject() throws IOException; + + @Override + public void close() throws IOException; + + public JsonWriter endArray() throws IOException; + + public JsonWriter endObject() throws IOException; + + @Override + public void flush() throws IOException; + + public boolean getSerializeNulls(); + + public boolean isHtmlSafe(); + + public boolean isLenient(); + + public JsonWriter name(String name) throws IOException; + + public JsonWriter nameWithoutQuotes(String name) throws IOException; + + public JsonWriter nullValue() throws IOException; + + public void setHtmlSafe(boolean htmlSafe); + + public void setIndent(String indent); + + public void setLenient(boolean lenient); + + public void setSerializeNulls(boolean serializeNulls); + + public JsonWriter value(boolean value) throws IOException; + + public JsonWriter value(double value) throws IOException; + + public JsonWriter value(long value) throws IOException; + + public JsonWriter value(Number value) throws IOException; + + public JsonWriter value(String value) throws IOException; + + void string(String value) throws IOException; + +} diff --git a/src/main/java/cn/citycraft/GsonAgent/api/utils/HandleInterface.java b/src/main/java/cn/citycraft/GsonAgent/api/utils/HandleInterface.java new file mode 100644 index 0000000..1abd1f0 --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/api/utils/HandleInterface.java @@ -0,0 +1,7 @@ +package cn.citycraft.GsonAgent.api.utils; + +public interface HandleInterface { + + public T getHandle(); + +} diff --git a/src/main/java/cn/citycraft/GsonAgent/api/utils/Utils.java b/src/main/java/cn/citycraft/GsonAgent/api/utils/Utils.java new file mode 100644 index 0000000..0d31399 --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/api/utils/Utils.java @@ -0,0 +1,54 @@ +/** + * + */ +package cn.citycraft.GsonAgent.api.utils; + +import java.lang.reflect.Constructor; + +/** + * Gson代理工具类(来自7老板) + * + * @since 2016年1月5日 下午1:33:57 + * @author 曲尘,喵♂呜 + */ +@SuppressWarnings({ "unchecked", "rawtypes" }) +public class Utils { + public static T deepCopyObject(final T obj) { + try { + return (T) obj.getClass().getDeclaredMethod("deepCopy").invoke(obj); + } catch (final Exception e) { + throw new RuntimeException(e); + } + } + + public static T newInstance(final Class clzz) { + try { + final Constructor constructor = clzz.getDeclaredConstructor(); + constructor.setAccessible(true); + return constructor.newInstance(); + } catch (final Exception e) { + throw new RuntimeException(e); + } + } + + public static T newInstance(final Class clzz, final Class[] types, final Object[] args) { + if (args.length == 0 || types.length == 0) { + return newInstance(clzz); + } + try { + final Constructor constructor = clzz.getDeclaredConstructor(types); + constructor.setAccessible(true); + return constructor.newInstance(args); + } catch (final Exception e) { + throw new RuntimeException(e); + } + } + + public static T newInstance(final Class clzz, final Object... args) { + final Class[] argClasses = new Class[args.length]; + for (int i = 0; i < argClasses.length; i++) { + argClasses[i] = args[i].getClass(); + } + return newInstance(clzz, argClasses, args); + } +} diff --git a/src/main/java/cn/citycraft/GsonAgent/nms/GsonHandle.java b/src/main/java/cn/citycraft/GsonAgent/nms/GsonHandle.java new file mode 100644 index 0000000..d703aa1 --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/nms/GsonHandle.java @@ -0,0 +1,135 @@ +/** + * + */ +package cn.citycraft.GsonAgent.nms; + +import java.io.Reader; +import java.lang.reflect.Type; + +import cn.citycraft.GsonAgent.api.Gson; +import cn.citycraft.GsonAgent.api.exception.JsonIOException; +import cn.citycraft.GsonAgent.api.exception.JsonSyntaxException; +import cn.citycraft.GsonAgent.nms.bind.TypeAdapterFactoryHandle; +import cn.citycraft.GsonAgent.nms.bind.TypeAdapterHandle; +import cn.citycraft.GsonAgent.nms.stream.JsonReaderHandle; +import cn.citycraft.GsonAgent.nms.stream.JsonWriterHandle; + +/** + * 老版本Gson代理类 + * + * @since 2016年1月5日 下午12:57:20 + * @author 喵♂呜 + */ +@SuppressWarnings({ "unchecked", "rawtypes" }) +public class GsonHandle implements Gson { + private final net.minecraft.util.com.google.gson.Gson handle; + + public GsonHandle() { + handle = new net.minecraft.util.com.google.gson.Gson(); + } + + @Override + public T fromJson(final cn.citycraft.GsonAgent.api.JsonElement json, final Class classOfT) throws JsonSyntaxException { + return getHandle().fromJson(((JsonElementHandle) json).getHandle(), classOfT); + } + + @Override + public T fromJson(final cn.citycraft.GsonAgent.api.JsonElement json, final Type typeOfT) throws JsonSyntaxException { + return getHandle().fromJson(((JsonElementHandle) json).getHandle(), typeOfT); + } + + @Override + public T fromJson(final cn.citycraft.GsonAgent.api.stream.JsonReader reader, final Type typeOfT) throws JsonIOException, JsonSyntaxException { + return getHandle().fromJson(((JsonReaderHandle) reader).getHandle(), typeOfT); + } + + @Override + public T fromJson(final Reader json, final Class classOfT) throws JsonSyntaxException, JsonIOException { + return getHandle().fromJson(json, classOfT); + } + + @Override + public T fromJson(final Reader json, final Type typeOfT) throws JsonIOException, JsonSyntaxException { + return getHandle().fromJson(json, typeOfT); + } + + @Override + public T fromJson(final String json, final Class classOfT) throws JsonSyntaxException { + return getHandle().fromJson(json, classOfT); + } + + @Override + public T fromJson(final String json, final Type typeOfT) throws JsonSyntaxException { + return getHandle().fromJson(json, typeOfT); + } + + @Override + public TypeAdapterHandle getAdapter(final Class type) { + return new TypeAdapterHandle(getHandle().getAdapter(type)); + } + + @Override + public TypeAdapterHandle getAdapter(final cn.citycraft.GsonAgent.api.reflect.TypeToken type) { + return new TypeAdapterHandle(getHandle().getAdapter((net.minecraft.util.com.google.gson.reflect.TypeToken) type.getHandle())); + } + + @Override + public TypeAdapterHandle getDelegateAdapter(final cn.citycraft.GsonAgent.api.TypeAdapterFactory skipPast, final cn.citycraft.GsonAgent.api.reflect.TypeToken type) { + return new TypeAdapterHandle(getHandle().getDelegateAdapter(((TypeAdapterFactoryHandle) skipPast).getHandle(), (net.minecraft.util.com.google.gson.reflect.TypeToken) type.getHandle())); + } + + public net.minecraft.util.com.google.gson.Gson getHandle() { + return handle; + } + + @Override + public String toJson(final cn.citycraft.GsonAgent.api.JsonElement jsonElement) { + return getHandle().toJson(((JsonElementHandle) jsonElement).getHandle()); + } + + @Override + public void toJson(final cn.citycraft.GsonAgent.api.JsonElement jsonElement, final Appendable writer) throws JsonIOException { + getHandle().toJson(((JsonElementHandle) jsonElement).getHandle(), writer); + } + + @Override + public void toJson(final cn.citycraft.GsonAgent.api.JsonElement jsonElement, final cn.citycraft.GsonAgent.api.stream.JsonWriter writer) throws JsonIOException { + getHandle().toJson(((JsonElementHandle) jsonElement).getHandle(), ((JsonWriterHandle) writer).getHandle()); + } + + @Override + public String toJson(final Object src) { + return getHandle().toJson(src); + } + + @Override + public void toJson(final Object src, final Appendable writer) throws JsonIOException { + getHandle().toJson(src, writer); + } + + @Override + public String toJson(final Object src, final Type typeOfSrc) { + return getHandle().toJson(src, typeOfSrc); + } + + @Override + public void toJson(final Object src, final Type typeOfSrc, final Appendable writer) throws JsonIOException { + getHandle().toJson(src, typeOfSrc, writer); + } + + @Override + public void toJson(final Object src, final Type typeOfSrc, final cn.citycraft.GsonAgent.api.stream.JsonWriter writer) throws JsonIOException { + getHandle().toJson(src, typeOfSrc, ((JsonWriterHandle) writer).getHandle()); + } + + @Override + public JsonElementHandle toJsonTree(final Object src) { + return new JsonElementHandle(getHandle().toJsonTree(src)); + } + + @Override + public JsonElementHandle toJsonTree(final Object src, final Type typeOfSrc) { + return new JsonElementHandle(getHandle().toJsonTree(src, typeOfSrc)); + } + +} diff --git a/src/main/java/cn/citycraft/GsonAgent/nms/JsonArrayHandle.java b/src/main/java/cn/citycraft/GsonAgent/nms/JsonArrayHandle.java new file mode 100644 index 0000000..6bacaff --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/nms/JsonArrayHandle.java @@ -0,0 +1,159 @@ +package cn.citycraft.GsonAgent.nms; + +import java.lang.reflect.Field; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import cn.citycraft.GsonAgent.api.JsonArray; +import cn.citycraft.GsonAgent.api.utils.Utils; + +/** + * + * @since 2016年1月5日 下午1:49:21 + * @author 喵♂呜 + */ +public class JsonArrayHandle extends JsonElementHandle implements JsonArray { + + private static Field elementsField; + + static { + try { + elementsField = net.minecraft.util.com.google.gson.JsonArray.class.getDeclaredField("elements"); + elementsField.setAccessible(true); + } catch (final Exception e) { + e.printStackTrace(); + } + } + + private final net.minecraft.util.com.google.gson.JsonArray handle; + + private List elements; + + public JsonArrayHandle() { + this(new net.minecraft.util.com.google.gson.JsonArray()); + } + + @SuppressWarnings("unchecked") + protected JsonArrayHandle(final net.minecraft.util.com.google.gson.JsonArray handle) { + this.handle = handle; + try { + elements = (List) elementsField.get(this.handle); + } catch (final Exception e) { + e.printStackTrace(); + } + } + + @Override + public void add(final cn.citycraft.GsonAgent.api.JsonElement element) { + handle.add(((JsonElementHandle) element).getHandle()); + } + + @Override + public void addAll(final cn.citycraft.GsonAgent.api.JsonArray array) { + handle.addAll(((JsonArrayHandle) array).handle); + } + + @Override + public cn.citycraft.GsonAgent.api.JsonArray deepCopy() { + return new JsonArrayHandle(Utils.deepCopyObject(this.handle)); + } + + @Override + public boolean equals(final Object o) { + return handle.equals(o); + } + + @Override + public cn.citycraft.GsonAgent.api.JsonElement get(final int i) { + return new JsonElementHandle(handle.get(i)); + } + + @Override + public BigDecimal getAsBigDecimal() { + return handle.getAsBigDecimal(); + } + + @Override + public BigInteger getAsBigInteger() { + return handle.getAsBigInteger(); + } + + @Override + public boolean getAsBoolean() { + return handle.getAsBoolean(); + } + + @Override + public byte getAsByte() { + return handle.getAsByte(); + } + + @Override + public char getAsCharacter() { + return handle.getAsCharacter(); + } + + @Override + public double getAsDouble() { + return handle.getAsDouble(); + } + + @Override + public float getAsFloat() { + return handle.getAsFloat(); + } + + @Override + public int getAsInt() { + return handle.getAsInt(); + } + + @Override + public long getAsLong() { + return handle.getAsLong(); + } + + @Override + public Number getAsNumber() { + return handle.getAsNumber(); + } + + @Override + public short getAsShort() { + return handle.getAsShort(); + } + + @Override + public String getAsString() { + return handle.getAsString(); + } + + @Override + public int hashCode() { + return handle.hashCode(); + } + + @Override + public Iterator iterator() { + try { + final List result = new ArrayList<>(); + final Iterator iterator = this.elements.iterator(); + while (iterator.hasNext()) { + result.add(new JsonElementHandle(iterator.next())); + } + return result.iterator(); + } catch (final Exception e) { + e.printStackTrace(); + } + return null; + } + + @Override + public int size() { + return handle.size(); + } + +} diff --git a/src/main/java/cn/citycraft/GsonAgent/nms/JsonElementHandle.java b/src/main/java/cn/citycraft/GsonAgent/nms/JsonElementHandle.java new file mode 100644 index 0000000..1b5eb0b --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/nms/JsonElementHandle.java @@ -0,0 +1,143 @@ +/** + * + */ +package cn.citycraft.GsonAgent.nms; + +import java.math.BigDecimal; +import java.math.BigInteger; + +import cn.citycraft.GsonAgent.api.JsonElement; +import cn.citycraft.GsonAgent.api.utils.Utils; + +/** + * JsonElementHandler处理类 + * + * @since 2016年1月5日 下午1:36:14 + * @author 喵♂呜 + */ +public class JsonElementHandle implements JsonElement { + + private net.minecraft.util.com.google.gson.JsonElement handle; + + public JsonElementHandle() { + } + + public JsonElementHandle(final net.minecraft.util.com.google.gson.JsonElement handle) { + this.handle = handle; + } + + @Override + public cn.citycraft.GsonAgent.api.JsonElement deepCopy() { + return new JsonElementHandle(Utils.deepCopyObject(this.getHandle())); + } + + @Override + public BigDecimal getAsBigDecimal() { + return getHandle().getAsBigDecimal(); + } + + @Override + public BigInteger getAsBigInteger() { + return getHandle().getAsBigInteger(); + } + + @Override + public boolean getAsBoolean() { + return getHandle().getAsBoolean(); + } + + @Override + public byte getAsByte() { + return getHandle().getAsByte(); + } + + @Override + public char getAsCharacter() { + return getHandle().getAsCharacter(); + } + + @Override + public double getAsDouble() { + return getHandle().getAsDouble(); + } + + @Override + public float getAsFloat() { + return getHandle().getAsFloat(); + } + + @Override + public int getAsInt() { + return getHandle().getAsInt(); + } + + @Override + public JsonArrayHandle getAsJsonArray() { + return new JsonArrayHandle(getHandle().getAsJsonArray()); + } + + @Override + public JsonNullHandle getAsJsonNull() { + return new JsonNullHandle(getHandle().getAsJsonNull()); + } + + @Override + public JsonObjectHandle getAsJsonObject() { + return new JsonObjectHandle(getHandle().getAsJsonObject()); + } + + @Override + public JsonPrimitiveHandle getAsJsonPrimitive() { + return new JsonPrimitiveHandle(getHandle().getAsJsonPrimitive()); + } + + @Override + public long getAsLong() { + return getHandle().getAsLong(); + } + + @Override + public Number getAsNumber() { + return getHandle().getAsNumber(); + } + + @Override + public short getAsShort() { + return getHandle().getAsShort(); + } + + @Override + public String getAsString() { + return getHandle().getAsString(); + } + + public net.minecraft.util.com.google.gson.JsonElement getHandle() { + return handle; + } + + @Override + public boolean isJsonArray() { + return getHandle().isJsonArray(); + } + + @Override + public boolean isJsonNull() { + return getHandle().isJsonNull(); + } + + @Override + public boolean isJsonObject() { + return getHandle().isJsonObject(); + } + + @Override + public boolean isJsonPrimitive() { + return getHandle().isJsonPrimitive(); + } + + @Override + public String toString() { + return getHandle().toString(); + } + +} diff --git a/src/main/java/cn/citycraft/GsonAgent/nms/JsonNullHandle.java b/src/main/java/cn/citycraft/GsonAgent/nms/JsonNullHandle.java new file mode 100644 index 0000000..f733a32 --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/nms/JsonNullHandle.java @@ -0,0 +1,36 @@ +package cn.citycraft.GsonAgent.nms; + +import cn.citycraft.GsonAgent.api.JsonNull; + +/** + * + * @since 2016年1月5日 下午1:49:34 + * @author 喵♂呜 + */ +public class JsonNullHandle extends JsonElementHandle implements JsonNull { + + private final net.minecraft.util.com.google.gson.JsonNull handle; + + public JsonNullHandle() { + this(net.minecraft.util.com.google.gson.JsonNull.INSTANCE); + } + + protected JsonNullHandle(final net.minecraft.util.com.google.gson.JsonNull handle) { + this.handle = handle; + } + + @Override + public cn.citycraft.GsonAgent.api.JsonNull deepCopy() { + return new JsonNullHandle(); + } + + @Override + public boolean equals(final Object other) { + return handle.equals(other); + } + + @Override + public int hashCode() { + return handle.hashCode(); + } +} diff --git a/src/main/java/cn/citycraft/GsonAgent/nms/JsonObjectHandle.java b/src/main/java/cn/citycraft/GsonAgent/nms/JsonObjectHandle.java new file mode 100644 index 0000000..0ec67f3 --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/nms/JsonObjectHandle.java @@ -0,0 +1,131 @@ +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 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) 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> entrySet() { + try { + final Map result = new LinkedTreeMap<>(); + for (final Map.Entry 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)); + } +} diff --git a/src/main/java/cn/citycraft/GsonAgent/nms/JsonParserHandle.java b/src/main/java/cn/citycraft/GsonAgent/nms/JsonParserHandle.java new file mode 100644 index 0000000..34a2a92 --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/nms/JsonParserHandle.java @@ -0,0 +1,41 @@ +package cn.citycraft.GsonAgent.nms; + +import java.io.Reader; + +import cn.citycraft.GsonAgent.api.exception.JsonIOException; +import cn.citycraft.GsonAgent.api.exception.JsonSyntaxException; +import cn.citycraft.GsonAgent.nms.stream.JsonReaderHandle; + +public class JsonParserHandle implements cn.citycraft.GsonAgent.api.JsonParser { + + public net.minecraft.util.com.google.gson.JsonParser handle; + + public JsonParserHandle() { + handle = new net.minecraft.util.com.google.gson.JsonParser(); + } + + protected JsonParserHandle(final net.minecraft.util.com.google.gson.JsonParser handle) { + this.handle = handle; + } + + @Override + public net.minecraft.util.com.google.gson.JsonParser getHandle() { + return this.handle; + } + + @Override + public JsonElementHandle parse(final cn.citycraft.GsonAgent.api.stream.JsonReader json) throws JsonIOException, JsonSyntaxException { + return new JsonElementHandle(getHandle().parse(((JsonReaderHandle) json).getHandle())); + } + + @Override + public JsonElementHandle parse(final Reader json) throws JsonIOException, JsonSyntaxException { + return new JsonElementHandle(getHandle().parse(json)); + } + + @Override + public JsonElementHandle parse(final String json) throws JsonSyntaxException { + return new JsonElementHandle(getHandle().parse(json)); + } + +} diff --git a/src/main/java/cn/citycraft/GsonAgent/nms/JsonPrimitiveHandle.java b/src/main/java/cn/citycraft/GsonAgent/nms/JsonPrimitiveHandle.java new file mode 100644 index 0000000..57d6a23 --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/nms/JsonPrimitiveHandle.java @@ -0,0 +1,154 @@ +/** + * + */ +package cn.citycraft.GsonAgent.nms; + +import java.math.BigDecimal; +import java.math.BigInteger; + +import cn.citycraft.GsonAgent.api.JsonPrimitive; +import cn.citycraft.GsonAgent.api.utils.Utils; + +/** + * + * @since 2016年1月5日 下午1:49:49 + * @author 喵♂呜 + */ +public class JsonPrimitiveHandle extends JsonElementHandle implements JsonPrimitive { + + private final net.minecraft.util.com.google.gson.JsonPrimitive handle; + + public JsonPrimitiveHandle(final Boolean bool) { + this(new net.minecraft.util.com.google.gson.JsonPrimitive(bool)); + setValue(bool); + } + + public JsonPrimitiveHandle(final Character c) { + this(new net.minecraft.util.com.google.gson.JsonPrimitive(c)); + setValue(c); + } + + public JsonPrimitiveHandle(final Number number) { + this(new net.minecraft.util.com.google.gson.JsonPrimitive(number)); + setValue(number); + } + + public JsonPrimitiveHandle(final String string) { + this(new net.minecraft.util.com.google.gson.JsonPrimitive(string)); + setValue(string); + } + + protected JsonPrimitiveHandle(final net.minecraft.util.com.google.gson.JsonPrimitive handle) { + this.handle = handle; + } + + @Override + public cn.citycraft.GsonAgent.api.JsonPrimitive deepCopy() { + return new JsonPrimitiveHandle(Utils.deepCopyObject(this.handle)); + } + + @Override + public boolean equals(final Object obj) { + return handle.equals(obj); + } + + @Override + public BigDecimal getAsBigDecimal() { + return handle.getAsBigDecimal(); + } + + @Override + public BigInteger getAsBigInteger() { + return handle.getAsBigInteger(); + } + + @Override + public boolean getAsBoolean() { + return handle.getAsBoolean(); + } + + @Override + public byte getAsByte() { + return handle.getAsByte(); + } + + @Override + public char getAsCharacter() { + return handle.getAsCharacter(); + } + + @Override + public double getAsDouble() { + return handle.getAsDouble(); + } + + @Override + public float getAsFloat() { + return handle.getAsFloat(); + } + + @Override + public int getAsInt() { + return handle.getAsInt(); + } + + @Override + public JsonArrayHandle getAsJsonArray() { + return new JsonArrayHandle(handle.getAsJsonArray()); + } + + @Override + public JsonObjectHandle getAsJsonObject() { + return new JsonObjectHandle(handle.getAsJsonObject()); + } + + @Override + public long getAsLong() { + return handle.getAsLong(); + } + + @Override + public Number getAsNumber() { + return handle.getAsNumber(); + } + + @Override + public short getAsShort() { + return handle.getAsShort(); + } + + @Override + public String getAsString() { + return handle.getAsString(); + } + + @Override + public int hashCode() { + return handle.hashCode(); + } + + @Override + public boolean isBoolean() { + return handle.isBoolean(); + } + + @Override + public boolean isNumber() { + return handle.isNumber(); + } + + @Override + public boolean isString() { + return handle.isString(); + } + + @Override + public final void setValue(final Object primitive) { + try { + handle.getClass().getDeclaredMethod("setValue", Object.class).invoke(handle, primitive); + } catch (final Exception e) { + throw new RuntimeException(e); + } + } + +} diff --git a/src/main/java/cn/citycraft/GsonAgent/nms/bind/TypeAdapterFactoryHandle.java b/src/main/java/cn/citycraft/GsonAgent/nms/bind/TypeAdapterFactoryHandle.java new file mode 100644 index 0000000..0d40eb4 --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/nms/bind/TypeAdapterFactoryHandle.java @@ -0,0 +1,32 @@ +package cn.citycraft.GsonAgent.nms.bind; + +import cn.citycraft.GsonAgent.nms.GsonHandle; +import net.minecraft.util.com.google.gson.Gson; +import net.minecraft.util.com.google.gson.TypeAdapter; +import net.minecraft.util.com.google.gson.TypeAdapterFactory; +import net.minecraft.util.com.google.gson.reflect.TypeToken; + +@SuppressWarnings({ "unchecked", "rawtypes" }) +public class TypeAdapterFactoryHandle implements cn.citycraft.GsonAgent.api.TypeAdapterFactory, net.minecraft.util.com.google.gson.TypeAdapterFactory { + + private final TypeAdapterFactory handle; + + protected TypeAdapterFactoryHandle(final TypeAdapterFactory handle) { + this.handle = handle; + } + + @Override + public TypeAdapterHandle create(final cn.citycraft.GsonAgent.api.Gson paramGson, final cn.citycraft.GsonAgent.api.reflect.TypeToken paramTypeToken) { + return new TypeAdapterHandle(this.create(((GsonHandle) paramGson).getHandle(), (TypeToken) paramTypeToken.getHandle())); + } + + @Override + public TypeAdapter create(final Gson paramGson, final TypeToken paramTypeToken) { + return this.getHandle().create(paramGson, paramTypeToken); + } + + public TypeAdapterFactory getHandle() { + return handle; + } + +} diff --git a/src/main/java/cn/citycraft/GsonAgent/nms/bind/TypeAdapterHandle.java b/src/main/java/cn/citycraft/GsonAgent/nms/bind/TypeAdapterHandle.java new file mode 100644 index 0000000..bf6a0a9 --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/nms/bind/TypeAdapterHandle.java @@ -0,0 +1,77 @@ +package cn.citycraft.GsonAgent.nms.bind; + +import java.io.IOException; +import java.io.Reader; +import java.io.Writer; + +import cn.citycraft.GsonAgent.nms.JsonElementHandle; +import net.minecraft.util.com.google.gson.TypeAdapter; + +@SuppressWarnings({ "unchecked", "rawtypes" }) +public class TypeAdapterHandle implements cn.citycraft.GsonAgent.api.TypeAdapter { + + private final TypeAdapter handle; + + public TypeAdapterHandle(final TypeAdapter handle) { + this.handle = handle; + } + + @Override + public T fromJson(final Reader in) throws IOException { + return getHandle().fromJson(in); + } + + @Override + public T fromJson(final String json) throws IOException { + return getHandle().fromJson(json); + } + + @Override + public T fromJsonTree(final cn.citycraft.GsonAgent.api.JsonElement jsonTree) { + return getHandle().fromJsonTree(((JsonElementHandle) jsonTree).getHandle()); + } + + @Override + public TypeAdapter getHandle() { + return handle; + } + + @Override + public TypeAdapterHandle nullSafe() { + return new TypeAdapterHandle(this.handle); + } + + @Override + public T read(final cn.citycraft.GsonAgent.api.stream.JsonReader reader) throws IOException { + if (reader.peek().name().equals("NULL")) { + reader.nextNull(); + return null; + } + return this.read(reader); + } + + @Override + public String toJson(final T value) throws IOException { + return getHandle().toJson(value); + } + + @Override + public void toJson(final Writer out, final T value) throws IOException { + getHandle().toJson(out, value); + } + + @Override + public JsonElementHandle toJsonTree(final T value) { + return new JsonElementHandle(getHandle().toJsonTree(value)); + } + + @Override + public void write(final cn.citycraft.GsonAgent.api.stream.JsonWriter out, final T value) throws IOException { + if (value == null) { + out.nullValue(); + } else { + this.write(out, value); + } + } + +} diff --git a/src/main/java/cn/citycraft/GsonAgent/nms/reflect/TypeTokenHandle.java b/src/main/java/cn/citycraft/GsonAgent/nms/reflect/TypeTokenHandle.java new file mode 100644 index 0000000..32e9dd2 --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/nms/reflect/TypeTokenHandle.java @@ -0,0 +1,73 @@ +package cn.citycraft.GsonAgent.nms.reflect; + +import java.lang.reflect.Type; + +import cn.citycraft.GsonAgent.api.reflect.TypeTokenAbstract; +import cn.citycraft.GsonAgent.api.utils.Utils; +import net.minecraft.util.com.google.gson.reflect.TypeToken; + +@SuppressWarnings({ "unchecked", "rawtypes" }) +public class TypeTokenHandle implements cn.citycraft.GsonAgent.api.reflect.TypeTokenAbstract { + + private TypeToken handle; + + public TypeTokenHandle() { + try { + handle = new TypeToken() { + }; + } catch (final Exception e) { + throw new RuntimeException(e); + } + } + + public TypeTokenHandle(final Type type) { + try { + handle = Utils.newInstance(TypeToken.class, Type.class, type); + } catch (final Exception e) { + throw new RuntimeException(e); + } + } + + protected TypeTokenHandle(final TypeToken handle) { + this.handle = handle; + } + + public static TypeTokenAbstract get(final Class type) { + return new TypeTokenHandle(TypeToken.get(type)); + } + + public static TypeTokenAbstract get(final Type type) { + return new TypeTokenHandle(TypeToken.get(type)); + } + + @Override + public TypeToken getHandle() { + return this.handle; + } + + @Override + public Class getRawType() { + return getHandle().getRawType(); + } + + @Override + public Type getType() { + return getHandle().getType(); + } + + @Override + public boolean isAssignableFrom(final Class cls) { + return getHandle().isAssignableFrom(cls); + } + + @Override + public boolean isAssignableFrom(final cn.citycraft.GsonAgent.api.reflect.TypeToken token) { + return getHandle().isAssignableFrom((TypeToken) token.getHandle()); + } + + @Override + public boolean isAssignableFrom(final Type from) { + return getHandle().isAssignableFrom(from); + } + +} diff --git a/src/main/java/cn/citycraft/GsonAgent/nms/stream/JsonReaderHandle.java b/src/main/java/cn/citycraft/GsonAgent/nms/stream/JsonReaderHandle.java new file mode 100644 index 0000000..7649ca8 --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/nms/stream/JsonReaderHandle.java @@ -0,0 +1,115 @@ +package cn.citycraft.GsonAgent.nms.stream; + +import java.io.IOException; +import java.io.Reader; + +import cn.citycraft.GsonAgent.api.stream.JsonToken; +import net.minecraft.util.com.google.gson.stream.JsonReader; + +public class JsonReaderHandle implements cn.citycraft.GsonAgent.api.stream.JsonReader { + + private final JsonReader handle; + + public JsonReaderHandle(final Reader in) { + this(new JsonReader(in)); + } + + protected JsonReaderHandle(final JsonReader handle) { + this.handle = handle; + } + + @Override + public void beginArray() throws IOException { + getHandle().beginArray(); + } + + @Override + public void beginObject() throws IOException { + getHandle().beginObject(); + } + + @Override + public void close() throws IOException { + getHandle().close(); + } + + @Override + public void endArray() throws IOException { + getHandle().endArray(); + } + + @Override + public void endObject() throws IOException { + getHandle().endObject(); + } + + public JsonReader getHandle() { + return handle; + } + + @Override + public boolean hasNext() throws IOException { + return getHandle().hasNext(); + } + + @Override + public boolean isLenient() { + return getHandle().isLenient(); + } + + @Override + public boolean nextBoolean() throws IOException { + return getHandle().nextBoolean(); + } + + @Override + public double nextDouble() throws IOException { + return getHandle().nextDouble(); + } + + @Override + public int nextInt() throws IOException { + return getHandle().nextInt(); + } + + @Override + public long nextLong() throws IOException { + return getHandle().nextLong(); + } + + @Override + public String nextName() throws IOException { + return getHandle().nextName(); + } + + @Override + public void nextNull() throws IOException { + getHandle().nextNull(); + } + + @Override + public String nextString() throws IOException { + return getHandle().nextString(); + } + + @Override + public JsonToken peek() throws IOException { + return JsonToken.getByName(getHandle().peek().name()); + } + + @Override + public void setLenient(final boolean lenient) { + getHandle().setLenient(lenient); + } + + @Override + public void skipValue() throws IOException { + getHandle().skipValue(); + } + + @Override + public String toString() { + return getHandle().toString(); + } + +} diff --git a/src/main/java/cn/citycraft/GsonAgent/nms/stream/JsonWriterHandle.java b/src/main/java/cn/citycraft/GsonAgent/nms/stream/JsonWriterHandle.java new file mode 100644 index 0000000..cbf3132 --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/nms/stream/JsonWriterHandle.java @@ -0,0 +1,208 @@ +package cn.citycraft.GsonAgent.nms.stream; + +import java.io.IOException; +import java.io.Writer; +import java.lang.reflect.Field; + +import net.minecraft.util.com.google.gson.stream.JsonWriter; + +public class JsonWriterHandle implements cn.citycraft.GsonAgent.api.stream.JsonWriter { + + private static String[] REPLACEMENT_CHARS; + + private static String[] HTML_SAFE_REPLACEMENT_CHARS; + + static { + try { + Field field = JsonWriter.class.getDeclaredField("REPLACEMENT_CHARS"); + field.setAccessible(true); + REPLACEMENT_CHARS = (String[]) field.get(null); + field = JsonWriter.class.getDeclaredField("HTML_SAFE_REPLACEMENT_CHARS"); + field.setAccessible(true); + HTML_SAFE_REPLACEMENT_CHARS = (String[]) field.get(null); + } catch (final Exception e) { + e.printStackTrace(); + } + } + + private final JsonWriter handle; + + private Writer out; + + private boolean withoutQuotes = false; + + public JsonWriterHandle(final Writer out) { + this(new JsonWriter(out)); + this.out = out; + } + + protected JsonWriterHandle(final JsonWriter handle) { + this.handle = handle; + } + + @Override + public JsonWriterHandle beginArray() throws IOException { + getHandle().beginArray(); + return this; + } + + @Override + public JsonWriterHandle beginObject() throws IOException { + getHandle().beginObject(); + return this; + } + + @Override + public void close() throws IOException { + getHandle().close(); + } + + @Override + public JsonWriterHandle endArray() throws IOException { + getHandle().endArray(); + return this; + } + + @Override + public JsonWriterHandle endObject() throws IOException { + getHandle().endObject(); + return this; + } + + @Override + public void flush() throws IOException { + getHandle().flush(); + } + + public JsonWriter getHandle() { + return handle; + } + + @Override + public boolean getSerializeNulls() { + return getHandle().getSerializeNulls(); + } + + @Override + public boolean isHtmlSafe() { + return getHandle().isHtmlSafe(); + } + + @Override + public boolean isLenient() { + return getHandle().isLenient(); + } + + @Override + public JsonWriterHandle name(final String name) throws IOException { + getHandle().name(name); + withoutQuotes = false; + return this; + } + + @Override + public JsonWriterHandle nameWithoutQuotes(final String name) throws IOException { + getHandle().name(name); + withoutQuotes = true; + return this; + } + + @Override + public JsonWriterHandle nullValue() throws IOException { + getHandle().nullValue(); + return this; + } + + @Override + public void setHtmlSafe(final boolean htmlSafe) { + getHandle().setHtmlSafe(htmlSafe); + } + + @Override + public void setIndent(final String indent) { + getHandle().setIndent(indent); + } + + @Override + public void setLenient(final boolean lenient) { + getHandle().setLenient(lenient); + } + + @Override + public void setSerializeNulls(final boolean serializeNulls) { + getHandle().setSerializeNulls(serializeNulls); + } + + @Override + public void string(final String value) throws IOException { + final String[] replacements = getHandle().isHtmlSafe() ? HTML_SAFE_REPLACEMENT_CHARS : REPLACEMENT_CHARS; + if (!this.withoutQuotes) { + this.out.write("\""); + } + int last = 0; + final int length = value.length(); + for (int i = 0; i < length; i++) { + final char c = value.charAt(i); + String replacement; + if (c < '€') { + replacement = replacements[c]; + if (replacement == null) { + continue; + } + } else { + if (c == '
') { + replacement = "\\u2028"; + } else { + if (c != '
') { + continue; + } + replacement = "\\u2029"; + } + } + + if (last < i) { + this.out.write(value, last, i - last); + } + this.out.write(replacement); + last = i + 1; + } + if (last < length) { + this.out.write(value, last, length - last); + } + if (!this.withoutQuotes) { + this.out.write("\""); + } + withoutQuotes = false; + } + + @Override + public JsonWriterHandle value(final boolean value) throws IOException { + getHandle().value(value); + return this; + } + + @Override + public JsonWriterHandle value(final double value) throws IOException { + getHandle().value(value); + return this; + } + + @Override + public JsonWriterHandle value(final long value) throws IOException { + getHandle().value(value); + return this; + } + + @Override + public JsonWriterHandle value(final Number value) throws IOException { + getHandle().value(value); + return this; + } + + @Override + public JsonWriterHandle value(final String value) throws IOException { + getHandle().value(value); + return this; + } + +} diff --git a/src/main/java/cn/citycraft/GsonAgent/normal/GsonHandle.java b/src/main/java/cn/citycraft/GsonAgent/normal/GsonHandle.java new file mode 100644 index 0000000..32a96f4 --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/normal/GsonHandle.java @@ -0,0 +1,128 @@ +package cn.citycraft.GsonAgent.normal; + +import java.io.Reader; +import java.lang.reflect.Type; + +import com.google.gson.JsonSyntaxException; + +import cn.citycraft.GsonAgent.api.Gson; +import cn.citycraft.GsonAgent.api.exception.JsonIOException; +import cn.citycraft.GsonAgent.normal.bind.TypeAdapterFactoryHandle; +import cn.citycraft.GsonAgent.normal.bind.TypeAdapterHandle; +import cn.citycraft.GsonAgent.normal.stream.JsonReaderHandle; +import cn.citycraft.GsonAgent.normal.stream.JsonWriterHandle; + +/** + * 新版本Gson代理类 + * + * @since 2016年1月5日 下午12:57:20 + * @author 喵♂呜 + */ +@SuppressWarnings({ "unchecked", "rawtypes" }) +public class GsonHandle implements Gson { + final com.google.gson.Gson handle = new com.google.gson.Gson(); + + @Override + public T fromJson(final cn.citycraft.GsonAgent.api.JsonElement json, final Class classOfT) throws JsonSyntaxException { + return getHandle().fromJson(((JsonElementHandle) json).getHandle(), classOfT); + } + + @Override + public T fromJson(final cn.citycraft.GsonAgent.api.JsonElement json, final Type typeOfT) throws JsonSyntaxException { + return getHandle().fromJson(((JsonElementHandle) json).getHandle(), typeOfT); + } + + @Override + public T fromJson(final cn.citycraft.GsonAgent.api.stream.JsonReader reader, final Type typeOfT) throws JsonIOException, JsonSyntaxException { + return getHandle().fromJson(((JsonReaderHandle) reader).getHandle(), typeOfT); + } + + @Override + public T fromJson(final Reader json, final Class classOfT) throws JsonSyntaxException, JsonIOException { + return getHandle().fromJson(json, classOfT); + } + + @Override + public T fromJson(final Reader json, final Type typeOfT) throws JsonIOException, JsonSyntaxException { + return getHandle().fromJson(json, typeOfT); + } + + @Override + public T fromJson(final String json, final Class classOfT) throws JsonSyntaxException { + return getHandle().fromJson(json, classOfT); + } + + @Override + public T fromJson(final String json, final Type typeOfT) throws JsonSyntaxException { + return getHandle().fromJson(json, typeOfT); + } + + @Override + public TypeAdapterHandle getAdapter(final Class type) { + return new TypeAdapterHandle(getHandle().getAdapter(type)); + } + + @Override + public TypeAdapterHandle getAdapter(final cn.citycraft.GsonAgent.api.reflect.TypeToken type) { + return new TypeAdapterHandle(getHandle().getAdapter((com.google.gson.reflect.TypeToken) type.getHandle())); + } + + @Override + public TypeAdapterHandle getDelegateAdapter(final cn.citycraft.GsonAgent.api.TypeAdapterFactory skipPast, final cn.citycraft.GsonAgent.api.reflect.TypeToken type) { + return new TypeAdapterHandle(getHandle().getDelegateAdapter(((TypeAdapterFactoryHandle) skipPast).getHandle(), (com.google.gson.reflect.TypeToken) type.getHandle())); + } + + public com.google.gson.Gson getHandle() { + return handle; + } + + @Override + public String toJson(final cn.citycraft.GsonAgent.api.JsonElement jsonElement) { + return getHandle().toJson(((JsonElementHandle) jsonElement).getHandle()); + } + + @Override + public void toJson(final cn.citycraft.GsonAgent.api.JsonElement jsonElement, final Appendable writer) throws JsonIOException { + getHandle().toJson(((JsonElementHandle) jsonElement).getHandle(), writer); + } + + @Override + public void toJson(final cn.citycraft.GsonAgent.api.JsonElement jsonElement, final cn.citycraft.GsonAgent.api.stream.JsonWriter writer) throws JsonIOException { + getHandle().toJson(((JsonElementHandle) jsonElement).getHandle(), ((JsonWriterHandle) writer).getHandle()); + } + + @Override + public String toJson(final Object src) { + return getHandle().toJson(src); + } + + @Override + public void toJson(final Object src, final Appendable writer) throws JsonIOException { + getHandle().toJson(src, writer); + } + + @Override + public String toJson(final Object src, final Type typeOfSrc) { + return getHandle().toJson(src, typeOfSrc); + } + + @Override + public void toJson(final Object src, final Type typeOfSrc, final Appendable writer) throws JsonIOException { + getHandle().toJson(src, typeOfSrc, writer); + } + + @Override + public void toJson(final Object src, final Type typeOfSrc, final cn.citycraft.GsonAgent.api.stream.JsonWriter writer) throws JsonIOException { + getHandle().toJson(src, typeOfSrc, ((JsonWriterHandle) writer).getHandle()); + } + + @Override + public JsonElementHandle toJsonTree(final Object src) { + return new JsonElementHandle(getHandle().toJsonTree(src)); + } + + @Override + public JsonElementHandle toJsonTree(final Object src, final Type typeOfSrc) { + return new JsonElementHandle(getHandle().toJsonTree(src, typeOfSrc)); + } +} diff --git a/src/main/java/cn/citycraft/GsonAgent/normal/JsonArrayHandle.java b/src/main/java/cn/citycraft/GsonAgent/normal/JsonArrayHandle.java new file mode 100644 index 0000000..5b6ab34 --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/normal/JsonArrayHandle.java @@ -0,0 +1,159 @@ +package cn.citycraft.GsonAgent.normal; + +import java.lang.reflect.Field; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import cn.citycraft.GsonAgent.api.JsonArray; +import cn.citycraft.GsonAgent.api.utils.Utils; + +/** + * + * @since 2016年1月5日 下午1:49:21 + * @author 喵♂呜 + */ +public class JsonArrayHandle extends JsonElementHandle implements JsonArray { + + private static Field elementsField; + + static { + try { + elementsField = com.google.gson.JsonArray.class.getDeclaredField("elements"); + elementsField.setAccessible(true); + } catch (final Exception e) { + e.printStackTrace(); + } + } + + private final com.google.gson.JsonArray handle; + + private List elements; + + public JsonArrayHandle() { + this(new com.google.gson.JsonArray()); + } + + @SuppressWarnings("unchecked") + protected JsonArrayHandle(final com.google.gson.JsonArray handle) { + this.handle = handle; + try { + elements = (List) elementsField.get(this.handle); + } catch (final Exception e) { + e.printStackTrace(); + } + } + + @Override + public void add(final cn.citycraft.GsonAgent.api.JsonElement element) { + handle.add(((JsonElementHandle) element).getHandle()); + } + + @Override + public void addAll(final cn.citycraft.GsonAgent.api.JsonArray array) { + handle.addAll(((JsonArrayHandle) array).handle); + } + + @Override + public cn.citycraft.GsonAgent.api.JsonArray deepCopy() { + return new JsonArrayHandle(Utils.deepCopyObject(this.handle)); + } + + @Override + public boolean equals(final Object o) { + return handle.equals(o); + } + + @Override + public cn.citycraft.GsonAgent.api.JsonElement get(final int i) { + return new JsonElementHandle(handle.get(i)); + } + + @Override + public BigDecimal getAsBigDecimal() { + return handle.getAsBigDecimal(); + } + + @Override + public BigInteger getAsBigInteger() { + return handle.getAsBigInteger(); + } + + @Override + public boolean getAsBoolean() { + return handle.getAsBoolean(); + } + + @Override + public byte getAsByte() { + return handle.getAsByte(); + } + + @Override + public char getAsCharacter() { + return handle.getAsCharacter(); + } + + @Override + public double getAsDouble() { + return handle.getAsDouble(); + } + + @Override + public float getAsFloat() { + return handle.getAsFloat(); + } + + @Override + public int getAsInt() { + return handle.getAsInt(); + } + + @Override + public long getAsLong() { + return handle.getAsLong(); + } + + @Override + public Number getAsNumber() { + return handle.getAsNumber(); + } + + @Override + public short getAsShort() { + return handle.getAsShort(); + } + + @Override + public String getAsString() { + return handle.getAsString(); + } + + @Override + public int hashCode() { + return handle.hashCode(); + } + + @Override + public Iterator iterator() { + try { + final List result = new ArrayList<>(); + final Iterator iterator = this.elements.iterator(); + while (iterator.hasNext()) { + result.add(new JsonElementHandle(iterator.next())); + } + return result.iterator(); + } catch (final Exception e) { + e.printStackTrace(); + } + return null; + } + + @Override + public int size() { + return handle.size(); + } + +} diff --git a/src/main/java/cn/citycraft/GsonAgent/normal/JsonElementHandle.java b/src/main/java/cn/citycraft/GsonAgent/normal/JsonElementHandle.java new file mode 100644 index 0000000..da5eca8 --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/normal/JsonElementHandle.java @@ -0,0 +1,143 @@ +/** + * + */ +package cn.citycraft.GsonAgent.normal; + +import java.math.BigDecimal; +import java.math.BigInteger; + +import cn.citycraft.GsonAgent.api.JsonElement; +import cn.citycraft.GsonAgent.api.utils.Utils; + +/** + * JsonElementHandler处理类 + * + * @since 2016年1月5日 下午1:36:14 + * @author 喵♂呜 + */ +public class JsonElementHandle implements JsonElement { + + private com.google.gson.JsonElement handle; + + public JsonElementHandle() { + } + + public JsonElementHandle(final com.google.gson.JsonElement handle) { + this.handle = handle; + } + + @Override + public cn.citycraft.GsonAgent.api.JsonElement deepCopy() { + return new JsonElementHandle(Utils.deepCopyObject(this.getHandle())); + } + + @Override + public BigDecimal getAsBigDecimal() { + return getHandle().getAsBigDecimal(); + } + + @Override + public BigInteger getAsBigInteger() { + return getHandle().getAsBigInteger(); + } + + @Override + public boolean getAsBoolean() { + return getHandle().getAsBoolean(); + } + + @Override + public byte getAsByte() { + return getHandle().getAsByte(); + } + + @Override + public char getAsCharacter() { + return getHandle().getAsCharacter(); + } + + @Override + public double getAsDouble() { + return getHandle().getAsDouble(); + } + + @Override + public float getAsFloat() { + return getHandle().getAsFloat(); + } + + @Override + public int getAsInt() { + return getHandle().getAsInt(); + } + + @Override + public JsonArrayHandle getAsJsonArray() { + return new JsonArrayHandle(getHandle().getAsJsonArray()); + } + + @Override + public JsonNullHandle getAsJsonNull() { + return new JsonNullHandle(getHandle().getAsJsonNull()); + } + + @Override + public JsonObjectHandle getAsJsonObject() { + return new JsonObjectHandle(getHandle().getAsJsonObject()); + } + + @Override + public JsonPrimitiveHandle getAsJsonPrimitive() { + return new JsonPrimitiveHandle(getHandle().getAsJsonPrimitive()); + } + + @Override + public long getAsLong() { + return getHandle().getAsLong(); + } + + @Override + public Number getAsNumber() { + return getHandle().getAsNumber(); + } + + @Override + public short getAsShort() { + return getHandle().getAsShort(); + } + + @Override + public String getAsString() { + return getHandle().getAsString(); + } + + public com.google.gson.JsonElement getHandle() { + return handle; + } + + @Override + public boolean isJsonArray() { + return getHandle().isJsonArray(); + } + + @Override + public boolean isJsonNull() { + return getHandle().isJsonNull(); + } + + @Override + public boolean isJsonObject() { + return getHandle().isJsonObject(); + } + + @Override + public boolean isJsonPrimitive() { + return getHandle().isJsonPrimitive(); + } + + @Override + public String toString() { + return getHandle().toString(); + } + +} diff --git a/src/main/java/cn/citycraft/GsonAgent/normal/JsonNullHandle.java b/src/main/java/cn/citycraft/GsonAgent/normal/JsonNullHandle.java new file mode 100644 index 0000000..8e52f2d --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/normal/JsonNullHandle.java @@ -0,0 +1,36 @@ +package cn.citycraft.GsonAgent.normal; + +import cn.citycraft.GsonAgent.api.JsonNull; + +/** + * + * @since 2016年1月5日 下午1:49:34 + * @author 喵♂呜 + */ +public class JsonNullHandle extends JsonElementHandle implements JsonNull { + + private final com.google.gson.JsonNull handle; + + public JsonNullHandle() { + this(com.google.gson.JsonNull.INSTANCE); + } + + protected JsonNullHandle(final com.google.gson.JsonNull handle) { + this.handle = handle; + } + + @Override + public cn.citycraft.GsonAgent.api.JsonNull deepCopy() { + return new JsonNullHandle(); + } + + @Override + public boolean equals(final Object other) { + return handle.equals(other); + } + + @Override + public int hashCode() { + return handle.hashCode(); + } +} diff --git a/src/main/java/cn/citycraft/GsonAgent/normal/JsonObjectHandle.java b/src/main/java/cn/citycraft/GsonAgent/normal/JsonObjectHandle.java new file mode 100644 index 0000000..6d3deca --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/normal/JsonObjectHandle.java @@ -0,0 +1,135 @@ +/** + * + */ +package cn.citycraft.GsonAgent.normal; + +import java.lang.reflect.Field; +import java.util.AbstractMap; +import java.util.Map; +import java.util.Set; + +import com.google.gson.internal.LinkedTreeMap; + +import cn.citycraft.GsonAgent.api.JsonObject; +import cn.citycraft.GsonAgent.api.utils.Utils; + +/** + * + * @since 2016年1月5日 下午1:49:41 + * @author 喵♂呜 + */ +public class JsonObjectHandle extends JsonElementHandle implements JsonObject { + + private static Field membersField; + + static { + try { + membersField = com.google.gson.JsonObject.class.getDeclaredField("members"); + membersField.setAccessible(true); + } catch (final Exception e) { + e.printStackTrace(); + } + } + + private final com.google.gson.JsonObject handle; + + private AbstractMap members; + + public JsonObjectHandle() { + this(new com.google.gson.JsonObject()); + } + + @SuppressWarnings("unchecked") + protected JsonObjectHandle(final com.google.gson.JsonObject handle) { + this.handle = handle; + try { + members = (AbstractMap) 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> entrySet() { + try { + final Map result = new LinkedTreeMap<>(); + for (final Map.Entry 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)); + } +} diff --git a/src/main/java/cn/citycraft/GsonAgent/normal/JsonParserHandle.java b/src/main/java/cn/citycraft/GsonAgent/normal/JsonParserHandle.java new file mode 100644 index 0000000..e53a85a --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/normal/JsonParserHandle.java @@ -0,0 +1,41 @@ +package cn.citycraft.GsonAgent.normal; + +import java.io.Reader; + +import cn.citycraft.GsonAgent.api.exception.JsonIOException; +import cn.citycraft.GsonAgent.api.exception.JsonSyntaxException; +import cn.citycraft.GsonAgent.normal.stream.JsonReaderHandle; + +public class JsonParserHandle implements cn.citycraft.GsonAgent.api.JsonParser { + + public com.google.gson.JsonParser handle; + + public JsonParserHandle() { + handle = new com.google.gson.JsonParser(); + } + + protected JsonParserHandle(final com.google.gson.JsonParser handle) { + this.handle = handle; + } + + @Override + public com.google.gson.JsonParser getHandle() { + return this.handle; + } + + @Override + public JsonElementHandle parse(final cn.citycraft.GsonAgent.api.stream.JsonReader json) throws JsonIOException, JsonSyntaxException { + return new JsonElementHandle(getHandle().parse(((JsonReaderHandle) json).getHandle())); + } + + @Override + public JsonElementHandle parse(final Reader json) throws JsonIOException, JsonSyntaxException { + return new JsonElementHandle(getHandle().parse(json)); + } + + @Override + public JsonElementHandle parse(final String json) throws JsonSyntaxException { + return new JsonElementHandle(getHandle().parse(json)); + } + +} diff --git a/src/main/java/cn/citycraft/GsonAgent/normal/JsonPrimitiveHandle.java b/src/main/java/cn/citycraft/GsonAgent/normal/JsonPrimitiveHandle.java new file mode 100644 index 0000000..221c86b --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/normal/JsonPrimitiveHandle.java @@ -0,0 +1,154 @@ +/** + * + */ +package cn.citycraft.GsonAgent.normal; + +import java.math.BigDecimal; +import java.math.BigInteger; + +import cn.citycraft.GsonAgent.api.JsonPrimitive; +import cn.citycraft.GsonAgent.api.utils.Utils; + +/** + * + * @since 2016年1月5日 下午1:49:49 + * @author 喵♂呜 + */ +public class JsonPrimitiveHandle extends JsonElementHandle implements JsonPrimitive { + + private final com.google.gson.JsonPrimitive handle; + + public JsonPrimitiveHandle(final Boolean bool) { + this(new com.google.gson.JsonPrimitive(bool)); + setValue(bool); + } + + public JsonPrimitiveHandle(final Character c) { + this(new com.google.gson.JsonPrimitive(c)); + setValue(c); + } + + public JsonPrimitiveHandle(final Number number) { + this(new com.google.gson.JsonPrimitive(number)); + setValue(number); + } + + public JsonPrimitiveHandle(final String string) { + this(new com.google.gson.JsonPrimitive(string)); + setValue(string); + } + + protected JsonPrimitiveHandle(final com.google.gson.JsonPrimitive handle) { + this.handle = handle; + } + + @Override + public cn.citycraft.GsonAgent.api.JsonPrimitive deepCopy() { + return new JsonPrimitiveHandle(Utils.deepCopyObject(this.handle)); + } + + @Override + public boolean equals(final Object obj) { + return handle.equals(obj); + } + + @Override + public BigDecimal getAsBigDecimal() { + return handle.getAsBigDecimal(); + } + + @Override + public BigInteger getAsBigInteger() { + return handle.getAsBigInteger(); + } + + @Override + public boolean getAsBoolean() { + return handle.getAsBoolean(); + } + + @Override + public byte getAsByte() { + return handle.getAsByte(); + } + + @Override + public char getAsCharacter() { + return handle.getAsCharacter(); + } + + @Override + public double getAsDouble() { + return handle.getAsDouble(); + } + + @Override + public float getAsFloat() { + return handle.getAsFloat(); + } + + @Override + public int getAsInt() { + return handle.getAsInt(); + } + + @Override + public JsonArrayHandle getAsJsonArray() { + return new JsonArrayHandle(handle.getAsJsonArray()); + } + + @Override + public JsonObjectHandle getAsJsonObject() { + return new JsonObjectHandle(handle.getAsJsonObject()); + } + + @Override + public long getAsLong() { + return handle.getAsLong(); + } + + @Override + public Number getAsNumber() { + return handle.getAsNumber(); + } + + @Override + public short getAsShort() { + return handle.getAsShort(); + } + + @Override + public String getAsString() { + return handle.getAsString(); + } + + @Override + public int hashCode() { + return handle.hashCode(); + } + + @Override + public boolean isBoolean() { + return handle.isBoolean(); + } + + @Override + public boolean isNumber() { + return handle.isNumber(); + } + + @Override + public boolean isString() { + return handle.isString(); + } + + @Override + public final void setValue(final Object primitive) { + try { + handle.getClass().getDeclaredMethod("setValue", Object.class).invoke(handle, primitive); + } catch (final Exception e) { + throw new RuntimeException(e); + } + } + +} diff --git a/src/main/java/cn/citycraft/GsonAgent/normal/bind/TypeAdapterFactoryHandle.java b/src/main/java/cn/citycraft/GsonAgent/normal/bind/TypeAdapterFactoryHandle.java new file mode 100644 index 0000000..7a4260d --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/normal/bind/TypeAdapterFactoryHandle.java @@ -0,0 +1,33 @@ +package cn.citycraft.GsonAgent.normal.bind; + +import com.google.gson.Gson; +import com.google.gson.TypeAdapter; +import com.google.gson.TypeAdapterFactory; +import com.google.gson.reflect.TypeToken; + +import cn.citycraft.GsonAgent.normal.GsonHandle; + +@SuppressWarnings({ "unchecked", "rawtypes" }) +public class TypeAdapterFactoryHandle implements cn.citycraft.GsonAgent.api.TypeAdapterFactory, com.google.gson.TypeAdapterFactory { + + private final TypeAdapterFactory handle; + + protected TypeAdapterFactoryHandle(final TypeAdapterFactory handle) { + this.handle = handle; + } + + @Override + public TypeAdapterHandle create(final cn.citycraft.GsonAgent.api.Gson paramGson, final cn.citycraft.GsonAgent.api.reflect.TypeToken paramTypeToken) { + return new TypeAdapterHandle(this.create(((GsonHandle) paramGson).getHandle(), (TypeToken) paramTypeToken.getHandle())); + } + + @Override + public TypeAdapter create(final Gson paramGson, final TypeToken paramTypeToken) { + return this.getHandle().create(paramGson, paramTypeToken); + } + + public TypeAdapterFactory getHandle() { + return handle; + } + +} diff --git a/src/main/java/cn/citycraft/GsonAgent/normal/bind/TypeAdapterHandle.java b/src/main/java/cn/citycraft/GsonAgent/normal/bind/TypeAdapterHandle.java new file mode 100644 index 0000000..2e56055 --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/normal/bind/TypeAdapterHandle.java @@ -0,0 +1,78 @@ +package cn.citycraft.GsonAgent.normal.bind; + +import java.io.IOException; +import java.io.Reader; +import java.io.Writer; + +import com.google.gson.TypeAdapter; + +import cn.citycraft.GsonAgent.normal.JsonElementHandle; + +@SuppressWarnings({ "unchecked", "rawtypes" }) +public class TypeAdapterHandle implements cn.citycraft.GsonAgent.api.TypeAdapter { + + private final TypeAdapter handle; + + public TypeAdapterHandle(final TypeAdapter handle) { + this.handle = handle; + } + + @Override + public T fromJson(final Reader in) throws IOException { + return getHandle().fromJson(in); + } + + @Override + public T fromJson(final String json) throws IOException { + return getHandle().fromJson(json); + } + + @Override + public T fromJsonTree(final cn.citycraft.GsonAgent.api.JsonElement jsonTree) { + return getHandle().fromJsonTree(((JsonElementHandle) jsonTree).getHandle()); + } + + @Override + public TypeAdapter getHandle() { + return handle; + } + + @Override + public TypeAdapterHandle nullSafe() { + return new TypeAdapterHandle(this.handle); + } + + @Override + public T read(final cn.citycraft.GsonAgent.api.stream.JsonReader reader) throws IOException { + if (reader.peek().name().equals("NULL")) { + reader.nextNull(); + return null; + } + return this.read(reader); + } + + @Override + public String toJson(final T value) throws IOException { + return getHandle().toJson(value); + } + + @Override + public void toJson(final Writer out, final T value) throws IOException { + getHandle().toJson(out, value); + } + + @Override + public JsonElementHandle toJsonTree(final T value) { + return new JsonElementHandle(getHandle().toJsonTree(value)); + } + + @Override + public void write(final cn.citycraft.GsonAgent.api.stream.JsonWriter out, final T value) throws IOException { + if (value == null) { + out.nullValue(); + } else { + this.write(out, value); + } + } + +} diff --git a/src/main/java/cn/citycraft/GsonAgent/normal/reflect/TypeTokenHandle.java b/src/main/java/cn/citycraft/GsonAgent/normal/reflect/TypeTokenHandle.java new file mode 100644 index 0000000..c0d3747 --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/normal/reflect/TypeTokenHandle.java @@ -0,0 +1,74 @@ +package cn.citycraft.GsonAgent.normal.reflect; + +import java.lang.reflect.Type; + +import com.google.gson.reflect.TypeToken; + +import cn.citycraft.GsonAgent.api.reflect.TypeTokenAbstract; +import cn.citycraft.GsonAgent.api.utils.Utils; + +@SuppressWarnings({ "unchecked", "rawtypes" }) +public class TypeTokenHandle implements cn.citycraft.GsonAgent.api.reflect.TypeTokenAbstract { + + private TypeToken handle; + + public TypeTokenHandle() { + try { + handle = new TypeToken() { + }; + } catch (final Exception e) { + throw new RuntimeException(e); + } + } + + public TypeTokenHandle(final Type type) { + try { + handle = Utils.newInstance(TypeToken.class, Type.class, type); + } catch (final Exception e) { + throw new RuntimeException(e); + } + } + + protected TypeTokenHandle(final TypeToken handle) { + this.handle = handle; + } + + public static TypeTokenAbstract get(final Class type) { + return new TypeTokenHandle(TypeToken.get(type)); + } + + public static TypeTokenAbstract get(final Type type) { + return new TypeTokenHandle(TypeToken.get(type)); + } + + @Override + public TypeToken getHandle() { + return this.handle; + } + + @Override + public Class getRawType() { + return getHandle().getRawType(); + } + + @Override + public Type getType() { + return getHandle().getType(); + } + + @Override + public boolean isAssignableFrom(final Class cls) { + return getHandle().isAssignableFrom(cls); + } + + @Override + public boolean isAssignableFrom(final cn.citycraft.GsonAgent.api.reflect.TypeToken token) { + return getHandle().isAssignableFrom((TypeToken) token.getHandle()); + } + + @Override + public boolean isAssignableFrom(final Type from) { + return getHandle().isAssignableFrom(from); + } + +} diff --git a/src/main/java/cn/citycraft/GsonAgent/normal/stream/JsonReaderHandle.java b/src/main/java/cn/citycraft/GsonAgent/normal/stream/JsonReaderHandle.java new file mode 100644 index 0000000..b381b4f --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/normal/stream/JsonReaderHandle.java @@ -0,0 +1,116 @@ +package cn.citycraft.GsonAgent.normal.stream; + +import java.io.IOException; +import java.io.Reader; + +import com.google.gson.stream.JsonReader; + +import cn.citycraft.GsonAgent.api.stream.JsonToken; + +public class JsonReaderHandle implements cn.citycraft.GsonAgent.api.stream.JsonReader { + + private final JsonReader handle; + + public JsonReaderHandle(final Reader in) { + this(new JsonReader(in)); + } + + protected JsonReaderHandle(final JsonReader handle) { + this.handle = handle; + } + + @Override + public void beginArray() throws IOException { + getHandle().beginArray(); + } + + @Override + public void beginObject() throws IOException { + getHandle().beginObject(); + } + + @Override + public void close() throws IOException { + getHandle().close(); + } + + @Override + public void endArray() throws IOException { + getHandle().endArray(); + } + + @Override + public void endObject() throws IOException { + getHandle().endObject(); + } + + public JsonReader getHandle() { + return handle; + } + + @Override + public boolean hasNext() throws IOException { + return getHandle().hasNext(); + } + + @Override + public boolean isLenient() { + return getHandle().isLenient(); + } + + @Override + public boolean nextBoolean() throws IOException { + return getHandle().nextBoolean(); + } + + @Override + public double nextDouble() throws IOException { + return getHandle().nextDouble(); + } + + @Override + public int nextInt() throws IOException { + return getHandle().nextInt(); + } + + @Override + public long nextLong() throws IOException { + return getHandle().nextLong(); + } + + @Override + public String nextName() throws IOException { + return getHandle().nextName(); + } + + @Override + public void nextNull() throws IOException { + getHandle().nextNull(); + } + + @Override + public String nextString() throws IOException { + return getHandle().nextString(); + } + + @Override + public JsonToken peek() throws IOException { + return JsonToken.getByName(getHandle().peek().name()); + } + + @Override + public void setLenient(final boolean lenient) { + getHandle().setLenient(lenient); + } + + @Override + public void skipValue() throws IOException { + getHandle().skipValue(); + } + + @Override + public String toString() { + return getHandle().toString(); + } + +} diff --git a/src/main/java/cn/citycraft/GsonAgent/normal/stream/JsonWriterHandle.java b/src/main/java/cn/citycraft/GsonAgent/normal/stream/JsonWriterHandle.java new file mode 100644 index 0000000..ef9e0fa --- /dev/null +++ b/src/main/java/cn/citycraft/GsonAgent/normal/stream/JsonWriterHandle.java @@ -0,0 +1,208 @@ +package cn.citycraft.GsonAgent.normal.stream; + +import java.io.IOException; +import java.io.Writer; +import java.lang.reflect.Field; + +import com.google.gson.stream.JsonWriter; + +public class JsonWriterHandle implements cn.citycraft.GsonAgent.api.stream.JsonWriter { + + private static String[] REPLACEMENT_CHARS; + + private static String[] HTML_SAFE_REPLACEMENT_CHARS; + + static { + try { + Field field = JsonWriter.class.getDeclaredField("REPLACEMENT_CHARS"); + field.setAccessible(true); + REPLACEMENT_CHARS = (String[]) field.get(null); + field = JsonWriter.class.getDeclaredField("HTML_SAFE_REPLACEMENT_CHARS"); + field.setAccessible(true); + HTML_SAFE_REPLACEMENT_CHARS = (String[]) field.get(null); + } catch (final Exception e) { + e.printStackTrace(); + } + } + + private final JsonWriter handle; + + private Writer out; + + private boolean withoutQuotes = false; + + public JsonWriterHandle(final Writer out) { + this(new JsonWriter(out)); + this.out = out; + } + + protected JsonWriterHandle(final JsonWriter handle) { + this.handle = handle; + } + + @Override + public JsonWriterHandle beginArray() throws IOException { + getHandle().beginArray(); + return this; + } + + @Override + public JsonWriterHandle beginObject() throws IOException { + getHandle().beginObject(); + return this; + } + + @Override + public void close() throws IOException { + getHandle().close(); + } + + @Override + public JsonWriterHandle endArray() throws IOException { + getHandle().endArray(); + return this; + } + + @Override + public JsonWriterHandle endObject() throws IOException { + getHandle().endObject(); + return this; + } + + @Override + public void flush() throws IOException { + getHandle().flush(); + } + + public JsonWriter getHandle() { + return handle; + } + + @Override + public boolean getSerializeNulls() { + return getHandle().getSerializeNulls(); + } + + @Override + public boolean isHtmlSafe() { + return getHandle().isHtmlSafe(); + } + + @Override + public boolean isLenient() { + return getHandle().isLenient(); + } + + @Override + public JsonWriterHandle name(final String name) throws IOException { + getHandle().name(name); + withoutQuotes = false; + return this; + } + + @Override + public JsonWriterHandle nameWithoutQuotes(final String name) throws IOException { + getHandle().name(name); + withoutQuotes = true; + return this; + } + + @Override + public JsonWriterHandle nullValue() throws IOException { + getHandle().nullValue(); + return this; + } + + @Override + public void setHtmlSafe(final boolean htmlSafe) { + getHandle().setHtmlSafe(htmlSafe); + } + + @Override + public void setIndent(final String indent) { + getHandle().setIndent(indent); + } + + @Override + public void setLenient(final boolean lenient) { + getHandle().setLenient(lenient); + } + + @Override + public void setSerializeNulls(final boolean serializeNulls) { + getHandle().setSerializeNulls(serializeNulls); + } + + @Override + public void string(final String value) throws IOException { + final String[] replacements = getHandle().isHtmlSafe() ? HTML_SAFE_REPLACEMENT_CHARS : REPLACEMENT_CHARS; + if (!this.withoutQuotes) { + this.out.write("\""); + } + int last = 0; + final int length = value.length(); + for (int i = 0; i < length; i++) { + final char c = value.charAt(i); + String replacement; + if (c < '€') { + replacement = replacements[c]; + if (replacement == null) { + continue; + } + } else { + if (c == '
') { + replacement = "\\u2028"; + } else { + if (c != '
') { + continue; + } + replacement = "\\u2029"; + } + } + + if (last < i) { + this.out.write(value, last, i - last); + } + this.out.write(replacement); + last = i + 1; + } + if (last < length) { + this.out.write(value, last, length - last); + } + if (!this.withoutQuotes) { + this.out.write("\""); + } + withoutQuotes = false; + } + + @Override + public JsonWriterHandle value(final boolean value) throws IOException { + getHandle().value(value); + return this; + } + + @Override + public JsonWriterHandle value(final double value) throws IOException { + getHandle().value(value); + return this; + } + + @Override + public JsonWriterHandle value(final long value) throws IOException { + getHandle().value(value); + return this; + } + + @Override + public JsonWriterHandle value(final Number value) throws IOException { + getHandle().value(value); + return this; + } + + @Override + public JsonWriterHandle value(final String value) throws IOException { + getHandle().value(value); + return this; + } + +}