From 46aa3225d34f71470f660fc44b1eea6ffbcb18f0 Mon Sep 17 00:00:00 2001
From: aro <pantoine.rochas@gmail.com>
Date: Mon, 13 Mar 2023 19:32:15 +0100
Subject: [PATCH] feat(redis): rework configuration to support multiple data
 sources

---
 .../nicko/config/Configuration.java           | 36 +++++++-------
 .../nicko/config/ConfigurationManager.java    |  2 +
 .../nicko/config/DataSourceConfiguration.java |  9 ++--
 .../nicko/config/NewConfiguration.java        | 47 -------------------
 .../nicko/storage/sql/SQLStorageProvider.java |  8 ++--
 core/src/main/resources/config.yml            | 26 +++++-----
 .../nicko/test/NickoPluginTest.java           |  6 +--
 .../nicko/test/cache/CacheStorageTest.java    | 11 +++--
 .../nicko/test/config/ConfigurationTest.java  | 40 ++++++++++++++++
 .../nicko/test/storage/BrokenSQLTest.java     |  6 +--
 .../nicko/test/storage/SQLStorageTest.java    |  6 +--
 11 files changed, 103 insertions(+), 94 deletions(-)
 delete mode 100644 core/src/main/java/net/artelnatif/nicko/config/NewConfiguration.java
 create mode 100644 core/src/test/java/net/artelnatif/nicko/test/config/ConfigurationTest.java

diff --git a/core/src/main/java/net/artelnatif/nicko/config/Configuration.java b/core/src/main/java/net/artelnatif/nicko/config/Configuration.java
index 949f17c..3dbd3ec 100644
--- a/core/src/main/java/net/artelnatif/nicko/config/Configuration.java
+++ b/core/src/main/java/net/artelnatif/nicko/config/Configuration.java
@@ -1,36 +1,40 @@
 package net.artelnatif.nicko.config;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
