From 663a7d9588b2a1bc9f8083ed28099eaa83045133 Mon Sep 17 00:00:00 2001 From: mxd <838425805@qq.com> Date: Fri, 31 Dec 2021 19:45:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=BA=90=E6=B3=A8=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../starter/MagicAPIAutoConfiguration.java | 4 +- .../magicapi/model/DataSourceInfo.java | 2 +- .../impl/DataSourceMagicDynamicRegistry.java | 77 +++++++++++++++++-- 3 files changed, 75 insertions(+), 8 deletions(-) diff --git a/magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicAPIAutoConfiguration.java b/magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicAPIAutoConfiguration.java index 614ec474..25ddc55e 100644 --- a/magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicAPIAutoConfiguration.java +++ b/magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicAPIAutoConfiguration.java @@ -385,8 +385,8 @@ public class MagicAPIAutoConfiguration implements WebMvcConfigurer, WebSocketCon @Bean @ConditionalOnMissingBean - public DataSourceMagicDynamicRegistry dataSourceMagicDynamicRegistry(DataSourceInfoMagicResourceStorage dataSourceInfoMagicResourceStorage) { - return new DataSourceMagicDynamicRegistry(dataSourceInfoMagicResourceStorage); + public DataSourceMagicDynamicRegistry dataSourceMagicDynamicRegistry(DataSourceInfoMagicResourceStorage dataSourceInfoMagicResourceStorage, MagicDynamicDataSource magicDynamicDataSource) { + return new DataSourceMagicDynamicRegistry(dataSourceInfoMagicResourceStorage, magicDynamicDataSource); } diff --git a/magic-api/src/main/java/org/ssssssss/magicapi/model/DataSourceInfo.java b/magic-api/src/main/java/org/ssssssss/magicapi/model/DataSourceInfo.java index ad8f2b61..4d1ea462 100644 --- a/magic-api/src/main/java/org/ssssssss/magicapi/model/DataSourceInfo.java +++ b/magic-api/src/main/java/org/ssssssss/magicapi/model/DataSourceInfo.java @@ -25,7 +25,7 @@ public class DataSourceInfo extends MagicEntity { /** * 最多返回条数 */ - private int maxRows; + private int maxRows = -1; /** * 驱动类 diff --git a/magic-api/src/main/java/org/ssssssss/magicapi/service/impl/DataSourceMagicDynamicRegistry.java b/magic-api/src/main/java/org/ssssssss/magicapi/service/impl/DataSourceMagicDynamicRegistry.java index 3b0415b3..2cce9b09 100644 --- a/magic-api/src/main/java/org/ssssssss/magicapi/service/impl/DataSourceMagicDynamicRegistry.java +++ b/magic-api/src/main/java/org/ssssssss/magicapi/service/impl/DataSourceMagicDynamicRegistry.java @@ -1,15 +1,41 @@ package org.ssssssss.magicapi.service.impl; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.boot.context.properties.bind.Bindable; +import org.springframework.boot.context.properties.bind.Binder; +import org.springframework.boot.context.properties.source.ConfigurationPropertyName; +import org.springframework.boot.context.properties.source.ConfigurationPropertyNameAliases; +import org.springframework.boot.context.properties.source.ConfigurationPropertySource; +import org.springframework.boot.context.properties.source.MapConfigurationPropertySource; +import org.springframework.boot.jdbc.DatabaseDriver; import org.springframework.context.event.EventListener; +import org.springframework.util.ClassUtils; +import org.ssssssss.magicapi.config.MagicDynamicDataSource; import org.ssssssss.magicapi.event.FileEvent; import org.ssssssss.magicapi.model.DataSourceInfo; import org.ssssssss.magicapi.provider.MagicResourceStorage; import org.ssssssss.magicapi.service.AbstractMagicDynamicRegistry; +import javax.sql.DataSource; +import java.util.HashMap; +import java.util.Map; + public class DataSourceMagicDynamicRegistry extends AbstractMagicDynamicRegistry { - public DataSourceMagicDynamicRegistry(MagicResourceStorage magicResourceStorage) { + private final MagicDynamicDataSource magicDynamicDataSource; + + private static final ClassLoader CLASSLOADER = DataSourceMagicDynamicRegistry.class.getClassLoader(); + + // copy from DataSourceBuilder + private static final String[] DATA_SOURCE_TYPE_NAMES = new String[]{ + "com.zaxxer.hikari.HikariDataSource", + "org.apache.tomcat.jdbc.pool.DataSource", + "org.apache.commons.dbcp2.BasicDataSource"}; + + public DataSourceMagicDynamicRegistry(MagicResourceStorage magicResourceStorage, MagicDynamicDataSource magicDynamicDataSource) { super(magicResourceStorage); + this.magicDynamicDataSource = magicDynamicDataSource; } @EventListener(condition = "#event.type == 'datasource'") @@ -19,16 +45,57 @@ public class DataSourceMagicDynamicRegistry extends AbstractMagicDynamicRegistry @Override public boolean register(DataSourceInfo info) { - // mapping.register(mappingNode.getRequestMappingInfo()); - System.out.println("注册数据源:" + info.getKey()); + Map properties = new HashMap<>(info.getProperties()); + properties.put("url", info.getUrl()); + properties.put("username", info.getUsername()); + properties.put("password", info.getPassword()); + if (StringUtils.isBlank(info.getDriverClassName())) { + String driverClass = DatabaseDriver.fromJdbcUrl(info.getUrl()).getDriverClassName(); + properties.put("driverClassName", driverClass); + } else { + properties.put("driverClassName", info.getDriverClassName()); + } + DataSource datasource = createDataSource(getDataSourceType(info.getType()), properties); + magicDynamicDataSource.put(info.getId(), info.getKey(), info.getName(), datasource, info.getMaxRows()); return true; } @Override public boolean unregister(DataSourceInfo info) { - System.out.println("取消注册数据源:" + info.getKey()); - return true; + return magicDynamicDataSource.delete(info.getKey()); } + // copy from DataSourceBuilder + private DataSource createDataSource(Class dataSourceType, Map properties) { + DataSource dataSource = BeanUtils.instantiateClass(dataSourceType); + ConfigurationPropertySource source = new MapConfigurationPropertySource(properties); + ConfigurationPropertyNameAliases aliases = new ConfigurationPropertyNameAliases(); + aliases.addAliases("url", "jdbc-url"); + aliases.addAliases("username", "user"); + Binder binder = new Binder(source.withAliases(aliases)); + binder.bind(ConfigurationPropertyName.EMPTY, Bindable.ofInstance(dataSource)); + return dataSource; + } + + @SuppressWarnings("unchecked") + private Class getDataSourceType(String datasourceType) { + if (StringUtils.isNotBlank(datasourceType)) { + try { + return (Class) ClassUtils.forName(datasourceType, CLASSLOADER); + } catch (Exception ignored) { + + } + } + for (String name : DATA_SOURCE_TYPE_NAMES) { + try { + return (Class) ClassUtils.forName(name, CLASSLOADER); + } catch (Exception ignored) { + // ignored + } + } + return null; + } + + }