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);