diff --git a/nicko-core/pom.xml b/nicko-core/pom.xml
index 5781d33..63c389d 100644
--- a/nicko-core/pom.xml
+++ b/nicko-core/pom.xml
@@ -99,6 +99,13 @@
2.29.0
test
+
+
+ org.mariadb.jdbc
+ mariadb-java-client
+ 3.1.0
+
+
diff --git a/nicko-core/src/main/java/net/artelnatif/nicko/NickoBukkit.java b/nicko-core/src/main/java/net/artelnatif/nicko/NickoBukkit.java
index 71f24ab..de3096c 100644
--- a/nicko-core/src/main/java/net/artelnatif/nicko/NickoBukkit.java
+++ b/nicko-core/src/main/java/net/artelnatif/nicko/NickoBukkit.java
@@ -27,9 +27,10 @@ import java.io.File;
import java.util.logging.Level;
public class NickoBukkit extends JavaPlugin {
- private boolean unitTesting;
private static NickoBukkit plugin;
+ private final boolean unitTesting;
+
private NickoConfiguration nickoConfiguration;
private MojangAPI mojangAPI;
private PlayerDataStore dataStore;
@@ -37,9 +38,10 @@ public class NickoBukkit extends JavaPlugin {
/**
* Used by MockBukkit
*/
- protected NickoBukkit(JavaPluginLoader loader, PluginDescriptionFile description, File dataFolder, File file) {
+ protected NickoBukkit(JavaPluginLoader loader, PluginDescriptionFile description, File dataFolder, File file, NickoConfiguration nickoConfiguration) {
super(loader, description, dataFolder, file);
unitTesting = true;
+ this.nickoConfiguration = nickoConfiguration;
getLogger().info("Unit Testing Mode enabled.");
}
@@ -47,13 +49,48 @@ public class NickoBukkit extends JavaPlugin {
public void onEnable() {
plugin = this;
- if(!isUnitTesting()) {
- getLogger().info("Loading internals...");
- if (getInternals() == null) {
- getLogger().log(Level.SEVERE, "Nicko could not find a valid implementation for this server version. Is your server supported?");
- dataStore.getStorage().setError(true);
- getServer().getPluginManager().disablePlugin(this);
+ if (isUnitTesting()) {
+ onUnitTestingStartup();
+ } else {
+ onPluginStartup();
+ }
+ }
+
+ @Override
+ public void onDisable() {
+ if (!dataStore.getStorage().isError()) {
+ getLogger().info("Closing persistence...");
+ dataStore.removeAllNames();
+ if (!dataStore.getStorage().getProvider().close()) {
+ getLogger().warning("Failed to close persistence!");
}
+ dataStore.getStorage().setError(false);
+ }
+
+ if (nickoConfiguration.isBungeecordEnabled()) {
+ getServer().getMessenger().unregisterIncomingPluginChannel(this);
+ getServer().getMessenger().unregisterOutgoingPluginChannel(this);
+ }
+
+ getLogger().info("Nicko (Bukkit) has been disabled.");
+ }
+
+ public void onUnitTestingStartup() {
+ getLogger().info("Loading persistence...");
+ dataStore = new PlayerDataStore(this);
+
+ if (!dataStore.getStorage().getProvider().init()) {
+ dataStore.getStorage().setError(true);
+ getLogger().warning("Failed to open persistence, data will NOT be saved!");
+ }
+ }
+
+ public void onPluginStartup() {
+ getLogger().info("Loading internals...");
+ if (getInternals() == null) {
+ getLogger().log(Level.SEVERE, "Nicko could not find a valid implementation for this server version. Is your server supported?");
+ dataStore.getStorage().setError(true);
+ getServer().getPluginManager().disablePlugin(this);
}
if (getServer().getPluginManager().isPluginEnabled(this)) {
@@ -84,17 +121,15 @@ public class NickoBukkit extends JavaPlugin {
new PlaceHolderHook(this).hook();
- if(!isUnitTesting()) {
- getServer().getPluginManager().registerEvents(new PlayerJoinListener(), this);
- getServer().getPluginManager().registerEvents(new PlayerQuitListener(), this);
+ getServer().getPluginManager().registerEvents(new PlayerJoinListener(), this);
+ getServer().getPluginManager().registerEvents(new PlayerQuitListener(), this);
- final ServerUtils serverUtils = new ServerUtils(this);
- serverUtils.checkSpigotBungeeCordHook();
- if (nickoConfiguration.isBungeecordEnabled()) {
- if (serverUtils.checkBungeeCordHook()) {
- getLogger().info("Enabling BungeeCord support...");
- getServer().getMessenger().registerIncomingPluginChannel(this, NickoBungee.NICKO_PLUGIN_CHANNEL_UPDATE, new PluginMessageHandler());
- }
+ final ServerUtils serverUtils = new ServerUtils(this);
+ serverUtils.checkSpigotBungeeCordHook();
+ if (nickoConfiguration.isBungeecordEnabled()) {
+ if (serverUtils.checkBungeeCordHook()) {
+ getLogger().info("Enabling BungeeCord support...");
+ getServer().getMessenger().registerIncomingPluginChannel(this, NickoBungee.NICKO_PLUGIN_CHANNEL_UPDATE, new PluginMessageHandler());
}
}
@@ -102,25 +137,6 @@ public class NickoBukkit extends JavaPlugin {
}
}
- @Override
- public void onDisable() {
- if (!dataStore.getStorage().isError()) {
- getLogger().info("Closing persistence...");
- dataStore.removeAllNames();
- if (!dataStore.getStorage().getProvider().close()) {
- getLogger().warning("Failed to close persistence!");
- }
- dataStore.getStorage().setError(false);
- }
-
- if (nickoConfiguration.isBungeecordEnabled()) {
- getServer().getMessenger().unregisterIncomingPluginChannel(this);
- getServer().getMessenger().unregisterOutgoingPluginChannel(this);
- }
-
- getLogger().info("Nicko (Bukkit) has been disabled.");
- }
-
public static NickoBukkit getInstance() {
return plugin;
}
diff --git a/nicko-core/src/main/java/net/artelnatif/nicko/config/NickoConfiguration.java b/nicko-core/src/main/java/net/artelnatif/nicko/config/NickoConfiguration.java
index 0d045cb..2edd6c5 100644
--- a/nicko-core/src/main/java/net/artelnatif/nicko/config/NickoConfiguration.java
+++ b/nicko-core/src/main/java/net/artelnatif/nicko/config/NickoConfiguration.java
@@ -80,7 +80,10 @@ public class NickoConfiguration {
}
public String getSQLPassword() {
- return getStorageSection().getString("password");
+ if (sqlPassword == null) {
+ return sqlPassword = getStorageSection().getString("password");
+ }
+ return sqlPassword;
}
public void setSQLPassword(String sqlPassword) {
diff --git a/nicko-core/src/main/java/net/artelnatif/nicko/storage/sql/SQLStorageProvider.java b/nicko-core/src/main/java/net/artelnatif/nicko/storage/sql/SQLStorageProvider.java
index 2ba5096..78e0724 100644
--- a/nicko-core/src/main/java/net/artelnatif/nicko/storage/sql/SQLStorageProvider.java
+++ b/nicko-core/src/main/java/net/artelnatif/nicko/storage/sql/SQLStorageProvider.java
@@ -4,12 +4,18 @@ import net.artelnatif.nicko.NickoBukkit;
import net.artelnatif.nicko.config.NickoConfiguration;
import net.artelnatif.nicko.storage.StorageProvider;
-import java.sql.*;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
public class SQLStorageProvider implements StorageProvider {
private final NickoBukkit instance;
private Connection connection;
+ private final String schemaName = "nicko";
+ private final String tableName = "DATA";
+
public SQLStorageProvider(NickoBukkit instance) {
this.instance = instance;
}
@@ -18,18 +24,20 @@ public class SQLStorageProvider implements StorageProvider {
public boolean init() {
try {
final NickoConfiguration config = instance.getNickoConfig();
- connection = DriverManager.getConnection("jdbc://" + config.getSQLAddress(), config.getSQLUsername(), config.getSQLPassword());
+ connection = DriverManager.getConnection("jdbc:mariadb://" + config.getSQLAddress(), config.getSQLUsername(), config.getSQLPassword());
final boolean initialized = connection != null && !connection.isClosed();
if (initialized) {
- if (!doesTableExist()) {
- instance.getLogger().info("Creating SQL tables...");
- return createTables();
- }
+ instance.getLogger().info("Creating SQL database...");
+ createDatabase();
+
+ instance.getLogger().info("Creating SQL table...");
+ createTable();
return true;
}
return false;
} catch (SQLException e) {
+ e.printStackTrace();
return false;
}
}
@@ -40,6 +48,7 @@ public class SQLStorageProvider implements StorageProvider {
@Override
public boolean close() {
+ if(connection == null) { return true; }
try {
connection.close();
return connection.isClosed();
@@ -48,38 +57,42 @@ public class SQLStorageProvider implements StorageProvider {
}
}
- private boolean createTables() {
+ private void createTable() {
final Connection connection = getConnection();
final String query = """
- CREATE TABLE IF NOT EXISTS 'NICKO' (
+ CREATE TABLE IF NOT EXISTS %s.%s (
uuid uuid NOT NULL,
name varchar(16) NOT NULL,
skin varchar(16) NOT NULL,
bungeecord boolean NOT NULL,
PRIMARY KEY (UUID)
)
- """;
+ """.formatted(schemaName, tableName);
try {
final PreparedStatement statement = connection.prepareStatement(query);
- ResultSet result = statement.executeQuery();
- return result.next();
+ statement.executeUpdate();
+ statement.close();
} catch (SQLException e) {
+ // TODO: 12/10/22 Handle error
throw new RuntimeException(e);
}
}
- private boolean doesTableExist() {
+ private void createDatabase() {
final Connection connection = getConnection();
- final String query = "SELECT UUID FROM 'NICKO'";
+ final String query = """
+ CREATE DATABASE IF NOT EXISTS %s
+ """.formatted(schemaName);
try {
final PreparedStatement statement = connection.prepareStatement(query);
- ResultSet result = statement.executeQuery();
- return result.next();
+ statement.executeUpdate();
+ statement.close();
} catch (SQLException e) {
+ // TODO: 12/10/22 Handle error
throw new RuntimeException(e);
}
}
diff --git a/nicko-core/src/test/java/net/artelnatif/nicko/test/mock/NickoServerMock.java b/nicko-core/src/test/java/net/artelnatif/nicko/test/mock/NickoServerMock.java
deleted file mode 100644
index 2071ad6..0000000
--- a/nicko-core/src/test/java/net/artelnatif/nicko/test/mock/NickoServerMock.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package net.artelnatif.nicko.test.mock;
-
-import be.seeseemelk.mockbukkit.ServerMock;
-
-public class NickoServerMock extends ServerMock {
-}
diff --git a/nicko-core/src/test/java/net/artelnatif/nicko/test/storage/SQLStorageTest.java b/nicko-core/src/test/java/net/artelnatif/nicko/test/storage/SQLStorageTest.java
index 914704b..d6cc9c1 100644
--- a/nicko-core/src/test/java/net/artelnatif/nicko/test/storage/SQLStorageTest.java
+++ b/nicko-core/src/test/java/net/artelnatif/nicko/test/storage/SQLStorageTest.java
@@ -6,7 +6,6 @@ import be.seeseemelk.mockbukkit.entity.PlayerMock;
import net.artelnatif.nicko.NickoBukkit;
import net.artelnatif.nicko.config.NickoConfiguration;
import net.artelnatif.nicko.disguise.NickoProfile;
-import net.artelnatif.nicko.test.mock.NickoServerMock;
import org.junit.jupiter.api.*;
import java.util.Optional;
@@ -18,17 +17,19 @@ public class SQLStorageTest {
@BeforeAll
public static void setup() {
- server = MockBukkit.mock(new NickoServerMock());
- plugin = MockBukkit.load(NickoBukkit.class);
- config = plugin.getNickoConfig();
+ server = MockBukkit.mock();
+ config = new NickoConfiguration(null);
+ config.setLocalStorage(false);
+ config.setBungeecordSupport(false);
+ config.setSQLAddress("127.0.0.1");
+ config.setSQLUsername("root");
+ config.setSQLPassword("12345"); // https://howsecureismypassword.net/ "Your password would be cracked: Instantly"
+ plugin = MockBukkit.load(NickoBukkit.class, config);
}
@Test
@DisplayName("Create SQL Tables")
public void testSQLTables() {
- config.setSQLAddress("localhost");
- config.setSQLUsername("root");
- config.setSQLPassword("12345"); // https://howsecureismypassword.net/ "Your password would be cracked: Instantly"
final PlayerMock playerMock = server.addPlayer("Aro");
final Optional data = plugin.getDataStore().getData(playerMock.getUniqueId());