+ update
This commit is contained in:
@@ -20,7 +20,7 @@ import java.util.Map;
|
||||
*/
|
||||
public class TInjectLoader implements TabooLibLoader.Loader {
|
||||
|
||||
private static Map<Class<?>, TInjectTask> injectTypes = Maps.newHashMap();
|
||||
private static Map<Class<?>, TInjectTask> injectTypes = Maps.newLinkedHashMap();
|
||||
|
||||
static {
|
||||
// Instance Inject
|
||||
@@ -50,11 +50,7 @@ public class TInjectLoader implements TabooLibLoader.Loader {
|
||||
// TConfiguration Inject
|
||||
injectTypes.put(TConfiguration.class, (plugin, field, args, instance) -> {
|
||||
try {
|
||||
if (args.length == 0) {
|
||||
TLogger.getGlobalLogger().error("Invalid inject arguments: " + field.getName() + " (" + field.getType().getName() + ")");
|
||||
} else {
|
||||
field.set(instance, TConfiguration.createInResource(plugin, args[0]));
|
||||
}
|
||||
field.set(instance, TConfiguration.createInResource(plugin, args.length == 0 ? "config.yml" : args[0]));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
package me.skymc.taboolib.common.nms;
|
||||
|
||||
import me.skymc.taboolib.TabooLib;
|
||||
import me.skymc.taboolib.commands.builder.SimpleCommandBuilder;
|
||||
import me.skymc.taboolib.common.function.TFunction;
|
||||
import me.skymc.taboolib.common.versioncontrol.SimpleVersionControl;
|
||||
import org.bukkit.entity.Player;
|
||||
@@ -21,11 +19,6 @@ public abstract class NMSHandler {
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
SimpleCommandBuilder.create("title", TabooLib.instance())
|
||||
.execute((sender, args) -> {
|
||||
handler.sendTitle((Player) sender, "TabooLib", 10, 40, 10, "author Bkm016", 10, 40, 10);
|
||||
return true;
|
||||
}).build();
|
||||
}
|
||||
|
||||
abstract public void sendTitle(Player player, String title, int titleFadein, int titleStay, int titleFadeout, String subtitle, int subtitleFadein, int subtitleStay, int subtitleFadeout);
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
package me.skymc.taboolib.common.serialize;
|
||||
|
||||
/**
|
||||
* @Author 坏黑
|
||||
* @Since 2019-03-08 17:28
|
||||
*/
|
||||
public interface TSerializable {
|
||||
|
||||
void read(String fieldName, String value);
|
||||
|
||||
String write(String fieldName, Object value);
|
||||
|
||||
default void read(String value) {
|
||||
TSerializer.read(this, value);
|
||||
}
|
||||
|
||||
default String write() {
|
||||
return TSerializer.write(this);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,149 @@
|
||||
package me.skymc.taboolib.common.serialize;
|
||||
|
||||
import ch.njol.skript.classes.ConfigurationSerializer;
|
||||
import com.google.gson.*;
|
||||
import org.bukkit.configuration.serialization.ConfigurationSerializable;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* @Author 坏黑
|
||||
* @Since 2019-03-08 17:31
|
||||
*/
|
||||
public class TSerializer {
|
||||
|
||||
public static <T extends ConfigurationSerializable> T read(String value, Class<T> type) {
|
||||
return ConfigurationSerializer.deserializeCS(value, type);
|
||||
}
|
||||
|
||||
public static TSerializable read(TSerializable serializable, String serializedString) {
|
||||
try {
|
||||
JsonObject jsonObject = (JsonObject) new JsonParser().parse(serializedString);
|
||||
if (jsonObject.has("serializeObject")) {
|
||||
JsonObject serializeObject = jsonObject.getAsJsonObject("serializeObject");
|
||||
for (Map.Entry<String, JsonElement> jsonElementEntry : serializeObject.entrySet()) {
|
||||
try {
|
||||
Field declaredField = serializable.getClass().getDeclaredField(jsonElementEntry.getKey());
|
||||
declaredField.setAccessible(true);
|
||||
Optional<TSerializerElementGeneral> serializer = Arrays.stream(TSerializerElementGeneral.values()).filter(serializerElements -> serializerElements.getSerializer().matches(declaredField.getType())).findFirst();
|
||||
if (serializer.isPresent()) {
|
||||
declaredField.set(serializable, serializer.get().getSerializer().read(jsonElementEntry.getValue().getAsString()));
|
||||
} else {
|
||||
serializable.read(jsonElementEntry.getKey(), jsonElementEntry.getValue().getAsString());
|
||||
}
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
}
|
||||
return serializable;
|
||||
}
|
||||
|
||||
public static String write(ConfigurationSerializable serializable) {
|
||||
return ConfigurationSerializer.serializeCS(serializable);
|
||||
}
|
||||
|
||||
public static String write(TSerializable serializable) {
|
||||
JsonObject jsonObject = new JsonObject();
|
||||
JsonObject serializeObject = new JsonObject();
|
||||
for (Field declaredField : serializable.getClass().getDeclaredFields()) {
|
||||
try {
|
||||
if (!Modifier.isStatic(declaredField.getModifiers())) {
|
||||
declaredField.setAccessible(true);
|
||||
Optional<TSerializerElementGeneral> serializer = Arrays.stream(TSerializerElementGeneral.values()).filter(serializerElements -> serializerElements.getSerializer().matches(declaredField.getType())).findFirst();
|
||||
Object o = declaredField.get(serializable);
|
||||
if (o == null) {
|
||||
continue;
|
||||
}
|
||||
if (serializer.isPresent()) {
|
||||
serializeObject.addProperty(declaredField.getName(), serializer.get().getSerializer().write(o));
|
||||
} else {
|
||||
Optional.ofNullable(serializable.write(declaredField.getName(), o)).ifPresent(value -> serializeObject.addProperty(declaredField.getName(), value));
|
||||
}
|
||||
}
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
}
|
||||
}
|
||||
jsonObject.add("serializeObject", serializeObject);
|
||||
return jsonObject.toString();
|
||||
}
|
||||
|
||||
public static void readMap(Map map, String serializedString, TSerializerElementGeneral elementKey, TSerializerElementGeneral elementValue) {
|
||||
readMap(map, serializedString, elementKey.getSerializer(), elementValue.getSerializer());
|
||||
}
|
||||
|
||||
public static void readMap(Map map, String serializedString, TSerializerElement elementKey, TSerializerElement elementValue) {
|
||||
try {
|
||||
JsonObject jsonObject = (JsonObject) new JsonParser().parse(serializedString);
|
||||
for (Map.Entry<String, JsonElement> jsonElementEntry : jsonObject.entrySet()) {
|
||||
try {
|
||||
map.put(elementKey.read(jsonElementEntry.getKey()), elementValue.read(jsonElementEntry.getValue().getAsString()));
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
}
|
||||
}
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static String writeMap(Map<?, ?> map, TSerializerElementGeneral elementKey, TSerializerElementGeneral elementValue) {
|
||||
return writeMap(map, elementKey.getSerializer(), elementValue.getSerializer());
|
||||
}
|
||||
|
||||
public static String writeMap(Map<?, ?> map, TSerializerElement elementKey, TSerializerElement elementValue) {
|
||||
JsonObject jsonObject = new JsonObject();
|
||||
for (Map.Entry<?, ?> entry : map.entrySet()) {
|
||||
try {
|
||||
jsonObject.addProperty(elementKey.write(entry.getKey()), elementValue.write(entry.getValue()));
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
}
|
||||
}
|
||||
return jsonObject.toString();
|
||||
}
|
||||
|
||||
public static void readCollection(Collection collection, String serializedString, TSerializerElementGeneral elementValue) {
|
||||
readCollection(collection, serializedString, elementValue.getSerializer());
|
||||
}
|
||||
|
||||
public static void readCollection(Collection collection, String serializedString, TSerializerElement elementValue) {
|
||||
try {
|
||||
JsonArray jsonArray = (JsonArray) new JsonParser().parse(serializedString);
|
||||
for (JsonElement jsonElement : jsonArray) {
|
||||
try {
|
||||
collection.add(elementValue.read(jsonElement.getAsString()));
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
}
|
||||
}
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static String writeCollection(Collection collection, TSerializerElementGeneral elementValue) {
|
||||
return writeCollection(collection, elementValue.getSerializer());
|
||||
}
|
||||
|
||||
public static String writeCollection(Collection collection, TSerializerElement elementValue) {
|
||||
JsonArray jsonArray = new JsonArray();
|
||||
for (Object object : collection) {
|
||||
try {
|
||||
jsonArray.add(new JsonPrimitive(elementValue.write(object)));
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
}
|
||||
}
|
||||
return jsonArray.toString();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package me.skymc.taboolib.common.serialize;
|
||||
|
||||
/**
|
||||
* @Author 坏黑
|
||||
* @Since 2019-03-08 17:28
|
||||
*/
|
||||
public interface TSerializerElement<T> {
|
||||
|
||||
T read(String value);
|
||||
|
||||
String write(Object value);
|
||||
|
||||
boolean matches(Class objectClass);
|
||||
|
||||
}
|
||||
@@ -0,0 +1,217 @@
|
||||
package me.skymc.taboolib.common.serialize;
|
||||
|
||||
import ch.njol.skript.classes.ConfigurationSerializer;
|
||||
import me.skymc.taboolib.other.NumberUtils;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* @Author 坏黑
|
||||
* @Since 2019-03-10 18:49
|
||||
*/
|
||||
public enum TSerializerElementGeneral {
|
||||
|
||||
STRING(new TSerializerElement() {
|
||||
|
||||
@Override
|
||||
public String read(String value) {
|
||||
return String.valueOf(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String write(Object value) {
|
||||
return Objects.toString(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean matches(Class objectClass) {
|
||||
return String.class.equals(objectClass);
|
||||
}
|
||||
}),
|
||||
|
||||
INT(new TSerializerElement() {
|
||||
|
||||
@Override
|
||||
public Integer read(String value) {
|
||||
try {
|
||||
return Integer.parseInt(value);
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String write(Object value) {
|
||||
return Objects.toString(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean matches(Class objectClass) {
|
||||
return Integer.class.equals(objectClass) || Integer.TYPE.equals(objectClass);
|
||||
}
|
||||
}),
|
||||
|
||||
LONG(new TSerializerElement() {
|
||||
|
||||
@Override
|
||||
public Long read(String value) {
|
||||
try {
|
||||
return Long.parseLong(value);
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
}
|
||||
return 0L;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String write(Object value) {
|
||||
return Objects.toString(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean matches(Class objectClass) {
|
||||
return Long.class.equals(objectClass) || Long.TYPE.equals(objectClass);
|
||||
}
|
||||
}),
|
||||
|
||||
SHORT(new TSerializerElement() {
|
||||
|
||||
@Override
|
||||
public Short read(String value) {
|
||||
try {
|
||||
return Short.parseShort(value);
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
}
|
||||
return (short) 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String write(Object value) {
|
||||
return Objects.toString(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean matches(Class objectClass) {
|
||||
return Short.class.equals(objectClass) || Short.TYPE.equals(objectClass);
|
||||
}
|
||||
}),
|
||||
|
||||
DOUBLE(new TSerializerElement() {
|
||||
|
||||
@Override
|
||||
public Double read(String value) {
|
||||
try {
|
||||
return Double.parseDouble(value);
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
}
|
||||
return 0D;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String write(Object value) {
|
||||
return Objects.toString(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean matches(Class objectClass) {
|
||||
return Double.class.equals(objectClass) || Boolean.TYPE.equals(objectClass);
|
||||
}
|
||||
}),
|
||||
|
||||
FLOAT(new TSerializerElement() {
|
||||
|
||||
@Override
|
||||
public Float read(String value) {
|
||||
try {
|
||||
return Float.parseFloat(value);
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
}
|
||||
return 0f;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String write(Object value) {
|
||||
return Objects.toString(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean matches(Class objectClass) {
|
||||
return Float.class.equals(objectClass) || Float.TYPE.equals(objectClass);
|
||||
}
|
||||
}),
|
||||
|
||||
BOOLEAN(new TSerializerElement() {
|
||||
|
||||
@Override
|
||||
public Boolean read(String value) {
|
||||
try {
|
||||
return NumberUtils.getBooleanAbbreviation(value);
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String write(Object value) {
|
||||
return Objects.toString(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean matches(Class objectClass) {
|
||||
return Boolean.class.equals(objectClass) || Boolean.TYPE.equals(objectClass);
|
||||
}
|
||||
}),
|
||||
|
||||
ITEM_STACK(new TSerializerElement() {
|
||||
|
||||
@Override
|
||||
public ItemStack read(String value) {
|
||||
return ConfigurationSerializer.deserializeCS(value, ItemStack.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String write(Object value) {
|
||||
return ConfigurationSerializer.serializeCS((ItemStack) value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean matches(Class objectClass) {
|
||||
return ItemStack.class.equals(objectClass);
|
||||
}
|
||||
}),
|
||||
|
||||
LOCATION(new TSerializerElement() {
|
||||
|
||||
@Override
|
||||
public Location read(String value) {
|
||||
return ConfigurationSerializer.deserializeCS(value, Location.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String write(Object value) {
|
||||
return ConfigurationSerializer.serializeCS((Location) value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean matches(Class objectClass) {
|
||||
return Location.class.equals(objectClass);
|
||||
}
|
||||
});
|
||||
|
||||
private TSerializerElement serializer;
|
||||
|
||||
TSerializerElementGeneral(TSerializerElement serializer) {
|
||||
this.serializer = serializer;
|
||||
}
|
||||
|
||||
public TSerializerElement getSerializer() {
|
||||
return serializer;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
package me.skymc.taboolib.common.serialize;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author 坏黑
|
||||
* @Since 2019-04-01 17:49
|
||||
*/
|
||||
public class TSerializerExample {
|
||||
|
||||
public static void main(String[] args) {
|
||||
// 创建对象
|
||||
SimpleData date = new SimpleData();
|
||||
// 修改参数
|
||||
date.number = 100;
|
||||
// 序列化
|
||||
String value = date.write();
|
||||
// 打印
|
||||
System.out.println(value);
|
||||
// 创建新的对象
|
||||
SimpleData dataCopy = new SimpleData();
|
||||
// 反序列化
|
||||
dataCopy.read(value);
|
||||
// 打印
|
||||
System.out.println(dataCopy);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建序列化类
|
||||
* 实现 TSerializable 接口
|
||||
*/
|
||||
public static class SimpleData implements TSerializable {
|
||||
|
||||
/**
|
||||
* 基本类型不需要手动进行序列化
|
||||
* 包含: String、int、short、long、double、float、boolean、ItemStack、Location
|
||||
*/
|
||||
private String text;
|
||||
private int number;
|
||||
/**
|
||||
* 特殊类型需要进行手动序列化
|
||||
* 本工具提供了基本容器的序列化方法
|
||||
*/
|
||||
private List<Double> list = Lists.newArrayList();
|
||||
|
||||
/**
|
||||
* 基本类型不会执行以下两个方法
|
||||
* 由 TSerializer 自动进行序列化和反序列化步骤
|
||||
*/
|
||||
@Override
|
||||
public void read(String fieldName, String value) {
|
||||
switch (fieldName) {
|
||||
case "list": {
|
||||
// List 类型可以直接通过 TSerializer 提供的预设方法进行反序列化
|
||||
TSerializer.readCollection(list, value, TSerializerElementGeneral.DOUBLE);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String write(String fieldName, Object value) {
|
||||
switch (fieldName) {
|
||||
case "list": {
|
||||
// 序列化同理
|
||||
return TSerializer.writeCollection((Collection) value, TSerializerElementGeneral.DOUBLE);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "SimpleData{" +
|
||||
"text='" + text + '\'' +
|
||||
", number=" + number +
|
||||
", list=" + list +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user