1
mirror of https://github.com/CarmJos/MineSQL.git synced 2024-09-19 20:25:45 +00:00

添加 PluginConfiguration 接口类

This commit is contained in:
Carm Jos 2022-02-23 05:00:48 +08:00
parent 6041c9b5dd
commit f04a81f627
9 changed files with 254 additions and 66 deletions

View File

@ -3,14 +3,13 @@ package cc.carm.plugin.easysql.api;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class DBConfiguration {
public DBConfiguration create(@NotNull SQLDriverType sourceType, @NotNull String url) {
return new DBConfiguration(sourceType.getDriverClass(), sourceType.getUrlPrefix(), url, sourceType.getDefaultSettings());
public static DBConfiguration create(@NotNull SQLDriverType sourceType, @NotNull String url) {
return new DBConfiguration(sourceType.getDriverClass(), sourceType.getUrlPrefix(), url, sourceType.getInitializeSQLs());
}
private final @NotNull String driverClassName;

View File

@ -1,28 +1,41 @@
package cc.carm.plugin.easysql.api;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Arrays;
public enum SQLDriverType {
MARIADB("org.mariadb.jdbc.Driver", "jdbc:mariadb://", "mariadb", new String[]{}),
MYSQL("com.mysql.jdbc.Driver", "jdbc:mysql://", "mysql", new String[]{}),
H2("org.h2.Driver", "jdbc:h2:", "h2", new String[]{"MODE=MySQL", "DB_CLOSE_DELAY=-1"});
MARIADB("org.mariadb.jdbc.Driver", "jdbc:mariadb://",
new String[]{"mariadb", "maria-db"}, new String[]{}
),
MYSQL("com.mysql.jdbc.Driver", "jdbc:mysql://",
new String[]{"mysql"}, new String[]{}
),
H2("org.h2.Driver", "jdbc:h2:",
new String[]{"h2", "h2-db", "h2-database"},
new String[]{"SET MODE=MySQL", "SET DB_CLOSE_DELAY=-1"}
);
private final @NotNull String databaseID;
private final @NotNull String driverClass;
private final @NotNull String urlPrefix;
private final @NotNull String[] defaultSettings;
private final @NotNull String[] databaseAlias;
private final @NotNull String[] initializeSQLs;
SQLDriverType(@NotNull String driverClass, @NotNull String urlPrefix,
@NotNull String databaseID, @NotNull String[] initializeSQLs) {
this.databaseID = databaseID;
@NotNull String[] databaseAlias,
@NotNull String[] initializeSQLs) {
this.driverClass = driverClass;
this.urlPrefix = urlPrefix;
this.defaultSettings = initializeSQLs;
this.databaseAlias = databaseAlias;
this.initializeSQLs = initializeSQLs;
}
public @NotNull String getDatabaseID() {
return databaseID;
public @NotNull String[] getDatabaseAlias() {
return databaseAlias;
}
public @NotNull String getDriverClass() {
@ -33,7 +46,20 @@ public enum SQLDriverType {
return urlPrefix;
}
public @NotNull String[] getDefaultSettings() {
return defaultSettings;
public @NotNull String[] getInitializeSQLs() {
return initializeSQLs;
}
@Contract("null->null")
public static @Nullable SQLDriverType parse(@Nullable String driverString) {
if (driverString == null) return null;
return Arrays.stream(values())
.filter(value -> value.name().equalsIgnoreCase(driverString) || has(value.getDatabaseAlias(), driverString))
.findFirst().orElse(null);
}
private static boolean has(String[] array, String value) {
return Arrays.stream(array).anyMatch(s -> s.equalsIgnoreCase(value));
}
}

View File

@ -37,14 +37,25 @@ public class EasySQLRegistryImpl implements EasySQLRegistry {
thread.setDaemon(true);
return thread;
});
Map<String, DBConfiguration> configurations = platform.readConfigurations();
Map<String, Properties> dbProperties = platform.readProperties();
Map<String, DBConfiguration> dbConfigurations = platform.readConfigurations();
if (configurations.isEmpty()) {
if (dbProperties.isEmpty() && dbConfigurations.isEmpty()) {
platform.getLogger().warning("未检测到任何数据库配置将不会创建任何SQLManager。");
return;
}
configurations.forEach((id, configuration) -> {
dbProperties.forEach((id, properties) -> {
try {
SQLManagerImpl sqlManager = create(id, properties);
this.sqlManagerRegistry.put(id, sqlManager);
} catch (Exception exception) {
platform.getLogger().warning("初始化SQLManager(#" + id + ") 出错,请检查配置文件.");
exception.printStackTrace();
}
});
dbConfigurations.forEach((id, configuration) -> {
try {
SQLManagerImpl sqlManager = create(id, configuration);
this.sqlManagerRegistry.put(id, sqlManager);
@ -130,6 +141,10 @@ public class EasySQLRegistryImpl implements EasySQLRegistry {
}
}
protected HashMap<String, SQLManagerImpl> getManagers() {
return sqlManagerRegistry;
}
public ExecutorService getExecutor() {
return executorPool;
}

View File

@ -0,0 +1,22 @@
package cc.carm.plugin.easysql.configuration;
import cc.carm.plugin.easysql.api.DBConfiguration;
import org.jetbrains.annotations.NotNull;
import java.util.Map;
public interface PluginConfiguration {
boolean isDebugEnabled();
boolean isMetricsEnabled();
boolean isUpdateCheckerEnabled();
boolean isPropertiesEnabled();
String getPropertiesFolder();
@NotNull Map<String, DBConfiguration> getDBConfigurations();
}

View File

@ -1,13 +0,0 @@
package cc.carm.plugin.easysql.util;
import cc.carm.lib.githubreleases4j.GithubReleases4J;
import java.util.logging.Logger;
public class UpdateCheckUtil {
}

View File

@ -23,11 +23,22 @@ properties:
# 该选项也支持绝对路径,但使用绝对路径时,请务必注意权限问题。
folder: "db-properties/"
configurations:
"example-mariadb": # database id
# 数据库源配置
# 目前支持的驱动类型(driver-type)有 mariadb、mysql 与 h2(文件数据库) 。
databases:
"example-mariadb": # 数据库源名称 不可包含“.” 以“example-”开头的数据源不会被加载
driver-type: mariadb
url: 127.0.0.1 # 数据库地址
host: 127.0.0.1 # 数据库地址
port: 3306 # 数据库端口
username: minecraft # 数据库用户名
password: password #数据库连接密码
database: minecraft #数据库名
"example-h2": # 数据库源名称 不可包含“.” 以“example-”开头的数据源不会被加载
driver-type: h2 #数据库驱动类型,目前支持 mariadb, mysql, h2
file: "example.db" #数据库文件路径相对于“plugins/EasySQL-Plugin/db-files/”
username: minecraft # 数据库用户名
password: password #数据库连接密码
database: minecraft #数据库名

View File

@ -0,0 +1,91 @@
package cc.carm.plugin.easysql;
import cc.carm.plugin.easysql.api.DBConfiguration;
import cc.carm.plugin.easysql.api.SQLDriverType;
import cc.carm.plugin.easysql.configuration.PluginConfiguration;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
import org.jetbrains.annotations.NotNull;
import java.util.LinkedHashMap;
import java.util.Map;
public class BukkitConfiguration implements PluginConfiguration {
private final @NotNull FileConfiguration configuration;
protected BukkitConfiguration(@NotNull FileConfiguration configuration) {
this.configuration = configuration;
}
public @NotNull FileConfiguration getConfiguration() {
return configuration;
}
@Override
public boolean isDebugEnabled() {
return getConfiguration().getBoolean("debug", false);
}
@Override
public boolean isMetricsEnabled() {
return getConfiguration().getBoolean("metrics", true);
}
@Override
public boolean isUpdateCheckerEnabled() {
return getConfiguration().getBoolean("check-update", true);
}
@Override
public boolean isPropertiesEnabled() {
return getConfiguration().getBoolean("properties.enable", true);
}
@Override
public String getPropertiesFolder() {
return getConfiguration().getString("properties.folder", "db-properties/");
}
@Override
public @NotNull Map<String, DBConfiguration> getDBConfigurations() {
Map<String, DBConfiguration> dbConfigurations = new LinkedHashMap<>();
ConfigurationSection dbConfigurationsSection = getConfiguration().getConfigurationSection("databases");
if (dbConfigurationsSection != null) {
for (String dbName : dbConfigurationsSection.getKeys(false)) {
if (dbName.startsWith("example-")) continue;
ConfigurationSection dbSection = dbConfigurationsSection.getConfigurationSection(dbName);
if (dbSection == null) continue;
String driverString = dbSection.getString("driver-type");
SQLDriverType driverType = SQLDriverType.parse(driverString);
if (driverType == null) {
EasySQLBukkit.getInstance().error("不存在预设的驱动类型 " + driverString + "," + " 请检查配置文件 databases." + dbName + "");
continue;
}
String host = dbSection.getString("host");
if (host == null) {
EasySQLBukkit.getInstance().error("地址配置不得为空," + " 请检查配置文件 databases." + dbName + "");
continue;
}
int port = dbSection.getInt("port", -1);
if (port < 0) {
EasySQLBukkit.getInstance().error("端口未配置正确," + " 请检查配置文件 databases." + dbName + "");
continue;
}
DBConfiguration configuration = DBConfiguration.create(driverType, host + ":" + port);
String username = dbSection.getString("username");
String password = dbSection.getString("password");
}
}
return dbConfigurations;
}
}

View File

@ -2,17 +2,18 @@ package cc.carm.plugin.easysql;
import cc.carm.lib.easyplugin.EasyPlugin;
import cc.carm.lib.easyplugin.i18n.EasyPluginMessageProvider;
import cc.carm.lib.easysql.api.SQLManager;
import cc.carm.plugin.easysql.api.DBConfiguration;
import cc.carm.plugin.easysql.util.PropertiesUtil;
import cc.carm.plugin.easysql.util.ResourceReadUtil;
import cn.beecp.BeeDataSource;
import co.aikar.commands.PaperCommandManager;
import org.bstats.bukkit.Metrics;
import org.bstats.charts.SimplePie;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.Properties;
import java.util.*;
public class EasySQLBukkit extends EasyPlugin implements EasySQLPluginPlatform {
@ -22,24 +23,76 @@ public class EasySQLBukkit extends EasyPlugin implements EasySQLPluginPlatform {
protected static EasySQLBukkit instance;
private PaperCommandManager commandManager;
private BukkitConfiguration configuration;
private EasySQLRegistryImpl registry;
private PaperCommandManager commandManager;
@Override
protected void load() {
EasySQLBukkit.instance = this;
log("加载配置文件...");
getInstance().saveDefaultConfig();
this.configuration = new BukkitConfiguration(getInstance().getConfig());
log("初始化EasySQL注册器...");
this.registry = new EasySQLRegistryImpl(this);
initializeAPI(getRegistry()); // 尽快的初始化接口方便其他插件调用
log("初始化EasySQLAPI...");
initializeAPI(getRegistry()); // 尽快地初始化接口方便其他插件调用
}
@Override
protected boolean initialize() {
log("初始化指令管理器...");
this.commandManager = new PaperCommandManager(this);
log("注册相关指令...");
initializeCommands(getCommandManager());
if (getConfiguration().isMetricsEnabled()) {
log("启用统计数据...");
Metrics metrics = new Metrics(this, 14075);
metrics.addCustomChart(new SimplePie("update_check",
() -> getConfiguration().isUpdateCheckerEnabled() ? "ENABLED" : "DISABLED")
);
metrics.addCustomChart(new SimplePie("properties_configuration",
() -> getConfiguration().isPropertiesEnabled() ? "ENABLED" : "DISABLED")
);
}
if (getConfiguration().isUpdateCheckerEnabled()) {
log("开始检查更新...");
getRegistry().checkUpdate(getDescription().getVersion());
} else {
log("已禁用检查更新,跳过。");
}
return true;
}
@Override
protected void shutdown() {
log("终止全部数据库连接...");
for (String dbName : new HashSet<>(getRegistry().list().keySet())) {
log(" 正在关闭数据库 " + dbName + "...");
SQLManager manager = getRegistry().get(dbName);
getRegistry().shutdown(manager, activeQueries -> {
log(" 数据库 " + dbName + " 仍有有 " + activeQueries + " 条活动查询,强制关闭中...");
if (manager.getDataSource() instanceof BeeDataSource) {
BeeDataSource dataSource = (BeeDataSource) manager.getDataSource();
dataSource.close(); //Close bee connection pool
}
});
}
getRegistry().getManagers().clear(); // release all managers
}
@Override
public boolean isDebugging() {
return getConfiguration().isDebugEnabled();
}
@Override
@NotNull
public EasySQLRegistryImpl getRegistry() {
@ -49,13 +102,16 @@ public class EasySQLBukkit extends EasyPlugin implements EasySQLPluginPlatform {
@Override
public @NotNull
Map<String, DBConfiguration> readConfigurations() {
return new HashMap<>();
return getConfiguration().getDBConfigurations();
}
@Override
public @NotNull
Map<String, Properties> readProperties() {
return PropertiesUtil.readDBProperties(new File(getDataFolder(), "db-properties"));
if (!getConfiguration().isPropertiesEnabled()) return new HashMap<>();
String propertiesFolder = getConfiguration().getPropertiesFolder();
if (propertiesFolder == null || propertiesFolder.length() == 0) return new HashMap<>();
else return PropertiesUtil.readDBProperties(new File(getDataFolder(), propertiesFolder));
}
@Override
@ -67,6 +123,10 @@ public class EasySQLBukkit extends EasyPlugin implements EasySQLPluginPlatform {
return EasySQLBukkit.instance;
}
protected BukkitConfiguration getConfiguration() {
return configuration;
}
protected PaperCommandManager getCommandManager() {
return commandManager;
}

View File

@ -1,23 +1,16 @@
package cc.carm.plugin.easysql;
import cc.carm.plugin.easysql.api.DBConfiguration;
import cc.carm.plugin.easysql.api.EasySQLRegistry;
import cc.carm.plugin.easysql.util.PropertiesUtil;
import net.md_5.bungee.api.plugin.Plugin;
import net.md_5.bungee.config.Configuration;
import net.md_5.bungee.config.ConfigurationProvider;
import net.md_5.bungee.config.YamlConfiguration;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
public class EasySQLBungee extends Plugin implements EasySQLPluginPlatform {
public class EasySQLBungee extends Plugin {
private boolean setup = false;
@ -69,20 +62,4 @@ public class EasySQLBungee extends Plugin implements EasySQLPluginPlatform {
getLogger().info("Shutting down...");
}
@Override
public @NotNull EasySQLRegistry getRegistry() {
return null;
}
@Override
public @NotNull Map<String, DBConfiguration> readConfigurations() {
return new HashMap<>();
}
@Override
public @NotNull Map<String, Properties> readProperties() {
return PropertiesUtil.readDBProperties(new File(getDataFolder(), "db-properties"));
}
}