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

Merge pull request #1 from CarmJos/impl

Merge impl to master
This commit is contained in:
Carm Jos 2022-02-09 04:13:12 +08:00 committed by GitHub
commit 2f55d732ba
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 492 additions and 41 deletions

View File

@ -1,15 +1,62 @@
package cc.carm.plugin.easysql.api;
import cc.carm.lib.easysql.api.SQLManager;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Map;
/**
* 入口类
*/
public class EasySQLAPI {
public interface EasySQLAPI {
/**
* 获取指定名称的 SQLManager 实例
* @param name 要获取的 SQLManager 实例名称
* @return SQLManager 实例
*/
@Nullable SQLManager getSQLManager(@Nullable String name);
public static @Nullable SQLManager getSQLManager(@Nullable String name) {
return null;
}
/**
* 获取所有 SQLManager 实例
* @return SQLManager 实例集合
*/
@NotNull Map<String, SQLManager> getSQLManagers();
/**
* 获取指定名称的 SQLManager 实例的命名空间
* @param name SQLManager 名称
* @return 命名空间
*/
@Nullable
String getNameSpace(@Nullable String name);
/**
* 获取指定 SQLManager 的注册名
* @param sqlManager SQLManager 实例
* @return 注册名
*/
@Nullable
String getName(@NotNull SQLManager sqlManager);
/**
* 注册 SQLManager 实例
* @param namespace 命名空间通常为插件名称
* @param name 实例名称
* @param sqlManager SQLManager 实例
*/
void registerSQLManager(@NotNull String namespace,@NotNull String name, @NotNull SQLManager sqlManager);
/**
* 注销指定的 SQLManager 实例
* @param name 实例名称
*/
void unregisterSQLManager(@NotNull String name);
/**
* 注销指定命名空间下的所有 SQLManager 实例
* @param namespace 命名空间
*/
void unregisterSQLManagerAll(@NotNull String namespace);
}

View File

@ -0,0 +1,15 @@
package cc.carm.plugin.easysql.api;
import cc.carm.lib.easysql.api.SQLManager;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public interface EasySQLPluginPlatform {
/**
* 获取 SQL 管理器
* @param name 注册键
* @return SQL管理器
*/
@Nullable
SQLManager getSqlManager(@NotNull String name);
}

View File

@ -1,15 +0,0 @@
package cc.carm.plugin.easysql.api;
public class SQLConfiguration {
String driver;
String address;
int port;
String database;
String username;
String password;
}

View File

@ -48,6 +48,13 @@
<scope>compile</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<scope>compile</scope>
</dependency>
</dependencies>
<build>

View File

@ -1,9 +0,0 @@
package cc.carm.plugin.easysql;
public class EasySQL {
}

View File

@ -0,0 +1,141 @@
package cc.carm.plugin.easysql;
import cc.carm.lib.easysql.api.SQLManager;
import cc.carm.plugin.easysql.api.EasySQLAPI;
import cc.carm.plugin.easysql.api.EasySQLPluginPlatform;
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
import com.google.common.collect.ImmutableMap;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class EasySQLManager implements EasySQLAPI {
public static final String VERSION = "1.0.0";
private final Lock LOCK =new ReentrantLock();
private final BiMap<String, Set<String>> nameSpaceRegistry = HashBiMap.create();
private final BiMap<String, SQLManager> sqlManagerRegistry = HashBiMap.create();
// 这个主要是避免外部插件注册此 EasySQLManager
// 没有其他意义
public EasySQLManager(@NotNull EasySQLPluginPlatform pluginPlatform){
}
/**
* 获取指定名称的 SQLManager 实例
*
* @param name 要获取的 SQLManager 实例名称
* @return SQLManager 实例
*/
@Override
public @Nullable SQLManager getSQLManager(@Nullable String name) {
LOCK.lock();
SQLManager sqlManager = this.sqlManagerRegistry.get(name);
LOCK.unlock();
return sqlManager;
}
/**
* 获取所有 SQLManager 实例
*
* @return SQLManager 实例集合
*/
@Override
public @NotNull Map<String, SQLManager> getSQLManagers() {
return ImmutableMap.copyOf(this.sqlManagerRegistry);
}
/**
* 获取指定名称的 SQLManager 实例的命名空间
*
* @param name SQLManager 名称
* @return 命名空间
*/
@Override
public @Nullable String getNameSpace(@Nullable String name) {
LOCK.lock();
String namespace = null;
for (Map.Entry<String, Set<String>> stringSetEntry : this.nameSpaceRegistry.entrySet()) {
if (stringSetEntry.getValue().contains(name)) {
namespace = stringSetEntry.getKey();
break;
}
}
LOCK.unlock();
return namespace;
}
/**
* 获取指定 SQLManager 的注册名
*
* @param sqlManager SQLManager 实例
* @return 注册名
*/
@Override
public @Nullable String getName(@NotNull SQLManager sqlManager) {
LOCK.lock();
String name = sqlManagerRegistry.inverse().get(sqlManager);
LOCK.unlock();
return name;
}
/**
* 注册 SQLManager 实例
*
* @param namespace 命名空间通常为插件名称
* @param name 实例名称
* @param sqlManager SQLManager 实例
*/
@Override
public void registerSQLManager(@NotNull String namespace, @NotNull String name, @NotNull SQLManager sqlManager) {
LOCK.lock();
// 注册命名空间
this.sqlManagerRegistry.put(name, sqlManager);
// 注册名称
this.nameSpaceRegistry.putIfAbsent(namespace, this.nameSpaceRegistry.getOrDefault(namespace, new HashSet<>()));
// 注册名称 -> 命名空间
this.nameSpaceRegistry.get(namespace).add(name);
LOCK.unlock();
}
/**
* 注销指定的 SQLManager 实例
*
* @param name 实例名称
*/
@Override
public void unregisterSQLManager(@NotNull String name) {
LOCK.lock();
for (Map.Entry<String, Set<String>> stringSetEntry : this.nameSpaceRegistry.entrySet()) {
stringSetEntry.getValue().remove(name);
}
this.nameSpaceRegistry.entrySet().removeIf(stringSetEntry -> stringSetEntry.getValue().isEmpty());
LOCK.unlock();
}
/**
* 注销指定命名空间下的所有 SQLManager 实例
*
* @param namespace 命名空间
*/
@Override
public void unregisterSQLManagerAll(@NotNull String namespace) {
LOCK.lock();
Set<String> names = this.nameSpaceRegistry.get(namespace);
if (names != null) {
// 删除所有的 SQLManager 实例
for (String name : names) {
this.sqlManagerRegistry.remove(name);
}
}
// 删除命名空间
this.nameSpaceRegistry.remove(namespace);
LOCK.unlock();
}
}

View File

@ -0,0 +1,9 @@
instances:
name1:
url: jdbc:mysql://localhost:3306/name1
username: mc
password: password
name2:
url: jdbc:mysql://localhost:3306/name2
username: mc
password: password

View File

@ -47,14 +47,6 @@
<version>2.2.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>cc.carm.lib</groupId>
<artifactId>easyplugin-main</artifactId>
<optional>true</optional>
<scope>compile</scope>
</dependency>
</dependencies>
<build>

View File

@ -1,4 +1,121 @@
package cc.carm.plugin.easysql;
public class EasySQLBukkit {
import cc.carm.lib.easysql.api.SQLManager;
import cc.carm.lib.easysql.manager.SQLManagerImpl;
import cc.carm.plugin.easysql.api.EasySQLAPI;
import cc.carm.plugin.easysql.api.EasySQLPluginPlatform;
import cn.beecp.BeeDataSource;
import org.bukkit.Bukkit;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.server.PluginDisableEvent;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class EasySQLBukkit extends JavaPlugin implements EasySQLPluginPlatform, Listener {
private EasySQLAPI apiImpl;
private boolean setup = false;
public void setup() {
if (setup) return;
apiImpl = new EasySQLManager(this);
saveDefaultConfig();
// 读取配置文件 - 预注册 instance
ConfigurationSection instancesConfig = getConfig().getConfigurationSection("instances");
if (instancesConfig != null) {
for (String instanceName : instancesConfig.getKeys(false)) {
SQLManager sqlManager = new SQLManagerImpl(
new BeeDataSource("com.mysql.jdbc.Driver"
, instancesConfig.getString("url")
, instancesConfig.getString("username")
, instancesConfig.getString("password")
)
);
this.register(this, instanceName, sqlManager);
}
}
// 获取指定UUID的玩家的盔甲
setup = true;
}
@Override
public void onLoad() {
setup(); // 尽可能早的初始化预注册的 SQLManager
}
@Override
public void onEnable() {
setup(); // 在特定情况下 Bukkit 可能不会调用 onLoad 函数
Bukkit.getPluginManager().registerEvents(this,this);
}
@Override
public void onDisable() {
getLogger().info("Shutting down...");
this.unregister(this);
apiImpl.getSQLManagers().keySet().forEach(apiImpl::unregisterSQLManager);
super.onDisable();
}
@EventHandler(priority = EventPriority.MONITOR)
public void onPluginDisable(PluginDisableEvent event){
this.unregister(event.getPlugin());
}
// =========== 平台注册方法 ===========
/**
* 注册 SQLManager 实例
* @param plugin 插件实例
* @param name SQLManager 映射名称
* @param sqlManager SQLManager 实例
*/
public void register(@NotNull Plugin plugin, @NotNull String name, @NotNull SQLManager sqlManager){
if(this.apiImpl.getSQLManagers().containsKey(name)){
// 名称冲突处理
throw new IllegalArgumentException("Instance name conflict: " + name+", Already registered by "+this.apiImpl.getNameSpace(name));
}
this.apiImpl.registerSQLManager(plugin.getDescription().getName(), name, sqlManager);
}
/**
* 注销指定 SQLManager 实例
* @param sqlManager SQLManager 实例
*/
public void unregister(@NotNull SQLManager sqlManager){
String name = this.apiImpl.getName(sqlManager);
if(name != null){
this.apiImpl.unregisterSQLManager(name);
}
}
/**
* 注销指定名称的 SQLManager
* @param name SQLManager 名称
*/
public void unregister(@NotNull String name){
this.apiImpl.unregisterSQLManager(name);
}
/**
* 注销指定插件注册的所有 SQLManager 实例
* @param plugin 插件
*/
public void unregister(@NotNull Plugin plugin){
this.apiImpl.unregisterSQLManagerAll(plugin.getName());
}
/**
* 获取 SQL 管理器
*
* @param name 注册键
* @return SQL管理器
*/
@Override
public @Nullable SQLManager getSqlManager(@NotNull String name) {
return this.apiImpl.getSQLManager(name);
}
}

View File

@ -1,4 +1,138 @@
package cc.carm.plugin.easysql;
public class EasySQLBungee {
import cc.carm.lib.easysql.api.SQLManager;
import cc.carm.lib.easysql.manager.SQLManagerImpl;
import cc.carm.plugin.easysql.api.EasySQLAPI;
import cc.carm.plugin.easysql.api.EasySQLPluginPlatform;
import cn.beecp.BeeDataSource;
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 org.jetbrains.annotations.Nullable;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
public class EasySQLBungee extends Plugin implements EasySQLPluginPlatform {
private EasySQLAPI apiImpl;
private boolean setup = false;
private void saveDefaultConfig(){
if (!getDataFolder().exists())
getDataFolder().mkdir();
File file = new File(getDataFolder(), "config.yml");
if (!file.exists()) {
try (InputStream in = getResourceAsStream("config.yml")) {
Files.copy(in, file.toPath());
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void setup() {
if (setup) return;
apiImpl = new EasySQLManager(this);
saveDefaultConfig();
// 读取配置文件 - 预注册 instance
Configuration configuration;
try {
configuration = ConfigurationProvider.getProvider(YamlConfiguration.class).load(new File(getDataFolder(), "config.yml"));
} catch (IOException e) {
e.printStackTrace();
return;
}
Configuration instancesConfig = configuration.getSection("instances");
if (instancesConfig != null) {
for (String instanceName : instancesConfig.getKeys()) {
SQLManager sqlManager = new SQLManagerImpl(
new BeeDataSource("com.mysql.jdbc.Driver"
, instancesConfig.getString("url")
, instancesConfig.getString("username")
, instancesConfig.getString("password")
)
);
this.register(this, instanceName, sqlManager);
}
}
setup = true;
}
@Override
public void onLoad() {
setup();
}
@Override
public void onEnable() {
setup();
}
@Override
public void onDisable() {
getLogger().info("Shutting down...");
this.unregister(this);
apiImpl.getSQLManagers().keySet().forEach(apiImpl::unregisterSQLManager);
super.onDisable();
}
// =========== 平台注册方法 ===========
/**
* 注册 SQLManager 实例
* @param plugin 插件实例
* @param name SQLManager 映射名称
* @param sqlManager SQLManager 实例
*/
public void register(@NotNull Plugin plugin, @NotNull String name, @NotNull SQLManager sqlManager){
if(this.apiImpl.getSQLManagers().containsKey(name)){
// 名称冲突处理
throw new IllegalArgumentException("Instance name conflict: " + name+", Already registered by "+this.apiImpl.getNameSpace(name));
}
this.apiImpl.registerSQLManager(plugin.getDescription().getName(), name, sqlManager);
}
/**
* 注销指定 SQLManager 实例
* @param sqlManager SQLManager 实例
*/
public void unregister(@NotNull SQLManager sqlManager){
String name = this.apiImpl.getName(sqlManager);
if(name != null){
this.apiImpl.unregisterSQLManager(name);
}
}
/**
* 注销指定名称的 SQLManager
* @param name SQLManager 名称
*/
public void unregister(@NotNull String name){
this.apiImpl.unregisterSQLManager(name);
}
/**
* 注销指定插件注册的所有 SQLManager 实例
* @param plugin 插件
*/
public void unregister(@NotNull Plugin plugin){
this.apiImpl.unregisterSQLManagerAll(plugin.getDescription().getName());
}
/**
* 获取 SQL 管理器
*
* @param name 注册键
* @return SQL管理器
*/
@Override
public @Nullable SQLManager getSqlManager(@NotNull String name) {
return this.apiImpl.getSQLManager(name);
}
}

View File

@ -2,16 +2,19 @@ package cc.carm.plugin.easysql;
import com.google.inject.Inject;
import com.velocitypowered.api.event.Subscribe;
import com.velocitypowered.api.event.proxy.ProxyInitializeEvent;
import com.velocitypowered.api.plugin.Plugin;
import com.velocitypowered.api.proxy.ProxyServer;
import java.util.logging.Logger;
@Plugin(id = "easysql-plugin", name = "EasySQL Plugin For Velocity", version = "1.0.0",
description = "",
url = "https://github.com/CarmJos/EasySQL-Plugin", authors = "CarmJos"
)
public class EasySQLVelocity {
public class EasySQLVelocity {
private static EasySQLVelocity instance;
@ -23,10 +26,10 @@ public class EasySQLVelocity {
instance = this;
this.server = server;
this.logger = logger;
// register listeners
server.getEventManager().register(this,this);
}
public static EasySQLVelocity getInstance() {
return instance;
}
@ -39,5 +42,8 @@ public class EasySQLVelocity {
return logger;
}
@Subscribe
public void onInitialize(ProxyInitializeEvent event) {
}
}

View File

@ -157,6 +157,13 @@
<version>${easysql.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0.1-jre</version>
</dependency>
</dependencies>
</dependencyManagement>