You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2021/02/26 05:07:25 UTC

[shardingsphere] branch master updated: Refactor interface PrivilegeLoader (#9513)

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

zhangliang 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 0f7e429  Refactor interface PrivilegeLoader (#9513)
0f7e429 is described below

commit 0f7e42908c7e8acaf8611eceb3edd0ce91baf436
Author: Juan Pan(Trista) <pa...@apache.org>
AuthorDate: Fri Feb 26 13:06:06 2021 +0800

    Refactor interface PrivilegeLoader (#9513)
---
 .../metadata/auth/builder/PrivilegeBuilder.java    | 11 ++++++---
 .../auth/builder/loader/PrivilegeLoader.java       | 10 +++++++-
 .../auth/builder/loader/PrivilegeLoaderEngine.java | 20 +++++++---------
 .../MySQLPrivilegeLoader.java}                     | 28 ++++++++++++----------
 .../execute/CalciteExecutionContextGenerator.java  | 16 ++++++++-----
 5 files changed, 52 insertions(+), 33 deletions(-)

diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/builder/PrivilegeBuilder.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/builder/PrivilegeBuilder.java
index 41821a4..e3f939d 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/builder/PrivilegeBuilder.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/builder/PrivilegeBuilder.java
@@ -60,13 +60,18 @@ public final class PrivilegeBuilder {
      */
     public static Map<ShardingSphereUser, ShardingSpherePrivilege> build(final Collection<ShardingSphereMetaData> metaDatas,
                                                                          final Collection<ShardingSphereUser> users, final ConfigurationProperties props) {
-        Optional<PrivilegeLoader> loader = PrivilegeLoaderEngine.getPrivilegeLoader();
-        if (!loader.isPresent()) {
+        if (metaDatas.isEmpty()) {
             return getDefaultShardingSpherePrivileges(users);
         }
+        Optional<PrivilegeLoader> loader = PrivilegeLoaderEngine.getPrivilegeLoader(metaDatas.iterator().next().getResource().getDatabaseType());
+        return loader.map(privilegeLoader -> build(metaDatas, users, props, privilegeLoader)).orElseGet(() -> getDefaultShardingSpherePrivileges(users));
+    }
+    
+    private static Map<ShardingSphereUser, ShardingSpherePrivilege> build(final Collection<ShardingSphereMetaData> metaDatas,
+                                                                          final Collection<ShardingSphereUser> users, final ConfigurationProperties props, final PrivilegeLoader loader) {
         Map<ShardingSphereUser, ShardingSpherePrivilege> result = new LinkedHashMap<>();
         for (ShardingSphereMetaData each : metaDatas) {
-            result.putAll(build0(each, users, loader.get(), props));
+            result.putAll(build0(each, users, loader, props));
         }
         return result;
     }
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/builder/loader/PrivilegeLoader.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/builder/loader/PrivilegeLoader.java
index 0d652ba..a0d8cdc 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/builder/loader/PrivilegeLoader.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/builder/loader/PrivilegeLoader.java
@@ -17,8 +17,9 @@
 
 package org.apache.shardingsphere.infra.metadata.auth.builder.loader;
 
-import org.apache.shardingsphere.infra.metadata.auth.model.user.ShardingSphereUser;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.metadata.auth.model.privilege.ShardingSpherePrivilege;
+import org.apache.shardingsphere.infra.metadata.auth.model.user.ShardingSphereUser;
 
 import javax.sql.DataSource;
 import java.util.Optional;
@@ -29,6 +30,13 @@ import java.util.Optional;
 public interface PrivilegeLoader {
     
     /**
+     * Get database type.
+     *
+     * @return database type
+     */
+    DatabaseType getDatabaseType();
+    
+    /**
      * Load.
      *
      * @param user user
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/builder/loader/PrivilegeLoaderEngine.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/builder/loader/PrivilegeLoaderEngine.java
index f73512a..2b6e9c2 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/builder/loader/PrivilegeLoaderEngine.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/builder/loader/PrivilegeLoaderEngine.java
@@ -19,9 +19,9 @@ package org.apache.shardingsphere.infra.metadata.auth.builder.loader;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
-import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import org.apache.shardingsphere.infra.metadata.auth.builder.loader.dialect.MySQLPrivilegeLoader;
 
-import java.util.Collection;
 import java.util.Optional;
 
 /**
@@ -30,20 +30,18 @@ import java.util.Optional;
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public final class PrivilegeLoaderEngine {
     
-    static {
-        ShardingSphereServiceLoader.register(PrivilegeLoader.class);
-    }
-    
     /**
      * Get privilege loader.
      *
+     * @param databaseType database type
      * @return privilege loader
      */
-    public static Optional<PrivilegeLoader> getPrivilegeLoader() {
-        Collection<PrivilegeLoader> loaders = ShardingSphereServiceLoader.newServiceInstances(PrivilegeLoader.class);
-        if (loaders.isEmpty()) {
-            return Optional.empty();
+    public static Optional<PrivilegeLoader> getPrivilegeLoader(final DatabaseType databaseType) {
+        switch (databaseType.getName()) {
+            case "MySQL":
+                return Optional.of(new MySQLPrivilegeLoader());
+            default:
+                return Optional.empty();
         }
-        return Optional.of(loaders.iterator().next());
     }
 }
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/builder/loader/PrivilegeLoader.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/builder/loader/dialect/MySQLPrivilegeLoader.java
similarity index 64%
copy from shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/builder/loader/PrivilegeLoader.java
copy to shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/builder/loader/dialect/MySQLPrivilegeLoader.java
index 0d652ba..2868be4 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/builder/loader/PrivilegeLoader.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/builder/loader/dialect/MySQLPrivilegeLoader.java
@@ -15,25 +15,29 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.metadata.auth.builder.loader;
+package org.apache.shardingsphere.infra.metadata.auth.builder.loader.dialect;
 
-import org.apache.shardingsphere.infra.metadata.auth.model.user.ShardingSphereUser;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
+import org.apache.shardingsphere.infra.metadata.auth.builder.loader.PrivilegeLoader;
 import org.apache.shardingsphere.infra.metadata.auth.model.privilege.ShardingSpherePrivilege;
+import org.apache.shardingsphere.infra.metadata.auth.model.user.ShardingSphereUser;
 
 import javax.sql.DataSource;
 import java.util.Optional;
 
 /**
- * Privilege loader.
+ * MySQL privilege loader.
  */
-public interface PrivilegeLoader {
+public final class MySQLPrivilegeLoader implements PrivilegeLoader {
+    
+    @Override
+    public DatabaseType getDatabaseType() {
+        return new MySQLDatabaseType();
+    }
     
-    /**
-     * Load.
-     *
-     * @param user user
-     * @param dataSource data source
-     * @return sharding sphere privilege
-     */
-    Optional<ShardingSpherePrivilege> load(ShardingSphereUser user, DataSource dataSource);
+    @Override
+    public Optional<ShardingSpherePrivilege> load(final ShardingSphereUser user, final DataSource dataSource) {
+        return Optional.empty();
+    }
 }
diff --git a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/schema/table/execute/CalciteExecutionContextGenerator.java b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/schema/table/execute/CalciteExecutionContextGenerator.java
index 2100bbe..e3b63be 100644
--- a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/schema/table/execute/CalciteExecutionContextGenerator.java
+++ b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/schema/table/execute/CalciteExecutionContextGenerator.java
@@ -55,16 +55,20 @@ public final class CalciteExecutionContextGenerator {
     private Collection<ExecutionUnit> getExecutionUnits(final Collection<RouteUnit> routeUnits, final CalciteExecutionSQLGenerator filter) {
         Collection<ExecutionUnit> result = new LinkedHashSet<>();
         for (RouteUnit each: routeUnits) {
-            for (RouteMapper mapper : each.getTableMappers()) {
-                if (mapper.getLogicName().equals(table)) {
-                    result.add(new ExecutionUnit(each.getDataSourceMapper().getActualName(),
-                            new SQLUnit(filter.generate(mapper.getActualName()), Collections.emptyList(), Collections.singletonList(mapper))));
-                }
-            }
+            fillExecutionUnits(result, filter, each);
         }
         return result;
     }
     
+    private void fillExecutionUnits(final Collection<ExecutionUnit> executionUnits, final CalciteExecutionSQLGenerator filter, final RouteUnit routeUnit) {
+        for (RouteMapper mapper : routeUnit.getTableMappers()) {
+            if (mapper.getLogicName().equals(table)) {
+                executionUnits.add(new ExecutionUnit(routeUnit.getDataSourceMapper().getActualName(),
+                        new SQLUnit(filter.generate(mapper.getActualName()), Collections.emptyList(), Collections.singletonList(mapper))));
+            }
+        }
+    }
+    
     private RouteContext getRouteContext(final RouteContext routeContext) {
         RouteContext result = new RouteContext();
         result.getRouteUnits().addAll(getRouteUnits(routeContext));