You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by pa...@apache.org on 2021/08/28 03:59:32 UTC
[shardingsphere] branch master updated: Enhance of TypedSPI and
RequiredSPI (#12074)
This is an automated email from the ASF dual-hosted git repository.
panjuan 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 8f4d55c Enhance of TypedSPI and RequiredSPI (#12074)
8f4d55c is described below
commit 8f4d55cfb1c346c0864d320c6b6e9bdaae3b38c4
Author: Liang Zhang <te...@163.com>
AuthorDate: Sat Aug 28 11:58:56 2021 +0800
Enhance of TypedSPI and RequiredSPI (#12074)
---
.../dbdiscovery/rule/DatabaseDiscoveryRule.java | 20 ++++++-------
.../route/DatabaseDiscoverySQLRouterTest.java | 35 +++++++++++-----------
.../rule/DatabaseDiscoveryRuleTest.java | 27 ++++++++---------
.../builder/DatabaseDiscoveryRuleBuilderTest.java | 12 ++++----
.../spi/ReplicaLoadBalanceAlgorithm.java | 3 +-
.../RoundRobinReplicaLoadBalanceAlgorithm.java | 5 ++++
.../rule/ReadwriteSplittingRule.java | 6 ++--
.../sharding/spi/KeyGenerateAlgorithm.java | 3 +-
.../keygen/SnowflakeKeyGenerateAlgorithm.java | 5 ++++
.../shardingsphere/sharding/rule/ShardingRule.java | 20 ++++++-------
.../shardingsphere/spi/required/RequiredSPI.java | 4 ++-
.../spi/required/RequiredSPIRegistry.java | 2 +-
.../shardingsphere/spi/typed/TypedSPIRegistry.java | 15 ----------
.../spi/required/RequiredSPIRegistryTest.java | 4 +--
.../spi/typed/TypedSPIRegistryTest.java | 23 +++-----------
15 files changed, 83 insertions(+), 101 deletions(-)
diff --git a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/main/java/org/apache/shardingsphere/dbdiscovery/rule/DatabaseDiscoveryRule.java b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/main/java/org/apache/shardingsphere/dbdiscovery/rule/DatabaseDiscoveryRule.java
index 127d136..b2430cc 100644
--- a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/main/java/org/apache/shardingsphere/dbdiscovery/rule/DatabaseDiscoveryRule.java
+++ b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/main/java/org/apache/shardingsphere/dbdiscovery/rule/DatabaseDiscoveryRule.java
@@ -18,7 +18,6 @@
package org.apache.shardingsphere.dbdiscovery.rule;
import com.google.common.base.Preconditions;
-import com.google.common.base.Strings;
import lombok.Getter;
import org.apache.shardingsphere.dbdiscovery.algorithm.config.AlgorithmProvidedDatabaseDiscoveryRuleConfiguration;
import org.apache.shardingsphere.dbdiscovery.api.config.DatabaseDiscoveryRuleConfiguration;
@@ -37,7 +36,6 @@ import org.apache.shardingsphere.infra.rule.identifier.scope.SchemaRule;
import org.apache.shardingsphere.infra.rule.identifier.type.DataSourceContainedRule;
import org.apache.shardingsphere.infra.rule.identifier.type.StatusContainedRule;
import org.apache.shardingsphere.spi.ShardingSphereServiceLoader;
-import org.apache.shardingsphere.spi.typed.TypedSPIRegistry;
import javax.sql.DataSource;
import java.sql.SQLException;
@@ -64,15 +62,15 @@ public final class DatabaseDiscoveryRule implements FeatureRule, SchemaRule, Dat
private final Map<String, DatabaseDiscoveryDataSourceRule> dataSourceRules;
public DatabaseDiscoveryRule(final DatabaseDiscoveryRuleConfiguration config, final DatabaseType databaseType, final Map<String, DataSource> dataSourceMap, final String schemaName) {
- Preconditions.checkArgument(!config.getDataSources().isEmpty(), "HA data source rules can not be empty.");
- Preconditions.checkArgument(null != dataSourceMap && !dataSourceMap.isEmpty(), "Data sources cannot be empty.");
- Preconditions.checkArgument(null != databaseType, "Database type cannot be null.");
+ Preconditions.checkArgument(!config.getDataSources().isEmpty(), "database discovery rules can not be empty.");
+ Preconditions.checkArgument(null != dataSourceMap && !dataSourceMap.isEmpty(), "Data sources of cannot be empty.");
+ Preconditions.checkNotNull(databaseType, "Database type cannot be null.");
config.getDiscoveryTypes().forEach((key, value) -> discoveryTypes.put(key, ShardingSphereAlgorithmFactory.createAlgorithm(value, DatabaseDiscoveryType.class)));
dataSourceRules = new HashMap<>(config.getDataSources().size(), 1);
for (DatabaseDiscoveryDataSourceRuleConfiguration each : config.getDataSources()) {
- DatabaseDiscoveryType databaseDiscoveryType = Strings.isNullOrEmpty(each.getDiscoveryTypeName()) || !discoveryTypes.containsKey(each.getDiscoveryTypeName())
- ? TypedSPIRegistry.getRegisteredService(DatabaseDiscoveryType.class) : discoveryTypes.get(each.getDiscoveryTypeName());
- dataSourceRules.put(each.getName(), new DatabaseDiscoveryDataSourceRule(each, databaseDiscoveryType));
+ Preconditions.checkNotNull(each.getDiscoveryTypeName(), "Discovery type cannot be null of rule name `%s`.", each.getName());
+ Preconditions.checkArgument(discoveryTypes.containsKey(each.getDiscoveryTypeName()), "Can not find discovery type of rule name `%s`.", each.getName());
+ dataSourceRules.put(each.getName(), new DatabaseDiscoveryDataSourceRule(each, discoveryTypes.get(each.getDiscoveryTypeName())));
}
for (Entry<String, DatabaseDiscoveryDataSourceRule> entry : dataSourceRules.entrySet()) {
String groupName = entry.getKey();
@@ -101,9 +99,9 @@ public final class DatabaseDiscoveryRule implements FeatureRule, SchemaRule, Dat
Preconditions.checkArgument(null != databaseType, "Database type cannot be null.");
dataSourceRules = new HashMap<>(config.getDataSources().size(), 1);
for (DatabaseDiscoveryDataSourceRuleConfiguration each : config.getDataSources()) {
- DatabaseDiscoveryType databaseDiscoveryType = Strings.isNullOrEmpty(each.getDiscoveryTypeName()) || !discoveryTypes.containsKey(each.getDiscoveryTypeName())
- ? TypedSPIRegistry.getRegisteredService(DatabaseDiscoveryType.class) : discoveryTypes.get(each.getDiscoveryTypeName());
- dataSourceRules.put(each.getName(), new DatabaseDiscoveryDataSourceRule(each, databaseDiscoveryType));
+ Preconditions.checkNotNull(each.getDiscoveryTypeName(), "Discovery type cannot be null of rule name `%s`.", each.getName());
+ Preconditions.checkArgument(discoveryTypes.containsKey(each.getDiscoveryTypeName()), "Can not find discovery type of rule name `%s`.", each.getName());
+ dataSourceRules.put(each.getName(), new DatabaseDiscoveryDataSourceRule(each, discoveryTypes.get(each.getDiscoveryTypeName())));
}
for (Entry<String, DatabaseDiscoveryDataSourceRule> entry : dataSourceRules.entrySet()) {
String groupName = entry.getKey();
diff --git a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/test/java/org/apache/shardingsphere/dbdiscovery/route/DatabaseDiscoverySQLRouterTest.java b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/test/java/org/apache/shardingsphere/dbdiscovery/route/DatabaseDiscoverySQLRouterTest.java
index 2934d9e..ec69fc8 100644
--- a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/test/java/org/apache/shardingsphere/dbdiscovery/route/DatabaseDiscoverySQLRouterTest.java
+++ b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/test/java/org/apache/shardingsphere/dbdiscovery/route/DatabaseDiscoverySQLRouterTest.java
@@ -22,6 +22,7 @@ import org.apache.shardingsphere.dbdiscovery.api.config.rule.DatabaseDiscoveryDa
import org.apache.shardingsphere.dbdiscovery.rule.DatabaseDiscoveryRule;
import org.apache.shardingsphere.infra.binder.LogicSQL;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
+import org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
import org.apache.shardingsphere.infra.config.properties.ConfigurationProperties;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
@@ -54,11 +55,11 @@ import static org.mockito.Mockito.mock;
@RunWith(MockitoJUnitRunner.class)
public final class DatabaseDiscoverySQLRouterTest {
- private static final String DATASOURCE_NAME = "ds";
+ private static final String DATA_SOURCE_NAME = "ds";
- private static final String NONE_DB_DISCOVERY_DATASOURCE_NAME = "noneDatabaseDiscoveryDatasource";
+ private static final String NONE_DB_DISCOVERY_DATA_SOURCE_NAME = "noneDatabaseDiscoveryDatasource";
- private static final String PRIMARY_DATASOURCE = "primary";
+ private static final String PRIMARY_DATA_SOURCE = "primary";
private DatabaseDiscoveryRule rule;
@@ -73,11 +74,11 @@ public final class DatabaseDiscoverySQLRouterTest {
@Before
public void setUp() {
- DatabaseDiscoveryDataSourceRuleConfiguration databaseDiscoveryDataSourceRuleConfiguration
- = new DatabaseDiscoveryDataSourceRuleConfiguration(DATASOURCE_NAME, Collections.singletonList(PRIMARY_DATASOURCE), "discoveryTypeName");
- DatabaseDiscoveryRuleConfiguration databaseDiscoveryRuleConfiguration
- = new DatabaseDiscoveryRuleConfiguration(Collections.singleton(databaseDiscoveryDataSourceRuleConfiguration), Collections.emptyMap());
- rule = new DatabaseDiscoveryRule(databaseDiscoveryRuleConfiguration, mock(DatabaseType.class), Collections.singletonMap("ds", mock(DataSource.class)), "ha_db");
+ DatabaseDiscoveryDataSourceRuleConfiguration dataSourceConfig
+ = new DatabaseDiscoveryDataSourceRuleConfiguration(DATA_SOURCE_NAME, Collections.singletonList(PRIMARY_DATA_SOURCE), "TEST");
+ ShardingSphereAlgorithmConfiguration algorithmConfig = new ShardingSphereAlgorithmConfiguration("TEST", new Properties());
+ DatabaseDiscoveryRuleConfiguration config = new DatabaseDiscoveryRuleConfiguration(Collections.singleton(dataSourceConfig), Collections.singletonMap("TEST", algorithmConfig));
+ rule = new DatabaseDiscoveryRule(config, mock(DatabaseType.class), Collections.singletonMap("ds", mock(DataSource.class)), "TEST");
sqlRouter = (DatabaseDiscoverySQLRouter) OrderedSPIRegistry.getRegisteredServices(SQLRouter.class, Collections.singleton(rule)).get(rule);
}
@@ -88,7 +89,7 @@ public final class DatabaseDiscoverySQLRouterTest {
mock(ShardingSphereResource.class, RETURNS_DEEP_STUBS), new ShardingSphereRuleMetaData(Collections.emptyList(), Collections.singleton(rule)), mock(ShardingSphereSchema.class));
RouteContext actual = sqlRouter.createRouteContext(logicSQL, metaData, rule, new ConfigurationProperties(new Properties()));
Iterator<String> routedDataSourceNames = actual.getActualDataSourceNames().iterator();
- assertThat(routedDataSourceNames.next(), is(PRIMARY_DATASOURCE));
+ assertThat(routedDataSourceNames.next(), is(PRIMARY_DATA_SOURCE));
}
@Test
@@ -99,8 +100,8 @@ public final class DatabaseDiscoverySQLRouterTest {
mock(ShardingSphereResource.class, RETURNS_DEEP_STUBS), new ShardingSphereRuleMetaData(Collections.emptyList(), Collections.singleton(rule)), mock(ShardingSphereSchema.class));
sqlRouter.decorateRouteContext(actual, logicSQL, metaData, rule, new ConfigurationProperties(new Properties()));
Iterator<String> routedDataSourceNames = actual.getActualDataSourceNames().iterator();
- assertThat(routedDataSourceNames.next(), is(NONE_DB_DISCOVERY_DATASOURCE_NAME));
- assertThat(routedDataSourceNames.next(), is(PRIMARY_DATASOURCE));
+ assertThat(routedDataSourceNames.next(), is(NONE_DB_DISCOVERY_DATA_SOURCE_NAME));
+ assertThat(routedDataSourceNames.next(), is(PRIMARY_DATA_SOURCE));
}
@Test
@@ -110,7 +111,7 @@ public final class DatabaseDiscoverySQLRouterTest {
mock(ShardingSphereResource.class, RETURNS_DEEP_STUBS), new ShardingSphereRuleMetaData(Collections.emptyList(), Collections.singleton(rule)), mock(ShardingSphereSchema.class));
RouteContext actual = sqlRouter.createRouteContext(logicSQL, metaData, rule, new ConfigurationProperties(new Properties()));
Iterator<String> routedDataSourceNames = actual.getActualDataSourceNames().iterator();
- assertThat(routedDataSourceNames.next(), is(PRIMARY_DATASOURCE));
+ assertThat(routedDataSourceNames.next(), is(PRIMARY_DATA_SOURCE));
}
@Test
@@ -121,8 +122,8 @@ public final class DatabaseDiscoverySQLRouterTest {
mock(ShardingSphereResource.class, RETURNS_DEEP_STUBS), new ShardingSphereRuleMetaData(Collections.emptyList(), Collections.singleton(rule)), mock(ShardingSphereSchema.class));
sqlRouter.decorateRouteContext(actual, logicSQL, metaData, rule, new ConfigurationProperties(new Properties()));
Iterator<String> routedDataSourceNames = actual.getActualDataSourceNames().iterator();
- assertThat(routedDataSourceNames.next(), is(NONE_DB_DISCOVERY_DATASOURCE_NAME));
- assertThat(routedDataSourceNames.next(), is(PRIMARY_DATASOURCE));
+ assertThat(routedDataSourceNames.next(), is(NONE_DB_DISCOVERY_DATA_SOURCE_NAME));
+ assertThat(routedDataSourceNames.next(), is(PRIMARY_DATA_SOURCE));
}
@Test
@@ -132,14 +133,14 @@ public final class DatabaseDiscoverySQLRouterTest {
mock(ShardingSphereResource.class, RETURNS_DEEP_STUBS), new ShardingSphereRuleMetaData(Collections.emptyList(), Collections.singleton(rule)), mock(ShardingSphereSchema.class));
RouteContext actual = sqlRouter.createRouteContext(logicSQL, metaData, rule, new ConfigurationProperties(new Properties()));
Iterator<String> routedDataSourceNames = actual.getActualDataSourceNames().iterator();
- assertThat(routedDataSourceNames.next(), is(PRIMARY_DATASOURCE));
+ assertThat(routedDataSourceNames.next(), is(PRIMARY_DATA_SOURCE));
}
private RouteContext mockRouteContext() {
RouteContext result = new RouteContext();
- RouteUnit routeUnit = new RouteUnit(new RouteMapper(DATASOURCE_NAME, DATASOURCE_NAME), Collections.singletonList(new RouteMapper("table", "table_0")));
+ RouteUnit routeUnit = new RouteUnit(new RouteMapper(DATA_SOURCE_NAME, DATA_SOURCE_NAME), Collections.singletonList(new RouteMapper("table", "table_0")));
result.getRouteUnits().add(routeUnit);
- result.getRouteUnits().add(new RouteUnit(new RouteMapper(NONE_DB_DISCOVERY_DATASOURCE_NAME, NONE_DB_DISCOVERY_DATASOURCE_NAME), Collections.emptyList()));
+ result.getRouteUnits().add(new RouteUnit(new RouteMapper(NONE_DB_DISCOVERY_DATA_SOURCE_NAME, NONE_DB_DISCOVERY_DATA_SOURCE_NAME), Collections.emptyList()));
return result;
}
}
diff --git a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/test/java/org/apache/shardingsphere/dbdiscovery/rule/DatabaseDiscoveryRuleTest.java b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/test/java/org/apache/shardingsphere/dbdiscovery/rule/DatabaseDiscoveryRuleTest.java
index 7448001..9d72fb3 100644
--- a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/test/java/org/apache/shardingsphere/dbdiscovery/rule/DatabaseDiscoveryRuleTest.java
+++ b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/test/java/org/apache/shardingsphere/dbdiscovery/rule/DatabaseDiscoveryRuleTest.java
@@ -49,22 +49,14 @@ public final class DatabaseDiscoveryRuleTest {
@Test
public void assertFindDataSourceRule() {
- Optional<DatabaseDiscoveryDataSourceRule> actual = createHARule().findDataSourceRule("test_pr");
+ Optional<DatabaseDiscoveryDataSourceRule> actual = createRule().findDataSourceRule("test_pr");
assertTrue(actual.isPresent());
assertDataSourceRule(actual.get());
}
@Test
public void assertGetSingleDataSourceRule() {
- assertDataSourceRule(createHARule().getSingleDataSourceRule());
- }
-
- private DatabaseDiscoveryRule createHARule() {
- DatabaseDiscoveryDataSourceRuleConfiguration config =
- new DatabaseDiscoveryDataSourceRuleConfiguration("test_pr", Arrays.asList("ds_0", "ds_1"), "discoveryTypeName");
- return new DatabaseDiscoveryRule(new DatabaseDiscoveryRuleConfiguration(
- Collections.singleton(config), ImmutableMap.of("mgr", new ShardingSphereAlgorithmConfiguration("MGR", new Properties()))),
- mock(DatabaseType.class), dataSourceMap, "ha_db");
+ assertDataSourceRule(createRule().getSingleDataSourceRule());
}
private void assertDataSourceRule(final DatabaseDiscoveryDataSourceRule actual) {
@@ -74,21 +66,21 @@ public final class DatabaseDiscoveryRuleTest {
@Test
public void assertUpdateRuleStatusWithNotExistDataSource() {
- DatabaseDiscoveryRule databaseDiscoveryRule = createHARule();
+ DatabaseDiscoveryRule databaseDiscoveryRule = createRule();
databaseDiscoveryRule.updateRuleStatus(new DataSourceNameDisabledEvent("db", true));
assertThat(databaseDiscoveryRule.getSingleDataSourceRule().getDataSourceNames(), is(Arrays.asList("ds_0", "ds_1")));
}
@Test
public void assertUpdateRuleStatus() {
- DatabaseDiscoveryRule databaseDiscoveryRule = createHARule();
+ DatabaseDiscoveryRule databaseDiscoveryRule = createRule();
databaseDiscoveryRule.updateRuleStatus(new DataSourceNameDisabledEvent("ds_0", true));
assertThat(databaseDiscoveryRule.getSingleDataSourceRule().getDataSourceNames(), is(Collections.singletonList("ds_1")));
}
@Test
public void assertUpdateRuleStatusWithEnable() {
- DatabaseDiscoveryRule databaseDiscoveryRule = createHARule();
+ DatabaseDiscoveryRule databaseDiscoveryRule = createRule();
databaseDiscoveryRule.updateRuleStatus(new DataSourceNameDisabledEvent("ds_0", true));
assertThat(databaseDiscoveryRule.getSingleDataSourceRule().getDataSourceNames(), is(Collections.singletonList("ds_1")));
databaseDiscoveryRule.updateRuleStatus(new DataSourceNameDisabledEvent("ds_0", false));
@@ -97,9 +89,16 @@ public final class DatabaseDiscoveryRuleTest {
@Test
public void assertGetDataSourceMapper() {
- DatabaseDiscoveryRule databaseDiscoveryRule = createHARule();
+ DatabaseDiscoveryRule databaseDiscoveryRule = createRule();
Map<String, Collection<String>> actual = databaseDiscoveryRule.getDataSourceMapper();
Map<String, Collection<String>> expected = ImmutableMap.of("test_pr", Arrays.asList("ds_0", "ds_1"));
assertThat(actual, is(expected));
}
+
+ private DatabaseDiscoveryRule createRule() {
+ DatabaseDiscoveryDataSourceRuleConfiguration config = new DatabaseDiscoveryDataSourceRuleConfiguration("test_pr", Arrays.asList("ds_0", "ds_1"), "TEST");
+ return new DatabaseDiscoveryRule(new DatabaseDiscoveryRuleConfiguration(
+ Collections.singleton(config), ImmutableMap.of("TEST", new ShardingSphereAlgorithmConfiguration("TEST", new Properties()))),
+ mock(DatabaseType.class), dataSourceMap, "ha_db");
+ }
}
diff --git a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/test/java/org/apache/shardingsphere/dbdiscovery/rule/builder/DatabaseDiscoveryRuleBuilderTest.java b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/test/java/org/apache/shardingsphere/dbdiscovery/rule/builder/DatabaseDiscoveryRuleBuilderTest.java
index 29cf380..38b0bfb 100644
--- a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/test/java/org/apache/shardingsphere/dbdiscovery/rule/builder/DatabaseDiscoveryRuleBuilderTest.java
+++ b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/test/java/org/apache/shardingsphere/dbdiscovery/rule/builder/DatabaseDiscoveryRuleBuilderTest.java
@@ -20,6 +20,7 @@ package org.apache.shardingsphere.dbdiscovery.rule.builder;
import org.apache.shardingsphere.dbdiscovery.api.config.DatabaseDiscoveryRuleConfiguration;
import org.apache.shardingsphere.dbdiscovery.api.config.rule.DatabaseDiscoveryDataSourceRuleConfiguration;
import org.apache.shardingsphere.dbdiscovery.rule.DatabaseDiscoveryRule;
+import org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
import org.apache.shardingsphere.infra.config.properties.ConfigurationProperties;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.rule.builder.ShardingSphereRulesBuilderMaterials;
@@ -37,7 +38,6 @@ import java.util.Properties;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
public final class DatabaseDiscoveryRuleBuilderTest {
@@ -48,13 +48,13 @@ public final class DatabaseDiscoveryRuleBuilderTest {
@SuppressWarnings({"rawtypes", "unchecked"})
@Test
public void assertBuild() {
- DatabaseDiscoveryRuleConfiguration ruleConfig = mock(DatabaseDiscoveryRuleConfiguration.class);
- DatabaseDiscoveryDataSourceRuleConfiguration dataSourceRuleConfig = new DatabaseDiscoveryDataSourceRuleConfiguration("name", Collections.singletonList("name"), "discoveryTypeName");
- when(ruleConfig.getDataSources()).thenReturn(Collections.singletonList(dataSourceRuleConfig));
- SchemaRuleBuilder builder = OrderedSPIRegistry.getRegisteredServices(SchemaRuleBuilder.class, Collections.singletonList(ruleConfig)).get(ruleConfig);
+ DatabaseDiscoveryDataSourceRuleConfiguration dataSourceConfig = new DatabaseDiscoveryDataSourceRuleConfiguration("name", Collections.singletonList("name"), "TEST");
+ DatabaseDiscoveryRuleConfiguration config = new DatabaseDiscoveryRuleConfiguration(
+ Collections.singleton(dataSourceConfig), Collections.singletonMap("TEST", new ShardingSphereAlgorithmConfiguration("TEST", new Properties())));
+ SchemaRuleBuilder builder = OrderedSPIRegistry.getRegisteredServices(SchemaRuleBuilder.class, Collections.singletonList(config)).get(config);
Map<String, DataSource> dataSourceMap = new HashMap<>(1, 1);
dataSourceMap.put("primaryDataSourceName", mock(DataSource.class));
assertThat(builder.build(new ShardingSphereRulesBuilderMaterials("test_schema", Collections.emptyList(), mock(DatabaseType.class),
- dataSourceMap, new ConfigurationProperties(new Properties())), ruleConfig, Collections.emptyList()), instanceOf(DatabaseDiscoveryRule.class));
+ dataSourceMap, new ConfigurationProperties(new Properties())), config, Collections.emptyList()), instanceOf(DatabaseDiscoveryRule.class));
}
}
diff --git a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-api/src/main/java/org/apache/shardingsphere/readwritesplitting/spi/ReplicaLoadBalanceAlgorithm.java b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-api/src/main/java/org/apache/shardingsphere/readwritesplitting/spi/ReplicaLoadBalanceAlgorithm.java
index 2e582f8..a0d6def 100644
--- a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-api/src/main/java/org/apache/shardingsphere/readwritesplitting/spi/ReplicaLoadBalanceAlgorithm.java
+++ b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-api/src/main/java/org/apache/shardingsphere/readwritesplitting/spi/ReplicaLoadBalanceAlgorithm.java
@@ -18,13 +18,14 @@
package org.apache.shardingsphere.readwritesplitting.spi;
import org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithm;
+import org.apache.shardingsphere.spi.required.RequiredSPI;
import java.util.List;
/**
* Replica load-balance algorithm.
*/
-public interface ReplicaLoadBalanceAlgorithm extends ShardingSphereAlgorithm {
+public interface ReplicaLoadBalanceAlgorithm extends ShardingSphereAlgorithm, RequiredSPI {
/**
* Get data source.
diff --git a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/RoundRobinReplicaLoadBalanceAlgorithm.java b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/RoundRobinReplicaLoadBalanceAlgorithm.java
index b32dd3c..55238cc 100644
--- a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/RoundRobinReplicaLoadBalanceAlgorithm.java
+++ b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/RoundRobinReplicaLoadBalanceAlgorithm.java
@@ -49,4 +49,9 @@ public final class RoundRobinReplicaLoadBalanceAlgorithm implements ReplicaLoadB
public String getType() {
return "ROUND_ROBIN";
}
+
+ @Override
+ public boolean isDefault() {
+ return true;
+ }
}
diff --git a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java
index 16da173..e088c6b 100644
--- a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java
+++ b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java
@@ -31,7 +31,7 @@ import org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleCo
import org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
import org.apache.shardingsphere.readwritesplitting.spi.ReplicaLoadBalanceAlgorithm;
import org.apache.shardingsphere.spi.ShardingSphereServiceLoader;
-import org.apache.shardingsphere.spi.typed.TypedSPIRegistry;
+import org.apache.shardingsphere.spi.required.RequiredSPIRegistry;
import java.util.Collection;
import java.util.HashMap;
@@ -60,7 +60,7 @@ public final class ReadwriteSplittingRule implements FeatureRule, SchemaRule, Da
for (ReadwriteSplittingDataSourceRuleConfiguration each : ruleConfig.getDataSources()) {
// TODO check if can not find load balancer should throw exception.
ReplicaLoadBalanceAlgorithm loadBalanceAlgorithm = Strings.isNullOrEmpty(each.getLoadBalancerName()) || !loadBalancers.containsKey(each.getLoadBalancerName())
- ? TypedSPIRegistry.getRegisteredService(ReplicaLoadBalanceAlgorithm.class) : loadBalancers.get(each.getLoadBalancerName());
+ ? RequiredSPIRegistry.getRegisteredService(ReplicaLoadBalanceAlgorithm.class) : loadBalancers.get(each.getLoadBalancerName());
dataSourceRules.put(each.getName(), new ReadwriteSplittingDataSourceRule(each, loadBalanceAlgorithm));
}
}
@@ -72,7 +72,7 @@ public final class ReadwriteSplittingRule implements FeatureRule, SchemaRule, Da
for (ReadwriteSplittingDataSourceRuleConfiguration each : ruleConfig.getDataSources()) {
// TODO check if can not find load balancer should throw exception.
ReplicaLoadBalanceAlgorithm loadBalanceAlgorithm = Strings.isNullOrEmpty(each.getLoadBalancerName()) || !loadBalancers.containsKey(each.getLoadBalancerName())
- ? TypedSPIRegistry.getRegisteredService(ReplicaLoadBalanceAlgorithm.class) : loadBalancers.get(each.getLoadBalancerName());
+ ? RequiredSPIRegistry.getRegisteredService(ReplicaLoadBalanceAlgorithm.class) : loadBalancers.get(each.getLoadBalancerName());
dataSourceRules.put(each.getName(), new ReadwriteSplittingDataSourceRule(each, loadBalanceAlgorithm));
}
}
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-api/src/main/java/org/apache/shardingsphere/sharding/spi/KeyGenerateAlgorithm.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-api/src/main/java/org/apache/shardingsphere/sharding/spi/KeyGenerateAlgorithm.java
index 4865f7a..3a91b84 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-api/src/main/java/org/apache/shardingsphere/sharding/spi/KeyGenerateAlgorithm.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-api/src/main/java/org/apache/shardingsphere/sharding/spi/KeyGenerateAlgorithm.java
@@ -19,11 +19,12 @@ package org.apache.shardingsphere.sharding.spi;
import org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithm;
import org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmPostProcessor;
+import org.apache.shardingsphere.spi.required.RequiredSPI;
/**
* Key generate algorithm.
*/
-public interface KeyGenerateAlgorithm extends ShardingSphereAlgorithm, ShardingSphereAlgorithmPostProcessor {
+public interface KeyGenerateAlgorithm extends ShardingSphereAlgorithm, ShardingSphereAlgorithmPostProcessor, RequiredSPI {
/**
* Generate key.
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/keygen/SnowflakeKeyGenerateAlgorithm.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/keygen/SnowflakeKeyGenerateAlgorithm.java
index 09da258..2da78a3 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/keygen/SnowflakeKeyGenerateAlgorithm.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/keygen/SnowflakeKeyGenerateAlgorithm.java
@@ -163,4 +163,9 @@ public final class SnowflakeKeyGenerateAlgorithm implements KeyGenerateAlgorithm
public String getType() {
return "SNOWFLAKE";
}
+
+ @Override
+ public boolean isDefault() {
+ return true;
+ }
}
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
index 17038eb..9c35bd5 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
@@ -42,7 +42,7 @@ import org.apache.shardingsphere.sharding.api.sharding.ShardingAutoTableAlgorith
import org.apache.shardingsphere.sharding.spi.KeyGenerateAlgorithm;
import org.apache.shardingsphere.sharding.spi.ShardingAlgorithm;
import org.apache.shardingsphere.spi.ShardingSphereServiceLoader;
-import org.apache.shardingsphere.spi.typed.TypedSPIRegistry;
+import org.apache.shardingsphere.spi.required.RequiredSPIRegistry;
import javax.sql.DataSource;
import java.util.Collection;
@@ -102,7 +102,7 @@ public final class ShardingRule implements FeatureRule, SchemaRule, DataNodeCont
defaultDatabaseShardingStrategyConfig = null == config.getDefaultDatabaseShardingStrategy() ? new NoneShardingStrategyConfiguration() : config.getDefaultDatabaseShardingStrategy();
defaultTableShardingStrategyConfig = null == config.getDefaultTableShardingStrategy() ? new NoneShardingStrategyConfiguration() : config.getDefaultTableShardingStrategy();
defaultKeyGenerateAlgorithm = null == config.getDefaultKeyGenerateStrategy()
- ? TypedSPIRegistry.getRegisteredService(KeyGenerateAlgorithm.class) : keyGenerators.get(config.getDefaultKeyGenerateStrategy().getKeyGeneratorName());
+ ? RequiredSPIRegistry.getRegisteredService(KeyGenerateAlgorithm.class) : keyGenerators.get(config.getDefaultKeyGenerateStrategy().getKeyGeneratorName());
defaultShardingColumn = config.getDefaultShardingColumn();
}
@@ -118,7 +118,7 @@ public final class ShardingRule implements FeatureRule, SchemaRule, DataNodeCont
defaultDatabaseShardingStrategyConfig = null == config.getDefaultDatabaseShardingStrategy() ? new NoneShardingStrategyConfiguration() : config.getDefaultDatabaseShardingStrategy();
defaultTableShardingStrategyConfig = null == config.getDefaultTableShardingStrategy() ? new NoneShardingStrategyConfiguration() : config.getDefaultTableShardingStrategy();
defaultKeyGenerateAlgorithm = null == config.getDefaultKeyGenerateStrategy()
- ? TypedSPIRegistry.getRegisteredService(KeyGenerateAlgorithm.class) : keyGenerators.get(config.getDefaultKeyGenerateStrategy().getKeyGeneratorName());
+ ? RequiredSPIRegistry.getRegisteredService(KeyGenerateAlgorithm.class) : keyGenerators.get(config.getDefaultKeyGenerateStrategy().getKeyGeneratorName());
defaultShardingColumn = config.getDefaultShardingColumn();
}
@@ -146,21 +146,21 @@ public final class ShardingRule implements FeatureRule, SchemaRule, DataNodeCont
return actualDataNodes.stream().map(each -> new DataNode(each).getDataSourceName()).collect(Collectors.toList());
}
- private Map<String, TableRule> createTableRules(final Collection<ShardingTableRuleConfiguration> tableRuleConfigurations, final KeyGenerateStrategyConfiguration defaultKeyGenerateStrategyConfig) {
- return tableRuleConfigurations.stream().map(each -> new TableRule(each, dataSourceNames, getDefaultGenerateKeyColumn(defaultKeyGenerateStrategyConfig)))
+ private Map<String, TableRule> createTableRules(final Collection<ShardingTableRuleConfiguration> tableRuleConfigs, final KeyGenerateStrategyConfiguration defaultKeyGenerateStrategyConfig) {
+ return tableRuleConfigs.stream().map(each -> new TableRule(each, dataSourceNames, getDefaultGenerateKeyColumn(defaultKeyGenerateStrategyConfig)))
.collect(Collectors.toMap(TableRule::getLogicTable, Function.identity(), (oldValue, currentValue) -> oldValue, LinkedHashMap::new));
}
- private Map<String, TableRule> createAutoTableRules(final Collection<ShardingAutoTableRuleConfiguration> autoTableRuleConfigurations,
+ private Map<String, TableRule> createAutoTableRules(final Collection<ShardingAutoTableRuleConfiguration> autoTableRuleConfigs,
final KeyGenerateStrategyConfiguration defaultKeyGenerateStrategyConfig) {
- return autoTableRuleConfigurations.stream().map(each -> createAutoTableRule(defaultKeyGenerateStrategyConfig, each))
+ return autoTableRuleConfigs.stream().map(each -> createAutoTableRule(defaultKeyGenerateStrategyConfig, each))
.collect(Collectors.toMap(TableRule::getLogicTable, Function.identity(), (oldValue, currentValue) -> oldValue, LinkedHashMap::new));
}
- private TableRule createAutoTableRule(final KeyGenerateStrategyConfiguration defaultKeyGenerateStrategyConfig, final ShardingAutoTableRuleConfiguration each) {
- ShardingAlgorithm shardingAlgorithm = null == each.getShardingStrategy() ? null : shardingAlgorithms.get(each.getShardingStrategy().getShardingAlgorithmName());
+ private TableRule createAutoTableRule(final KeyGenerateStrategyConfiguration defaultKeyGenerateStrategyConfig, final ShardingAutoTableRuleConfiguration autoTableRuleConfig) {
+ ShardingAlgorithm shardingAlgorithm = null == autoTableRuleConfig.getShardingStrategy() ? null : shardingAlgorithms.get(autoTableRuleConfig.getShardingStrategy().getShardingAlgorithmName());
Preconditions.checkState(shardingAlgorithm instanceof ShardingAutoTableAlgorithm, "Sharding auto table rule configuration must match sharding auto table algorithm.");
- return new TableRule(each, dataSourceNames, (ShardingAutoTableAlgorithm) shardingAlgorithm, getDefaultGenerateKeyColumn(defaultKeyGenerateStrategyConfig));
+ return new TableRule(autoTableRuleConfig, dataSourceNames, (ShardingAutoTableAlgorithm) shardingAlgorithm, getDefaultGenerateKeyColumn(defaultKeyGenerateStrategyConfig));
}
private String getDefaultGenerateKeyColumn(final KeyGenerateStrategyConfiguration defaultKeyGenerateStrategyConfig) {
diff --git a/shardingsphere-spi/src/main/java/org/apache/shardingsphere/spi/required/RequiredSPI.java b/shardingsphere-spi/src/main/java/org/apache/shardingsphere/spi/required/RequiredSPI.java
index 3b6ebf7..9e12e27 100644
--- a/shardingsphere-spi/src/main/java/org/apache/shardingsphere/spi/required/RequiredSPI.java
+++ b/shardingsphere-spi/src/main/java/org/apache/shardingsphere/spi/required/RequiredSPI.java
@@ -27,5 +27,7 @@ public interface RequiredSPI {
*
* @return is default service provider or not
*/
- boolean isDefault();
+ default boolean isDefault() {
+ return false;
+ }
}
diff --git a/shardingsphere-spi/src/main/java/org/apache/shardingsphere/spi/required/RequiredSPIRegistry.java b/shardingsphere-spi/src/main/java/org/apache/shardingsphere/spi/required/RequiredSPIRegistry.java
index b147c99..51820f2 100644
--- a/shardingsphere-spi/src/main/java/org/apache/shardingsphere/spi/required/RequiredSPIRegistry.java
+++ b/shardingsphere-spi/src/main/java/org/apache/shardingsphere/spi/required/RequiredSPIRegistry.java
@@ -45,6 +45,6 @@ public final class RequiredSPIRegistry {
if (1 == services.size()) {
return services.iterator().next();
}
- return services.stream().filter(each -> !each.isDefault()).findFirst().orElseGet(() -> services.iterator().next());
+ return services.stream().filter(RequiredSPI::isDefault).findFirst().orElseGet(() -> services.iterator().next());
}
}
diff --git a/shardingsphere-spi/src/main/java/org/apache/shardingsphere/spi/typed/TypedSPIRegistry.java b/shardingsphere-spi/src/main/java/org/apache/shardingsphere/spi/typed/TypedSPIRegistry.java
index da22342..83e6d71 100644
--- a/shardingsphere-spi/src/main/java/org/apache/shardingsphere/spi/typed/TypedSPIRegistry.java
+++ b/shardingsphere-spi/src/main/java/org/apache/shardingsphere/spi/typed/TypedSPIRegistry.java
@@ -75,19 +75,4 @@ public final class TypedSPIRegistry {
}
throw new ServiceProviderNotFoundException(typedSPIClass, type);
}
-
- /**
- * Get registered service.
- *
- * @param typedSPIClass typed SPI class
- * @param <T> type
- * @return registered service
- */
- public static <T extends TypedSPI> T getRegisteredService(final Class<T> typedSPIClass) {
- Optional<T> serviceInstance = ShardingSphereServiceLoader.newServiceInstances(typedSPIClass).stream().findFirst();
- if (serviceInstance.isPresent()) {
- return serviceInstance.get();
- }
- throw new ServiceProviderNotFoundException(typedSPIClass);
- }
}
diff --git a/shardingsphere-spi/src/test/java/org/apache/shardingsphere/spi/required/RequiredSPIRegistryTest.java b/shardingsphere-spi/src/test/java/org/apache/shardingsphere/spi/required/RequiredSPIRegistryTest.java
index 3824057..39a4b7b 100644
--- a/shardingsphere-spi/src/test/java/org/apache/shardingsphere/spi/required/RequiredSPIRegistryTest.java
+++ b/shardingsphere-spi/src/test/java/org/apache/shardingsphere/spi/required/RequiredSPIRegistryTest.java
@@ -21,7 +21,7 @@ import org.apache.shardingsphere.spi.ShardingSphereServiceLoader;
import org.apache.shardingsphere.spi.exception.ServiceProviderNotFoundException;
import org.apache.shardingsphere.spi.fixture.required.NoImplRequiredSPIFixture;
import org.apache.shardingsphere.spi.fixture.required.RequiredSPIFixture;
-import org.apache.shardingsphere.spi.fixture.required.RequiredSPIFixtureDefaultFalseImpl;
+import org.apache.shardingsphere.spi.fixture.required.RequiredSPIFixtureDefaultTrueImpl;
import org.apache.shardingsphere.spi.fixture.required.RequiredSPIImpl;
import org.junit.Test;
@@ -48,6 +48,6 @@ public final class RequiredSPIRegistryTest {
@Test
public void assertRegisteredServiceMoreThanOne() {
RequiredSPIFixture actualRegisteredService = RequiredSPIRegistry.getRegisteredService(RequiredSPIFixture.class);
- assertTrue(actualRegisteredService instanceof RequiredSPIFixtureDefaultFalseImpl);
+ assertTrue(actualRegisteredService instanceof RequiredSPIFixtureDefaultTrueImpl);
}
}
diff --git a/shardingsphere-spi/src/test/java/org/apache/shardingsphere/spi/typed/TypedSPIRegistryTest.java b/shardingsphere-spi/src/test/java/org/apache/shardingsphere/spi/typed/TypedSPIRegistryTest.java
index 73a383e..bf958c9 100644
--- a/shardingsphere-spi/src/test/java/org/apache/shardingsphere/spi/typed/TypedSPIRegistryTest.java
+++ b/shardingsphere-spi/src/test/java/org/apache/shardingsphere/spi/typed/TypedSPIRegistryTest.java
@@ -19,7 +19,6 @@ package org.apache.shardingsphere.spi.typed;
import org.apache.shardingsphere.spi.ShardingSphereServiceLoader;
import org.apache.shardingsphere.spi.exception.ServiceProviderNotFoundException;
-import org.apache.shardingsphere.spi.fixture.typed.NoImplTypedSPIFixture;
import org.apache.shardingsphere.spi.fixture.typed.TypedSPIFixture;
import org.junit.Before;
import org.junit.Test;
@@ -39,37 +38,23 @@ public final class TypedSPIRegistryTest {
@Test
public void assertGetRegisteredService() {
- String type = "FIXTURE";
- TypedSPIFixture actual = TypedSPIRegistry.getRegisteredService(TypedSPIFixture.class, type, new Properties());
+ TypedSPIFixture actual = TypedSPIRegistry.getRegisteredService(TypedSPIFixture.class, "FIXTURE", new Properties());
assertNotNull(actual);
}
@Test
- public void assertPropertiesGetRegisteredService() {
+ public void assertGetRegisteredServiceWithProperties() {
Properties properties = new Properties();
properties.put("key1", 1);
properties.put("key2", 2L);
- String type = "FIXTURE";
- TypedSPIFixture actual = TypedSPIRegistry.getRegisteredService(TypedSPIFixture.class, type, properties);
+ TypedSPIFixture actual = TypedSPIRegistry.getRegisteredService(TypedSPIFixture.class, "FIXTURE", properties);
assertNotNull(actual);
assertThat(actual.getProps().getProperty("key1"), is("1"));
assertThat(actual.getProps().getProperty("key2"), is("2"));
}
- @Test
- public void assertGetRegisteredServiceBySPIClass() {
- TypedSPIFixture actual = TypedSPIRegistry.getRegisteredService(TypedSPIFixture.class);
- assertNotNull(actual);
- }
-
@Test(expected = ServiceProviderNotFoundException.class)
public void assertGetRegisteredServiceWhenTypeIsNotExist() {
- String type = "TEST_FIXTURE";
- TypedSPIRegistry.getRegisteredService(TypedSPIFixture.class, type, new Properties());
- }
-
- @Test(expected = ServiceProviderNotFoundException.class)
- public void assertGetRegisteredServiceWhenSPIClassIsNotExist() {
- TypedSPIRegistry.getRegisteredService(NoImplTypedSPIFixture.class);
+ TypedSPIRegistry.getRegisteredService(TypedSPIFixture.class, "NOT_EXISTED", new Properties());
}
}