From 1ee70b2794dead6777e6f3b1ae3280227a1c459b Mon Sep 17 00:00:00 2001 From: CarmJos Date: Mon, 3 Jan 2022 12:39:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=86=E7=94=A8=E6=88=B7=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E3=80=81=E4=BF=9D=E5=AD=98=E7=9A=84=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E5=88=86=E6=9E=90=E5=92=8Cdebug=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E6=94=BE=E5=9C=A8UserManager?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/ultradepository/data/UserData.java | 10 +-- .../ultradepository/manager/UserManager.java | 29 +++++++-- .../ultradepository/storage/DataStorage.java | 3 +- .../ultradepository/storage/FileStorage.java | 31 ++-------- .../ultradepository/storage/MySQLStorage.java | 62 +++++++------------ src/test/java/GsonMapTest.java | 34 +++++++++- 6 files changed, 87 insertions(+), 82 deletions(-) diff --git a/src/main/java/cc/carm/plugin/ultradepository/data/UserData.java b/src/main/java/cc/carm/plugin/ultradepository/data/UserData.java index 2a08b65..3f48331 100644 --- a/src/main/java/cc/carm/plugin/ultradepository/data/UserData.java +++ b/src/main/java/cc/carm/plugin/ultradepository/data/UserData.java @@ -3,7 +3,6 @@ package cc.carm.plugin.ultradepository.data; import cc.carm.plugin.ultradepository.Main; import cc.carm.plugin.ultradepository.configuration.depository.Depository; import cc.carm.plugin.ultradepository.configuration.depository.DepositoryItem; -import cc.carm.plugin.ultradepository.storage.DataStorage; import cc.carm.plugin.ultradepository.util.DateIntUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -18,15 +17,13 @@ public class UserData { public final UUID userUUID; - DataStorage storage; Map depositories; int date; - public UserData(UUID userUUID, DataStorage storage, + public UserData(UUID userUUID, Map depositories, int date) { this.userUUID = userUUID; - this.storage = storage; this.depositories = depositories; this.date = date; } @@ -145,11 +142,6 @@ public class UserData { .forEach(DepositoryItemData::clearSold); } - - public void save() throws Exception { - this.storage.saveUserData(this); - } - public Map>> serializeToMap() { Map>> values = new LinkedHashMap<>(); diff --git a/src/main/java/cc/carm/plugin/ultradepository/manager/UserManager.java b/src/main/java/cc/carm/plugin/ultradepository/manager/UserManager.java index 71b063b..d81103c 100644 --- a/src/main/java/cc/carm/plugin/ultradepository/manager/UserManager.java +++ b/src/main/java/cc/carm/plugin/ultradepository/manager/UserManager.java @@ -2,6 +2,7 @@ package cc.carm.plugin.ultradepository.manager; import cc.carm.plugin.ultradepository.Main; import cc.carm.plugin.ultradepository.data.UserData; +import cc.carm.plugin.ultradepository.storage.DataStorage; import cc.carm.plugin.ultradepository.util.DateIntUtil; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -29,11 +30,24 @@ public class UserManager { public @NotNull UserData loadData(@NotNull UUID userUUID) { try { - return Main.getStorage().loadData(userUUID); + long start = System.currentTimeMillis(); + DataStorage storage = Main.getStorage(); + Main.debug("正通过 " + storage.getClass().getSimpleName() + " 加载 " + userUUID + " 的用户数据..."); + UserData data = Main.getStorage().loadData(userUUID); + + if (data == null) { + Main.debug("当前还不存在玩家 " + userUUID + " 的数据,视作新档。"); + return new UserData(userUUID, new HashMap<>(), DateIntUtil.getCurrentDate()); + } + + Main.debug("通过 " + storage.getClass().getSimpleName() + "加载 " + userUUID + " 的用户数据完成," + + "耗时 " + (System.currentTimeMillis() - start) + "ms。"); + + return data; } catch (Exception e) { Main.error("无法正常加载玩家数据,玩家操作将不会被保存,请检查数据配置!"); Main.error("Could not load user's data, please check the data configuration!"); - return new UserData(userUUID, Main.getStorage(), new HashMap<>(), DateIntUtil.getCurrentDate()); + return new UserData(userUUID, new HashMap<>(), DateIntUtil.getCurrentDate()); } } @@ -46,8 +60,15 @@ public class UserManager { public void saveData(UserData data) { try { - data.save(); - Main.debug(" 玩家 " + data.getUserUUID() + " 数据已保存。"); + long start = System.currentTimeMillis(); + DataStorage storage = Main.getStorage(); + + Main.debug("正通过 " + storage.getClass().getSimpleName() + " 保存 " + data.getUserUUID() + " 的用户数据..."); + storage.saveUserData(data); + + Main.debug("通过 " + storage.getClass().getSimpleName() + " 保存 " + data.getUserUUID() + " 的用户数据完成," + + "耗时 " + (System.currentTimeMillis() - start) + "ms。"); + } catch (Exception e) { Main.error("无法正常保存玩家数据,请检查数据配置!"); Main.error("Could not save user's data, please check the data configuration!"); diff --git a/src/main/java/cc/carm/plugin/ultradepository/storage/DataStorage.java b/src/main/java/cc/carm/plugin/ultradepository/storage/DataStorage.java index 9613010..b72bbbe 100644 --- a/src/main/java/cc/carm/plugin/ultradepository/storage/DataStorage.java +++ b/src/main/java/cc/carm/plugin/ultradepository/storage/DataStorage.java @@ -2,6 +2,7 @@ package cc.carm.plugin.ultradepository.storage; import cc.carm.plugin.ultradepository.data.UserData; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.UUID; @@ -12,7 +13,7 @@ public interface DataStorage { void shutdown(); - @NotNull + @Nullable UserData loadData(@NotNull UUID uuid) throws Exception; void saveUserData(@NotNull UserData data) throws Exception; diff --git a/src/main/java/cc/carm/plugin/ultradepository/storage/FileStorage.java b/src/main/java/cc/carm/plugin/ultradepository/storage/FileStorage.java index 3a03462..efa99cc 100644 --- a/src/main/java/cc/carm/plugin/ultradepository/storage/FileStorage.java +++ b/src/main/java/cc/carm/plugin/ultradepository/storage/FileStorage.java @@ -11,6 +11,7 @@ import cc.carm.plugin.ultradepository.util.DateIntUtil; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.YamlConfiguration; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.io.File; import java.io.IOException; @@ -45,18 +46,16 @@ public class FileStorage implements DataStorage { } @Override - public @NotNull UserData loadData(@NotNull UUID uuid) { - long start = System.currentTimeMillis(); - Main.debug("正通过 FileStorage 加载 " + uuid + " 的用户数据..."); + public @Nullable UserData loadData(@NotNull UUID uuid) { File userDataFile = new File(getDataContainer(), uuid + ".yml"); if (!userDataFile.exists()) { Main.debug("当前文件夾内不存在玩家 " + uuid + " 的数据,视作新档。"); - return new UserData(uuid, this, new HashMap<>(), DateIntUtil.getCurrentDate()); + return null; } YamlConfiguration userDataConfig = YamlConfiguration.loadConfiguration(userDataFile); int dateInt = userDataConfig.getInt("date", DateIntUtil.getCurrentDate()); - UserData userData = new UserData(uuid, this, new HashMap<>(), dateInt); + UserData userData = new UserData(uuid, new HashMap<>(), dateInt); ConfigurationSection depositoriesSection = userDataConfig.getConfigurationSection("depositories"); if (depositoriesSection != null) { @@ -88,33 +87,15 @@ public class FileStorage implements DataStorage { if (!depositoryData.getContents().isEmpty()) userData.setDepository(depositoryData); } } - Main.debug("通过 FileStorage 加载 " + uuid + " 的用户数据完成," - + "耗时 " + (System.currentTimeMillis() - start) + "ms。"); - return userData; } @Override public void saveUserData(@NotNull UserData data) throws IOException { - long start = System.currentTimeMillis(); - Main.debug("正通过 FileStorage 保存 " + data.getUserUUID() + " 的用户数据..."); - YamlConfiguration userDataConfig = new YamlConfiguration(); userDataConfig.set("date", data.getDateInt()); - - try { - userDataConfig.createSection("depositories", data.serializeToMap()); - userDataConfig.save(new File(getDataContainer(), data.getUserUUID() + ".yml")); - } catch (IOException ioException) { - Main.error("在保存玩家 #" + data.getUserUUID() + " 的数据时出现异常。"); - Main.error("Error occurred when saving #" + data.getUserUUID() + " data."); - throw ioException; - } - - Main.debug( - "通过 FileStorage 保存 " + data.getUserUUID() + " 的用户数据完成," + - "耗时 " + (System.currentTimeMillis() - start) + "ms。" - ); + userDataConfig.createSection("depositories", data.serializeToMap()); + userDataConfig.save(new File(getDataContainer(), data.getUserUUID() + ".yml")); } } diff --git a/src/main/java/cc/carm/plugin/ultradepository/storage/MySQLStorage.java b/src/main/java/cc/carm/plugin/ultradepository/storage/MySQLStorage.java index 1c4d0a7..6d74cd6 100644 --- a/src/main/java/cc/carm/plugin/ultradepository/storage/MySQLStorage.java +++ b/src/main/java/cc/carm/plugin/ultradepository/storage/MySQLStorage.java @@ -18,6 +18,7 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.sql.Date; import java.sql.ResultSet; @@ -117,35 +118,29 @@ public class MySQLStorage implements DataStorage { } @Override - public @NotNull UserData loadData(@NotNull UUID uuid) throws Exception { - long start = System.currentTimeMillis(); - Main.debug("正通过 MySQLStorage 加载 " + uuid + " 的用户数据..."); + public @Nullable UserData loadData(@NotNull UUID uuid) throws Exception { try (SQLQuery query = createAction(uuid).execute()) { ResultSet resultSet = query.getResultSet(); - if (resultSet != null && resultSet.next()) { - String dataJSON = resultSet.getString("data"); - Date date = resultSet.getDate("day"); - UserData data = new UserData(uuid, this, new HashMap<>(), DateIntUtil.getDateInt(date)); - JsonElement dataElement = PARSER.parse(dataJSON); - if (dataElement.isJsonObject()) { - for (Map.Entry entry : dataElement.getAsJsonObject().entrySet()) { - Depository depository = Main.getDepositoryManager().getDepository(entry.getKey()); - if (depository == null) continue; + if (resultSet == null || !resultSet.next()) return null; - DepositoryData contentsData = parseContentsData(depository, data, entry.getValue()); - if (contentsData != null) data.setDepository(contentsData); + String dataJSON = resultSet.getString("data"); + Date date = resultSet.getDate("day"); + UserData data = new UserData(uuid, new HashMap<>(), DateIntUtil.getDateInt(date)); + + JsonElement dataElement = PARSER.parse(dataJSON); + if (dataElement.isJsonObject()) { + for (Map.Entry entry : dataElement.getAsJsonObject().entrySet()) { + Depository depository = Main.getDepositoryManager().getDepository(entry.getKey()); + if (depository == null) continue; + + DepositoryData contentsData = parseContentsData(depository, data, entry.getValue()); + if (contentsData != null) data.setDepository(contentsData); - } } - - Main.debug("通过 MySQLStorage 加载 " + uuid + " 的用户数据完成," - + "耗时 " + (System.currentTimeMillis() - start) + "ms。"); - - return data; } - Main.debug("当前库内不存在玩家 " + uuid + " 的数据,视作新档。"); - return new UserData(uuid, this, new HashMap<>(), DateIntUtil.getCurrentDate()); + return data; + } catch (Exception exception) { throw new Exception(exception); } @@ -153,25 +148,10 @@ public class MySQLStorage implements DataStorage { @Override public void saveUserData(@NotNull UserData data) throws Exception { - long start = System.currentTimeMillis(); - Main.debug("正通过 MySQLStorage 保存 " + data.getUserUUID() + " 的用户数据..."); - - try { - - getSQLManager().createReplace(SQLTables.USER_DATA.getName()) - .setColumnNames("uuid", "data", "day") - .setParams(data.getUserUUID(), GSON.toJson(data.serializeToMap()), data.getDate()) - .execute(); - - } catch (SQLException exception) { - Main.error("在保存玩家 #" + data.getUserUUID() + " 的数据时出现异常。"); - Main.error("Error occurred when saving #" + data.getUserUUID() + " data."); - throw new Exception(exception); - } - - Main.debug("通过 MySQLStorage 保存 " + data.getUserUUID() + " 的用户数据完成," + - "耗时 " + (System.currentTimeMillis() - start) + "ms。"); - + getSQLManager().createReplace(SQLTables.USER_DATA.getName()) + .setColumnNames("uuid", "data", "day") + .setParams(data.getUserUUID(), GSON.toJson(data.serializeToMap()), data.getDate()) + .execute(); } private SQLManager getSQLManager() { diff --git a/src/test/java/GsonMapTest.java b/src/test/java/GsonMapTest.java index 4eda087..99bc909 100644 --- a/src/test/java/GsonMapTest.java +++ b/src/test/java/GsonMapTest.java @@ -1,5 +1,4 @@ import com.google.gson.Gson; -import org.junit.Test; import java.util.*; @@ -7,10 +6,17 @@ public class GsonMapTest { private static final Gson GSON = new Gson(); - @Test + @org.junit.Test public void test() { System.out.println(this.getClass().getSimpleName()); + + List tests = new ArrayList<>(); + tests.add(new Test1()); + tests.add(new Test2()); + + tests.stream().map(test -> test.getClass().getSimpleName()).forEach(System.out::println); + Map>> values = new LinkedHashMap<>(); @@ -38,5 +44,29 @@ public class GsonMapTest { System.out.println(jsonValues); } + public interface Test { + + void load(); + + } + + public static class Test1 implements Test { + + + @Override + public void load() { + System.out.println("test1"); + } + } + + public static class Test2 implements Test { + + + @Override + public void load() { + System.out.println("test2"); + } + } + }