This is an automated email from the ASF dual-hosted git repository.

wuweijie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new d970cc5  Can load authority from diff database types (#10013)
d970cc5 is described below

commit d970cc576b531be2dc21e6a43e98237aa00e487c
Author: Liang Zhang <[email protected]>
AuthorDate: Fri Apr 9 20:29:06 2021 +0800

    Can load authority from diff database types (#10013)
---
 .../authority/spi/PrivilegeLoadAlgorithm.java      |  4 +-
 .../storage/StoragePrivilegeLoadAlgorithm.java     |  5 +--
 .../storage/impl/StoragePrivilegeBuilder.java      | 46 ++++++++++++++++------
 .../authority/rule/AuthorityRule.java              |  6 +--
 .../rule/builder/AuthorityRuleBuilder.java         | 28 +------------
 .../authority/GovernanceAuthorityContext.java      |  2 +-
 6 files changed, 40 insertions(+), 51 deletions(-)

diff --git 
a/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-api/src/main/java/org/apache/shardingsphere/authority/spi/PrivilegeLoadAlgorithm.java
 
b/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-api/src/main/java/org/apache/shardingsphere/authority/spi/PrivilegeLoadAlgorithm.java
index 5839494..59f72b5 100644
--- 
a/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-api/src/main/java/org/apache/shardingsphere/authority/spi/PrivilegeLoadAlgorithm.java
+++ 
b/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-api/src/main/java/org/apache/shardingsphere/authority/spi/PrivilegeLoadAlgorithm.java
@@ -19,7 +19,6 @@ package org.apache.shardingsphere.authority.spi;
 
 import org.apache.shardingsphere.authority.model.ShardingSpherePrivileges;
 import 
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithm;
-import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.infra.metadata.user.ShardingSphereUser;
 
@@ -34,10 +33,9 @@ public interface PrivilegeLoadAlgorithm extends 
ShardingSphereAlgorithm {
     /**
      * Load privileges.
      * 
-     * @param databaseType database type
      * @param mataDataMap mata data map
      * @param users users
      * @return user and privileges map
      */
-    Map<ShardingSphereUser, ShardingSpherePrivileges> load(DatabaseType 
databaseType, Map<String, ShardingSphereMetaData> mataDataMap, 
Collection<ShardingSphereUser> users);
+    Map<ShardingSphereUser, ShardingSpherePrivileges> load(Map<String, 
ShardingSphereMetaData> mataDataMap, Collection<ShardingSphereUser> users);
 }
diff --git 
a/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/loader/storage/StoragePrivilegeLoadAlgorithm.java
 
b/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/loader/storage/StoragePrivilegeLoadAlgorithm.java
index f292626..65600c0 100644
--- 
a/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/loader/storage/StoragePrivilegeLoadAlgorithm.java
+++ 
b/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/loader/storage/StoragePrivilegeLoadAlgorithm.java
@@ -21,7 +21,6 @@ import 
org.apache.shardingsphere.authority.loader.storage.impl.StoragePrivilegeB
 import 
org.apache.shardingsphere.authority.loader.storage.impl.StoragePrivilegeLoader;
 import org.apache.shardingsphere.authority.model.ShardingSpherePrivileges;
 import org.apache.shardingsphere.authority.spi.PrivilegeLoadAlgorithm;
-import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.infra.metadata.user.ShardingSphereUser;
 import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
@@ -40,8 +39,8 @@ public final class StoragePrivilegeLoadAlgorithm implements 
PrivilegeLoadAlgorit
     }
     
     @Override
-    public Map<ShardingSphereUser, ShardingSpherePrivileges> load(final 
DatabaseType databaseType, final Map<String, ShardingSphereMetaData> 
mataDataMap, final Collection<ShardingSphereUser> users) {
-        return StoragePrivilegeBuilder.build(databaseType, new 
LinkedList<>(mataDataMap.values()), users);
+    public Map<ShardingSphereUser, ShardingSpherePrivileges> load(final 
Map<String, ShardingSphereMetaData> mataDataMap, final 
Collection<ShardingSphereUser> users) {
+        return StoragePrivilegeBuilder.build(new 
LinkedList<>(mataDataMap.values()), users);
     }
     
     @Override
diff --git 
a/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/loader/storage/impl/StoragePrivilegeBuilder.java
 
b/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/loader/storage/impl/StoragePrivilegeBuilder.java
index a19c60a..2eaa7241 100644
--- 
a/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/loader/storage/impl/StoragePrivilegeBuilder.java
+++ 
b/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/loader/storage/impl/StoragePrivilegeBuilder.java
@@ -17,10 +17,12 @@
 
 package org.apache.shardingsphere.authority.loader.storage.impl;
 
+import com.google.common.base.Preconditions;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import org.apache.shardingsphere.authority.model.ShardingSpherePrivileges;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import org.apache.shardingsphere.infra.database.type.DatabaseTypeRegistry;
 import org.apache.shardingsphere.infra.exception.ShardingSphereException;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.infra.metadata.user.ShardingSphereUser;
@@ -28,6 +30,8 @@ import 
org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
 import org.apache.shardingsphere.infra.spi.typed.TypedSPIRegistry;
 
 import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.SQLException;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -61,35 +65,51 @@ public final class StoragePrivilegeBuilder {
     /**
      * Build privileges.
      *
-     * @param databaseType database type
      * @param metaDataList meta data list
      * @param users users
      * @return privileges
      */
-    public static Map<ShardingSphereUser, ShardingSpherePrivileges> 
build(final DatabaseType databaseType,
-                                                                          
final Collection<ShardingSphereMetaData> metaDataList, final 
Collection<ShardingSphereUser> users) {
-        if (metaDataList.isEmpty()) {
-            return buildDefaultPrivileges(users);
-        }
-        Optional<StoragePrivilegeLoader> loader = 
TypedSPIRegistry.findRegisteredService(StoragePrivilegeLoader.class, 
databaseType.getName(), new Properties());
-        return loader.map(optional -> build(metaDataList, users, 
optional)).orElseGet(() -> buildDefaultPrivileges(users));
+    public static Map<ShardingSphereUser, ShardingSpherePrivileges> 
build(final Collection<ShardingSphereMetaData> metaDataList, final 
Collection<ShardingSphereUser> users) {
+        return metaDataList.isEmpty() ? buildDefaultPrivileges(users) : 
buildWithMetaData(metaDataList, users);
     }
     
-    private static Map<ShardingSphereUser, ShardingSpherePrivileges> 
build(final Collection<ShardingSphereMetaData> metaDataList,
-                                                                           
final Collection<ShardingSphereUser> users, final StoragePrivilegeLoader 
loader) {
+    private static Map<ShardingSphereUser, ShardingSpherePrivileges> 
buildWithMetaData(final Collection<ShardingSphereMetaData> metaDataList, final 
Collection<ShardingSphereUser> users) {
         Map<ShardingSphereUser, ShardingSpherePrivileges> result = new 
LinkedHashMap<>();
         for (ShardingSphereMetaData each : metaDataList) {
-            result.putAll(build(each, users, loader));
+            result.putAll(buildWithMetaData(each, users));
         }
         return result;
     }
     
-    private static Map<ShardingSphereUser, ShardingSpherePrivileges> 
build(final ShardingSphereMetaData metaData, final 
Collection<ShardingSphereUser> users, final StoragePrivilegeLoader loader) {
-        Map<ShardingSphereUser, Collection<ShardingSpherePrivileges>> result = 
load(metaData.getResource().getAllInstanceDataSources(), users, loader);
+    private static Map<ShardingSphereUser, ShardingSpherePrivileges> 
buildWithMetaData(final ShardingSphereMetaData metaData, final 
Collection<ShardingSphereUser> users) {
+        DatabaseType databaseType = 
getDatabaseType(metaData.getResource().getAllInstanceDataSources());
+        Optional<StoragePrivilegeLoader> loader = 
TypedSPIRegistry.findRegisteredService(StoragePrivilegeLoader.class, 
databaseType.getName(), new Properties());
+        if (!loader.isPresent()) {
+            return buildDefaultPrivileges(users);
+        }
+        Map<ShardingSphereUser, Collection<ShardingSpherePrivileges>> result = 
load(metaData.getResource().getAllInstanceDataSources(), users, loader.get());
         checkPrivileges(result);
         return StoragePrivilegeMerger.merge(result, metaData.getName(), 
metaData.getRuleMetaData().getRules());
     }
     
+    private static DatabaseType getDatabaseType(final Collection<DataSource> 
dataSources) {
+        DatabaseType result = null;
+        for (DataSource each : dataSources) {
+            DatabaseType databaseType = getDatabaseType(each);
+            Preconditions.checkState(null == result || result == databaseType, 
String.format("Database type inconsistent with '%s' and '%s'", result, 
databaseType));
+            result = databaseType;
+        }
+        return null == result ? DatabaseTypeRegistry.getDefaultDatabaseType() 
: result;
+    }
+    
+    private static DatabaseType getDatabaseType(final DataSource dataSource) {
+        try (Connection connection = dataSource.getConnection()) {
+            return 
DatabaseTypeRegistry.getDatabaseTypeByURL(connection.getMetaData().getURL());
+        } catch (final SQLException ex) {
+            return null;
+        }
+    }
+    
     private static Map<ShardingSphereUser, 
Collection<ShardingSpherePrivileges>> load(final Collection<DataSource> 
dataSources,
                                                                                
       final Collection<ShardingSphereUser> users, final StoragePrivilegeLoader 
loader) {
         Map<ShardingSphereUser, Collection<ShardingSpherePrivileges>> result = 
new LinkedHashMap<>(users.size(), 1);
diff --git 
a/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/rule/AuthorityRule.java
 
b/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/rule/AuthorityRule.java
index d0b3c8c..7386bb2 100644
--- 
a/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/rule/AuthorityRule.java
+++ 
b/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/rule/AuthorityRule.java
@@ -23,7 +23,6 @@ import 
org.apache.shardingsphere.authority.engine.ShardingSphereAuthority;
 import org.apache.shardingsphere.authority.engine.impl.DefaultAuthority;
 import org.apache.shardingsphere.authority.spi.PrivilegeLoadAlgorithm;
 import 
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmFactory;
-import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.infra.metadata.user.ShardingSphereUser;
 import org.apache.shardingsphere.infra.rule.scope.GlobalRule;
@@ -41,11 +40,10 @@ public final class AuthorityRule implements GlobalRule {
         ShardingSphereServiceLoader.register(PrivilegeLoadAlgorithm.class);
     }
     
-    public AuthorityRule(final AuthorityRuleConfiguration config, final 
Map<String, ShardingSphereMetaData> mataDataMap, final DatabaseType 
databaseType,
-                         final Collection<ShardingSphereUser> users) {
+    public AuthorityRule(final AuthorityRuleConfiguration config, final 
Map<String, ShardingSphereMetaData> mataDataMap, final 
Collection<ShardingSphereUser> users) {
         PrivilegeLoadAlgorithm privilegeLoader = 
ShardingSphereAlgorithmFactory.createAlgorithm(config.getPrivilegeLoader(), 
PrivilegeLoadAlgorithm.class);
         ShardingSphereAuthority authority = null == 
AuthorityContext.getInstance().getAuthority() ? new DefaultAuthority() : 
AuthorityContext.getInstance().getAuthority();
-        authority.init(privilegeLoader.load(databaseType, mataDataMap, users));
+        authority.init(privilegeLoader.load(mataDataMap, users));
         AuthorityContext.getInstance().init(authority);
     }
 }
diff --git 
a/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/rule/builder/AuthorityRuleBuilder.java
 
b/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/rule/builder/AuthorityRuleBuilder.java
index b136d26..5ebc416 100644
--- 
a/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/rule/builder/AuthorityRuleBuilder.java
+++ 
b/shardingsphere-features/shardingsphere-authority/shardingsphere-authority-common/src/main/java/org/apache/shardingsphere/authority/rule/builder/AuthorityRuleBuilder.java
@@ -17,20 +17,13 @@
 
 package org.apache.shardingsphere.authority.rule.builder;
 
-import com.google.common.base.Preconditions;
 import 
org.apache.shardingsphere.authority.api.config.AuthorityRuleConfiguration;
 import org.apache.shardingsphere.authority.constant.AuthorityOrder;
 import org.apache.shardingsphere.authority.rule.AuthorityRule;
-import org.apache.shardingsphere.infra.database.type.DatabaseType;
-import org.apache.shardingsphere.infra.database.type.DatabaseTypeRegistry;
-import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.infra.metadata.user.ShardingSphereUser;
 import org.apache.shardingsphere.infra.rule.builder.GlobalRuleBuilder;
 
-import javax.sql.DataSource;
-import java.sql.Connection;
-import java.sql.SQLException;
 import java.util.Collection;
 import java.util.Map;
 
@@ -41,26 +34,7 @@ public final class AuthorityRuleBuilder implements 
GlobalRuleBuilder<AuthorityRu
     
     @Override
     public AuthorityRule build(final Map<String, ShardingSphereMetaData> 
mataDataMap, final AuthorityRuleConfiguration ruleConfig, final 
Collection<ShardingSphereUser> users) {
-        DatabaseType databaseType = mataDataMap.isEmpty() ? new 
MySQLDatabaseType() : 
getDatabaseType(mataDataMap.values().iterator().next().getResource().getDataSources());
-        return new AuthorityRule(ruleConfig, mataDataMap, databaseType, users);
-    }
-    
-    private static DatabaseType getDatabaseType(final Map<String, DataSource> 
dataSourceMap) {
-        DatabaseType result = null;
-        for (DataSource each : dataSourceMap.values()) {
-            DatabaseType databaseType = getDatabaseType(each);
-            Preconditions.checkState(null == result || result == databaseType, 
String.format("Database type inconsistent with '%s' and '%s'", result, 
databaseType));
-            result = databaseType;
-        }
-        return null == result ? DatabaseTypeRegistry.getDefaultDatabaseType() 
: result;
-    }
-
-    private static DatabaseType getDatabaseType(final DataSource dataSource) {
-        try (Connection connection = dataSource.getConnection()) {
-            return 
DatabaseTypeRegistry.getDatabaseTypeByURL(connection.getMetaData().getURL());
-        } catch (final SQLException ex) {
-            return null;
-        }
+        return new AuthorityRule(ruleConfig, mataDataMap, users);
     }
     
     @Override
diff --git 
a/shardingsphere-governance/shardingsphere-governance-context/src/main/java/org/apache/shardingsphere/governance/context/authority/GovernanceAuthorityContext.java
 
b/shardingsphere-governance/shardingsphere-governance-context/src/main/java/org/apache/shardingsphere/governance/context/authority/GovernanceAuthorityContext.java
index ac4807b..d4a0e99 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-context/src/main/java/org/apache/shardingsphere/governance/context/authority/GovernanceAuthorityContext.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-context/src/main/java/org/apache/shardingsphere/governance/context/authority/GovernanceAuthorityContext.java
@@ -104,7 +104,7 @@ public final class GovernanceAuthorityContext implements 
MetaDataAwareEventSubsc
         Optional<StoragePrivilegeLoader> loader = 
TypedSPIRegistry.findRegisteredService(StoragePrivilegeLoader.class, 
databaseType.getName(), new Properties());
         // TODO :Authority, Loader is created here and still created in 
StoragePrivilegeBuilder
         if (loader.isPresent()) {
-            Map<ShardingSphereUser, ShardingSpherePrivileges> privileges = 
StoragePrivilegeBuilder.build(databaseType, 
metaDataContexts.getMetaDataMap().values(), users);
+            Map<ShardingSphereUser, ShardingSpherePrivileges> privileges = 
StoragePrivilegeBuilder.build(metaDataContexts.getMetaDataMap().values(), 
users);
             authority.init(getPrivilegesWithPassword(privileges));
         }
         AuthorityContext.getInstance().init(authority);

Reply via email to