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

zichaowang 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 5032c9d7337 Refactor TypedSPI to support more types of return value 
(#26864)
5032c9d7337 is described below

commit 5032c9d733755c34a29c40fcb7d72a62d260b72b
Author: Liang Zhang <[email protected]>
AuthorDate: Mon Jul 10 06:22:38 2023 +0800

    Refactor TypedSPI to support more types of return value (#26864)
    
    * Refactor TypedSPI to support more types of return value
    
    * Refactor TypedSPI to support more types of return value
    
    * Refactor TypedSPI to support more types of return value
    
    * Refactor TypedSPI to support more types of return value
    
    * Refactor TypedSPI to support more types of return value
    
    * Refactor TypedSPI to support more types of return value
    
    * Refactor TypedSPI to support more types of return value
    
    * Refactor TypedSPI to support more types of return value
    
    * Refactor TypedSPI to support more types of return value
    
    * Refactor TypedSPI to support more types of return value
---
 .../impl/proxy/ProxyMetaDataInfoExporterTest.java      | 10 ++++++----
 .../infra/database/type/DatabaseType.java              |  3 +++
 .../infra/util/spi/type/typed/TypedSPI.java            |  2 +-
 .../infra/util/spi/type/typed/TypedSPILoader.java      | 10 ++++++++--
 .../type/typed/algorithm/ShardingSphereAlgorithm.java  |  5 +++++
 .../pipeline/spi/sqlbuilder/PipelineSQLBuilder.java    |  3 +++
 .../data/pipeline/common/job/type/JobType.java         |  3 +++
 .../query/ShowMigrationCheckAlgorithmsExecutor.java    |  4 ++--
 .../shardingsphere/mode/metadata/MetaDataContexts.java | 18 +++++++++++++-----
 .../repository/cluster/consul/ConsulRepository.java    |  5 -----
 .../cluster/zookeeper/ZookeeperRepositoryTest.java     |  2 +-
 .../spi/FeaturedDistSQLStatementParserFacade.java      |  3 +++
 .../admin/executor/MySQLSetCharsetExecutor.java        |  3 +--
 .../frontend/spi/DatabaseProtocolFrontendEngine.java   |  3 +++
 14 files changed, 52 insertions(+), 22 deletions(-)

diff --git 
a/agent/plugins/metrics/core/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/core/exporter/impl/proxy/ProxyMetaDataInfoExporterTest.java
 
b/agent/plugins/metrics/core/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/core/exporter/impl/proxy/ProxyMetaDataInfoExporterTest.java
index 17c3c8ca431..a56951501e8 100644
--- 
a/agent/plugins/metrics/core/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/core/exporter/impl/proxy/ProxyMetaDataInfoExporterTest.java
+++ 
b/agent/plugins/metrics/core/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/core/exporter/impl/proxy/ProxyMetaDataInfoExporterTest.java
@@ -22,11 +22,12 @@ import 
org.apache.shardingsphere.agent.plugin.metrics.core.collector.type.GaugeM
 import 
org.apache.shardingsphere.agent.plugin.metrics.core.config.MetricCollectorType;
 import 
org.apache.shardingsphere.agent.plugin.metrics.core.config.MetricConfiguration;
 import 
org.apache.shardingsphere.agent.plugin.metrics.core.fixture.collector.MetricsCollectorFixture;
+import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
-import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import org.apache.shardingsphere.test.mock.AutoMockExtension;
 import org.apache.shardingsphere.test.mock.StaticMockSettings;
@@ -74,9 +75,10 @@ class ProxyMetaDataInfoExporterTest {
     private ContextManager mockContextManager() {
         ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
         
when(database.getResourceMetaData().getDataSources()).thenReturn(Collections.singletonMap("ds_0",
 mock(DataSource.class)));
-        ShardingSphereMetaData shardingSphereMetaData = 
mock(ShardingSphereMetaData.class);
-        
when(shardingSphereMetaData.getDatabases()).thenReturn(Collections.singletonMap("sharding_db",
 database));
-        MetaDataContexts metaDataContexts = new 
MetaDataContexts(mock(MetaDataPersistService.class), shardingSphereMetaData);
+        when(database.getProtocolType()).thenReturn(new MySQLDatabaseType());
+        ShardingSphereMetaData metaData = mock(ShardingSphereMetaData.class);
+        
when(metaData.getDatabases()).thenReturn(Collections.singletonMap("sharding_db",
 database));
+        MetaDataContexts metaDataContexts = new 
MetaDataContexts(mock(MetaDataPersistService.class), metaData);
         ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS);
         when(result.getMetaDataContexts()).thenReturn(metaDataContexts);
         return result;
diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/database/type/DatabaseType.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/database/type/DatabaseType.java
index e0c6e101198..d918c2f913a 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/database/type/DatabaseType.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/database/type/DatabaseType.java
@@ -114,4 +114,7 @@ public interface DatabaseType extends TypedSPI {
      */
     default void handleRollbackOnly(final boolean rollbackOnly, final 
SQLStatement statement) throws SQLException {
     }
+    
+    @Override
+    String getType();
 }
diff --git 
a/infra/util/src/main/java/org/apache/shardingsphere/infra/util/spi/type/typed/TypedSPI.java
 
b/infra/util/src/main/java/org/apache/shardingsphere/infra/util/spi/type/typed/TypedSPI.java
index fc41a922ff6..44b2f8b1f98 100644
--- 
a/infra/util/src/main/java/org/apache/shardingsphere/infra/util/spi/type/typed/TypedSPI.java
+++ 
b/infra/util/src/main/java/org/apache/shardingsphere/infra/util/spi/type/typed/TypedSPI.java
@@ -39,7 +39,7 @@ public interface TypedSPI {
      * 
      * @return type
      */
-    default String getType() {
+    default Object getType() {
         return null;
     }
     
diff --git 
a/infra/util/src/main/java/org/apache/shardingsphere/infra/util/spi/type/typed/TypedSPILoader.java
 
b/infra/util/src/main/java/org/apache/shardingsphere/infra/util/spi/type/typed/TypedSPILoader.java
index 629bec0bdf1..550f287e61c 100644
--- 
a/infra/util/src/main/java/org/apache/shardingsphere/infra/util/spi/type/typed/TypedSPILoader.java
+++ 
b/infra/util/src/main/java/org/apache/shardingsphere/infra/util/spi/type/typed/TypedSPILoader.java
@@ -120,7 +120,7 @@ public final class TypedSPILoader {
      * @return service
      */
     public static <T extends TypedSPI> T getService(final Class<T> spiClass, 
final String type, final Properties props) {
-        return findService(spiClass, type, props).orElseGet(() -> 
findService(spiClass).orElseThrow(() -> new 
ServiceProviderNotFoundServerException(spiClass)));
+        return findService(spiClass, type, props).orElseGet(() -> 
findService(spiClass).orElseThrow(() -> new 
ServiceProviderNotFoundServerException(spiClass, type)));
     }
     
     /**
@@ -145,6 +145,12 @@ public final class TypedSPILoader {
     }
     
     private static boolean matchesType(final String type, final TypedSPI 
instance) {
-        return null != instance.getType() && 
(instance.getType().equalsIgnoreCase(type) || 
instance.getTypeAliases().contains(type));
+        if (null == instance.getType()) {
+            return false;
+        }
+        if (instance.getType() instanceof String) {
+            return instance.getType().toString().equalsIgnoreCase(type) || 
instance.getTypeAliases().contains(type);
+        }
+        return instance.getType().equals(type) || 
instance.getTypeAliases().contains(type);
     }
 }
diff --git 
a/infra/util/src/main/java/org/apache/shardingsphere/infra/util/spi/type/typed/algorithm/ShardingSphereAlgorithm.java
 
b/infra/util/src/main/java/org/apache/shardingsphere/infra/util/spi/type/typed/algorithm/ShardingSphereAlgorithm.java
index a1f7c9e4505..5e9e423f08a 100644
--- 
a/infra/util/src/main/java/org/apache/shardingsphere/infra/util/spi/type/typed/algorithm/ShardingSphereAlgorithm.java
+++ 
b/infra/util/src/main/java/org/apache/shardingsphere/infra/util/spi/type/typed/algorithm/ShardingSphereAlgorithm.java
@@ -23,4 +23,9 @@ import 
org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPI;
  * ShardingSphere algorithm SPI.
  */
 public interface ShardingSphereAlgorithm extends TypedSPI {
+    
+    @Override
+    default String getType() {
+        return "";
+    }
 }
diff --git 
a/kernel/data-pipeline/api/src/main/java/org/apache/shardingsphere/data/pipeline/spi/sqlbuilder/PipelineSQLBuilder.java
 
b/kernel/data-pipeline/api/src/main/java/org/apache/shardingsphere/data/pipeline/spi/sqlbuilder/PipelineSQLBuilder.java
index 440ff4f8363..743410b9bd6 100644
--- 
a/kernel/data-pipeline/api/src/main/java/org/apache/shardingsphere/data/pipeline/spi/sqlbuilder/PipelineSQLBuilder.java
+++ 
b/kernel/data-pipeline/api/src/main/java/org/apache/shardingsphere/data/pipeline/spi/sqlbuilder/PipelineSQLBuilder.java
@@ -189,4 +189,7 @@ public interface PipelineSQLBuilder extends TypedSPI {
     default Optional<String> buildCRC32SQL(final String schemaName, final 
String tableName, final String column) {
         return Optional.empty();
     }
+    
+    @Override
+    String getType();
 }
diff --git 
a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/common/job/type/JobType.java
 
b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/common/job/type/JobType.java
index 36b47bdaf63..0376ee0c1b0 100644
--- 
a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/common/job/type/JobType.java
+++ 
b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/common/job/type/JobType.java
@@ -32,4 +32,7 @@ public interface JobType extends TypedSPI {
      * @return job type code
      */
     String getCode();
+    
+    @Override
+    String getType();
 }
diff --git 
a/kernel/data-pipeline/distsql/handler/src/main/java/org/apache/shardingsphere/migration/distsql/handler/query/ShowMigrationCheckAlgorithmsExecutor.java
 
b/kernel/data-pipeline/distsql/handler/src/main/java/org/apache/shardingsphere/migration/distsql/handler/query/ShowMigrationCheckAlgorithmsExecutor.java
index 20d80ebe3b3..3674cef6c5f 100644
--- 
a/kernel/data-pipeline/distsql/handler/src/main/java/org/apache/shardingsphere/migration/distsql/handler/query/ShowMigrationCheckAlgorithmsExecutor.java
+++ 
b/kernel/data-pipeline/distsql/handler/src/main/java/org/apache/shardingsphere/migration/distsql/handler/query/ShowMigrationCheckAlgorithmsExecutor.java
@@ -20,8 +20,8 @@ package 
org.apache.shardingsphere.migration.distsql.handler.query;
 import 
org.apache.shardingsphere.data.pipeline.core.job.service.InventoryIncrementalJobAPI;
 import org.apache.shardingsphere.data.pipeline.core.job.service.PipelineJobAPI;
 import 
org.apache.shardingsphere.distsql.handler.ral.query.QueryableRALExecutor;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
-import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPI;
 import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPILoader;
 import 
org.apache.shardingsphere.migration.distsql.statement.ShowMigrationCheckAlgorithmsStatement;
 
@@ -39,7 +39,7 @@ public final class ShowMigrationCheckAlgorithmsExecutor 
implements QueryableRALE
         InventoryIncrementalJobAPI jobAPI = (InventoryIncrementalJobAPI) 
TypedSPILoader.getService(PipelineJobAPI.class, "MIGRATION");
         return jobAPI.listDataConsistencyCheckAlgorithms().stream().map(
                 each -> new LocalDataQueryResultRow(each.getType(),
-                        
each.getSupportedDatabaseTypes().stream().map(TypedSPI::getType).collect(Collectors.joining(",")),
 each.getDescription()))
+                        
each.getSupportedDatabaseTypes().stream().map(DatabaseType::getType).collect(Collectors.joining(",")),
 each.getDescription()))
                 .collect(Collectors.toList());
     }
     
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContexts.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContexts.java
index 2c72f21d4e1..9759590d4d7 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContexts.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContexts.java
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.mode.metadata;
 
 import lombok.Getter;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.database.type.SchemaSupportedDatabaseType;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.statistics.ShardingSphereStatistics;
@@ -54,11 +55,18 @@ public final class MetaDataContexts implements 
AutoCloseable {
         if (metaData.getDatabases().isEmpty()) {
             return new ShardingSphereStatistics();
         }
-        ShardingSphereStatistics result = 
Optional.ofNullable(metaData.getDatabases().values().iterator().next().getProtocolType())
-                // TODO can `protocolType instanceof 
SchemaSupportedDatabaseType ? "PostgreSQL" : protocolType.getType()` replace to 
trunk database type?
-                .flatMap(protocolType -> 
TypedSPILoader.findService(ShardingSphereStatisticsBuilder.class, protocolType 
instanceof SchemaSupportedDatabaseType ? "PostgreSQL" : protocolType.getType())
-                        .map(builder -> builder.build(metaData)))
-                .orElseGet(ShardingSphereStatistics::new);
+        DatabaseType protocolType = 
metaData.getDatabases().values().iterator().next().getProtocolType();
+        if (null == protocolType) {
+            return new ShardingSphereStatistics();
+        }
+        // TODO can `protocolType instanceof SchemaSupportedDatabaseType ? 
"PostgreSQL" : protocolType.getType()` replace to trunk database type?
+        Optional<ShardingSphereStatisticsBuilder> statisticsBuilder = 
TypedSPILoader.findService(ShardingSphereStatisticsBuilder.class, protocolType 
instanceof SchemaSupportedDatabaseType
+                ? "PostgreSQL"
+                : protocolType.getType());
+        if (!statisticsBuilder.isPresent()) {
+            return new ShardingSphereStatistics();
+        }
+        ShardingSphereStatistics result = 
statisticsBuilder.get().build(metaData);
         Optional<ShardingSphereStatistics> loadedStatistics = 
Optional.ofNullable(persistService.getShardingSphereDataPersistService())
                 .flatMap(shardingSphereDataPersistService -> 
shardingSphereDataPersistService.load(metaData));
         loadedStatistics.ifPresent(optional -> useLoadedToReplaceInit(result, 
optional));
diff --git 
a/mode/type/cluster/repository/provider/consul/src/main/java/org/apache/shardingsphere/mode/repository/cluster/consul/ConsulRepository.java
 
b/mode/type/cluster/repository/provider/consul/src/main/java/org/apache/shardingsphere/mode/repository/cluster/consul/ConsulRepository.java
index 36e692419eb..3c0f363a123 100644
--- 
a/mode/type/cluster/repository/provider/consul/src/main/java/org/apache/shardingsphere/mode/repository/cluster/consul/ConsulRepository.java
+++ 
b/mode/type/cluster/repository/provider/consul/src/main/java/org/apache/shardingsphere/mode/repository/cluster/consul/ConsulRepository.java
@@ -199,9 +199,4 @@ public final class ConsulRepository implements 
ClusterPersistRepository {
     public String getType() {
         return "Consul";
     }
-    
-    @Override
-    public Collection<String> getTypeAliases() {
-        return ClusterPersistRepository.super.getTypeAliases();
-    }
 }
diff --git 
a/mode/type/cluster/repository/provider/zookeeper/src/test/java/org/apache/shardingsphere/mode/repository/cluster/zookeeper/ZookeeperRepositoryTest.java
 
b/mode/type/cluster/repository/provider/zookeeper/src/test/java/org/apache/shardingsphere/mode/repository/cluster/zookeeper/ZookeeperRepositoryTest.java
index cccd9bba31a..cd5824293bf 100644
--- 
a/mode/type/cluster/repository/provider/zookeeper/src/test/java/org/apache/shardingsphere/mode/repository/cluster/zookeeper/ZookeeperRepositoryTest.java
+++ 
b/mode/type/cluster/repository/provider/zookeeper/src/test/java/org/apache/shardingsphere/mode/repository/cluster/zookeeper/ZookeeperRepositoryTest.java
@@ -128,7 +128,7 @@ class ZookeeperRepositoryTest {
     
     @SneakyThrows(ReflectiveOperationException.class)
     private void mockDistributedLockHolder() {
-        DistributedLockHolder distributedLockHolder = new 
DistributedLockHolder("Zookeeper", client, new ZookeeperProperties(new 
Properties()));
+        DistributedLockHolder distributedLockHolder = new 
DistributedLockHolder("ZooKeeper", client, new ZookeeperProperties(new 
Properties()));
         
Plugins.getMemberAccessor().set(DistributedLockHolder.class.getDeclaredField("locks"),
 distributedLockHolder, Collections.singletonMap("/locks/glock", 
mock(ZookeeperDistributedLock.class)));
         
Plugins.getMemberAccessor().set(ZookeeperRepository.class.getDeclaredField("distributedLockHolder"),
 REPOSITORY, distributedLockHolder);
     }
diff --git 
a/parser/distsql/engine/src/main/java/org/apache/shardingsphere/distsql/parser/engine/spi/FeaturedDistSQLStatementParserFacade.java
 
b/parser/distsql/engine/src/main/java/org/apache/shardingsphere/distsql/parser/engine/spi/FeaturedDistSQLStatementParserFacade.java
index 501ceee2108..c8820dae8e3 100644
--- 
a/parser/distsql/engine/src/main/java/org/apache/shardingsphere/distsql/parser/engine/spi/FeaturedDistSQLStatementParserFacade.java
+++ 
b/parser/distsql/engine/src/main/java/org/apache/shardingsphere/distsql/parser/engine/spi/FeaturedDistSQLStatementParserFacade.java
@@ -34,4 +34,7 @@ public interface FeaturedDistSQLStatementParserFacade extends 
SQLParserFacade {
      * @return visitor class
      */
     Class<? extends SQLVisitor<ASTNode>> getVisitorClass();
+    
+    @Override
+    String getType();
 }
diff --git 
a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/MySQLSetCharsetExecutor.java
 
b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/MySQLSetCharsetExecutor.java
index 392215d6abd..9c08474e5b1 100644
--- 
a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/MySQLSetCharsetExecutor.java
+++ 
b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/MySQLSetCharsetExecutor.java
@@ -28,7 +28,6 @@ import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
 import java.util.Collection;
 import java.util.Locale;
-import java.util.Set;
 import java.util.TreeSet;
 
 /**
@@ -36,7 +35,7 @@ import java.util.TreeSet;
  */
 public final class MySQLSetCharsetExecutor implements 
MySQLSessionVariableHandler {
     
-    private static final Set<String> TYPE_ALIASES = new 
TreeSet<>(String.CASE_INSENSITIVE_ORDER);
+    private static final Collection<String> TYPE_ALIASES = new 
TreeSet<>(String.CASE_INSENSITIVE_ORDER);
     
     static {
         TYPE_ALIASES.add("character_set_client");
diff --git 
a/proxy/frontend/spi/src/main/java/org/apache/shardingsphere/proxy/frontend/spi/DatabaseProtocolFrontendEngine.java
 
b/proxy/frontend/spi/src/main/java/org/apache/shardingsphere/proxy/frontend/spi/DatabaseProtocolFrontendEngine.java
index 83b3a097736..44fab75ceea 100644
--- 
a/proxy/frontend/spi/src/main/java/org/apache/shardingsphere/proxy/frontend/spi/DatabaseProtocolFrontendEngine.java
+++ 
b/proxy/frontend/spi/src/main/java/org/apache/shardingsphere/proxy/frontend/spi/DatabaseProtocolFrontendEngine.java
@@ -72,4 +72,7 @@ public interface DatabaseProtocolFrontendEngine extends 
TypedSPI {
      * @param exception exception
      */
     void handleException(ConnectionSession connectionSession, Exception 
exception);
+    
+    @Override
+    String getType();
 }

Reply via email to