You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by wu...@apache.org on 2021/04/09 12:29:35 UTC

[shardingsphere] branch master updated: Can load authority from diff database types (#10013)

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 <te...@163.com>
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);