+
 public class Configuration {
-    private final String address;
-    private final String username;
-    private final String password;
+    @JsonProperty("sql")
+    private final DataSourceConfiguration sqlConfiguration;
+    @JsonProperty("redis")
+    private final DataSourceConfiguration redisConfiguration;
     private final String prefix;
     private final Boolean local;
     private final Boolean customLocale;
 
-    public Configuration(String address, String username, String password, String prefix, Boolean local, Boolean customLocale) {
-        this.address = address;
-        this.username = username;
-        this.password = password;
+    public Configuration(DataSourceConfiguration sqlConfiguration, DataSourceConfiguration redisConfiguration, String prefix, Boolean local, Boolean customLocale) {
+        this.sqlConfiguration = sqlConfiguration;
+        this.redisConfiguration = redisConfiguration;
         this.prefix = prefix;
         this.local = local;
         this.customLocale = customLocale;
     }
 
     public Configuration() {
-        this("", "", "", "", false, false);
+        this(
+                new DataSourceConfiguration("", 3306, "", ""),
+                new DataSourceConfiguration("", 6379, "", ""),
+                "",
+                false,
+                false
+        );
     }
 
-    public String getAddress() {
-        return address;
+    public DataSourceConfiguration getSqlConfiguration() {
+        return sqlConfiguration;
     }
 
-    public String getUsername() {
-        return username;
-    }
-
-    public String getPassword() {
-        return password;
+    public DataSourceConfiguration getRedisConfiguration() {
+        return redisConfiguration;
     }
 
     public String getPrefix() {
diff --git a/core/src/main/java/net/artelnatif/nicko/config/ConfigurationManager.java b/core/src/main/java/net/artelnatif/nicko/config/ConfigurationManager.java
index 2ebb33c..37c680b 100644
--- a/core/src/main/java/net/artelnatif/nicko/config/ConfigurationManager.java
+++ b/core/src/main/java/net/artelnatif/nicko/config/ConfigurationManager.java
@@ -1,5 +1,6 @@
 package net.artelnatif.nicko.config;
 
+import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
 
@@ -15,6 +16,7 @@ public class ConfigurationManager {
 
     public ConfigurationManager(File directory) {
         this.file = new File(directory, "config.yml");
+        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
     }
 
     public void save(Configuration configuration) throws IOException {
diff --git a/core/src/main/java/net/artelnatif/nicko/config/DataSourceConfiguration.java b/core/src/main/java/net/artelnatif/nicko/config/DataSourceConfiguration.java
index 1ffd60b..5778416 100644
--- a/core/src/main/java/net/artelnatif/nicko/config/DataSourceConfiguration.java
+++ b/core/src/main/java/net/artelnatif/nicko/config/DataSourceConfiguration.java
@@ -1,12 +1,15 @@
 package net.artelnatif.nicko.config;
 
 public class DataSourceConfiguration {
+    public static final DataSourceConfiguration SQL_EMPTY = new DataSourceConfiguration("127.0.0.1", 3306, "root", "");
+    public static final DataSourceConfiguration REDIS_EMPTY = new DataSourceConfiguration("127.0.0.1", 6379, "", "");
+
     private final String address;
-    private final String port;
+    private final Integer port;
     private final String username;
     private final String password;
 
-    public DataSourceConfiguration(String address, String port, String username, String password) {
+    public DataSourceConfiguration(String address, Integer port, String username, String password) {
         this.address = address;
         this.port = port;
         this.username = username;
@@ -17,7 +20,7 @@ public class DataSourceConfiguration {
         return address;
     }
 
-    public String getPort() {
+    public Integer getPort() {
         return port;
     }
 
diff --git a/core/src/main/java/net/artelnatif/nicko/config/NewConfiguration.java b/core/src/main/java/net/artelnatif/nicko/config/NewConfiguration.java
deleted file mode 100644
index c3f37f5..0000000
--- a/core/src/main/java/net/artelnatif/nicko/config/NewConfiguration.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package net.artelnatif.nicko.config;
-
-public class NewConfiguration {
-    private final DataSourceConfiguration sqlConfiguration;
-    private final DataSourceConfiguration redisConfiguration;
-    private final String prefix;
-    private final Boolean local;
-    private final Boolean customLocale;
-
-    public NewConfiguration(DataSourceConfiguration sqlConfiguration, DataSourceConfiguration redisConfiguration, String prefix, Boolean local, Boolean customLocale) {
-        this.sqlConfiguration = sqlConfiguration;
-        this.redisConfiguration = redisConfiguration;
-        this.prefix = prefix;
-        this.local = local;
-        this.customLocale = customLocale;
-    }
-
-    public NewConfiguration() {
-        this(
-                new DataSourceConfiguration("", "", "", ""),
-                new DataSourceConfiguration("", "", "", ""),
-                "",
-                false,
-                false
-        );
-    }
-
-    public DataSourceConfiguration getSqlConfiguration() {
-        return sqlConfiguration;
-    }
-
-    public DataSourceConfiguration getRedisConfiguration() {
-        return redisConfiguration;
-    }
-
-    public String getPrefix() {
-        return prefix;
-    }
-
-    public Boolean isLocal() {
-        return local;
-    }
-
-    public Boolean isCustomLocale() {
-        return customLocale;
-    }
-}
diff --git a/core/src/main/java/net/artelnatif/nicko/storage/sql/SQLStorageProvider.java b/core/src/main/java/net/artelnatif/nicko/storage/sql/SQLStorageProvider.java
index d5f9c96..1a733e7 100644
--- a/core/src/main/java/net/artelnatif/nicko/storage/sql/SQLStorageProvider.java
+++ b/core/src/main/java/net/artelnatif/nicko/storage/sql/SQLStorageProvider.java
@@ -1,6 +1,7 @@
 package net.artelnatif.nicko.storage.sql;
 
 import net.artelnatif.nicko.config.Configuration;
+import net.artelnatif.nicko.config.DataSourceConfiguration;
 import net.artelnatif.nicko.storage.StorageProvider;
 import org.mariadb.jdbc.MariaDbDataSource;
 
@@ -25,9 +26,10 @@ public class SQLStorageProvider implements StorageProvider {
     public boolean init() {
         try {
             final MariaDbDataSource dataSource = new MariaDbDataSource();
-            dataSource.setUrl("jdbc:mariadb://" + configuration.getAddress());
-            dataSource.setUser(configuration.getUsername());
-            dataSource.setPassword(configuration.getPassword());
+            final DataSourceConfiguration dataSourceConfiguration = configuration.getSqlConfiguration();
+            dataSource.setUrl("jdbc:mariadb://" + dataSourceConfiguration.getAddress() + ":" + dataSourceConfiguration.getPort());
+            dataSource.setUser(dataSourceConfiguration.getUsername());
+            dataSource.setPassword(dataSourceConfiguration.getPassword());
             connection = dataSource.getConnection();
             final boolean initialized = connection != null && !connection.isClosed();
 
diff --git a/core/src/main/resources/config.yml b/core/src/main/resources/config.yml
index cd12668..de2d1e3 100644
--- a/core/src/main/resources/config.yml
+++ b/core/src/main/resources/config.yml
@@ -9,18 +9,20 @@
 # Accepted values: false (Disabled), true (Enabled)
 local: true
 
-# SQL database's address
-# Accepted values: valid IP address (e.g. localhost, 127.0.0.1)
-address: "localhost"
-# SQL database's port
-# Accepted values: valid integer (e.g. 3306, 25565)
-port: 3306
-# SQL database's username.
-# Accepted values: any string
-username: "username"
-# SQL database's password.
-# Accepted values: any string
-password: "password"
+# This configuration section manages SQL.
+sql:
+  # SQL database's address
+  # Accepted values: valid IP address (e.g. localhost, 127.0.0.1)
+  address: "localhost"
+  # SQL database's port
+  # Accepted values: valid integer (e.g. 3306, 25565)
+  port: 3306
+  # SQL database's username.
+  # Accepted values: any string
+  username: "username"
+  # SQL database's password.
+  # Accepted values: any string
+  password: "password"
 
 # This configuration section manages Redis (BungeeCord support).
 # It is used to transfer data between multiple servers.
diff --git a/core/src/test/java/net/artelnatif/nicko/test/NickoPluginTest.java b/core/src/test/java/net/artelnatif/nicko/test/NickoPluginTest.java
index ec63b63..29fd9f7 100644
--- a/core/src/test/java/net/artelnatif/nicko/test/NickoPluginTest.java
+++ b/core/src/test/java/net/artelnatif/nicko/test/NickoPluginTest.java
@@ -3,6 +3,7 @@ package net.artelnatif.nicko.test;
 import be.seeseemelk.mockbukkit.MockBukkit;
 import net.artelnatif.nicko.NickoBukkit;
 import net.artelnatif.nicko.config.Configuration;
+import net.artelnatif.nicko.config.DataSourceConfiguration;
 import org.junit.jupiter.api.*;
 
 public class NickoPluginTest {
@@ -11,9 +12,8 @@ public class NickoPluginTest {
     @BeforeAll
     public static void setup() {
         final Configuration config = new Configuration(
-                "",
-                "",
-                "",
+                DataSourceConfiguration.SQL_EMPTY,
+                DataSourceConfiguration.REDIS_EMPTY,
                 "",
                 true,
                 false);
diff --git a/core/src/test/java/net/artelnatif/nicko/test/cache/CacheStorageTest.java b/core/src/test/java/net/artelnatif/nicko/test/cache/CacheStorageTest.java
index 2b7fc3f..694d136 100644
--- a/core/src/test/java/net/artelnatif/nicko/test/cache/CacheStorageTest.java
+++ b/core/src/test/java/net/artelnatif/nicko/test/cache/CacheStorageTest.java
@@ -5,8 +5,12 @@ import be.seeseemelk.mockbukkit.ServerMock;
 import be.seeseemelk.mockbukkit.entity.PlayerMock;
 import net.artelnatif.nicko.NickoBukkit;
 import net.artelnatif.nicko.config.Configuration;
+import net.artelnatif.nicko.config.DataSourceConfiguration;
 import net.artelnatif.nicko.disguise.NickoProfile;
-import org.junit.jupiter.api.*;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
 
 import java.util.Optional;
 
@@ -20,9 +24,8 @@ public class CacheStorageTest {
     @BeforeAll
     public static void setup() {
         final Configuration config = new Configuration(
-                "127.0.0.1",
-                "root",
-                "12345",
+                new DataSourceConfiguration("127.0.0.1", 3306, "root", "12345"),
+                DataSourceConfiguration.REDIS_EMPTY,
                 "",
                 false,
                 false);
diff --git a/core/src/test/java/net/artelnatif/nicko/test/config/ConfigurationTest.java b/core/src/test/java/net/artelnatif/nicko/test/config/ConfigurationTest.java
new file mode 100644
index 0000000..d61dcd7
--- /dev/null
+++ b/core/src/test/java/net/artelnatif/nicko/test/config/ConfigurationTest.java
@@ -0,0 +1,40 @@
+package net.artelnatif.nicko.test.config;
+
+import be.seeseemelk.mockbukkit.MockBukkit;
+import net.artelnatif.nicko.NickoBukkit;
+import net.artelnatif.nicko.config.Configuration;
+import net.artelnatif.nicko.config.DataSourceConfiguration;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class ConfigurationTest {
+    private static NickoBukkit plugin;
+
+    @BeforeAll
+    public static void setup() {
+        final Configuration config = new Configuration(
+                DataSourceConfiguration.SQL_EMPTY,
+                DataSourceConfiguration.REDIS_EMPTY,
+                "",
+                true,
+                false);
+        MockBukkit.mock();
+        plugin = MockBukkit.load(NickoBukkit.class, config);
+    }
+
+    @Test
+    @DisplayName("Read configuration")
+    public void readConfiguration() {
+        final Configuration configuration = plugin.getNickoConfig();
+        assertTrue(configuration.isLocal());
+    }
+
+    @AfterAll
+    public static void shutdown() {
+        MockBukkit.unmock();
+    }
+}
diff --git a/core/src/test/java/net/artelnatif/nicko/test/storage/BrokenSQLTest.java b/core/src/test/java/net/artelnatif/nicko/test/storage/BrokenSQLTest.java
index 3e4e069..1b4f7c2 100644
--- a/core/src/test/java/net/artelnatif/nicko/test/storage/BrokenSQLTest.java
+++ b/core/src/test/java/net/artelnatif/nicko/test/storage/BrokenSQLTest.java
@@ -5,6 +5,7 @@ import be.seeseemelk.mockbukkit.ServerMock;
 import be.seeseemelk.mockbukkit.entity.PlayerMock;
 import net.artelnatif.nicko.NickoBukkit;
 import net.artelnatif.nicko.config.Configuration;
+import net.artelnatif.nicko.config.DataSourceConfiguration;
 import net.artelnatif.nicko.disguise.ActionResult;
 import net.artelnatif.nicko.disguise.NickoProfile;
 import org.junit.jupiter.api.*;
@@ -22,9 +23,8 @@ public class BrokenSQLTest {
     @BeforeAll
     public static void setup() {
         final Configuration config = new Configuration(
-                "127.0.0.1",
-                "root",
-                "INVALID_PASSWORD",
+                DataSourceConfiguration.SQL_EMPTY,
+                DataSourceConfiguration.REDIS_EMPTY,
                 "",
                 false,
                 false);
diff --git a/core/src/test/java/net/artelnatif/nicko/test/storage/SQLStorageTest.java b/core/src/test/java/net/artelnatif/nicko/test/storage/SQLStorageTest.java
index d443668..15f3b82 100644
--- a/core/src/test/java/net/artelnatif/nicko/test/storage/SQLStorageTest.java
+++ b/core/src/test/java/net/artelnatif/nicko/test/storage/SQLStorageTest.java
@@ -4,6 +4,7 @@ import be.seeseemelk.mockbukkit.MockBukkit;
 import be.seeseemelk.mockbukkit.ServerMock;
 import be.seeseemelk.mockbukkit.entity.PlayerMock;
 import net.artelnatif.nicko.NickoBukkit;
+import net.artelnatif.nicko.config.DataSourceConfiguration;
 import net.artelnatif.nicko.i18n.Locale;
 import net.artelnatif.nicko.config.Configuration;
 import net.artelnatif.nicko.disguise.ActionResult;
@@ -24,9 +25,8 @@ public class SQLStorageTest {
     @BeforeAll
     public static void setup() {
         final Configuration config = new Configuration(
-                "127.0.0.1",
-                "root",
-                "12345",
+                new DataSourceConfiguration("127.0.0.1", 3306, "root", "12345"),
+                DataSourceConfiguration.REDIS_EMPTY,
                 "",
                 false,
                 false);