diff --git a/pom.xml b/pom.xml index 6d610e3..7360ddf 100644 --- a/pom.xml +++ b/pom.xml @@ -142,6 +142,12 @@ test + + com.google.code.gson + gson + 2.9.1 + + diff --git a/src/TestFiles/ExistingEmptyFileInit.json b/src/TestFiles/ExistingEmptyFileInit.json new file mode 100644 index 0000000..e69de29 diff --git a/src/TestFiles/ExistingPopulatedFileInit.json b/src/TestFiles/ExistingPopulatedFileInit.json new file mode 100644 index 0000000..ae5bd6a --- /dev/null +++ b/src/TestFiles/ExistingPopulatedFileInit.json @@ -0,0 +1 @@ +{"players":{"BlankUUID":{"playerWorlds":[]}}} \ No newline at end of file diff --git a/src/TestFiles/workingDir/dataBaseInitTestCreateValidFile.json b/src/TestFiles/workingDir/dataBaseInitTestCreateValidFile.json new file mode 100644 index 0000000..ae5bd6a --- /dev/null +++ b/src/TestFiles/workingDir/dataBaseInitTestCreateValidFile.json @@ -0,0 +1 @@ +{"players":{"BlankUUID":{"playerWorlds":[]}}} \ No newline at end of file diff --git a/src/TestFiles/workingDir/dataBaseInitTestFromNoFile.json b/src/TestFiles/workingDir/dataBaseInitTestFromNoFile.json new file mode 100644 index 0000000..ae5bd6a --- /dev/null +++ b/src/TestFiles/workingDir/dataBaseInitTestFromNoFile.json @@ -0,0 +1 @@ +{"players":{"BlankUUID":{"playerWorlds":[]}}} \ No newline at end of file diff --git a/src/main/java/de/butzlabben/world/data/WorldDatabase.java b/src/main/java/de/butzlabben/world/data/WorldDatabase.java index b704ebd..19052c0 100644 --- a/src/main/java/de/butzlabben/world/data/WorldDatabase.java +++ b/src/main/java/de/butzlabben/world/data/WorldDatabase.java @@ -1,4 +1,81 @@ package de.butzlabben.world.data; +import com.google.gson.Gson; +import de.butzlabben.world.data.objects.PlayerData; +import de.butzlabben.world.data.objects.WorldSystemData; + +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Paths; + public class WorldDatabase { + + //This is Set to Static to allow for only one to prevent Data to be not saved; + private static WorldSystemData wsDataBase; + private String dbFilePath; + + public WorldDatabase(String databaseFilePath) { + this.dbFilePath = databaseFilePath; + this.wsDataBase = getWorldSystemDatabase(); + } + + public int getPlayerCount() { + return wsDataBase.getPlayers(); + } + + public void addPlayer(String playerUUID) { + wsDataBase.addplayer(playerUUID); + saveWSData(); + } + + + + + private WorldSystemData getWorldSystemDatabase() { + File wsDataFile = new File(this.dbFilePath); + Gson gson = new Gson(); + WorldSystemData newDatabase = null; + + + if (!wsDataFile.exists()) { + newDatabase = new WorldSystemData(); + saveWSData(); + return newDatabase; + } + + try { + Reader reader = Files.newBufferedReader(Paths.get(this.dbFilePath)); + newDatabase = gson.fromJson(reader, WorldSystemData.class); + reader.close(); + } catch (IOException e) { + //Log Warning + } + + if (newDatabase == null) { + newDatabase = new WorldSystemData(); + } + + return newDatabase; + } + + private void saveWSData() { + Gson gson = new Gson(); + + File dataFile = new File(this.dbFilePath); + if (!dataFile.exists()) { + try { + dataFile.createNewFile(); + } catch (IOException e) { + //Should Never Run + throw new RuntimeException(e); + } + } + try { + FileWriter writer = new FileWriter(dataFile); + gson.toJson(wsDataBase, writer); + writer.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } } diff --git a/src/main/java/de/butzlabben/world/data/objects/PlayerData.java b/src/main/java/de/butzlabben/world/data/objects/PlayerData.java new file mode 100644 index 0000000..c9bc5bb --- /dev/null +++ b/src/main/java/de/butzlabben/world/data/objects/PlayerData.java @@ -0,0 +1,27 @@ +package de.butzlabben.world.data.objects; + +import java.util.ArrayList; +import java.util.List; + +public class PlayerData { + + //TODO Write Tests + public List playerWorlds; + + + public PlayerData() { + playerWorlds = new ArrayList(); + } + + public void addWorld(PlayerWorld world) { + playerWorlds.add(world); + } + + public int getWorldCount() { + return playerWorlds.size(); + } + + public PlayerWorld getWorldAt(int index) { + return playerWorlds.get(index); + } +} \ No newline at end of file diff --git a/src/main/java/de/butzlabben/world/data/objects/PlayerWorld.java b/src/main/java/de/butzlabben/world/data/objects/PlayerWorld.java new file mode 100644 index 0000000..0c3e293 --- /dev/null +++ b/src/main/java/de/butzlabben/world/data/objects/PlayerWorld.java @@ -0,0 +1,11 @@ +package de.butzlabben.world.data.objects; + +public class PlayerWorld { + public int worldNumber; + public long lastLoaded; + + public PlayerWorld(String OWNER, String OWNERname, int worldNumber) { + this.worldNumber = worldNumber; + this.lastLoaded = 0; + } +} diff --git a/src/main/java/de/butzlabben/world/data/objects/WorldSystemData.java b/src/main/java/de/butzlabben/world/data/objects/WorldSystemData.java new file mode 100644 index 0000000..a471792 --- /dev/null +++ b/src/main/java/de/butzlabben/world/data/objects/WorldSystemData.java @@ -0,0 +1,41 @@ +package de.butzlabben.world.data.objects; + + +import de.butzlabben.WorldSystem; +import de.butzlabben.world.data.WorldDatabase; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class WorldSystemData { + + public Map players; + public WorldSystemData() { + players = new HashMap(); + } + + public Boolean addplayer(String uuid) { + if (players.get(uuid) == null) { + players.put(uuid, new PlayerData()); + return true; + } + return false; + } + + public void addWorldToPlayer(String uuid, PlayerWorld world) { + if (players.get(uuid) != null) { + players.get(uuid).addWorld(world); + } + } + + public int getPlayers() { + return players.size(); + } + + + +} + diff --git a/src/test/java/de/butzlabben/world/data/TestWorldDatabase.java b/src/test/java/de/butzlabben/world/data/TestWorldDatabase.java index 9114387..90b2e3a 100644 --- a/src/test/java/de/butzlabben/world/data/TestWorldDatabase.java +++ b/src/test/java/de/butzlabben/world/data/TestWorldDatabase.java @@ -1,4 +1,80 @@ package de.butzlabben.world.data; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.io.FileNotFoundException; +import java.util.Scanner; + +import static org.junit.jupiter.api.Assertions.*; + public class TestWorldDatabase { + + /** + * Before the Test this function cleans out the Working Directory + * This allows us to view the results of our prevous tests as needed + * but then allows us to run the tests Fresh. + */ + @BeforeAll + static void CleanLastTest() { + File workingDir = new File("src\\TestFiles\\workingDir\\"); + for (File file : workingDir.listFiles()) { + file.delete(); + } + } + + /** + * This Tests the Basis Initaliaztion of the DataBase from nothing + */ + @Test + public void testDatabaseInitalizationFromNoFile() { + final String path = "src\\TestFiles\\workingDir\\dataBaseInitTestFromNoFile.json"; + + WorldDatabase wb = new WorldDatabase(path); + assertEquals(0, wb.getPlayerCount()); + } + + /** + * This Test Creates the new Object and Verifies that is can save data Properly; + * @throws FileNotFoundException + */ + @Test + public void testDatabaseInitalizationCreateValidFile() throws FileNotFoundException { + final String path = "src\\TestFiles\\workingDir\\dataBaseInitTestCreateValidFile.json"; + + WorldDatabase wb = new WorldDatabase(path); + wb.addPlayer("BlankUUID"); + + + String input = new Scanner(new File(path)).nextLine(); + assertEquals("{\"players\":{\"BlankUUID\":{\"playerWorlds\":[]}}}", input); + } + + + /** + * This Test to see if it can create to database when loading from a blank File + */ + @Test + public void testDatabaseInitalizationWithExistingEmptyFile() { + final String path = "src\\TestFiles\\ExistingEmptyFileInit.json"; + + WorldDatabase wb = new WorldDatabase(path); + assertEquals(0, wb.getPlayerCount()); + } + + /** + * This Test to see if it can create to database when loading from a populated File + */ + @Test + public void testDatabaseInitalizationWithPopulatedEmptyFile() throws FileNotFoundException { + final String path = "src\\TestFiles\\ExistingPopulatedFileInit.json"; + + WorldDatabase wb = new WorldDatabase(path); + + + String input = new Scanner(new File(path)).nextLine(); + assertEquals("{\"players\":{\"BlankUUID\":{\"playerWorlds\":[]}}}", input); + assertEquals(1, wb.getPlayerCount()); + } } diff --git a/target/classes/de/butzlabben/world/WorldSystem.class b/target/classes/de/butzlabben/WorldSystem.class similarity index 93% rename from target/classes/de/butzlabben/world/WorldSystem.class rename to target/classes/de/butzlabben/WorldSystem.class index d445a26..cc6308c 100644 Binary files a/target/classes/de/butzlabben/world/WorldSystem.class and b/target/classes/de/butzlabben/WorldSystem.class differ diff --git a/target/classes/de/butzlabben/inventory/OrcListener.class b/target/classes/de/butzlabben/inventory/OrcListener.class index ca954f5..c69c91e 100644 Binary files a/target/classes/de/butzlabben/inventory/OrcListener.class and b/target/classes/de/butzlabben/inventory/OrcListener.class differ diff --git a/target/classes/de/butzlabben/world/autoupdater/UpdateInformations.class b/target/classes/de/butzlabben/world/autoupdater/UpdateInformations.class index d360899..b030ed7 100644 Binary files a/target/classes/de/butzlabben/world/autoupdater/UpdateInformations.class and b/target/classes/de/butzlabben/world/autoupdater/UpdateInformations.class differ diff --git a/target/classes/de/butzlabben/world/command/commands/WSCommands.class b/target/classes/de/butzlabben/world/command/commands/WSCommands.class index 68f5893..0a0f331 100644 Binary files a/target/classes/de/butzlabben/world/command/commands/WSCommands.class and b/target/classes/de/butzlabben/world/command/commands/WSCommands.class differ diff --git a/target/classes/de/butzlabben/world/command/commands/WorldAdministrateCommand.class b/target/classes/de/butzlabben/world/command/commands/WorldAdministrateCommand.class index 0cbd4ef..4131ad2 100644 Binary files a/target/classes/de/butzlabben/world/command/commands/WorldAdministrateCommand.class and b/target/classes/de/butzlabben/world/command/commands/WorldAdministrateCommand.class differ diff --git a/target/classes/de/butzlabben/world/command/commands/WorldSettingsCommands.class b/target/classes/de/butzlabben/world/command/commands/WorldSettingsCommands.class index a857190..1bf730f 100644 Binary files a/target/classes/de/butzlabben/world/command/commands/WorldSettingsCommands.class and b/target/classes/de/butzlabben/world/command/commands/WorldSettingsCommands.class differ diff --git a/target/classes/de/butzlabben/world/config/GuiConfig.class b/target/classes/de/butzlabben/world/config/GuiConfig.class index 508e7db..bab66d4 100644 Binary files a/target/classes/de/butzlabben/world/config/GuiConfig.class and b/target/classes/de/butzlabben/world/config/GuiConfig.class differ diff --git a/target/classes/de/butzlabben/world/config/MessageConfig.class b/target/classes/de/butzlabben/world/config/MessageConfig.class index 4263a16..bc7f35d 100644 Binary files a/target/classes/de/butzlabben/world/config/MessageConfig.class and b/target/classes/de/butzlabben/world/config/MessageConfig.class differ diff --git a/target/classes/de/butzlabben/world/config/PluginConfig.class b/target/classes/de/butzlabben/world/config/PluginConfig.class index 607c0db..176ce18 100644 Binary files a/target/classes/de/butzlabben/world/config/PluginConfig.class and b/target/classes/de/butzlabben/world/config/PluginConfig.class differ diff --git a/target/classes/de/butzlabben/world/config/SettingsConfig.class b/target/classes/de/butzlabben/world/config/SettingsConfig.class index 5d2b497..fafbfbf 100644 Binary files a/target/classes/de/butzlabben/world/config/SettingsConfig.class and b/target/classes/de/butzlabben/world/config/SettingsConfig.class differ diff --git a/target/classes/de/butzlabben/world/data/WorldDatabase.class b/target/classes/de/butzlabben/world/data/WorldDatabase.class new file mode 100644 index 0000000..c1e22da Binary files /dev/null and b/target/classes/de/butzlabben/world/data/WorldDatabase.class differ diff --git a/target/classes/de/butzlabben/world/data/objects/PlayerData.class b/target/classes/de/butzlabben/world/data/objects/PlayerData.class new file mode 100644 index 0000000..c5aa565 Binary files /dev/null and b/target/classes/de/butzlabben/world/data/objects/PlayerData.class differ diff --git a/target/classes/de/butzlabben/world/data/objects/PlayerWorld.class b/target/classes/de/butzlabben/world/data/objects/PlayerWorld.class new file mode 100644 index 0000000..68c2d10 Binary files /dev/null and b/target/classes/de/butzlabben/world/data/objects/PlayerWorld.class differ diff --git a/target/classes/de/butzlabben/world/data/objects/WorldSystemData.class b/target/classes/de/butzlabben/world/data/objects/WorldSystemData.class new file mode 100644 index 0000000..089296b Binary files /dev/null and b/target/classes/de/butzlabben/world/data/objects/WorldSystemData.class differ diff --git a/target/classes/de/butzlabben/world/util/PapiExtension.class b/target/classes/de/butzlabben/world/util/PapiExtension.class index 5a8b7d2..72be07b 100644 Binary files a/target/classes/de/butzlabben/world/util/PapiExtension.class and b/target/classes/de/butzlabben/world/util/PapiExtension.class differ diff --git a/target/classes/de/butzlabben/world/util/VersionUtil.class b/target/classes/de/butzlabben/world/util/VersionUtil.class index 7d729e7..2feb592 100644 Binary files a/target/classes/de/butzlabben/world/util/VersionUtil.class and b/target/classes/de/butzlabben/world/util/VersionUtil.class differ diff --git a/target/classes/de/butzlabben/world/wrapper/SystemWorld$1.class b/target/classes/de/butzlabben/world/wrapper/SystemWorld$1.class index d3ccf87..d06d5ef 100644 Binary files a/target/classes/de/butzlabben/world/wrapper/SystemWorld$1.class and b/target/classes/de/butzlabben/world/wrapper/SystemWorld$1.class differ diff --git a/target/classes/de/butzlabben/world/wrapper/SystemWorld.class b/target/classes/de/butzlabben/world/wrapper/SystemWorld.class index f4e1851..8aa01aa 100644 Binary files a/target/classes/de/butzlabben/world/wrapper/SystemWorld.class and b/target/classes/de/butzlabben/world/wrapper/SystemWorld.class differ diff --git a/target/classes/plugin.yml b/target/classes/plugin.yml deleted file mode 100644 index 15e9915..0000000 --- a/target/classes/plugin.yml +++ /dev/null @@ -1,7 +0,0 @@ -name: 'WorldSystem' -version: '2.4.20' -main: de.bulzlabben.world.WorldSystem - -description: The one world per player solution you have always dreamed of. - -api-version: '1.17' \ No newline at end of file diff --git a/target/test-classes/de/butzlabben/world/data/TestWorldDatabase.class b/target/test-classes/de/butzlabben/world/data/TestWorldDatabase.class new file mode 100644 index 0000000..95e8df2 Binary files /dev/null and b/target/test-classes/de/butzlabben/world/data/TestWorldDatabase.class differ